incubator-cloudstack-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rohit Yadav <rohit.ya...@citrix.com>
Subject CLI for CloudStack: cloudmonkey
Date Wed, 31 Oct 2012 18:10:25 GMT
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
Mime
View raw message