Yes, I look forward to using it instead of local curl calls on the command line :-)
On Thu, Nov 1, 2012 at 2:02 PM, Edison Su <edison...@citrix.com> wrote: > > >> -----Original Message----- >> From: Rohit Yadav [mailto:rohit.ya...@citrix.com] >> Sent: Thursday, November 01, 2012 11:45 AM >> To: cloudstack-dev@incubator.apache.org >> Subject: RE: CLI for CloudStack: cloudmonkey >> >> 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. > > Great! Thanks for your awesome CLI, people will like it. > >> >> 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=c >> > ommit;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