solusvm 1.0.0.beta2 → 1.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
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