cloudstack_client 0.9.7 → 1.0.0.rc1

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -11
  3. data/bin/cloudstack_client +5 -0
  4. data/cloudstack_client.gemspec +2 -0
  5. data/config/4.2.json +1 -0
  6. data/lib/cloudstack_client/api.rb +29 -0
  7. data/lib/cloudstack_client/cli.rb +107 -0
  8. data/lib/cloudstack_client/client.rb +34 -127
  9. data/lib/cloudstack_client/connection.rb +131 -0
  10. data/lib/cloudstack_client/error.rb +9 -0
  11. data/lib/cloudstack_client/version.rb +1 -1
  12. data/lib/cloudstack_client.rb +0 -1
  13. metadata +38 -34
  14. data/lib/cloudstack_client/commands/account.rb +0 -38
  15. data/lib/cloudstack_client/commands/affinity_group.rb +0 -39
  16. data/lib/cloudstack_client/commands/capacity.rb +0 -30
  17. data/lib/cloudstack_client/commands/cluster.rb +0 -19
  18. data/lib/cloudstack_client/commands/configuration.rb +0 -42
  19. data/lib/cloudstack_client/commands/disk_offering.rb +0 -49
  20. data/lib/cloudstack_client/commands/domain.rb +0 -22
  21. data/lib/cloudstack_client/commands/host.rb +0 -28
  22. data/lib/cloudstack_client/commands/ip_address.rb +0 -83
  23. data/lib/cloudstack_client/commands/iso.rb +0 -76
  24. data/lib/cloudstack_client/commands/job.rb +0 -29
  25. data/lib/cloudstack_client/commands/load_balancer_rule.rb +0 -61
  26. data/lib/cloudstack_client/commands/network.rb +0 -130
  27. data/lib/cloudstack_client/commands/pod.rb +0 -20
  28. data/lib/cloudstack_client/commands/port_forwarding_rule.rb +0 -49
  29. data/lib/cloudstack_client/commands/project.rb +0 -32
  30. data/lib/cloudstack_client/commands/region.rb +0 -19
  31. data/lib/cloudstack_client/commands/resource_limit.rb +0 -125
  32. data/lib/cloudstack_client/commands/router.rb +0 -100
  33. data/lib/cloudstack_client/commands/server.rb +0 -350
  34. data/lib/cloudstack_client/commands/service_offering.rb +0 -98
  35. data/lib/cloudstack_client/commands/snapshot.rb +0 -51
  36. data/lib/cloudstack_client/commands/ssh_key_pair.rb +0 -137
  37. data/lib/cloudstack_client/commands/storage_pool.rb +0 -31
  38. data/lib/cloudstack_client/commands/system_vm.rb +0 -82
  39. data/lib/cloudstack_client/commands/template.rb +0 -60
  40. data/lib/cloudstack_client/commands/user.rb +0 -32
  41. data/lib/cloudstack_client/commands/volume.rb +0 -54
  42. data/lib/cloudstack_client/commands/zone.rb +0 -57
  43. data/lib/connection_helper.rb +0 -12
@@ -0,0 +1,29 @@
1
+ require "json"
2
+ require "ostruct"
3
+
4
+ module CloudstackClient
5
+ class Api
6
+
7
+ DEFAULT_API_VERSION = "4.2"
8
+
9
+ def initialize(options = {})
10
+ if options[:api_file]
11
+ @api_file = options[:api_file]
12
+ @api_version = File.basename(@api_file, ".json")
13
+ else
14
+ @api_version = options[:api_version] || DEFAULT_API_VERSION
15
+ @api_file = File.expand_path("../../../config/#{@api_version}.json", __FILE__)
16
+ end
17
+ end
18
+
19
+ def commands
20
+ begin
21
+ api = JSON.parse(IO.read @api_file)
22
+ rescue => e
23
+ raise "Error: Unable to read file '#{@api_file}' : #{e.message}"
24
+ end
25
+ api["api"].map {|command| OpenStruct.new command }
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,107 @@
1
+ require 'cloudstack_client/client'
2
+ require 'thor'
3
+ require 'yaml'
4
+ require 'ripl'
5
+
6
+ module CloudstackClient
7
+ class Cli < Thor
8
+ include Thor::Actions
9
+
10
+ class_option :config_file,
11
+ default: File.join(Dir.home, '.cloudstack-cli.yml'),
12
+ aliases: '-c',
13
+ desc: 'location of your cloudstack-cli configuration file'
14
+
15
+ class_option :env,
16
+ aliases: '-e',
17
+ desc: 'environment to use'
18
+
19
+ class_option :debug,
20
+ desc: 'enable debug output',
21
+ type: :boolean
22
+
23
+ desc "version", "Print cloudstack_client version number"
24
+ def version
25
+ say "cloudstack_client version #{CloudstackClient::VERSION}"
26
+ end
27
+ map %w(-v --version) => :version
28
+
29
+ desc "list_apis", "list api commands using the Cloudstack API Discovery service"
30
+ option :format, default: 'json',
31
+ enum: %w(json yaml), desc: "output format"
32
+ option :pretty_print, default: true, type: :boolean,
33
+ desc: "pretty print json output"
34
+ option :remove_response, default: true, type: :boolean,
35
+ desc: "remove response sections"
36
+ option :remove_description, default: true, type: :boolean,
37
+ desc: "remove description sections"
38
+ def list_apis
39
+ apis = client.send_request('command' => 'listApis')
40
+ apis.each do |command|
41
+ command.delete("response") if options[:remove_response]
42
+ if options[:remove_description]
43
+ command.delete("description")
44
+ command["params"].each {|param| param.delete("description")}
45
+ end
46
+ end
47
+ output = if options[:format] == "json"
48
+ options[:pretty_print] ? JSON.pretty_generate(apis) : data.to_json
49
+ else
50
+ apis.to_yaml
51
+ end
52
+ puts output
53
+ end
54
+
55
+ desc "console", "Cloudstack Client interactive shell"
56
+ def console
57
+ puts "cloudstack_client version #{CloudstackClient::VERSION}"
58
+ puts ' try: list_virtual_machines state: "Started"'
59
+ ARGV.clear
60
+ env = options[:env] ? options[:env] : load_configuration.last
61
+ Ripl.config[:prompt] = "#{env} >> "
62
+ Ripl.start binding: client.instance_eval('binding')
63
+ end
64
+
65
+ no_commands do
66
+ def client(opts = {})
67
+ @config ||= load_configuration.first
68
+ @client ||= CloudstackClient::Client.new(
69
+ @config[:url],
70
+ @config[:api_key],
71
+ @config[:secret_key]
72
+ )
73
+ end
74
+
75
+ def load_configuration(config_file = options[:config_file], env = options[:env])
76
+ unless File.exists?(config_file)
77
+ say "Configuration file #{config_file} not found.", :red
78
+ say "Please run \'cloudstack-cli environment add\' to create one."
79
+ exit 1
80
+ end
81
+
82
+ begin
83
+ config = YAML::load(IO.read(config_file))
84
+ rescue
85
+ say "Can't load configuration from file #{config_file}.", :red
86
+ exit 1
87
+ end
88
+
89
+ env ||= config[:default]
90
+ if env
91
+ unless config = config[env]
92
+ say "Can't find environment #{env}.", :red
93
+ exit 1
94
+ end
95
+ end
96
+
97
+ unless config.key?(:url) && config.key?(:api_key) && config.key?(:secret_key)
98
+ say "The environment #{env || '\'-\''} contains no valid data.", :red
99
+ exit 1
100
+ end
101
+ return config, env
102
+ end
103
+
104
+ end # no_commands
105
+
106
+ end # class
107
+ end # module
@@ -1,147 +1,54 @@
1
- require 'base64'
2
- require 'openssl'
3
- require 'uri'
4
- require 'cgi'
5
- require 'net/http'
6
- require 'net/https'
7
- require 'json'
8
- require 'yaml'
1
+ require "cloudstack_client/api"
2
+ require "cloudstack_client/error"
3
+ require "cloudstack_client/connection"
9
4
 
10
5
  module CloudstackClient
11
- class Connection
6
+ class Client < Connection
12
7
 
13
- @@async_poll_interval = 2.0
14
- @@async_timeout = 400
8
+ attr_accessor :api_version, :api_path
15
9
 
16
- # include all commands
17
- Dir.glob(File.dirname(__FILE__) + "/commands/*.rb").each do |file|
18
- require file
19
- module_name = File.basename(file, '.rb').split('_').map{|f| f.capitalize}.join
20
- include Object.const_get("CloudstackClient").const_get(module_name)
10
+ def initialize(api_url, api_key, secret_key, options = {})
11
+ super(api_url, api_key, secret_key, options = {})
12
+ @api_version = options[:api_version] if options[:api_version]
13
+ @api_file = options[:api_file] if options[:api_file]
14
+ define_api_methods unless options[:no_api_methods]
21
15
  end
22
16
 
23
- attr_accessor :verbose
24
- attr_accessor :debug
17
+ def define_api_methods
18
+ Api.new(api_file: @api_file, api_version: @api_version).commands.each do |command|
19
+ method_name = underscore(command.name).to_sym
25
20
 
26
- def initialize(api_url, api_key, secret_key, opts = {})
27
- @api_url = api_url
28
- @api_key = api_key
29
- @secret_key = secret_key
30
- @verbose = opts[:quiet] ? false : true
31
- @debug = opts[:debug] ? true : false
32
- end
33
-
34
- ##
35
- # Sends a synchronous request to the CloudStack API and returns the response as a Hash.
36
- #
37
- # The wrapper element of the response (e.g. mycommandresponse) is discarded and the
38
- # contents of that element are returned.
39
-
40
- def send_request(params)
41
- params['response'] = 'json'
42
- params['apiKey'] = @api_key
43
-
44
- params_arr = []
45
- params.sort.each { |elem|
46
- params_arr << elem[0].to_s + '=' + CGI.escape(elem[1].to_s).gsub('+', '%20').gsub(' ','%20')
47
- }
48
-
49
- debug_output JSON.pretty_generate(params) if @debug
50
-
51
- data = params_arr.join('&')
52
- signature = OpenSSL::HMAC.digest('sha1', @secret_key, data.downcase)
53
- signature = Base64.encode64(signature).chomp
54
- signature = CGI.escape(signature)
55
-
56
- url = "#{@api_url}?#{data}&signature=#{signature}"
21
+ define_singleton_method(method_name) do |args = {}, options = {}|
22
+ params = {"command" => command.name}
57
23
 
58
- uri = URI.parse(url)
59
- http = Net::HTTP.new(uri.host, uri.port)
24
+ args.each do |k, v|
25
+ k = normalize_key(k)
26
+ if v != nil && command_supports_key?(command, k)
27
+ params[k] = v
28
+ end
29
+ end
60
30
 
61
- if uri.scheme == 'https'
62
- http.use_ssl = true
63
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
64
- end
65
-
66
- begin
67
- response = http.request(Net::HTTP::Get.new(uri.request_uri))
68
- rescue
69
- puts "Error connecting to API:"
70
- puts "#{@api_url} is not reachable"
71
- exit 1
72
- end
73
-
74
-
75
- if response.is_a? Net::HTTPOK
76
- begin
77
- json = JSON.parse(response.body)
78
- json = json[params['command'].downcase + 'response']
79
- rescue JSON::ParserError
80
- puts "Error parsing response from server:"
81
- puts response.body
82
- exit 2
83
- end
84
- else
85
- begin
86
- json = JSON.parse(response.body)
87
- puts "Error executing command..."
88
- puts json if @debug
89
- json = json[params['command'].downcase + 'response']
90
- puts "#{json['errorcode']}: #{json['errortext']}"
91
- rescue
92
- puts "Error parsing response from server..."
93
- puts "#{response.code}: #{response.body}"
31
+ sync = command.isasync == false || options[:sync]
32
+ sync ? send_request(params) : send_async_request(params)
94
33
  end
95
- exit 3
96
34
  end
97
35
  end
98
36
 
99
- ##
100
- # Sends an asynchronous request and waits for the response.
101
- #
102
- # The contents of the 'jobresult' element are returned upon completion of the command.
103
-
104
- def send_async_request(params)
105
-
106
- json = send_request(params)
107
-
108
- params = {
109
- 'command' => 'queryAsyncJobResult',
110
- 'jobId' => json['jobid']
111
- }
112
-
113
- max_tries = (@@async_timeout / @@async_poll_interval).round
114
- max_tries.times do
115
- json = send_request(params)
116
- status = json['jobstatus']
117
-
118
- print "." if @verbose
119
-
120
- if status == 1
121
- return json['jobresult']
122
- elsif status == 2
123
- puts
124
- puts "Request failed (#{json['jobresultcode']}): #{json['jobresult']}"
125
- exit 1
126
- end
127
-
128
- STDOUT.flush
129
- sleep @@async_poll_interval
130
- end
37
+ private
131
38
 
132
- print "\n"
133
- puts "Error: Asynchronous request timed out"
134
- exit 1
39
+ def normalize_key(key)
40
+ key.to_s.gsub("_", "")
135
41
  end
136
42
 
137
- private
43
+ def command_supports_key?(command, key)
44
+ command.params.detect { |p| p["name"] == key }
45
+ end
138
46
 
139
- def debug_output(output, seperator = '-' * 80)
140
- puts
141
- puts seperator
142
- puts output
143
- puts seperator
144
- puts
47
+ def underscore(camel_case)
48
+ camel_case.gsub(/::/, '/').
49
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
50
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
51
+ tr("-", "_").downcase
145
52
  end
146
53
 
147
54
  end # class
@@ -0,0 +1,131 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+ require 'uri'
4
+ require 'cgi'
5
+ require 'net/http'
6
+ require 'net/https'
7
+ require 'json'
8
+
9
+ module CloudstackClient
10
+ class Connection
11
+
12
+ attr_accessor :api_url, :api_key, :secret_key, :verbose, :debug
13
+ attr_accessor :async_poll_interval, :async_timeout
14
+
15
+ def initialize(api_url, api_key, secret_key, options = {})
16
+ @api_url = api_url
17
+ @api_key = api_key
18
+ @secret_key = secret_key
19
+ @verbose = options[:quiet] ? false : true
20
+ @debug = options[:debug] ? true : false
21
+ @async_poll_interval = options[:async_poll_interval] || 2.0
22
+ @async_timeout = options[:async_timeout] || 400
23
+ end
24
+
25
+ ##
26
+ # Sends a synchronous request to the CloudStack API and returns the response as a Hash.
27
+ #
28
+
29
+ def send_request(params)
30
+ params['response'] = 'json'
31
+ params['apiKey'] = @api_key
32
+
33
+ params_arr = params.sort.map do |key, value|
34
+ value = CGI.escape(value.to_s).gsub('+', '%20').gsub(' ','%20')
35
+ "#{key}=#{value}"
36
+ end
37
+
38
+ debug_output JSON.pretty_generate(params) if @debug
39
+
40
+ data = params_arr.join('&')
41
+ signature = OpenSSL::HMAC.digest('sha1', @secret_key, data.downcase)
42
+ signature = Base64.encode64(signature).chomp
43
+ signature = CGI.escape(signature)
44
+
45
+ url = "#{@api_url}?#{data}&signature=#{signature}"
46
+
47
+ uri = URI.parse(url)
48
+ http = Net::HTTP.new(uri.host, uri.port)
49
+
50
+ if uri.scheme == 'https'
51
+ http.use_ssl = true
52
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
53
+ end
54
+
55
+ begin
56
+ response = http.request(Net::HTTP::Get.new(uri.request_uri))
57
+ rescue
58
+ raise ConnectionError, "API URL \'#{@api_url}\' is not reachable."
59
+ end
60
+
61
+ begin
62
+ body = JSON.parse(response.body).values.first
63
+ rescue JSON::ParserError
64
+ raise ParseError, "Error parsing response from server: #{response.body}."
65
+ end
66
+
67
+ if response.is_a? Net::HTTPOK
68
+ return body unless body.respond_to?(:keys)
69
+ if body.size == 2 && body.key?('count')
70
+ return body.reject { |key, _| key == 'count' }.values.first
71
+ elsif body.size == 1 && body.values.first.respond_to?(:keys)
72
+ item = body.values.first
73
+ return item.is_a?(Array) ? item : []
74
+ else
75
+ body.reject! { |key, _| key == 'count' } if body.key?('count')
76
+ body.size == 0 ? [] : body
77
+ end
78
+ else
79
+ message = data[data.keys.first]['errortext'] rescue data
80
+ raise ApiError, "Error #{response.code} - #{message}."
81
+ end
82
+ end
83
+
84
+ ##
85
+ # Sends an asynchronous request and waits for the response.
86
+ #
87
+ # The contents of the 'jobresult' element are returned upon completion of the command.
88
+
89
+ def send_async_request(params)
90
+ data = send_request(params)
91
+
92
+ params = {
93
+ 'command' => 'queryAsyncJobResult',
94
+ 'jobid' => data['jobid']
95
+ }
96
+
97
+ max_tries.times do
98
+ data = send_request(params)
99
+
100
+ print "." if @verbose
101
+
102
+ case data['jobstatus']
103
+ when 1
104
+ return data['jobresult']
105
+ when 2
106
+ raise JobError, "Request failed (#{data['jobresultcode']}). #{data['jobresult']}."
107
+ end
108
+
109
+ STDOUT.flush if @verbose
110
+ sleep @async_poll_interval
111
+ end
112
+
113
+ raise TimeoutError, "Asynchronous request timed out."
114
+ end
115
+
116
+ private
117
+
118
+ def max_tries
119
+ (@async_timeout / @async_poll_interval).round
120
+ end
121
+
122
+ def debug_output(output, seperator = '-' * 80)
123
+ puts
124
+ puts seperator
125
+ puts output
126
+ puts seperator
127
+ puts
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,9 @@
1
+ module CloudstackClient
2
+ class Error < StandardError; end
3
+ class ArgumentError < Error; end
4
+ class ConnectionError < Error; end
5
+ class ParseError < Error; end
6
+ class ApiError < Error; end
7
+ class JobError < Error; end
8
+ class TimeoutError < Error; end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module CloudstackClient
2
- VERSION = "0.9.7"
2
+ VERSION = "1.0.0.rc1"
3
3
  end
@@ -1,3 +1,2 @@
1
1
  require "cloudstack_client/version"
2
2
  require "cloudstack_client/client"
3
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudstack_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nik Wolfgramm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-12 00:00:00.000000000 Z
11
+ date: 2015-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -44,6 +44,34 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 10.0.4
47
+ - !ruby/object:Gem::Dependency
48
+ name: thor
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: ripl
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
47
75
  description: CloudStack API client written in Ruby
48
76
  email:
49
77
  - nik.wolfgramm@gmail.com
@@ -56,40 +84,16 @@ files:
56
84
  - LICENSE.txt
57
85
  - README.md
58
86
  - Rakefile
87
+ - bin/cloudstack_client
59
88
  - cloudstack_client.gemspec
89
+ - config/4.2.json
60
90
  - lib/cloudstack_client.rb
91
+ - lib/cloudstack_client/api.rb
92
+ - lib/cloudstack_client/cli.rb
61
93
  - lib/cloudstack_client/client.rb
62
- - lib/cloudstack_client/commands/account.rb
63
- - lib/cloudstack_client/commands/affinity_group.rb
64
- - lib/cloudstack_client/commands/capacity.rb
65
- - lib/cloudstack_client/commands/cluster.rb
66
- - lib/cloudstack_client/commands/configuration.rb
67
- - lib/cloudstack_client/commands/disk_offering.rb
68
- - lib/cloudstack_client/commands/domain.rb
69
- - lib/cloudstack_client/commands/host.rb
70
- - lib/cloudstack_client/commands/ip_address.rb
71
- - lib/cloudstack_client/commands/iso.rb
72
- - lib/cloudstack_client/commands/job.rb
73
- - lib/cloudstack_client/commands/load_balancer_rule.rb
74
- - lib/cloudstack_client/commands/network.rb
75
- - lib/cloudstack_client/commands/pod.rb
76
- - lib/cloudstack_client/commands/port_forwarding_rule.rb
77
- - lib/cloudstack_client/commands/project.rb
78
- - lib/cloudstack_client/commands/region.rb
79
- - lib/cloudstack_client/commands/resource_limit.rb
80
- - lib/cloudstack_client/commands/router.rb
81
- - lib/cloudstack_client/commands/server.rb
82
- - lib/cloudstack_client/commands/service_offering.rb
83
- - lib/cloudstack_client/commands/snapshot.rb
84
- - lib/cloudstack_client/commands/ssh_key_pair.rb
85
- - lib/cloudstack_client/commands/storage_pool.rb
86
- - lib/cloudstack_client/commands/system_vm.rb
87
- - lib/cloudstack_client/commands/template.rb
88
- - lib/cloudstack_client/commands/user.rb
89
- - lib/cloudstack_client/commands/volume.rb
90
- - lib/cloudstack_client/commands/zone.rb
94
+ - lib/cloudstack_client/connection.rb
95
+ - lib/cloudstack_client/error.rb
91
96
  - lib/cloudstack_client/version.rb
92
- - lib/connection_helper.rb
93
97
  homepage: https://github.com/niwo/cloudstack_client
94
98
  licenses:
95
99
  - MIT
@@ -107,9 +111,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
111
  version: 1.9.3
108
112
  required_rubygems_version: !ruby/object:Gem::Requirement
109
113
  requirements:
110
- - - ">="
114
+ - - ">"
111
115
  - !ruby/object:Gem::Version
112
- version: '0'
116
+ version: 1.3.1
113
117
  requirements: []
114
118
  rubyforge_project:
115
119
  rubygems_version: 2.2.2
@@ -1,38 +0,0 @@
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
- ##
21
- # Lists project accounts.
22
-
23
- def list_project_accounts(project_id, args = {})
24
- params = {
25
- 'command' => 'listProjectAccounts',
26
- 'projectid' => project_id,
27
- 'listall' => 'true',
28
- 'isrecursive' => 'true'
29
- }
30
- params['name'] = args[:name] if args[:name]
31
-
32
- json = send_request(params)
33
- json['account'] || []
34
- end
35
-
36
- end
37
-
38
- end
@@ -1,39 +0,0 @@
1
- module CloudstackClient
2
-
3
- module AffinityGroup
4
-
5
- ##
6
- # List Affinity Groups.
7
-
8
- def list_affinity_groups(args = {})
9
- params = {
10
- 'command' => 'listAffinityGroups',
11
- }
12
-
13
- if args[:account]
14
- account = list_accounts({name: args[:account]}).first
15
- unless account
16
- puts "Error: Account #{args[:account]} not found."
17
- exit 1
18
- end
19
- params['domainid'] = account["domainid"]
20
- params['account'] = args[:account]
21
- end
22
-
23
- if args['listall']
24
- params['listall'] = true
25
- params['isrecursive'] = true
26
- end
27
-
28
- params['name'] = args['name'] if args['name']
29
- params['type'] = args['type'] if args['type']
30
- params['virtualmachineid'] = args['virtualmachine_id'] if args['virtualmachine_id']
31
- params['keyword'] = args['keyword'] if args['keyword']
32
-
33
- json = send_request(params)
34
- json['affinitygroup'] || []
35
- end
36
-
37
- end
38
-
39
- end
@@ -1,30 +0,0 @@
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
- if args[:zone]
14
- zone = get_zone(args[:zone])
15
- unless zone
16
- puts "Error: Zone #{args[:zone]} not found"
17
- exit 1
18
- end
19
- params['zoneid'] = zone['id']
20
- end
21
-
22
- params['type'] = args[:type] if args[:type]
23
-
24
- json = send_request(params)
25
- json['capacity'] || []
26
- end
27
-
28
- end
29
-
30
- end