Hi Chip, please go ahead if we can fix the http/s issue. The connection is 
based on marvin, I'm sure using CLI we'll find out more bugs and fix anything 
in marvin thereby help maintain marvin->tests and CLI.
Please hack that up on tools/marvin/marvin/cloudstackConnection.py

Edison, yes I'm working on the completedefault, I've figured a solution to the 
parsing and tabbing issue to show params for any api and added more verbs to 
the grammar like deploy, start etc.
In the new approach doc strings and params needed for an api are fetched and 
cached in the class locally to speed up the loading process.
Till it gets committed, cloudmonkey (now) will keep telling the user what 
params they are missing until it gets all the required ones.

One more thing, for people who may not have unicode support the prompt may 
appear weird and history search (up, down ) can mess up the visuals. For 
example on Mac it appears as a colorful emoji, but I found that it looks weird 
on other platforms. Will probably remove it, or the user can custom set their 
prompt, using: set prompt myprompt>

Regards.
PS. the set command is full of (fun :)  hacks because of funtional/generic 
programming, it basically can set any attribute on the class, so one can do 
something like creating something (var, func). For example set ruler # (so 
instead of - you will have a # separator)

________________________________________
From: Chip Childers [chip.child...@sungard.com]
Sent: Thursday, November 01, 2012 11:15 PM
To: cloudstack-dev@incubator.apache.org
Subject: Re: CLI for CloudStack: cloudmonkey

On Wed, Oct 31, 2012 at 2:10 PM, Rohit Yadav <rohit.ya...@citrix.com> wrote:
> Hi,
>
> I was working on a CLI for cloudstack, it's based on Marvin (the neglected 
> robot) and called cloudmonkey after our beloved mascot :D
>
> I've committed that on master, please review:
> https://git-wip-us.apache.org/repos/asf?p=incubator-cloudstack.git;a=commit;h=2ceaa3911e792dbeb6c40dfb70961008a01f7e3c
>
> Features:
> - it's a shell and also a terminal tool, accepts file redirection and pipes
> - scalable to find and run old and new APIs
> - intuitive grammar and verbs
> - autocompletion (functional hack)
> - shell execution using ! or shell
> - cfg support: user defined variables, like prompt, ruler, host, port etc.
> - history
> - colors (disable using set color false)
> - dynamic API loading and rule generation
> - leverages Marvin to get latest autogenerated APIs
> - emacs like shortcuts on prompt
> - uses apiKey and secretKey to interact with mgmt server
> - logs all client commands
> - PEP-8 compliant code
>
> FIXMEs:
> - Reverse search over history
> - Fix input and output processing
>
> It requires python and clint;
> pip install clint (or if you have to easy_install clint)
> mvn clean install -P developer
> cd tools/cli/cloudmonkey
> python cloudmonkey.py
>
> If you want to have the terminal tool installed;
> cd tools/cli
> python setup.py sdist
> cd dist
> pip install cloudmonkey-0.0.4.tar.gz (or easy_install etc.)
>
> You can do stuff like;
> cloudmonkey < file-with-commands, or
> cloudmonkey list Users, or as shell;
>
> (If you see unicode chars cloud and monkey below, yes they were put 
> intentionally :)
>
> $ cloudmonkey
> ☁ Apache CloudStack CLI. Type help or ? to list commands.
> 🙉 cloudmonkey>  set apiKey <your key here>
> 🙉 cloudmonkey>  set secretKey <your key here>
> 🙉 cloudmonkey>  <tab><tab>
> add      api      create   delete   disable  enable   help     list     quit  
>    remove   set      shell    update
> 🙉 cloudmonkey>  list <tab><tab>
> Accounts                   Alerts                     AsyncJobs               
>    Capabilities               Capacity                   Clusters             
>       Configurations
> DiskOfferings              DomainChildren             Domains                 
>    Events                     EventTypes                 FirewallRules        
>       Hosts
> HypervisorCapabilities     Hypervisors                InstanceGroups          
>    IpForwardingRules          IsoPermissions             Isos                 
>       LBStickinessPolicies
> LoadBalancerRuleInstances  LoadBalancerRules          NetworkACLs             
>    NetworkDevice              NetworkOfferings           Networks             
>       NetworkServiceProviders
> OsCategories               OsTypes                    PhysicalNetworks        
>    Pods                       PortForwardingRules        PrivateGateways      
>       ProjectAccounts
> ProjectInvitations         Projects                   PublicIpAddresses       
>    RemoteAccessVpns           ResourceLimits             Routers              
>       SecurityGroups
> ServiceOfferings           SnapshotPolicies           Snapshots               
>    SSHKeyPairs                StaticRoutes               
> StorageNetworkIpRange      StoragePools
> SupportedNetworkServices   Swifts                     SystemVms               
>    Tags                       TemplatePermissions        Templates            
>       TrafficTypeImplementors
> TrafficTypes               Users                      VirtualMachines         
>    VirtualRouterElements      VlanIpRanges               Volumes              
>       VPCOfferings
> VPCs                       VpnConnections             VpnCustomerGateways     
>    VpnGateways                VpnUsers                   Zones
> 🙉 cloudmonkey>  list Users
> …
> 🙉 cloudmonkey>  !ls
> # this give you a shell too and one can do things like
> 🙉 cloudmonkey>  !for i in Users Account; do echo `cloudmonkey list $i | grep 
> id`; done;
>
> Example commands to deploy a datacenter; (fill in dynamic ids etc.)
> create Zone dns1=8.8.8.8 internaldns1=10.147.28.6 name=Zone1 networktype=Basic
> create PhysicalNetwork name=test-network zoneid=
> add TrafficType traffictype=Guest physicalnetworkid=
> add TrafficType traffictype=Management physicalnetworkid=
> update PhysicalNetwork state=Enabled id=
> list NetworkServiceProviders name=VirtualRouter physicalNetworkId=
> list VirtualRouterElements nspid=
> api configureVirtualRouterElement enabled=true id=
> update NetworkServiceProvider state=Enabled id=
> list NetworkServiceProviders name=SecurityGroupProvider physicalNetworkId=
> update NetworkServiceProvider state=Enabled id=
> create Network zoneid= name=guestNetworkForBasicZone 
> displaytext=guestNetworkForBasicZone networkofferingid=
> create Pod zoneid= name=Pod1 gateway=10.147.28.1 netmask=255.255.255.0 
> startip=10.147.28.220 endip=10.147.28.235
> create VlanIpRange podid= networkid= gateway=10.147.28.1 
> netmask=255.255.255.0 startip=10.147.28.236 endip=10.147.28.250 
> forVirtualNetwork=false
> add Cluster zoneid= hypervisor=XenServer clustertype=CloudManaged podid= 
> clustername=Cluster1
> add Host zoneid= podid= clusterid= hypervisor=XenServer 
> clustertype=CloudManaged username=root password=password 
> url=http://10.147.28.60
> create StoragePool zoneid= clusterid= name=NFS1 
> url=nfs://10.147.28.7/export/home/rohit/primary
> add SecondaryStorage zoneId= url=nfs://10.147.28.7/export/home/rohit/secondary
> update Zone allocationstate=Enabled id=
>
> After some stabilisation, I can put it on pypi so any user can just do pip 
> install cloudmonkey to get the CLI.
>
> Regards.
> PS. Marvin the neglected robot and hipster cloudmonkey should rule the world 
> :D

Rohit,

This is really really cool.  It puts the "fun" in managing instances
from a command line.  I've been testing it against a production
CloudStack environment, and it's working pretty well.

If you don't mind, I might hack at the code a bit to fill in some gaps
that I'm seeing.  First example is that it assumes http, which doesn't
work in a public deployment where the endpoint is over https.

-chip

Reply via email to