solusvm 1.1.0.beta2 → 1.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.
@@ -25,9 +25,7 @@ module Solusvm
25
25
  end
26
26
  end
27
27
 
28
- require 'solusvm/exceptions'
29
28
  require 'solusvm/hash'
30
- require 'solusvm/solusvm_errors'
31
29
  require 'solusvm/base'
32
30
  require 'solusvm/general'
33
31
  require 'solusvm/client'
@@ -1,16 +1,15 @@
1
- Faraday.register_middleware :response, :solusvm_errors => Solusvm::SolusvmErrors
2
-
3
1
  module Solusvm
4
2
  # Solusvm::Base is the main class for mapping API resources as subclasses.
5
3
  class Base
6
- attr_reader :returned_parameters, :statusmsg
7
- VALID_SERVER_TYPES = ['openvz', 'xen', 'xen hvm']
4
+ VALID_SERVER_TYPES = ["openvz", "xen", "xen hvm"]
5
+
6
+ attr_reader :returned_parameters
8
7
 
9
8
  # Prepares and sends the API request to the URL specificed in Solusvm.config
10
9
  #
11
10
  # class MyClass < Base
12
11
  # def create_server(name)
13
- # perform_request(:action => 'name', :id => 1)
12
+ # perform_request(:action => "name", :id => 1)
14
13
  # end
15
14
  # end
16
15
  #
@@ -20,14 +19,15 @@ module Solusvm
20
19
  #
21
20
  # <tt>force_array</tt> - see parse_response
22
21
  def perform_request(options = {}, force_array = false)
23
- ca_path = File.join(File.dirname(__FILE__), '..', 'cacert.pem')
22
+ ca_path = File.join(File.dirname(__FILE__), "..", "cacert.pem")
24
23
  ssl = {:verify => true, :ca_file => File.expand_path(ca_path)}
24
+
25
25
  response = Faraday.new(:url => api_endpoint, :ssl => ssl) do |c|
26
26
  c.params = options.merge(api_login)
27
- c.response :solusvm_errors
28
27
  c.adapter :net_http
29
28
  end.get
30
- @returned_parameters = parse_response(response.body, force_array)
29
+
30
+ @returned_parameters = parse_response(response.status, response.body, force_array)
31
31
  log_messages(options)
32
32
  successful?
33
33
  end
@@ -36,26 +36,45 @@ module Solusvm
36
36
  #
37
37
  # <tt>force_array</tt> - Parses the xml element as an array; can be a string with the element name
38
38
  # or an array with element names
39
- def parse_response(body, force_array = false)
40
- force_array = Array(force_array) if force_array
41
- body = "<solusrequest>#{body}</solusrequest>"
42
- XmlSimple.xml_in(body, 'ForceArray' => force_array)
39
+ def parse_response(status, body, force_array = false)
40
+ parse_error(status, body) || begin
41
+ force_array = Array(force_array) if force_array
42
+ body = "<solusrequest>#{body}</solusrequest>"
43
+ XmlSimple.xml_in(body, "ForceArray" => force_array)
44
+ end
43
45
  end
44
46
 
45
47
  # Parses a returned_parameters value as a list, if present.
46
48
  def parse_returned_params_as_list(attribute)
47
49
  if returned_parameters[attribute] && !returned_parameters[attribute].empty?
48
- returned_parameters[attribute].to_s.split(',')
50
+ returned_parameters[attribute].to_s.split(",")
51
+ end
52
+ end
53
+
54
+ # Parses error responses.
55
+ def parse_error(status, body)
56
+ if (200..299).include?(status)
57
+ # Checks for application errors
58
+ case body.downcase
59
+ when /invalid ipaddress/i
60
+ { "status" => "error", "statusmsg" => "This IP is not authorized to use the API" }
61
+ when /Invalid id or key/i
62
+ { "status" => "error", "statusmsg" => "Invalid ID or key" }
63
+ when /Node not found/i
64
+ { "status" => "error", "statusmsg" => "Node does not exist" }
65
+ end
66
+ else
67
+ { "status" => "error", "statusmsg" => "Bad HTTP Status: #{status}" }
49
68
  end
50
69
  end
51
70
 
52
71
  # Returns true when a request has been successful
53
72
  #
54
73
  # my_class = MyClass.new
55
- # my_class.create_server('example.com')
74
+ # my_class.create_server("example.com")
56
75
  # my_class.successful? # => true
57
76
  def successful?
58
- returned_parameters['status'] == 'success'
77
+ returned_parameters["status"] == "success"
59
78
  end
60
79
 
61
80
  # URI parsed API URL
@@ -81,14 +100,22 @@ module Solusvm
81
100
 
82
101
  # API response message
83
102
  def statusmsg
84
- returned_parameters['statusmsg']
103
+ returned_parameters["statusmsg"]
85
104
  end
86
105
 
87
- # Raises an exception unless a valid type is specified
88
- def validate_server_type!(type)
106
+ # Validates the server type.
107
+ def validate_server_type(type, &block)
89
108
  type = type.strip
90
- unless VALID_SERVER_TYPES.include?(type)
91
- raise SolusvmError, "Invalid Virtual Server type: #{type}"
109
+
110
+ if valid = VALID_SERVER_TYPES.include?(type)
111
+ yield
112
+ else
113
+ @returned_parameters = {
114
+ "status" => "error",
115
+ "statusmsg" => "Invalid Virtual Server type: #{type}"
116
+ }
117
+
118
+ false
92
119
  end
93
120
  end
94
121
  end
@@ -1,16 +1,17 @@
1
1
  module Solusvm
2
2
  # Solusvm::General is the class for retrieving general information.
3
3
  class General < Base
4
-
4
+
5
5
  # Lists available templates.
6
6
  #
7
7
  # Parameters:
8
8
  #
9
9
  # * +type+ - a valid virtualization type; e.g: [openvz|xen|xen hvm|kvm]
10
10
  def templates(type)
11
- validate_server_type!(type)
12
- perform_request(:action => 'listtemplates', :type => type)
13
- parse_returned_params_as_list('templates')
11
+ validate_server_type(type) do
12
+ perform_request(:action => 'listtemplates', :type => type)
13
+ parse_returned_params_as_list('templates')
14
+ end
14
15
  end
15
16
 
16
17
  # Lists available plans.
@@ -19,9 +20,10 @@ module Solusvm
19
20
  #
20
21
  # * +type+ - a valid virtualization type; e.g: [openvz|xen|xen hvm|kvm]
21
22
  def plans(type)
22
- validate_server_type!(type)
23
- perform_request(:action => 'listplans', :type => type)
24
- parse_returned_params_as_list('plans')
23
+ validate_server_type(type) do
24
+ perform_request(:action => 'listplans', :type => type)
25
+ parse_returned_params_as_list('plans')
26
+ end
25
27
  end
26
28
 
27
29
  # Lists available isos.
@@ -30,9 +32,10 @@ module Solusvm
30
32
  #
31
33
  # * +type+ - a valid virtualization type; e.g: [openvz|xen|xen hvm|kvm]
32
34
  def isos(type)
33
- validate_server_type!(type)
34
- perform_request(:action => 'listiso', :type => type)
35
- parse_returned_params_as_list('iso')
35
+ validate_server_type(type) do
36
+ perform_request(:action => 'listiso', :type => type)
37
+ parse_returned_params_as_list('iso')
38
+ end
36
39
  end
37
40
  end
38
41
  end
@@ -8,9 +8,10 @@ module Solusvm
8
8
  #
9
9
  # * +type+ - a valid virtualization type; e.g: [openvz|xen|xen hvm|kvm]
10
10
  def list(type)
11
- validate_server_type!(type)
12
- perform_request(:action => 'listnodes', :type => type)
13
- parse_returned_params_as_list('nodes')
11
+ validate_server_type(type) do
12
+ perform_request(:action => 'listnodes', :type => type)
13
+ parse_returned_params_as_list('nodes')
14
+ end
14
15
  end
15
16
 
16
17
  # Lists existing nodes ids of a given type.
@@ -19,9 +20,10 @@ module Solusvm
19
20
  #
20
21
  # * +type+ - a valid virtualization type; e.g: [openvz|xen|xen hvm|kvm]
21
22
  def ids(type)
22
- validate_server_type!(type)
23
- perform_request(:action => 'node-idlist', :type => type)
24
- returned_parameters['nodes'].split(',')
23
+ validate_server_type(type) do
24
+ perform_request(:action => 'node-idlist', :type => type)
25
+ returned_parameters['nodes'].split(',')
26
+ end
25
27
  end
26
28
 
27
29
  # Retrieves statistics from a specific node.
@@ -1,3 +1,3 @@
1
1
  module Solusvm
2
- VERSION = "1.1.0.beta2"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -55,49 +55,47 @@ class TestBase < Test::Unit::TestCase
55
55
 
56
56
  def test_validate_server_type
57
57
  Solusvm::Base::VALID_SERVER_TYPES.each do |type|
58
- assert_nothing_raised do
59
- @base.validate_server_type!(type)
60
- end
58
+ assert @base.validate_server_type(type) { true }
61
59
  end
62
60
 
63
- begin
64
- @base.validate_server_type!('bob')
65
- flunk "Shouldn't get here"
66
- rescue Solusvm::SolusvmError => e
67
- assert_equal 'Invalid Virtual Server type: bob', e.message
68
- end
61
+ assert !@base.validate_server_type('bob') { true }
62
+ assert !@base.successful?
63
+ assert_equal "Invalid Virtual Server type: bob", @base.statusmsg
69
64
  end
70
65
 
71
66
  def test_unautorized_ip
72
67
  VCR.use_cassette "base/unauthorized_ip" do
73
- assert_raise RuntimeError do
74
- @base.perform_request(:action => 'unauthorized')
75
- end
68
+ @base.perform_request(:action => 'unauthorized')
69
+
70
+ assert !@base.successful?
71
+ assert_equal "This IP is not authorized to use the API", @base.statusmsg
76
72
  end
77
73
  end
78
74
 
79
75
  def test_invalid_key_or_id
80
76
  VCR.use_cassette "base/invalid_key" do
81
- assert_raise RuntimeError do
82
- @base.perform_request(:action => 'badkey')
83
- end
77
+ @base.perform_request(:action => 'badkey')
78
+
79
+ assert !@base.successful?
80
+ assert_equal "Invalid ID or key", @base.statusmsg
84
81
  end
85
82
  end
86
83
 
87
84
  def test_node_does_not_exist
88
85
  VCR.use_cassette "base/nonexistent_node" do
89
- assert_raise RuntimeError do
90
- @base.perform_request(:action => 'nodeexist')
91
- end
86
+ @base.perform_request(:action => 'nodeexist')
87
+
88
+ assert !@base.successful?
89
+ assert_equal "Node does not exist", @base.statusmsg
92
90
  end
93
91
  end
94
92
 
95
93
  def test_invalid_http_status
96
94
  VCR.use_cassette "base/invalid_status" do
97
- assert_raise Solusvm::SolusvmError do
98
- @base.perform_request(:action => 'httperror')
99
- end
95
+ @base.perform_request(:action => 'httperror')
96
+
97
+ assert !@base.successful?
98
+ assert_equal "Bad HTTP Status: 404", @base.statusmsg
100
99
  end
101
-
102
100
  end
103
101
  end
@@ -20,11 +20,7 @@ class TestGeneral < Test::Unit::TestCase
20
20
  end
21
21
 
22
22
  def test_templates_with_invalid_type
23
- VCR.use_cassette "general/templates" do
24
- assert_raise Solusvm::SolusvmError do
25
- @general.templates('badserver')
26
- end
27
- end
23
+ assert !@general.templates('badserver')
28
24
  end
29
25
 
30
26
  def test_plans
@@ -40,11 +36,7 @@ class TestGeneral < Test::Unit::TestCase
40
36
  end
41
37
 
42
38
  def test_plans_with_invalid_type
43
- VCR.use_cassette "general/plans" do
44
- assert_raise Solusvm::SolusvmError do
45
- @general.plans('whatever')
46
- end
47
- end
39
+ assert !@general.plans('whatever')
48
40
  end
49
41
 
50
42
  def test_isos
@@ -60,10 +52,6 @@ class TestGeneral < Test::Unit::TestCase
60
52
  end
61
53
 
62
54
  def test_isos_with_invalid_type
63
- VCR.use_cassette "general/isos" do
64
- assert_raise Solusvm::SolusvmError do
65
- @general.isos('whatever')
66
- end
67
- end
55
+ assert !@general.isos('whatever')
68
56
  end
69
57
  end
@@ -13,24 +13,22 @@ class TestNode < Test::Unit::TestCase
13
13
  end
14
14
 
15
15
  def test_list_empty
16
- VCR.use_cassette "node/list" do
16
+ VCR.use_cassette "node/list" do
17
17
  assert !@nodes.list('openvz')
18
18
  end
19
19
  end
20
20
 
21
21
  def test_nodes_with_invalid_type
22
- assert_raise Solusvm::SolusvmError do
23
- @nodes.list('whatever')
24
- end
22
+ assert !@nodes.list('whatever')
25
23
  end
26
24
 
27
25
  def test_statistics
28
26
  VCR.use_cassette "node/statistics" do
29
27
  @nodes.statistics(1)
30
28
  end
31
-
29
+
32
30
  node_statistics = @nodes.returned_parameters
33
-
31
+
34
32
  assert_equal '1000', node_statistics['freedisk']
35
33
  assert_equal '22', node_statistics['sshport']
36
34
  assert_equal 'city', node_statistics['city']
@@ -49,7 +47,7 @@ class TestNode < Test::Unit::TestCase
49
47
  def test_list_all_ips_available
50
48
  Solusvm.config("api_id1", api_login[:key], :url => 'http://www.example.com/api')
51
49
  VCR.use_cassette "node/available_ips" do
52
- assert_equal %w(123.123.123.123 124.124.124.124 125.125.125.125).sort, @nodes.available_ips(1).sort
50
+ assert_equal %w(123.123.123.123 124.124.124.124 125.125.125.125).sort, @nodes.available_ips(1).sort
53
51
  end
54
52
  end
55
53
 
@@ -67,9 +65,7 @@ class TestNode < Test::Unit::TestCase
67
65
  end
68
66
 
69
67
  def test_nodes_ids_error
70
- assert_raise Solusvm::SolusvmError do
71
- @nodes.ids('whatever')
72
- end
68
+ assert !@nodes.ids('whatever')
73
69
  end
74
70
 
75
71
  def test_virtualservers
@@ -77,9 +73,9 @@ class TestNode < Test::Unit::TestCase
77
73
  VCR.use_cassette "node/virtualservers" do
78
74
  @nodes.virtualservers(1)
79
75
  end
80
-
76
+
81
77
  server = @nodes.returned_parameters["virtualservers"]["virtualserver"].first
82
-
78
+
83
79
  assert_equal "theid", server["vserverid"]
84
80
  assert_equal "thexid", server["ctid-xid"]
85
81
  assert_equal "theclientid", server["clientid"]
@@ -111,9 +107,9 @@ class TestNode < Test::Unit::TestCase
111
107
  VCR.use_cassette "node/xenresources" do
112
108
  @nodes.xenresources(1)
113
109
  end
114
-
110
+
115
111
  node_resources = @nodes.returned_parameters
116
-
112
+
117
113
  assert_equal 'thefreememory', node_resources['freememory']
118
114
  assert_equal 'thefreehdd', node_resources['freehdd']
119
115
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solusvm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.beta2
5
- prerelease: 6
4
+ version: 1.2.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Justin Mazzi
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-13 00:00:00.000000000 Z
12
+ date: 2012-08-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: xml-simple
@@ -182,13 +182,11 @@ files:
182
182
  - lib/solusvm/cli/reseller_cli.rb
183
183
  - lib/solusvm/cli/server_cli.rb
184
184
  - lib/solusvm/client.rb
185
- - lib/solusvm/exceptions.rb
186
185
  - lib/solusvm/general.rb
187
186
  - lib/solusvm/hash.rb
188
187
  - lib/solusvm/node.rb
189
188
  - lib/solusvm/reseller.rb
190
189
  - lib/solusvm/server.rb
191
- - lib/solusvm/solusvm_errors.rb
192
190
  - lib/solusvm/version.rb
193
191
  - solusvm.gemspec
194
192
  - test/cli/test_base_cli.rb
@@ -278,90 +276,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
278
276
  version: '0'
279
277
  segments:
280
278
  - 0
281
- hash: -963033860729967788
279
+ hash: -2927450006008360826
282
280
  required_rubygems_version: !ruby/object:Gem::Requirement
283
281
  none: false
284
282
  requirements:
285
- - - ! '>'
283
+ - - ! '>='
286
284
  - !ruby/object:Gem::Version
287
- version: 1.3.1
285
+ version: '0'
286
+ segments:
287
+ - 0
288
+ hash: -2927450006008360826
288
289
  requirements: []
289
290
  rubyforge_project: solusvm
290
- rubygems_version: 1.8.21
291
+ rubygems_version: 1.8.23
291
292
  signing_key:
292
293
  specification_version: 3
293
294
  summary: Wrapper for the SolusVM Admin::API
294
- test_files:
295
- - test/cli/test_base_cli.rb
296
- - test/cli/test_client_cli.rb
297
- - test/cli/test_general_cli.rb
298
- - test/cli/test_node_cli.rb
299
- - test/cli/test_reseller_cli.rb
300
- - test/cli/test_server_cli.rb
301
- - test/solusvm/test_base.rb
302
- - test/solusvm/test_cli.rb
303
- - test/solusvm/test_client.rb
304
- - test/solusvm/test_general.rb
305
- - test/solusvm/test_hash.rb
306
- - test/solusvm/test_node.rb
307
- - test/solusvm/test_reseller.rb
308
- - test/solusvm/test_server.rb
309
- - test/test_helper.rb
310
- - test/test_solusvm.rb
311
- - test/vcr_cassettes/base/invalid_key.yml
312
- - test/vcr_cassettes/base/invalid_status.yml
313
- - test/vcr_cassettes/base/nonexistent_node.yml
314
- - test/vcr_cassettes/base/parse_response.yml
315
- - test/vcr_cassettes/base/statusmsg.yml
316
- - test/vcr_cassettes/base/successful.yml
317
- - test/vcr_cassettes/base/unauthorized_ip.yml
318
- - test/vcr_cassettes/client/authenticate.yml
319
- - test/vcr_cassettes/client/change_password.yml
320
- - test/vcr_cassettes/client/create.yml
321
- - test/vcr_cassettes/client/delete.yml
322
- - test/vcr_cassettes/client/exists.yml
323
- - test/vcr_cassettes/client/list.yml
324
- - test/vcr_cassettes/general/isos.yml
325
- - test/vcr_cassettes/general/plans.yml
326
- - test/vcr_cassettes/general/templates.yml
327
- - test/vcr_cassettes/node/available_ips.yml
328
- - test/vcr_cassettes/node/ids.yml
329
- - test/vcr_cassettes/node/list.yml
330
- - test/vcr_cassettes/node/statistics.yml
331
- - test/vcr_cassettes/node/virtualservers.yml
332
- - test/vcr_cassettes/node/xenresources.yml
333
- - test/vcr_cassettes/reseller/change_resources.yml
334
- - test/vcr_cassettes/reseller/create.yml
335
- - test/vcr_cassettes/reseller/delete.yml
336
- - test/vcr_cassettes/reseller/info.yml
337
- - test/vcr_cassettes/reseller/list.yml
338
- - test/vcr_cassettes/server/.yml
339
- - test/vcr_cassettes/server/boot.yml
340
- - test/vcr_cassettes/server/change_bootorder.yml
341
- - test/vcr_cassettes/server/change_consolepass.yml
342
- - test/vcr_cassettes/server/change_hostname.yml
343
- - test/vcr_cassettes/server/change_owner.yml
344
- - test/vcr_cassettes/server/change_plan.yml
345
- - test/vcr_cassettes/server/change_rootpassword.yml
346
- - test/vcr_cassettes/server/change_vncpass.yml
347
- - test/vcr_cassettes/server/console.yml
348
- - test/vcr_cassettes/server/create.yml
349
- - test/vcr_cassettes/server/exists.yml
350
- - test/vcr_cassettes/server/info.yml
351
- - test/vcr_cassettes/server/info_all.yml
352
- - test/vcr_cassettes/server/mountiso.yml
353
- - test/vcr_cassettes/server/network_disable.yml
354
- - test/vcr_cassettes/server/network_enable.yml
355
- - test/vcr_cassettes/server/pae_disable.yml
356
- - test/vcr_cassettes/server/pae_enable.yml
357
- - test/vcr_cassettes/server/reboot.yml
358
- - test/vcr_cassettes/server/rebuild.yml
359
- - test/vcr_cassettes/server/resume.yml
360
- - test/vcr_cassettes/server/shutdown.yml
361
- - test/vcr_cassettes/server/status.yml
362
- - test/vcr_cassettes/server/suspend.yml
363
- - test/vcr_cassettes/server/terminate.yml
364
- - test/vcr_cassettes/server/tun_disable.yml
365
- - test/vcr_cassettes/server/tun_enable.yml
366
- - test/vcr_cassettes/server/unmountiso.yml
367
- - test/vcr_cassettes/server/vnc.yml
295
+ test_files: []
@@ -1,4 +0,0 @@
1
- module Solusvm
2
- class SolusvmError < StandardError
3
- end
4
- end
@@ -1,22 +0,0 @@
1
- module Solusvm
2
- class SolusvmErrors < Faraday::Response::Middleware
3
-
4
- def on_complete(env)
5
- if (200..299).include? env[:status]
6
- # Checks for application errors
7
- case env[:body].downcase
8
- when /invalid ipaddress/i
9
- raise "This IP is not authorized to use the API"
10
- when /Invalid id or key/i
11
- raise "Invalid ID or key"
12
- when /Node not found/i
13
- raise "Node does not exist"
14
- end
15
- else
16
- raise SolusvmError, "Bad HTTP Status: #{env[:status]}"
17
- end
18
-
19
- end
20
-
21
- end
22
- end