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

Reply via email to