solusvm 1.0.0.beta2 → 1.0.0.beta3

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.
data/lib/solusvm/base.rb CHANGED
@@ -28,7 +28,7 @@ module Solusvm
28
28
  request = Net::HTTP::Get.new("#{api_endpoint.path}?#{options.to_query}")
29
29
  response = http.request(request)
30
30
 
31
- handle_errors(response.body)
31
+ handle_errors(response)
32
32
  @returned_parameters = parse_response(response.body, force_array)
33
33
  log_messages(options)
34
34
  end
@@ -45,20 +45,32 @@ module Solusvm
45
45
  XmlSimple.xml_in(body, 'ForceArray' => force_array)
46
46
  end
47
47
 
48
+ # Parses a returned_parameters value as a list, if present.
49
+ def parse_returned_params_as_list(attribute)
50
+ if returned_parameters[attribute] && !returned_parameters[attribute].empty?
51
+ returned_parameters[attribute].to_s.split(',')
52
+ end
53
+ end
54
+
48
55
  # Look for known error messages
49
- def handle_errors(body)
50
- case body.downcase
51
- when /invalid ipaddress/i
52
- raise "This IP is not authorized to use the API"
53
- when /Invalid id or key/i
54
- raise "Invalid ID or key"
55
- when /Node not found/i
56
- raise "Node does not exist"
56
+ def handle_errors(response)
57
+ if (200..299).include? response.code.to_i
58
+ # Checks for application errors
59
+ case response.body.downcase
60
+ when /invalid ipaddress/i
61
+ raise "This IP is not authorized to use the API"
62
+ when /Invalid id or key/i
63
+ raise "Invalid ID or key"
64
+ when /Node not found/i
65
+ raise "Node does not exist"
66
+ end
67
+ else
68
+ raise SolusvmError, "Bad HTTP Status: #{response.code}"
57
69
  end
58
70
  end
59
71
 
60
72
  # Returns true when a request has been successful
61
- #
73
+ #
62
74
  # my_class = MyClass.new
63
75
  # my_class.create_server('example.com')
64
76
  # my_class.successful? # => true
@@ -77,7 +89,7 @@ module Solusvm
77
89
 
78
90
  def log_messages(options)
79
91
  logger, logger_method = Solusvm.api_options[:logger], Solusvm.api_options[:logger_method]
80
-
92
+
81
93
  if logger && logger.respond_to?(logger_method)
82
94
  logger.send(logger_method, "[Start] => #{options[:action]}")
83
95
  returned_parameters.each do |k,v|
@@ -94,7 +106,7 @@ module Solusvm
94
106
 
95
107
  # Raises an exception unless a valid type is specified
96
108
  def validate_server_type!(type)
97
- type.strip!
109
+ type = type.strip
98
110
  unless VALID_SERVER_TYPES.include?(type)
99
111
  raise SolusvmError, "Invalid Virtual Server type: #{type}"
100
112
  end
@@ -6,38 +6,44 @@ require 'solusvm/version'
6
6
  module Solusvm
7
7
  class BaseCli < Thor
8
8
  include Thor::Actions
9
+
10
+ class << self
11
+ # Overrides the default banner implementation to output the whole command
12
+ def banner(task, namespace = true, subcommand = false)
13
+ "#{self.namespace.split(":").join(" ")} #{task.formatted_usage(self, false, false)}"
14
+ end
9
15
 
10
- # Retrieves default options coming from a configuration file, if any.
11
- def self.default_option(key)
12
- @@yaml ||= begin
13
- file = File.join(File.expand_path(ENV['HOME']), '.solusvm.yml')
14
- if File.exists?(file)
15
- YAML::load(File.open(file))
16
+ # Convenience method to get the namespace from the class name. It's the
17
+ # same as Thor default except that the "_cli" at the end of the class
18
+ # is removed.
19
+ def namespace(name=nil)
20
+ if name
21
+ super
16
22
  else
17
- {}
23
+ @namespace ||= super.sub(/_cli$/, '')
18
24
  end
19
25
  end
20
26
 
21
- @@yaml[key.to_s]
22
- end
27
+ # Retrieves default options coming from a configuration file, if any.
28
+ def default_option(key)
29
+ @@yaml ||= begin
30
+ file = File.join(File.expand_path(ENV['HOME']), '.solusvm.yml')
31
+ if File.exists?(file)
32
+ YAML::load(File.open(file))
33
+ else
34
+ {}
35
+ end
36
+ end
23
37
 
24
- # Convenience method to get the namespace from the class name. It's the
25
- # same as Thor default except that the "_cli" at the end of the class
26
- # is removed.
27
- def self.namespace(name=nil)
28
- return super if name
29
- @namespace ||= super.sub(/_cli$/, '')
38
+ @@yaml[key.to_s]
39
+ end
30
40
  end
31
-
41
+
42
+ # Default required options
32
43
  class_option :api_login, :type => :string, :desc => "API ID; Required.", :aliases => ["-I", "--api-login"], :default => default_option(:id)
33
44
  class_option :api_key, :type => :string, :desc => "API KEY; Required.", :aliases => ["-K", "--api-key"], :default => default_option(:key)
34
45
  class_option :api_url, :type => :string, :desc => "API URL; Required.", :aliases => ["-U", "--api-url"], :default => default_option(:url)
35
46
 
36
- # Overrides the default banner implementation to output the whole command
37
- def self.banner(task, namespace = true, subcommand = false)
38
- "#{self.namespace.split(":").join(" ")} #{task.formatted_usage(self, false, false)}"
39
- end
40
-
41
47
  protected
42
48
 
43
49
  def configure
@@ -10,7 +10,7 @@ module Solusvm
10
10
  def templates(type)
11
11
  validate_server_type!(type)
12
12
  perform_request(:action => 'listtemplates', :type => type)
13
- returned_parameters['templates'].split(',')
13
+ parse_returned_params_as_list('templates')
14
14
  end
15
15
 
16
16
  # Lists available plans.
@@ -21,7 +21,7 @@ module Solusvm
21
21
  def plans(type)
22
22
  validate_server_type!(type)
23
23
  perform_request(:action => 'listplans', :type => type)
24
- returned_parameters['plans'].split(',')
24
+ parse_returned_params_as_list('plans')
25
25
  end
26
26
 
27
27
  # Lists available isos.
@@ -32,7 +32,7 @@ module Solusvm
32
32
  def isos(type)
33
33
  validate_server_type!(type)
34
34
  perform_request(:action => 'listiso', :type => type)
35
- returned_parameters['iso'].split(',')
35
+ parse_returned_params_as_list('iso')
36
36
  end
37
37
  end
38
38
  end
data/lib/solusvm/node.rb CHANGED
@@ -10,7 +10,7 @@ module Solusvm
10
10
  def list(type)
11
11
  validate_server_type!(type)
12
12
  perform_request(:action => 'listnodes', :type => type)
13
- returned_parameters['nodes'].split(',')
13
+ parse_returned_params_as_list('nodes')
14
14
  end
15
15
 
16
16
  # Lists existing nodes ids of a given type.
@@ -65,7 +65,7 @@ module Solusvm
65
65
  # Lists existing resellers.
66
66
  def list
67
67
  perform_request(:action => 'reseller-list')
68
- returned_parameters['usernames'].split(',')
68
+ parse_returned_params_as_list('usernames')
69
69
  end
70
70
 
71
71
  end
@@ -1,3 +1,3 @@
1
1
  module Solusvm
2
- VERSION = "1.0.0.beta2"
2
+ VERSION = "1.0.0.beta3"
3
3
  end
data/test/test_base.rb CHANGED
@@ -75,7 +75,7 @@ class TestBase < Test::Unit::TestCase
75
75
  begin
76
76
  @base.perform_request(:action => 'unauthorized')
77
77
  rescue Exception => e
78
- message = e
78
+ message = e
79
79
  end
80
80
  assert_equal "This IP is not authorized to use the API", message.to_s
81
81
  end
@@ -86,7 +86,7 @@ class TestBase < Test::Unit::TestCase
86
86
  begin
87
87
  @base.perform_request(:action => 'badkey')
88
88
  rescue Exception => e
89
- message = e
89
+ message = e
90
90
  end
91
91
  assert_equal "Invalid ID or key", message.to_s
92
92
  end
@@ -97,8 +97,19 @@ class TestBase < Test::Unit::TestCase
97
97
  begin
98
98
  @base.perform_request(:action => 'nodeexist')
99
99
  rescue Exception => e
100
- message = e
100
+ message = e
101
101
  end
102
102
  assert_equal "Node does not exist", message.to_s
103
103
  end
104
+
105
+ def test_invalid_http_status
106
+ FakeWeb.register_uri(:get, "#{base_uri}&action=httperror", :body => "", :status => ["404", "Not Found"])
107
+ message = ""
108
+ begin
109
+ @base.perform_request(:action => 'httperror')
110
+ rescue Solusvm::SolusvmError => e
111
+ message = e
112
+ end
113
+ assert_equal "Bad HTTP Status: 404", message.to_s
114
+ end
104
115
  end
data/test/test_general.rb CHANGED
@@ -13,7 +13,12 @@ class TestGeneral < Test::Unit::TestCase
13
13
  assert_equal %w(template1 template2 template3), @general.templates('xen')
14
14
  end
15
15
 
16
- def test_templates_error
16
+ def test_templates_empty
17
+ FakeWeb.register_uri(:get, "#{base_uri}&action=listtemplates&type=xen", :body => load_response('error'))
18
+ assert !@general.templates('xen')
19
+ end
20
+
21
+ def test_templates_with_invalid_type
17
22
  FakeWeb.register_uri(:get, "#{base_uri}&action=listtemplates&type=whatever", :body => load_response('error'))
18
23
  begin
19
24
  @general.templates('whatever')
@@ -28,7 +33,12 @@ class TestGeneral < Test::Unit::TestCase
28
33
  assert_equal %w(plan1 plan2 plan3 plan4), @general.plans('xen')
29
34
  end
30
35
 
31
- def test_plans_error
36
+ def test_plans_empty
37
+ FakeWeb.register_uri(:get, "#{base_uri}&action=listplans&type=xen", :body => load_response('error'))
38
+ assert !@general.plans('xen')
39
+ end
40
+
41
+ def test_plans_with_invalid_type
32
42
  FakeWeb.register_uri(:get, "#{base_uri}&action=listplans&type=whatever", :body => load_response('error'))
33
43
  begin
34
44
  @general.plans('whatever')
@@ -43,7 +53,12 @@ class TestGeneral < Test::Unit::TestCase
43
53
  assert_equal %w(iso1 iso2 iso3), @general.isos('xen')
44
54
  end
45
55
 
46
- def test_isos_error
56
+ def test_isos_empty
57
+ FakeWeb.register_uri(:get, "#{base_uri}&action=listiso&type=xen", :body => load_response('error'))
58
+ assert !@general.isos('xen')
59
+ end
60
+
61
+ def test_isos_with_invalid_type
47
62
  FakeWeb.register_uri(:get, "#{base_uri}&action=listiso&type=whatever", :body => load_response('error'))
48
63
  begin
49
64
  @general.isos('whatever')
data/test/test_node.rb CHANGED
@@ -9,11 +9,16 @@ class TestNode < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_list
12
- FakeWeb.register_uri(:get, "#{base_uri}&action=listnodes&type=xen", :body => load_response('general_nodes_success'))
12
+ FakeWeb.register_uri(:get, "#{base_uri}&action=listnodes&type=xen", :body => load_response('nodes_list_success'))
13
13
  assert_equal %w(node1 node2 node3 node4), @nodes.list('xen')
14
14
  end
15
15
 
16
- def test_nodes_error
16
+ def test_list_empty
17
+ FakeWeb.register_uri(:get, "#{base_uri}&action=listnodes&type=xen", :body => load_response('error'))
18
+ assert !@nodes.list('xen')
19
+ end
20
+
21
+ def test_nodes_with_invalid_type
17
22
  FakeWeb.register_uri(:get, "#{base_uri}&action=listnodes&type=whatever", :body => load_response('error'))
18
23
  begin
19
24
  @nodes.list('whatever')
@@ -24,7 +29,7 @@ class TestNode < Test::Unit::TestCase
24
29
  end
25
30
 
26
31
  def test_statistics
27
- FakeWeb.register_uri(:get, "#{base_uri}&action=node-statistics&nodeid=1", :body => load_response('general_node_statistics_success'))
32
+ FakeWeb.register_uri(:get, "#{base_uri}&action=node-statistics&nodeid=1", :body => load_response('node_statistics_success'))
28
33
  node_statistics = @nodes.statistics(1)
29
34
 
30
35
  assert_equal '1000', node_statistics['freedisk']
@@ -43,17 +48,17 @@ class TestNode < Test::Unit::TestCase
43
48
  end
44
49
 
45
50
  def test_list_all_ips_available
46
- FakeWeb.register_uri(:get, "#{base_uri}&action=node-iplist&nodeid=1", :body => load_response('general_node_list_all_ips_available'))
51
+ FakeWeb.register_uri(:get, "#{base_uri}&action=node-iplist&nodeid=1", :body => load_response('node_list_all_ips_available'))
47
52
  assert_equal %w(123.123.123.123 124.124.124.124 125.125.125.125).sort, @nodes.available_ips(1).sort
48
53
  end
49
54
 
50
55
  def test_list_all_ips_not_available
51
- FakeWeb.register_uri(:get, "#{base_uri}&action=node-iplist&nodeid=1", :body => load_response('general_node_list_all_ips_not_available'))
56
+ FakeWeb.register_uri(:get, "#{base_uri}&action=node-iplist&nodeid=1", :body => load_response('node_list_all_ips_not_available'))
52
57
  assert @nodes.available_ips(1).empty?
53
58
  end
54
59
 
55
60
  def test_ids
56
- FakeWeb.register_uri(:get, "#{base_uri}&action=node-idlist&type=xen", :body => load_response('general_nodes_ids_success'))
61
+ FakeWeb.register_uri(:get, "#{base_uri}&action=node-idlist&type=xen", :body => load_response('nodes_ids_success'))
57
62
  assert_equal %w(nodeid1 nodeid2 nodeid3 nodeid4), @nodes.ids('xen')
58
63
  end
59
64
 
@@ -68,7 +73,7 @@ class TestNode < Test::Unit::TestCase
68
73
  end
69
74
 
70
75
  def test_virtualservers
71
- FakeWeb.register_uri(:get, "#{base_uri}&action=node-virtualservers&nodeid=1", :body => load_response('general_node_virtualservers_success'))
76
+ FakeWeb.register_uri(:get, "#{base_uri}&action=node-virtualservers&nodeid=1", :body => load_response('node_virtualservers_success'))
72
77
 
73
78
  servers = @nodes.virtualservers(1)
74
79
  assert_equal 1, servers.size
@@ -88,7 +93,7 @@ class TestNode < Test::Unit::TestCase
88
93
  end
89
94
 
90
95
  def test_virtualservers_empty
91
- FakeWeb.register_uri(:get, "#{base_uri}&action=node-virtualservers&nodeid=1", :body => load_response('general_node_virtualservers_success_empty'))
96
+ FakeWeb.register_uri(:get, "#{base_uri}&action=node-virtualservers&nodeid=1", :body => load_response('node_virtualservers_success_empty'))
92
97
  assert @nodes.virtualservers(1).empty?
93
98
  end
94
99
 
@@ -98,7 +103,7 @@ class TestNode < Test::Unit::TestCase
98
103
  end
99
104
 
100
105
  def test_xenresources
101
- FakeWeb.register_uri(:get, "#{base_uri}&action=node-xenresources&nodeid=1", :body => load_response('general_node_xenresources_success'))
106
+ FakeWeb.register_uri(:get, "#{base_uri}&action=node-xenresources&nodeid=1", :body => load_response('node_xenresources_success'))
102
107
  node_resources = @nodes.xenresources(1)
103
108
 
104
109
  assert_equal 'thefreememory', node_resources['freememory']
@@ -67,6 +67,11 @@ class TestReseller < Test::Unit::TestCase
67
67
  assert_equal %w(username1 username2 username3), @reseller.list
68
68
  end
69
69
 
70
+ def test_list_empty
71
+ FakeWeb.register_uri(:get, "#{base_uri}&action=reseller-list", :body => load_response('error'))
72
+ assert !@reseller.list
73
+ end
74
+
70
75
  def test_delete
71
76
  FakeWeb.register_uri(:get, "#{base_uri}&action=reseller-delete&username=vps123", :body => load_response('reseller_delete_success'))
72
77
  assert @reseller.delete("vps123")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solusvm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta2
4
+ version: 1.0.0.beta3
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: xml-simple
17
- requirement: &15026220 !ruby/object:Gem::Requirement
17
+ requirement: &10478600 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.1.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *15026220
25
+ version_requirements: *10478600
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: thor
28
- requirement: &15025220 !ruby/object:Gem::Requirement
28
+ requirement: &10477860 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 0.14.6
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *15025220
36
+ version_requirements: *10477860
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: redgreen
39
- requirement: &15024020 !ruby/object:Gem::Requirement
39
+ requirement: &10476700 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 1.2.2
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *15024020
47
+ version_requirements: *10476700
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: fakeweb
50
- requirement: &15023240 !ruby/object:Gem::Requirement
50
+ requirement: &10474880 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 1.3.0
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *15023240
58
+ version_requirements: *10474880
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: mocha
61
- requirement: &15022480 !ruby/object:Gem::Requirement
61
+ requirement: &10473260 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ~>
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: 0.10.3
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *15022480
69
+ version_requirements: *10473260
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rdoc
72
- requirement: &15021900 !ruby/object:Gem::Requirement
72
+ requirement: &10472140 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ~>
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: '3.12'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *15021900
80
+ version_requirements: *10472140
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: rake
83
- requirement: &15021240 !ruby/object:Gem::Requirement
83
+ requirement: &10471240 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ~>
@@ -88,7 +88,7 @@ dependencies:
88
88
  version: 0.9.2.2
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *15021240
91
+ version_requirements: *10471240
92
92
  description: Solusvm allows for easy interaction with the SolusVM Admin::API.
93
93
  email:
94
94
  - jmazzi@gmail.com
@@ -145,16 +145,16 @@ files:
145
145
  - test/fixtures/client_list_success_empty.txt
146
146
  - test/fixtures/error.txt
147
147
  - test/fixtures/general_isos_success.txt
148
- - test/fixtures/general_node_list_all_ips_available.txt
149
- - test/fixtures/general_node_list_all_ips_not_available.txt
150
- - test/fixtures/general_node_statistics_success.txt
151
- - test/fixtures/general_node_virtualservers_success.txt
152
- - test/fixtures/general_node_virtualservers_success_empty.txt
153
- - test/fixtures/general_node_xenresources_success.txt
154
- - test/fixtures/general_nodes_ids_success.txt
155
- - test/fixtures/general_nodes_success.txt
156
148
  - test/fixtures/general_plans_success.txt
157
149
  - test/fixtures/general_templates_success.txt
150
+ - test/fixtures/node_list_all_ips_available.txt
151
+ - test/fixtures/node_list_all_ips_not_available.txt
152
+ - test/fixtures/node_statistics_success.txt
153
+ - test/fixtures/node_virtualservers_success.txt
154
+ - test/fixtures/node_virtualservers_success_empty.txt
155
+ - test/fixtures/node_xenresources_success.txt
156
+ - test/fixtures/nodes_ids_success.txt
157
+ - test/fixtures/nodes_list_success.txt
158
158
  - test/fixtures/reseller_change_resources_success.txt
159
159
  - test/fixtures/reseller_create_success.txt
160
160
  - test/fixtures/reseller_delete_success.txt
@@ -213,7 +213,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
213
213
  version: '0'
214
214
  segments:
215
215
  - 0
216
- hash: 4337387384446240597
216
+ hash: 429201309612601316
217
217
  required_rubygems_version: !ruby/object:Gem::Requirement
218
218
  none: false
219
219
  requirements:
@@ -247,16 +247,16 @@ test_files:
247
247
  - test/fixtures/client_list_success_empty.txt
248
248
  - test/fixtures/error.txt
249
249
  - test/fixtures/general_isos_success.txt
250
- - test/fixtures/general_node_list_all_ips_available.txt
251
- - test/fixtures/general_node_list_all_ips_not_available.txt
252
- - test/fixtures/general_node_statistics_success.txt
253
- - test/fixtures/general_node_virtualservers_success.txt
254
- - test/fixtures/general_node_virtualservers_success_empty.txt
255
- - test/fixtures/general_node_xenresources_success.txt
256
- - test/fixtures/general_nodes_ids_success.txt
257
- - test/fixtures/general_nodes_success.txt
258
250
  - test/fixtures/general_plans_success.txt
259
251
  - test/fixtures/general_templates_success.txt
252
+ - test/fixtures/node_list_all_ips_available.txt
253
+ - test/fixtures/node_list_all_ips_not_available.txt
254
+ - test/fixtures/node_statistics_success.txt
255
+ - test/fixtures/node_virtualservers_success.txt
256
+ - test/fixtures/node_virtualservers_success_empty.txt
257
+ - test/fixtures/node_xenresources_success.txt
258
+ - test/fixtures/nodes_ids_success.txt
259
+ - test/fixtures/nodes_list_success.txt
260
260
  - test/fixtures/reseller_change_resources_success.txt
261
261
  - test/fixtures/reseller_create_success.txt
262
262
  - test/fixtures/reseller_delete_success.txt