cloudstack-cli 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile.lock +1 -3
  3. data/cloudstack-cli.gemspec +0 -1
  4. data/lib/cloudstack-cli/base.rb +3 -0
  5. data/lib/cloudstack-cli/cli.rb +5 -0
  6. data/lib/cloudstack-cli/commands/server.rb +8 -7
  7. data/lib/cloudstack-cli/helper.rb +6 -2
  8. data/lib/cloudstack-cli/version.rb +1 -1
  9. data/lib/cloudstack-client/client.rb +7 -980
  10. data/lib/cloudstack-client/commands/account.rb +22 -0
  11. data/lib/cloudstack-client/commands/capacity.rb +19 -0
  12. data/lib/cloudstack-client/commands/command_template +8 -0
  13. data/lib/cloudstack-client/commands/disk_offering.rb +49 -0
  14. data/lib/cloudstack-client/commands/domain.rb +22 -0
  15. data/lib/cloudstack-client/commands/ip_address.rb +77 -0
  16. data/lib/cloudstack-client/commands/iso.rb +60 -0
  17. data/lib/cloudstack-client/commands/load_balancer_rule.rb +61 -0
  18. data/lib/cloudstack-client/commands/network.rb +101 -0
  19. data/lib/cloudstack-client/commands/port_forwarding_rule.rb +50 -0
  20. data/lib/cloudstack-client/commands/project.rb +32 -0
  21. data/lib/cloudstack-client/commands/router.rb +74 -0
  22. data/lib/cloudstack-client/commands/server.rb +291 -0
  23. data/lib/cloudstack-client/commands/service_offering.rb +98 -0
  24. data/lib/cloudstack-client/commands/template.rb +60 -0
  25. data/lib/cloudstack-client/commands/volumes.rb +20 -0
  26. data/lib/cloudstack-client/commands/zone.rb +57 -0
  27. data/lib/cloudstack-client/helper.rb +2 -2
  28. data/lib/cloudstack-client/version.rb +3 -0
  29. data/lib/cloudstack_cli.rb +0 -8
  30. data/lib/cloudstack_client.rb +2 -2
  31. metadata +26 -34
  32. data/config/cloudstack.example.yml +0 -3
  33. data/lib/cloudstack-client/ssh_command.rb +0 -15
@@ -0,0 +1,22 @@
1
+ module CloudstackClient
2
+
3
+ module Account
4
+
5
+ ##
6
+ # Lists accounts.
7
+
8
+ def list_accounts(args = { :name => nil })
9
+ params = {
10
+ 'command' => 'listAccounts',
11
+ 'listall' => 'true',
12
+ 'isrecursive' => 'true'
13
+ }
14
+ params['name'] = args[:name] if args[:name]
15
+
16
+ json = send_request(params)
17
+ json['account'] || []
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,19 @@
1
+ module CloudstackClient
2
+
3
+ module Capacity
4
+
5
+ ##
6
+ # List capacity.
7
+
8
+ def list_capacity(args = {})
9
+ params = {
10
+ 'command' => 'listCapacity',
11
+ }
12
+
13
+ json = send_request(params)
14
+ json['capacity'] || []
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,8 @@
1
+ module CloudstackClient
2
+
3
+ module Command
4
+
5
+
6
+ end
7
+
8
+ end
@@ -0,0 +1,49 @@
1
+ module CloudstackClient
2
+
3
+ module DiskOffering
4
+
5
+ ##
6
+ # Lists all available disk offerings.
7
+
8
+ def list_disk_offerings(domain = nil)
9
+ params = {
10
+ 'command' => 'listDiskOfferings'
11
+ }
12
+
13
+ if domain
14
+ params['domainid'] = list_domains(domain).first["id"]
15
+ end
16
+
17
+ json = send_request(params)
18
+ json['diskoffering'] || []
19
+ end
20
+
21
+ ##
22
+ # Get disk offering by name.
23
+
24
+ def get_disk_offering(name)
25
+
26
+ # TODO: use name parameter
27
+ # listServiceOfferings in CloudStack 2.2 doesn't seem to work
28
+ # when the name parameter is specified. When this is fixed,
29
+ # the name parameter should be added to the request.
30
+ params = {
31
+ 'command' => 'listDiskOfferings'
32
+ }
33
+ json = send_request(params)
34
+
35
+ services = json['diskoffering']
36
+ return nil unless services
37
+
38
+ services.each { |s|
39
+ if s['name'] == name then
40
+ return s
41
+ end
42
+ }
43
+ nil
44
+ end
45
+
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,22 @@
1
+ module CloudstackClient
2
+
3
+ module Domain
4
+
5
+ ##
6
+ # List domains.
7
+
8
+ def list_domains(name = nil)
9
+ params = {
10
+ 'command' => 'listDomains',
11
+ 'listall' => 'true',
12
+ 'isrecursive' => 'true'
13
+ }
14
+ params['name'] = name if name
15
+
16
+ json = send_request(params)
17
+ json['domain'] || []
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,77 @@
1
+ module CloudstackClient
2
+
3
+ module IpAddress
4
+
5
+ ##
6
+ # Lists the public ip addresses.
7
+
8
+ def list_public_ip_addresses(args = {})
9
+ params = {
10
+ 'command' => 'listPublicIpAddresses',
11
+ 'isrecursive' => true
12
+ }
13
+ if args[:project]
14
+ project = get_project(args[:project])
15
+ params['projectid'] = project['id']
16
+ end
17
+ if args[:account]
18
+ account = list_accounts({name: args[:account]}).first
19
+ unless account
20
+ puts "Error: Account #{args[:account]} not found."
21
+ exit 1
22
+ end
23
+ params['domainid'] = account["domainid"]
24
+ params['account'] = args[:account]
25
+ end
26
+ params['listall'] = args[:listall] if args[:listall]
27
+
28
+ json = send_request(params)
29
+ json['publicipaddress'] || []
30
+ end
31
+
32
+ ##
33
+ # Finds the public ip address for a given ip address string.
34
+
35
+ def get_public_ip_address(ip_address)
36
+ params = {
37
+ 'command' => 'listPublicIpAddresses',
38
+ 'ipaddress' => ip_address
39
+ }
40
+ json = send_request(params)
41
+ ip_address = json['publicipaddress']
42
+
43
+ return nil unless ip_address
44
+ ip_address.first
45
+ end
46
+
47
+
48
+ ##
49
+ # Acquires and associates a public IP to an account.
50
+
51
+ def associate_ip_address(network_id)
52
+ params = {
53
+ 'command' => 'associateIpAddress',
54
+ 'networkid' => network_id
55
+ }
56
+
57
+ json = send_async_request(params)
58
+ json['ipaddress']
59
+ end
60
+
61
+ ##
62
+ # Disassociates an ip address from the account.
63
+ #
64
+ # Returns true if successful, false otherwise.
65
+
66
+ def disassociate_ip_address(id)
67
+ params = {
68
+ 'command' => 'disassociateIpAddress',
69
+ 'id' => id
70
+ }
71
+ json = send_async_request(params)
72
+ json['success']
73
+ end
74
+
75
+ end
76
+
77
+ end
@@ -0,0 +1,60 @@
1
+ module CloudstackClient
2
+
3
+ module Iso
4
+
5
+ ##
6
+ # Lists all isos that match the specified filter.
7
+ #
8
+ # Allowable filter values are:
9
+ #
10
+ # * featured - isos that are featured and are public
11
+ # * self - isos that have been registered/created by the owner
12
+ # * self-executable - isos that have been registered/created by the owner that can be used to deploy a new VM
13
+ # * executable - all isos that can be used to deploy a new VM
14
+ # * community - isos that are public
15
+
16
+ def list_isos(args = {})
17
+ filter = args[:filter] || 'featured'
18
+ params = {
19
+ 'command' => 'listIsos',
20
+ 'templateFilter' => filter
21
+ }
22
+ params['projectid'] = args[:project_id] if args[:project_id]
23
+ params['zoneid'] = args[:zone_id] if args[:zone_id]
24
+
25
+ json = send_request(params)
26
+ json['iso'] || []
27
+ end
28
+
29
+ ##
30
+ # Finds the template with the specified name.
31
+
32
+ def get_iso(name)
33
+
34
+ # TODO: use name parameter
35
+ # listIsos in CloudStack 2.2 doesn't seem to work
36
+ # when the name parameter is specified. When this is fixed,
37
+ # the name parameter should be added to the request.
38
+ params = {
39
+ 'command' => 'listIsos',
40
+ 'templateFilter' => 'executable'
41
+ }
42
+ json = send_request(params)
43
+
44
+ isos = json['iso']
45
+ if !isos then
46
+ return nil
47
+ end
48
+
49
+ isos.each { |t|
50
+ if t['name'] == name then
51
+ return t
52
+ end
53
+ }
54
+
55
+ nil
56
+ end
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,61 @@
1
+ module CloudstackClient
2
+
3
+ module LoadBalancerRule
4
+
5
+ ##
6
+ # List loadbalancer rules
7
+
8
+ def list_load_balancer_rules(options = {})
9
+ params = {
10
+ 'command' => 'listLoadBalancerRules',
11
+ }
12
+ params['name'] = options[:name] if options[:name]
13
+
14
+ if options[:project_name]
15
+ project = get_project(options[:project_name])
16
+ params['projectid'] = project['id']
17
+ end
18
+
19
+ json = send_request(params)
20
+ json['loadbalancerrule'] || []
21
+ end
22
+
23
+ ##
24
+ # Creates a load balancing rule.
25
+
26
+ def create_load_balancer_rule(name, publicip, private_port, public_port, options = {})
27
+ params = {
28
+ 'command' => 'createLoadBalancerRule',
29
+ 'name' => name,
30
+ 'privateport' => private_port,
31
+ 'publicport' => public_port,
32
+ 'publicipid' => get_public_ip_address(publicip)['id']
33
+ }
34
+ params['algorithm'] = options[:algorithm] || 'roundrobin'
35
+ params['openfirewall'] = options[:openfirewall] || true
36
+
37
+ json = send_async_request(params)
38
+ json['LoadBalancerRule']
39
+ end
40
+
41
+ ##
42
+ # Assigns virtual machine or a list of virtual machines to a load balancer rule.
43
+
44
+ def assign_to_load_balancer_rule(name, vm_names)
45
+ id = list_load_balancer_rules(name).first['id']
46
+
47
+ vm_ids = vm_names.map do |vm|
48
+ get_server(vm)['id']
49
+ end
50
+
51
+ params = {
52
+ 'command' => 'assignToLoadBalancerRule',
53
+ 'id' => id,
54
+ 'virtualmachineids' => vm_ids.join(',')
55
+ }
56
+ json = send_async_request(params)
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,101 @@
1
+ module CloudstackClient
2
+
3
+ module Network
4
+
5
+ ##
6
+ # Finds the network with the specified name.
7
+
8
+ def get_network(name, project_id = nil)
9
+ params = {
10
+ 'command' => 'listNetworks',
11
+ 'listall' => true
12
+ }
13
+ params['projectid'] = project_id if project_id
14
+ json = send_request(params)
15
+
16
+ networks = json['network']
17
+ return nil unless networks
18
+
19
+ networks.each { |n|
20
+ if n['name'] == name then
21
+ return n
22
+ end
23
+ }
24
+ nil
25
+ end
26
+
27
+ ##
28
+ # Finds the default network.
29
+
30
+ def get_default_network(zone = nil)
31
+ params = {
32
+ 'command' => 'listNetworks',
33
+ 'isDefault' => true
34
+ }
35
+ if zone
36
+ params['zoneid'] = get_zone(zone)['id']
37
+ end
38
+ json = send_request(params)
39
+
40
+ networks = json['network']
41
+ return nil if !networks || networks.empty?
42
+ return networks.first if networks.length == 1
43
+
44
+ networks.each { |n|
45
+ if n['type'] == 'Direct' then
46
+ return n
47
+ end
48
+ }
49
+ nil
50
+ end
51
+
52
+ ##
53
+ # Lists all available networks.
54
+
55
+ def list_networks(args = {})
56
+ params = {
57
+ 'command' => 'listNetworks',
58
+ 'listall' => true,
59
+ }
60
+ params['projectid'] = args[:project_id] if args[:project_id]
61
+ params['zoneid'] = args[:zone_id] if args[:zone_id]
62
+ params['isDefault'] = true if args[:isdefault]
63
+ if args[:account]
64
+ domain = list_accounts(name: args[:account])
65
+ if domain.size > 0
66
+ params['account'] = args[:account]
67
+ params['domainid'] = domain.first["domainid"]
68
+ else
69
+ puts "Account #{args[:account]} not found."
70
+ end
71
+ end
72
+ json = send_request(params)
73
+ json['network'] || []
74
+ end
75
+
76
+ ##
77
+ # Delete network.
78
+
79
+ def delete_network(id)
80
+ params = {
81
+ 'command' => 'deleteNetwork',
82
+ 'id' => id,
83
+ }
84
+ p json = send_async_request(params)
85
+ json['network']
86
+ end
87
+
88
+ ##
89
+ # Lists all physical networks.
90
+
91
+ def list_physical_networks
92
+ params = {
93
+ 'command' => 'listPhysicalNetworks',
94
+ }
95
+ json = send_request(params)
96
+ json['physicalnetwork'] || []
97
+ end
98
+
99
+ end
100
+
101
+ end
@@ -0,0 +1,50 @@
1
+ module CloudstackClient
2
+
3
+ module PortForwardingRule
4
+
5
+ ##
6
+ # Lists all port forwarding rules.
7
+
8
+ def list_port_forwarding_rules(ip_address_id=nil, project_id)
9
+ params = {
10
+ 'command' => 'listPortForwardingRules',
11
+ 'listall' => true,
12
+ 'isrecursive' => true
13
+ }
14
+ params['ipAddressId'] = ip_address_id if ip_address_id
15
+ params['projectid'] = project_id if project_id
16
+ json = send_request(params)
17
+ json['portforwardingrule'] || []
18
+ end
19
+
20
+ ##
21
+ # Gets the SSH port forwarding rule for the specified server.
22
+
23
+ def get_ssh_port_forwarding_rule(server, cached_rules=nil)
24
+ rules = cached_rules || list_port_forwarding_rules || []
25
+ rules.find_all { |r|
26
+ r['virtualmachineid'] == server['id'] &&
27
+ r['privateport'] == '22'&&
28
+ r['publicport'] == '22'
29
+ }.first
30
+ end
31
+
32
+ ##
33
+ # Creates a port forwarding rule.
34
+
35
+ def create_port_forwarding_rule(ip_address_id, private_port, protocol, public_port, virtual_machine_id)
36
+ params = {
37
+ 'command' => 'createPortForwardingRule',
38
+ 'ipAddressId' => ip_address_id,
39
+ 'privatePort' => private_port,
40
+ 'protocol' => protocol,
41
+ 'publicPort' => public_port,
42
+ 'virtualMachineId' => virtual_machine_id
43
+ }
44
+ json = send_async_request(params)
45
+ json['portforwardingrule']
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,32 @@
1
+ module CloudstackClient
2
+
3
+ module Project
4
+
5
+ ##
6
+ # Get project by name.
7
+
8
+ def get_project(name)
9
+ params = {
10
+ 'command' => 'listProjects',
11
+ 'name' => name,
12
+ 'listall' => true,
13
+ }
14
+ json = send_request(params)
15
+ json['project'] ? json['project'].first : nil
16
+ end
17
+
18
+ ##
19
+ # Lists projects.
20
+
21
+ def list_projects
22
+ params = {
23
+ 'command' => 'listProjects',
24
+ 'listall' => true,
25
+ }
26
+ json = send_request(params)
27
+ json['project'] || []
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,74 @@
1
+ module CloudstackClient
2
+
3
+ module Router
4
+
5
+ ##
6
+ # Lists all virtual routers.
7
+
8
+ def list_routers(args = {:account => nil, :zone => nil, :projectid => nil, :status => nil, :name => nil})
9
+ params = {
10
+ 'command' => 'listRouters',
11
+ 'listall' => 'true',
12
+ 'isrecursive' => 'true'
13
+ }
14
+ if args[:zone]
15
+ zone = get_zone(args[:zone])
16
+ unless zone
17
+ puts "Error: Zone #{args[:zone]} not found"
18
+ exit 1
19
+ end
20
+ params['zoneid'] = zone['id']
21
+ end
22
+ params['projectid'] = args[:projectid] if args[:projectid]
23
+ params['state'] = args[:status] if args[:status]
24
+ params['name'] = args[:name] if args[:name]
25
+ if args[:account]
26
+ account = list_accounts({name: args[:account]}).first
27
+ unless account
28
+ puts "Error: Account #{args[:account]} not found."
29
+ exit 1
30
+ end
31
+ params['domainid'] = account["domainid"]
32
+ params['account'] = args[:account]
33
+ end
34
+
35
+ json = send_request(params)
36
+ json['router'] || []
37
+ end
38
+
39
+ ##
40
+ # Destroy virtual router.
41
+
42
+ def destroy_router(id, async = false)
43
+ params = {
44
+ 'command' => 'destroyRouter',
45
+ 'id' => id
46
+ }
47
+ async ? send_async_request(params) : send_request(params)
48
+ end
49
+
50
+ ##
51
+ # Start virtual router.
52
+
53
+ def start_router(id, async = false)
54
+ params = {
55
+ 'command' => 'startRouter',
56
+ 'id' => id
57
+ }
58
+ async ? send_async_request(params) : send_request(params)
59
+ end
60
+
61
+ ##
62
+ # Stop virtual router.
63
+
64
+ def stop_router(id, async = false)
65
+ params = {
66
+ 'command' => 'stopRouter',
67
+ 'id' => id
68
+ }
69
+ async ? send_async_request(params) : send_request(params)
70
+ end
71
+
72
+ end
73
+
74
+ end