This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository

The following commit(s) were added to refs/heads/master by this push:
     new c974335  Updated Usage (markdown)
c974335 is described below

commit c9743356af5cb19d5b173e9ab94ca88294c81b07
Author: Rohit Yadav <>
AuthorDate: Thu Mar 14 13:19:41 2019 +0530

    Updated Usage (markdown)
--- | 233 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 231 insertions(+), 2 deletions(-)

diff --git a/ b/
index ece53c7..63445fb 100644
--- a/
+++ b/
@@ -1,3 +1,232 @@
-Refer to old docs:
+Link to old docs:
-Updates usage docs will be added soon.
\ No newline at end of file
+## Server profiles
+CloudMonkey supports multiple (management) server profiles, using which one 
can use to make API requests to different CloudStack servers. If cloudmonkey 
starts for the first time, it will create a default server profile by the name 
`[localcloud]` and use the following default values which one can then override 
using the `set` command. The default `cmk` config file at `~/.cmk/config` looks 
as follows:
+prompt          = 🐱
+asyncblock      = true
+timeout         = 1800
+output          = json
+paramcompletion = true
+verifycert      = true
+profile         = localcloud
+url       = http://localhost:8080/client/api
+username  = admin
+password  = password
+domain    = /
+apikey    = 
+secretkey = 
+To create a new server profile, one can use `set profile <profile-name>` and 
this will create a new server profile config section in `~/.cmk/config` and use 
the above default values. You can `set` parameters of a server profile such as 
the url, username, password and it will set the passed values for the current 
server profile.
+These are the various options you can configure in `cmk` using `set`:
+Option | Description | Default
+prompt | The CLI prompt | 🐱
+asyncblock | Whether to block and poll for async API job result, valid 
options: true and false | true
+timeout | The API timeout in seconds | 1800
+output | The API response output format, valid options: json, table, text, 
column, csv | json
+verifycert | Whether to verify X509/TLS certificate if URL is https enabled | 
+profile | The server profile name, `set` will switch to an existing profile or 
create a new profile with default if it does not exist | localcloud
+url* | The CloudStack server API url | http://localhost:8080/client/api
+username* | The user's username | admin
+password* | The user's password | password
+domain* | The user's domain | /
+apikey* | The user's API key | 
+secretkey* | The user's secret key | 
+- Options marked with `*` are settings server profile settings, other settings 
are core/global settings.
+- When both api/secret key and username/passwords are provided, the api/secret 
keys take precedence for API authentication over username/password.
+- An additional setting `debug` exists when can be turned on to enable console 
based debugging.
+## Shell and Interactive Usage
+`cmk` implements readline compliant shell and most of the emacs/readline 
bindings are honoured. For example:
+Ctrl+r (reverse search), Ctrl+a (start of the line), Ctrl+e (end of the line), 
Ctlr+w (remove one word from back), Ctrl+u (remove whole line) etc.
+The command history can be accessed by using up/down arrow keys as well and it 
is saved at `~/.cmk/history`.
+## Debugging
+Debugging in log is disabled, but you can enable debugging on console by 
starting CloudMonkey with `cmk -d` or use `set debug [true|false]`.
+## Argument passing
+Arguments can be passed to an api command using the syntax `<cmd> <verb> 
key1=value1 ...`. CloudMonkey's shell input parsing is similar to `shlex` and 
arguments are split by spaces. Arguments/values with space in them can be 
wrapped instead double/single quotes such as `list api arg1="some value with 
spaces" arg2='example input'`.
+If values have spaces, one can put them under quotes, like:
+> create project name="my unique name" displaytext="my lengthy description"
+Some APIs accept array or maps as their arguments, in that case use 
`arg0.key=value` syntax. For example, while creating network offering:
+> create networkoffering supportedservices=Dhcp,Dns 
serviceproviderlist[1].service=Dns serviceproviderlist[1].provider=VirtualRouter
+## Text processing using pipes
+Text processing is very easy, one can pipe the output to other terminal tools 
such as awk, sed, grep, jq etc. Examples:
+$ cmk list users | jq -r '.user[].id'
+$ cmk ...
+> list accounts listall=true | grep 'id'
+> list users | wc -l
+## Raw API execution
+You may directly call the API on the shell or command-line to execute it, for 
+> listUsers
+> uploadVolume url=xxx format=yyy name=zzz zoneid=aaa
+## Async Job execution
+There are two kinds of APIs in CloudStack; blocking or synchronous, and 
non-blocking or asynchronous. By default, CloudMonkey will poll and wait for 
async APIs to finish and return a response. This behaviour can be changed by 
seting `asyncblock` to false:
+> set asyncblock false
+When `asynblock` is false, CloudMonkey will return a `jobid` which can be used 
to poll the result of the API using the `query asyncjobresult` API request. For 
+> query asyncjobresult jobid=<job-id>
+## Output
+Irrespective of the configured output, the `filter` argument can be clubbed 
with an API request to filter the API response based on the provided list of 
comma-separated response keys.
+The `JSON` output is the default output. For example:
+(mycloud) 🐱 > set output json
+(mycloud) 🐱 > list users account=admin filter=
+account,             accountid,           accounttype,         apikey,         
     created,             domain,              domainid,            email,      
+firstname,           id,                  iscallerchilddomain, isdefault,      
     lastname,            roleid,              rolename,            roletype,   
+secretkey,           state,               timezone,            username,       
+(mycloud) 🐱 > list users account=admin filter=account,id,domain,username,
+  "count": 1,
+  "user": [
+    {
+      "account": "admin",
+      "domain": "ROOT",
+      "id": "7966afa9-3cd4-11e9-bf33-f4d1082409e6",
+      "username": "admin"
+    }
+  ]
+(mycloud) 🐱 > set output table
+(mycloud) 🐱 > list users account=admin filter=account,id,domain,username
+count = 1
+| ACCOUNT | DOMAIN |                  ID                  | USERNAME |
+| admin   | ROOT   | 7966afa9-3cd4-11e9-bf33-f4d1082409e6 | admin    |
+(mycloud) 🐱 > set output text
+(mycloud) 🐱 > list users account=admin filter=account,id,domain,username
+count = 1
+account = admin
+id = 7966afa9-3cd4-11e9-bf33-f4d1082409e6
+domain = ROOT
+username = admin
+(mycloud) 🐱 > set output column
+(mycloud) 🐱 > list users account=admin filter=account,id,domain,username
+ACCOUNT   DOMAIN   ID                                     USERNAME
+admin     ROOT     7966afa9-3cd4-11e9-bf33-f4d1082409e6   admin
+(mycloud) 🐱 > list users account=admin filter=account,id,domain,username
+## Shell Script Usage
+The modern CloudMonkey is backwards compatible with `legacy` cloudmonkey and 
can be used as a drop-in replacement for shell script and automation related 
usage. The follow example illustrates how one can use `cmk` to automate their 
deployments, this one deploys a basic zone:
+#Put space separated host ips in following
+zone_id=`$cli create zone dns1=$dns_ext internaldns1=$dns_int name=MyZone 
networktype=Basic | grep ^id\ = | awk '{print $3}'`
+echo "Created zone" $zone_id
+phy_id=`$cli create physicalnetwork name=phy-network zoneid=$zone_id | grep 
^id\ = | awk '{print $3}'`
+echo "Created physical network" $phy_id
+$cli add traffictype traffictype=Guest physicalnetworkid=$phy_id
+echo "Added guest traffic"
+$cli add traffictype traffictype=Management physicalnetworkid=$phy_id
+echo "Added mgmt traffic"
+$cli update physicalnetwork state=Enabled id=$phy_id
+echo "Enabled physicalnetwork"
+nsp_id=`$cli list networkserviceproviders name=VirtualRouter 
physicalnetworkid=$phy_id | grep ^id\ = | awk '{print $3}'`
+vre_id=`$cli list virtualrouterelements nspid=$nsp_id | grep ^id\ = | awk 
'{print $3}'`
+$cli api configureVirtualRouterElement enabled=true id=$vre_id
+$cli update networkserviceprovider state=Enabled id=$nsp_id
+echo "Enabled virtual router element and network service provider"
+nsp_sg_id=`$cli list networkserviceproviders name=SecurityGroupProvider 
physicalnetworkid=$phy_id | grep ^id\ = | awk '{print $3}'`
+$cli update networkserviceprovider state=Enabled id=$nsp_sg_id
+echo "Enabled security group provider"
+netoff_id=`$cli list networkofferings 
name=DefaultSharedNetworkOfferingWithSGService | grep ^id\ = | awk '{print $3}'`
+net_id=`$cli create network zoneid=$zone_id name=guestNetworkForBasicZone 
displaytext=guestNetworkForBasicZone networkofferingid=$netoff_id | grep ^id\ = 
| awk '{print $3}'`
+echo "Created network $net_id for zone" $zone_id
+pod_id=`$cli create pod name=MyPod zoneid=$zone_id gateway=$gw netmask=$nmask 
startip=$pod_start endip=$pod_end | grep ^id\ = | awk '{print $3}'`
+echo "Created pod"
+$cli create vlaniprange podid=$pod_id networkid=$net_id gateway=$gw 
netmask=$nmask startip=$vlan_start endip=$vlan_end forvirtualnetwork=false
+echo "Created IP ranges for instances"
+cluster_id=`$cli add cluster zoneid=$zone_id hypervisor=$hpvr 
clustertype=CloudManaged podid=$pod_id clustername=MyCluster | grep ^id\ = | 
awk '{print $3}'`
+echo "Created cluster" $cluster_id
+#Put loop here if more than one
+for host_ip in $host_ips;
+  $cli add host zoneid=$zone_id podid=$pod_id clusterid=$cluster_id 
hypervisor=$hpvr username=$host_user password=$host_passwd url=http://$host_ip;
+  echo "Added host" $host_ip;
+#$cli create storagepool zoneid=$zone_id podid=$pod_id clusterid=$cluster_id 
name=MyNFSPrimary url=$prm_storage
+#echo "Added primary storage"
+$cli add secondarystorage zoneid=$zone_id url=$sec_storage
+echo "Added secondary storage"
+$cli update zone allocationstate=Enabled id=$zone_id
+echo "Basic zone deloyment completed!"
\ No newline at end of file

Reply via email to