cloudstack_client 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 91ab2cb39a241bfd4688b632ad5399d0c76a8fe5
4
- data.tar.gz: ae9f63f4a8ffc1162e54498fc64df85e3a08c2aa
3
+ metadata.gz: 2f64a91a71aa5ffe62432e9d5c306288f5814ab8
4
+ data.tar.gz: 529f9c16b616564a52f9a2abbbc3239a7e990abb
5
5
  SHA512:
6
- metadata.gz: e306ce18d7185a2419519cd45e09661b280b152aa5e63e6ba6f8fcc72b8ec25d6177b45a0b9bc8dd41af6e983873c2bfa2f4cce1abd774430cc3bfdae9a485cd
7
- data.tar.gz: a9909453dea1c17d5652ded8cdb392ef9dfab1baf640a8eb9ca5f1d60a57e90ec988515f7dd4af5f5efea63f7704d0c06b1a8ecaffe96d6d8e25bdf732660639
6
+ metadata.gz: 4989517ca038f29d621dc07f9956c3e7f30439571e6808a8894f17c0f74f43980cc7d65f8a01668c0124dac995c95aff8cf7b68f858cd9e334dfbee53832497e
7
+ data.tar.gz: 4fec2c1962dc14e1f6d7d7b58ffab771652c3690c0e2417be447b3dbdcb0880ec326a6897887d96faeac6c9952d000d262478b41597fc38148ab92e9b7a0775b
data/README.md CHANGED
@@ -13,8 +13,18 @@ Install the cloudstack_client gem:
13
13
  $ gem install cloudstack_client
14
14
  ```
15
15
 
16
+ ## Features
17
+ - Dynamically builds API methods based on the lisApis function of CloudStack
18
+ - Command names are converted to match Ruby naming conventions (i.e. ListVirtualMachines becomes list_virtual_machines)
19
+ - Accepts Ruby style args passed to commands (i.e. list_all: true becomes listall=true)
20
+ - makes sure all required arguments are passed
21
+ - Removes unsupported arguments and arguments with nil values from commands
22
+
23
+
16
24
  ## Usage
17
25
 
26
+ ### Basic usage
27
+
18
28
  ```ruby
19
29
  require "cloudstack_client"
20
30
 
@@ -29,25 +39,45 @@ cs.list_virtual_machines(state: "running").each do |server|
29
39
  end
30
40
  ```
31
41
 
32
- ## Features
42
+ ### Initialize with options
33
43
 
34
- - Dynamically builds API methods based on the lisApis function of CloudStack
35
- - Command names are converted to match Ruby naming conventions (i.e. ListVirtualMachines becomes list_virtual_machines)
36
- - Accepts Ruby style args passed to commands (i.e. list_all: true becomes listall=true)
37
- - makes sure all required arguments are passed
38
- - Removes unsupported arguments and arguments with nil values from commands
44
+ Load API definition file from a alternative path and set the version:
45
+
46
+ ```ruby
47
+ cs = CloudstackClient::Client.new(
48
+ "https://cloudstack.local/client/api",
49
+ "API_KEY",
50
+ "API_SECRET",
51
+ {
52
+ api_path: "~/cloudstack",
53
+ api_version: "4.6"
54
+ }
55
+ )
56
+ ```
57
+
58
+ ..or load the API definition directly from a file:
59
+
60
+ ```ruby
61
+ cs = CloudstackClient::Client.new(
62
+ "https://cloudstack.local/client/api",
63
+ "API_KEY",
64
+ "API_SECRET",
65
+ { api_file: "~/cloudstack/4.6.json.gz" }
66
+ )
67
+ ```
39
68
 
40
69
  ## Development
41
70
 
42
- ### Generate new API configs
71
+ ### Generate/Update API versions
43
72
 
44
- New API configs can be genearted using the list_apis command.
73
+ New API configs can be generated using the list_apis command.
45
74
 
46
75
  *Example:*
47
76
 
48
77
  ```bash
49
78
  # running against an CloudStack 4.5 API endpoint:
50
- $ cloudstack_client list_apis > config/4.5.msgpack
79
+ $ cloudstack_client list_apis > data/4.5.json
80
+ $ gzip data/4.5.json
51
81
  ```
52
82
 
53
83
  ### Interactive Console
@@ -26,5 +26,5 @@ Gem::Specification.new do |gem|
26
26
  gem.add_development_dependency('ripl', '~> 0.7.0')
27
27
  gem.add_development_dependency('minitest', '~> 5.8.2')
28
28
 
29
- gem.add_dependency('msgpack', '~> 0.7.0')
29
+ gem.add_dependency('json', '~> 1.8.3')
30
30
  end
data/data/4.5.json.gz ADDED
Binary file
@@ -1,35 +1,24 @@
1
- require "msgpack"
1
+ require "zlib"
2
2
 
3
3
  module CloudstackClient
4
4
  class Api
5
5
 
6
6
  DEFAULT_API_VERSION = "4.5"
7
+ API_PATH = File.expand_path("../../../data/", __FILE__)
7
8
 
8
9
  attr_reader :commands
9
- attr_reader :api_version
10
+ attr_reader :api_version, :api_file, :api_path
10
11
 
11
- def self.versions
12
- Dir["#{self.config_path}/*.msgpack"].map do |path|
13
- File.basename(path, ".msgpack")
12
+ def self.versions(api_path = API_PATH)
13
+ Dir[api_path + "/*.json.gz"].map do |path|
14
+ File.basename(path, ".json.gz")
14
15
  end
15
16
  end
16
17
 
17
- def self.config_path
18
- File.expand_path("../../../config/", __FILE__)
19
- end
20
-
21
18
  def initialize(options = {})
22
- if options[:api_file]
23
- @api_file = options[:api_file]
24
- @api_version = File.basename(@api_file, ".msgpack")
25
- else
26
- @api_version = options[:api_version] || DEFAULT_API_VERSION
27
- unless Api.versions.include? @api_version
28
- raise "API definition not found for #{@api_version}"
29
- end
30
- @api_file = File.join(Api.config_path, "#{@api_version}.msgpack")
31
- end
32
- @commands = load_commands
19
+ set_api_path(options)
20
+ set_api_version_and_file(options)
21
+ load_commands
33
22
  end
34
23
 
35
24
  def command_supported?(command)
@@ -37,7 +26,11 @@ module CloudstackClient
37
26
  end
38
27
 
39
28
  def command_supports_param?(command, key)
40
- @commands[command]["params"].detect { |p| p["name"] == key } ? true : false
29
+ if @commands[command]["params"].detect { |p| p["name"] == key }
30
+ true
31
+ else
32
+ false
33
+ end
41
34
  end
42
35
 
43
36
  def required_params(command)
@@ -51,21 +44,52 @@ module CloudstackClient
51
44
  end
52
45
 
53
46
  def missing_params_msg(command)
54
- requ = required_params(command)
55
- "#{command} requires the following parameter#{ 's' if requ.size > 1}: #{requ.join(', ')}"
47
+ "#{command} requires the following parameter" +
48
+ "#{ 's' if required_params(command).size > 1 }: " +
49
+ required_params(command).join(", ")
56
50
  end
57
51
 
58
52
  private
59
53
 
60
- def load_commands
61
- begin
62
- api = MessagePack.unpack(IO.read @api_file)
63
- rescue => e
64
- raise "Error: Unable to read file '#{@api_file}' : #{e.message}"
54
+ def set_api_version_and_file(options)
55
+ if options[:api_file]
56
+ @api_file = options[:api_file]
57
+ @api_version = File.basename(@api_file, ".json.gz")
58
+ else
59
+ set_api_version(options)
60
+ @api_file = File.join(@api_path, "#{@api_version}.json.gz")
61
+ end
62
+ end
63
+
64
+ def set_api_path(options)
65
+ @api_path = if options[:api_path]
66
+ File.expand_path(options[:api_path])
67
+ else
68
+ API_PATH
69
+ end
70
+ end
71
+
72
+ def set_api_version(options)
73
+ @api_version = options[:api_version] || DEFAULT_API_VERSION
74
+ unless Api.versions(@api_path).include? @api_version
75
+ if options[:api_version]
76
+ raise "API definition not found for version '#{@api_version}' in api_path '#{@api_path}'"
77
+ elsif Api.versions(@api_path).size < 1
78
+ raise "no API file available in api_path '#{@api_path}'"
79
+ else
80
+ @api_version = Api.versions(@api_path).last
81
+ end
65
82
  end
66
- commands = Hash.new
67
- api.each { |command| commands[command["name"]] = command }
68
- commands
83
+ @api_version
84
+ end
85
+
86
+ def load_commands
87
+ @commands = {}
88
+ Zlib::GzipReader.open(@api_file) do |gz|
89
+ JSON.parse(gz.read)
90
+ end.each {|cmd| @commands[cmd["name"]] = cmd }
91
+ rescue => e
92
+ raise "Error: Unable to read file '#{@api_file}': #{e.message}"
69
93
  end
70
94
 
71
95
  end
@@ -1,5 +1,7 @@
1
1
  require "cloudstack_client/client"
2
2
  require "yaml"
3
+ require "json"
4
+ require 'pp'
3
5
 
4
6
  begin
5
7
  require "thor"
@@ -40,8 +42,8 @@ module CloudstackClient
40
42
  map %w(-v --version) => :version
41
43
 
42
44
  desc "list_apis", "list api commands using the Cloudstack API Discovery service"
43
- option :format, default: 'msgpack',
44
- enum: %w(msgpack json yaml), desc: "output format"
45
+ option :format, default: 'json',
46
+ enum: %w(json yaml), desc: "output format"
45
47
  option :pretty_print, default: true, type: :boolean,
46
48
  desc: "pretty print json output"
47
49
  option :remove_response, default: true, type: :boolean,
@@ -59,12 +61,10 @@ module CloudstackClient
59
61
  end
60
62
 
61
63
  print case options[:format]
62
- when "json"
63
- options[:pretty_print] ? JSON.pretty_generate(apis) : apis.to_json
64
64
  when "yaml"
65
65
  apis.to_yaml
66
66
  else
67
- apis.to_msgpack
67
+ options[:pretty_print] ? JSON.pretty_generate(apis) : apis.to_json
68
68
  end
69
69
  end
70
70
 
@@ -84,7 +84,7 @@ module CloudstackClient
84
84
  ARGV.clear
85
85
  env = options[:env] ? options[:env] : load_configuration.last
86
86
  Ripl.config[:prompt] = "#{env} >> "
87
- Ripl.start binding: cs_client.instance_eval('binding')
87
+ Ripl.start binding: cs_client.instance_eval{ binding }
88
88
  end
89
89
 
90
90
  no_commands do
@@ -1,3 +1,3 @@
1
1
  module CloudstackClient
2
- VERSION = "1.0.5"
2
+ VERSION = "1.1.0"
3
3
  end
data/test/api_test.rb CHANGED
@@ -5,12 +5,36 @@ describe CloudstackClient::Api do
5
5
  @api = CloudstackClient::Api.new
6
6
  end
7
7
 
8
+ describe "when the API is initialized" do
9
+ it "has to find the default version in available versions" do
10
+ CloudstackClient::Api.versions.include?(
11
+ CloudstackClient::Api::DEFAULT_API_VERSION
12
+ ).must_equal true
13
+ end
14
+
15
+ it "must raise exception for unavailable version" do
16
+ proc { CloudstackClient::Api.new(api_version: "0.0") }.must_raise RuntimeError
17
+ end
18
+
19
+ it "must set correct version of fake api file" do
20
+ CloudstackClient::Api.new(
21
+ api_file: "#{File.expand_path File.dirname(__FILE__)}/data/0.42.json.gz"
22
+ ).api_version.must_equal "0.42"
23
+ end
24
+
25
+ it "must set correct api file of fake api when loaded with api_version option" do
26
+ CloudstackClient::Api.new(
27
+ api_path: "#{File.expand_path File.dirname(__FILE__)}/data/",
28
+ ).api_file.must_equal "#{File.expand_path File.dirname(__FILE__)}/data/0.42.json.gz"
29
+ end
30
+ end
31
+
8
32
  describe "when commands are accessed" do
9
33
  it "must return a Hash" do
10
34
  @api.commands.class.must_equal Hash
11
35
  end
12
36
 
13
- it "the Hash must have a key named 'listDomains'" do
37
+ it "must have a key named 'listDomains'" do
14
38
  @api.commands.has_key?('listDomains').must_equal true
15
39
  end
16
40
 
data/test/benchmark.rb CHANGED
@@ -22,10 +22,8 @@ end
22
22
  gc_stat_after = GC.stat
23
23
  memory_after = `ps -o rss= -p #{Process.pid}`.to_i/1024
24
24
 
25
- puts(
26
- {
27
- time: time.round(2),
28
- gc_count: gc_stat_after[:count] - gc_stat_before[:count],
29
- memory: "%dM" % (memory_after - memory_before)
30
- }.to_json
31
- )
25
+ puts({
26
+ time: time.round(2),
27
+ gc_count: gc_stat_after[:count] - gc_stat_before[:count],
28
+ memory: "%dM" % (memory_after - memory_before)
29
+ }.to_json)
@@ -0,0 +1,15 @@
1
+ [
2
+ {
3
+ "name": "noCommand",
4
+ "isasync": true,
5
+ "related": "nilCommand",
6
+ "params": [
7
+ {
8
+ "name": "noparam",
9
+ "type": "string",
10
+ "length": 255,
11
+ "required": true
12
+ }
13
+ ]
14
+ }
15
+ ]
Binary file
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: 1.0.5
4
+ version: 1.1.0
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-11-02 00:00:00.000000000 Z
11
+ date: 2015-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -81,19 +81,19 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: 5.8.2
83
83
  - !ruby/object:Gem::Dependency
84
- name: msgpack
84
+ name: json
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.7.0
89
+ version: 1.8.3
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.7.0
96
+ version: 1.8.3
97
97
  description: CloudStack API client written in Ruby
98
98
  email:
99
99
  - nik.wolfgramm@gmail.com
@@ -110,8 +110,7 @@ files:
110
110
  - Rakefile
111
111
  - bin/cloudstack_client
112
112
  - cloudstack_client.gemspec
113
- - config/4.2.msgpack
114
- - config/4.5.msgpack
113
+ - data/4.5.json.gz
115
114
  - lib/cloudstack_client.rb
116
115
  - lib/cloudstack_client/api.rb
117
116
  - lib/cloudstack_client/cli.rb
@@ -123,6 +122,8 @@ files:
123
122
  - test/api_test.rb
124
123
  - test/benchmark.rb
125
124
  - test/client_test.rb
125
+ - test/data/0.42.json
126
+ - test/data/0.42.json.gz
126
127
  - test/test_helper.rb
127
128
  homepage: https://github.com/niwo/cloudstack_client
128
129
  licenses:
@@ -154,4 +155,6 @@ test_files:
154
155
  - test/api_test.rb
155
156
  - test/benchmark.rb
156
157
  - test/client_test.rb
158
+ - test/data/0.42.json
159
+ - test/data/0.42.json.gz
157
160
  - test/test_helper.rb
data/config/4.2.msgpack DELETED
Binary file
data/config/4.5.msgpack DELETED
Binary file