linode 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,11 @@
1
1
 
2
+ 0.7.0 / 2011-07-07
3
+ ==================
4
+ * Added support for Nodebalancer API calls
5
+ * Changed HTTP GETs to HTTP POSTs to work around errors with large stackscripts (credit: Dan Hodos)
6
+ * Updated documentation references in error messages to match API documentation on Linode website
7
+
8
+
2
9
  0.6.3 / 2010-11-23
3
10
  ==================
4
11
  * Can now initialize w/ username/pass; also support for user.getapikey API call
data/README CHANGED
@@ -140,4 +140,5 @@ Here is an annoyingly exhaustive IRB session where I play around with the API:
140
140
  irb> ^D@ Wed Aug 05 01:50:52 rick@Yer-Moms-Computer
141
141
 
142
142
  CREDITS:
143
+ - Thanks to Dan Hodos (github: danhodos) for diagnosing and fixing an issue with sending GET requests instead of POST request.
143
144
  - Thanks to Aaron Hamid for updates for RSpec 2 and work on user.getapikey + username/password initialization.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.3
1
+ 0.7.0
@@ -10,7 +10,7 @@ class Linode
10
10
  define_method(action.to_sym) do |*data|
11
11
  data = data.shift if data
12
12
  data ||= {}
13
- send_request(self.class.name.downcase.sub(/^linode::/, '').gsub(/::/, '.') + ".#{action}", data)
13
+ send_request(Linode.action_path(self.class.name, action), data)
14
14
  end
15
15
  end
16
16
  end
@@ -27,7 +27,30 @@ class Linode
27
27
  end
28
28
  end
29
29
 
30
- has_namespace :test, :avail, :user, :domain, :linode
30
+ has_namespace :test, :avail, :user, :domain, :linode, :nodebalancer
31
+
32
+ @@documentation_category = {}
33
+
34
+ def self.documentation_category(category)
35
+ @@documentation_category[class_to_path(name)] = category
36
+ end
37
+
38
+ def documentation_categories
39
+ @@documentation_category
40
+ end
41
+
42
+ def self.action_path(class_name, action)
43
+ Linode.class_to_path(class_name) + ".#{action}"
44
+ end
45
+
46
+ def self.class_to_path(class_name)
47
+ class_name.downcase.sub(/^linode::/, '').gsub(/::/, '.')
48
+ end
49
+
50
+ def documentation_path(action)
51
+ hits = action.match(/^(.*)\.[^.]+$/)
52
+ "http://www.linode.com/api/" + @@documentation_category[hits[1]] + '/' + action
53
+ end
31
54
 
32
55
  def initialize(args)
33
56
  @api_url = args[:api_url] if args[:api_url]
@@ -52,7 +75,7 @@ class Linode
52
75
 
53
76
  def send_request(action, data)
54
77
  data.delete_if {|k,v| [:api_key, :api_action, :api_responseFormat].include?(k) }
55
- response = get({ :api_key => api_key, :api_action => action, :api_responseFormat => 'json' }.merge(data))
78
+ response = post({ :api_key => api_key, :api_action => action, :api_responseFormat => 'json' }.merge(data))
56
79
  raise "Errors completing request [#{action}] @ [#{api_url}] with data [#{data.inspect}]:\n#{error_message(response, action)}" if error?(response)
57
80
  reformat_response(response)
58
81
  end
@@ -60,13 +83,13 @@ class Linode
60
83
  protected
61
84
 
62
85
  def fetch_api_key
63
- response = get(:api_action => 'user.getapikey', :api_responseFormat => 'json', :username => username, :password => password)
86
+ response = post(:api_action => 'user.getapikey', :api_responseFormat => 'json', :username => username, :password => password)
64
87
  raise "Errors completing request [user.getapikey] @ [#{api_url}] for username [#{username}]:\n#{error_message(response, 'user.getapikey')}" if error?(response)
65
88
  reformat_response(response).api_key
66
89
  end
67
90
 
68
- def get(data)
69
- Crack::JSON.parse(HTTParty.get(api_url, :query => data))
91
+ def post(data)
92
+ Crack::JSON.parse(HTTParty.post(api_url, :body => data))
70
93
  end
71
94
 
72
95
  def error?(response)
@@ -76,7 +99,7 @@ class Linode
76
99
  def error_message(response, action)
77
100
  response["ERRORARRAY"].collect { |err|
78
101
  " - Error \##{err["ERRORCODE"]} - #{err["ERRORMESSAGE"]}. "+
79
- "(Please consult http://www.linode.com/api/autodoc.cfm?method=#{action})"
102
+ "(Please consult #{documentation_path(action)})"
80
103
  }.join("\n")
81
104
  end
82
105
 
@@ -1,3 +1,4 @@
1
1
  class Linode::Avail < Linode
2
+ documentation_category 'utility'
2
3
  has_method :datacenters, :kernels, :linodeplans, :distributions, :stackscripts
3
4
  end
@@ -1,4 +1,5 @@
1
1
  class Linode::Domain < Linode
2
+ documentation_category 'dns'
2
3
  has_namespace :resource
3
4
  has_method :update, :create, :list, :delete
4
5
  end
@@ -1,3 +1,4 @@
1
1
  class Linode::Domain::Resource < Linode
2
+ documentation_category 'dns'
2
3
  has_method :create, :delete, :update, :list
3
4
  end
@@ -1,4 +1,5 @@
1
1
  class Linode::Linode < Linode
2
+ documentation_category "linode"
2
3
  has_namespace :config, :disk, :ip, :job
3
4
  has_method :update, :create, :list, :shutdown, :boot, :delete, :reboot
4
5
  end
@@ -1,3 +1,4 @@
1
1
  class Linode::Linode::Config < Linode
2
+ documentation_category 'linode'
2
3
  has_method :create, :delete, :update, :list
3
4
  end
@@ -1,3 +1,4 @@
1
1
  class Linode::Linode::Disk < Linode
2
+ documentation_category 'linode'
2
3
  has_method :update, :create, :list, :createfromdistribution, :createfromstackscript, :duplicate, :delete, :resize
3
4
  end
@@ -1,3 +1,4 @@
1
1
  class Linode::Linode::Ip < Linode
2
+ documentation_category 'linode'
2
3
  has_method :list
3
4
  end
@@ -1,3 +1,4 @@
1
1
  class Linode::Linode::Job < Linode
2
+ documentation_category 'linode'
2
3
  has_method :list
3
4
  end
@@ -0,0 +1,5 @@
1
+ class Linode::Nodebalancer < Linode
2
+ documentation_category 'nodebalancer'
3
+ has_namespace :config, :node
4
+ has_method :update, :create, :list, :delete
5
+ end
@@ -0,0 +1,4 @@
1
+ class Linode::Nodebalancer::Config < Linode
2
+ documentation_category 'nodebalancer'
3
+ has_method :create, :delete, :update, :list
4
+ end
@@ -0,0 +1,4 @@
1
+ class Linode::Nodebalancer::Node < Linode
2
+ documentation_category 'nodebalancer'
3
+ has_method :create, :delete, :update, :list
4
+ end
@@ -1,3 +1,4 @@
1
1
  class Linode::Stackscript < Linode
2
+ documentation_category 'stackscript'
2
3
  has_method :update, :create, :list, :delete
3
4
  end
@@ -1,3 +1,4 @@
1
1
  class Linode::Test < Linode
2
+ documentation_category 'utility'
2
3
  has_method :echo
3
4
  end
@@ -1,4 +1,6 @@
1
1
  class Linode::User < Linode
2
+ documentation_category 'utility'
3
+
2
4
  def getapikey
3
5
  api_key
4
6
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{linode}
8
- s.version = "0.6.3"
8
+ s.version = "0.7.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rick Bradley"]
12
- s.date = %q{2010-11-23}
12
+ s.date = %q{2011-07-07}
13
13
  s.description = %q{This is a wrapper around Linode's automation facilities.}
14
14
  s.email = %q{rick@rickbradley.com}
15
15
  s.extra_rdoc_files = [
@@ -32,6 +32,9 @@ Gem::Specification.new do |s|
32
32
  "lib/linode/linode/disk.rb",
33
33
  "lib/linode/linode/ip.rb",
34
34
  "lib/linode/linode/job.rb",
35
+ "lib/linode/nodebalancer.rb",
36
+ "lib/linode/nodebalancer/config.rb",
37
+ "lib/linode/nodebalancer/node.rb",
35
38
  "lib/linode/stackscript.rb",
36
39
  "lib/linode/test.rb",
37
40
  "lib/linode/user.rb",
@@ -44,6 +47,9 @@ Gem::Specification.new do |s|
44
47
  "spec/linode/linode/ip_spec.rb",
45
48
  "spec/linode/linode/job_spec.rb",
46
49
  "spec/linode/linode_spec.rb",
50
+ "spec/linode/nodebalancer/config_spec.rb",
51
+ "spec/linode/nodebalancer/node_spec.rb",
52
+ "spec/linode/nodebalancer_spec.rb",
47
53
  "spec/linode/stackscript_spec.rb",
48
54
  "spec/linode/test_spec.rb",
49
55
  "spec/linode/user_spec.rb",
@@ -63,6 +69,9 @@ Gem::Specification.new do |s|
63
69
  "spec/linode/linode/ip_spec.rb",
64
70
  "spec/linode/linode/job_spec.rb",
65
71
  "spec/linode/linode_spec.rb",
72
+ "spec/linode/nodebalancer/config_spec.rb",
73
+ "spec/linode/nodebalancer/node_spec.rb",
74
+ "spec/linode/nodebalancer_spec.rb",
66
75
  "spec/linode/stackscript_spec.rb",
67
76
  "spec/linode/test_spec.rb",
68
77
  "spec/linode/user_spec.rb",
@@ -39,7 +39,10 @@ describe Linode::Avail do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/utility/avail.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/utility/avail.#{action}"
45
+ end
42
46
  end
43
47
  end
44
-
45
48
  end
@@ -39,6 +39,10 @@ describe Linode::Domain::Resource do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/dns/domain.resource.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/dns/domain.resource.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -39,6 +39,10 @@ describe Linode::Domain do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/dns/domain.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/dns/domain.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
 
@@ -39,6 +39,10 @@ describe Linode::Linode::Config do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/linode/linode.config.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/linode/linode.config.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -39,6 +39,10 @@ describe Linode::Linode::Disk do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/linode/linode.disk.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/linode/linode.disk.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -39,6 +39,10 @@ describe Linode::Linode::Ip do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/linode/linode.ip.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/linode/linode.ip.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -39,6 +39,10 @@ describe Linode::Linode::Job do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/linode/linode.job.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/linode/linode.job.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -39,6 +39,10 @@ describe Linode::Linode do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/linode/linode.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/linode/linode.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
 
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
2
+ require 'linode'
3
+
4
+ describe Linode::Nodebalancer::Config do
5
+ before :each do
6
+ @api_key = 'foo'
7
+ @linode = Linode::Nodebalancer::Config.new(:api_key => @api_key)
8
+ end
9
+
10
+ it 'should be a Linode instance' do
11
+ @linode.class.should < Linode
12
+ end
13
+
14
+ %w(create delete update list).each do |action|
15
+ it "should allow accessing the #{action} API" do
16
+ @linode.should respond_to(action.to_sym)
17
+ end
18
+
19
+ describe "when accessing the #{action} API" do
20
+ it 'should allow a data hash' do
21
+ lambda { @linode.send(action.to_sym, {}) }.should_not raise_error(ArgumentError)
22
+ end
23
+
24
+ it 'should not require arguments' do
25
+ lambda { @linode.send(action.to_sym) }.should_not raise_error(ArgumentError)
26
+ end
27
+
28
+ it "should request the nodebalancer.config.#{action} action" do
29
+ @linode.expects(:send_request).with {|api_action, data| api_action == "nodebalancer.config.#{action}" }
30
+ @linode.send(action.to_sym)
31
+ end
32
+
33
+ it 'should provide the data hash when making its request' do
34
+ @linode.expects(:send_request).with {|api_action, data| data = { :foo => :bar } }
35
+ @linode.send(action.to_sym, {:foo => :bar})
36
+ end
37
+
38
+ it 'should return the result of the request' do
39
+ @linode.expects(:send_request).returns(:bar => :baz)
40
+ @linode.send(action.to_sym).should == { :bar => :baz }
41
+ end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/nodebalancer/nodebalancer.config.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/nodebalancer/nodebalancer.config.#{action}"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
2
+ require 'linode'
3
+
4
+ describe Linode::Nodebalancer::Node do
5
+ before :each do
6
+ @api_key = 'foo'
7
+ @linode = Linode::Nodebalancer::Node.new(:api_key => @api_key)
8
+ end
9
+
10
+ it 'should be a Linode instance' do
11
+ @linode.class.should < Linode
12
+ end
13
+
14
+ %w(create delete update list).each do |action|
15
+ it "should allow accessing the #{action} API" do
16
+ @linode.should respond_to(action.to_sym)
17
+ end
18
+
19
+ describe "when accessing the #{action} API" do
20
+ it 'should allow a data hash' do
21
+ lambda { @linode.send(action.to_sym, {}) }.should_not raise_error(ArgumentError)
22
+ end
23
+
24
+ it 'should not require arguments' do
25
+ lambda { @linode.send(action.to_sym) }.should_not raise_error(ArgumentError)
26
+ end
27
+
28
+ it "should request the nodebalancer.node.#{action} action" do
29
+ @linode.expects(:send_request).with {|api_action, data| api_action == "nodebalancer.node.#{action}" }
30
+ @linode.send(action.to_sym)
31
+ end
32
+
33
+ it 'should provide the data hash when making its request' do
34
+ @linode.expects(:send_request).with {|api_action, data| data = { :foo => :bar } }
35
+ @linode.send(action.to_sym, {:foo => :bar})
36
+ end
37
+
38
+ it 'should return the result of the request' do
39
+ @linode.expects(:send_request).returns(:bar => :baz)
40
+ @linode.send(action.to_sym).should == { :bar => :baz }
41
+ end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/nodebalancer/nodebalancer.node.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/nodebalancer/nodebalancer.node.#{action}"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,124 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
2
+ require 'linode'
3
+
4
+ describe Linode::Nodebalancer do
5
+ before :each do
6
+ @api_key = 'foo'
7
+ @linode = Linode::Nodebalancer.new(:api_key => @api_key)
8
+ end
9
+
10
+ it 'should be a Linode instance' do
11
+ @linode.class.should < Linode
12
+ end
13
+
14
+ %w(update create list delete).each do |action|
15
+ it "should allow accessing the #{action} API" do
16
+ @linode.should respond_to(action.to_sym)
17
+ end
18
+
19
+ describe "when accessing the #{action} API" do
20
+ it 'should allow a data hash' do
21
+ lambda { @linode.send(action.to_sym, {}) }.should_not raise_error(ArgumentError)
22
+ end
23
+
24
+ it 'should not require arguments' do
25
+ lambda { @linode.send(action.to_sym) }.should_not raise_error(ArgumentError)
26
+ end
27
+
28
+ it "should request the nodebalancer.#{action} action" do
29
+ @linode.expects(:send_request).with {|api_action, data| api_action == "nodebalancer.#{action}" }
30
+ @linode.send(action.to_sym)
31
+ end
32
+
33
+ it 'should provide the data hash when making its request' do
34
+ @linode.expects(:send_request).with {|api_action, data| data = { :foo => :bar } }
35
+ @linode.send(action.to_sym, {:foo => :bar})
36
+ end
37
+
38
+ it 'should return the result of the request' do
39
+ @linode.expects(:send_request).returns(:bar => :baz)
40
+ @linode.send(action.to_sym).should == { :bar => :baz }
41
+ end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/nodebalancer/nodebalancer.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/nodebalancer/nodebalancer.#{action}"
45
+ end
46
+ end
47
+ end
48
+
49
+ it 'should be able to provide access to the Linode Nodebalancer Config API' do
50
+ @linode.should respond_to(:config)
51
+ end
52
+
53
+ describe 'when providing access to the Linode Nodebalancer Config API' do
54
+ before :each do
55
+ @api_key = 'foo'
56
+ @api_url = 'https://fake.linode.com/'
57
+ @linode = Linode::Nodebalancer.new(:api_key => @api_key, :api_url => @api_url)
58
+ end
59
+
60
+ it 'should allow no arguments' do
61
+ lambda { @linode.config }.should_not raise_error(ArgumentError)
62
+ end
63
+
64
+ it 'should require no arguments' do
65
+ lambda { @linode.config(:foo) }.should raise_error(ArgumentError)
66
+ end
67
+
68
+ it 'should return a Linode::Nodebalancer::Config instance' do
69
+ @linode.config.class.should == Linode::Nodebalancer::Config
70
+ end
71
+
72
+ it 'should set the API key on the Linode::Nodebalancer::Config instance to be our API key' do
73
+ @linode.config.api_key.should == @api_key
74
+ end
75
+
76
+ it 'should set the API url on the Linode::Nodebalancer::Config instance to be our API url' do
77
+ @linode.config.api_url.should == @api_url
78
+ end
79
+
80
+ it 'should return the same Linode::Nodebalancer::Config instance when called again' do
81
+ linode = Linode::Nodebalancer.new(:api_key => @api_key)
82
+ result = linode.config
83
+ linode.config.should == result
84
+ end
85
+ end
86
+
87
+ it 'should be able to provide access to the Linode Nodebalancer Node API' do
88
+ @linode.should respond_to(:node)
89
+ end
90
+
91
+ describe 'when providing access to the Linode Nodebalancer Node API' do
92
+ before :each do
93
+ @api_key = 'foo'
94
+ @api_url = 'https://fake.linode.com/'
95
+ @linode = Linode::Nodebalancer.new(:api_key => @api_key, :api_url => @api_url)
96
+ end
97
+
98
+ it 'should allow no arguments' do
99
+ lambda { @linode.node }.should_not raise_error(ArgumentError)
100
+ end
101
+
102
+ it 'should require no arguments' do
103
+ lambda { @linode.node(:foo) }.should raise_error(ArgumentError)
104
+ end
105
+
106
+ it 'should return a Linode::Nodebalancer::Node instance' do
107
+ @linode.node.class.should == Linode::Nodebalancer::Node
108
+ end
109
+
110
+ it 'should set the API key on the Linode::Nodebalancer::Node instance to be our API key' do
111
+ @linode.node.api_key.should == @api_key
112
+ end
113
+
114
+ it 'should set the API url on the Linode::Nodebalancer::Node instance to be our API url' do
115
+ @linode.node.api_url.should == @api_url
116
+ end
117
+
118
+ it 'should return the same Linode::Nodebalancer::Node instance when called again' do
119
+ linode = Linode::Nodebalancer.new(:api_key => @api_key)
120
+ result = linode.node
121
+ linode.node.should == result
122
+ end
123
+ end
124
+ end
@@ -39,6 +39,10 @@ describe Linode::Stackscript do
39
39
  @linode.expects(:send_request).returns(:bar => :baz)
40
40
  @linode.send(action.to_sym).should == { :bar => :baz }
41
41
  end
42
+
43
+ it "should consider the documentation to live at http://www.linode.com/api/stackscript/stackscript.#{action}" do
44
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/stackscript/stackscript.#{action}"
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -40,6 +40,10 @@ describe Linode::Test do
40
40
  @linode.expects(:send_request).returns(:bar => :baz)
41
41
  @linode.send(action.to_sym).should == { :bar => :baz }
42
42
  end
43
+
44
+ it "should consider the documentation to live at http://www.linode.com/api/linode/linode.#{action}" do
45
+ @linode.documentation_path(Linode.action_path(@linode.class.name, action)).should == "http://www.linode.com/api/utility/test.#{action}"
46
+ end
43
47
  end
44
48
  end
45
49
  end
@@ -28,5 +28,9 @@ describe Linode::User do
28
28
  @linode.stubs(:api_key).returns('foo')
29
29
  @linode.getapikey.should == 'foo'
30
30
  end
31
+
32
+ it "should consider the documentation to live at http://www.linode.com/api/utility/user.getapikey" do
33
+ @linode.documentation_path(Linode.action_path(@linode.class.name, 'getapikey')).should == "http://www.linode.com/api/utility/user.getapikey"
34
+ end
31
35
  end
32
36
  end
@@ -70,8 +70,8 @@ describe 'Linode' do
70
70
 
71
71
  it 'should use the user.getapikey remote call to look up the API key associated with the username/password combo specified at creation time' do
72
72
  @json = '{"ERRORARRAY":[],"DATA":{"USERNAME":"ogc","API_KEY":"blahblahblah"},"ACTION":"user.getapikey"}'
73
- HTTParty.expects(:get).with(@api_url,
74
- :query => {
73
+ HTTParty.expects(:post).with(@api_url,
74
+ :body => {
75
75
  :api_action => 'user.getapikey',
76
76
  :api_responseFormat => 'json',
77
77
  :username => @username,
@@ -136,7 +136,7 @@ describe 'Linode' do
136
136
  "ACTION":"test.echo",
137
137
  "DATA":{"FOO":"bar"}
138
138
  }!
139
- HTTParty.stubs(:get).returns(@json)
139
+ HTTParty.stubs(:post).returns(@json)
140
140
  @linode.stubs(:api_url).returns('https://fake.linode.com/')
141
141
  end
142
142
 
@@ -150,63 +150,63 @@ describe 'Linode' do
150
150
 
151
151
  it 'should make a request to the API url' do
152
152
  @linode.stubs(:api_url).returns('https://fake.linode.com/')
153
- HTTParty.expects(:get).with { |path, args|
153
+ HTTParty.expects(:post).with { |path, args|
154
154
  path == 'https://fake.linode.com/'
155
155
  }.returns(@json)
156
156
  @linode.send_request('test.echo', { })
157
157
  end
158
158
 
159
159
  it 'should provide the API key when making its request' do
160
- HTTParty.expects(:get).with { |path, args|
161
- args[:query][:api_key] == @api_key
160
+ HTTParty.expects(:post).with { |path, args|
161
+ args[:body][:api_key] == @api_key
162
162
  }.returns(@json)
163
163
  @linode.send_request('test.echo', { })
164
164
  end
165
165
 
166
166
  it 'should set the designated request method as the HTTP API action' do
167
- HTTParty.expects(:get).with { |path, args|
168
- args[:query][:api_action] == 'test.echo'
167
+ HTTParty.expects(:post).with { |path, args|
168
+ args[:body][:api_action] == 'test.echo'
169
169
  }.returns(@json)
170
170
  @linode.send_request('test.echo', { })
171
171
  end
172
172
 
173
173
  it 'should set the response format to JSON' do
174
- HTTParty.expects(:get).with { |path, args|
175
- args[:query][:api_responseFormat] == 'json'
174
+ HTTParty.expects(:post).with { |path, args|
175
+ args[:body][:api_responseFormat] == 'json'
176
176
  }.returns(@json)
177
177
  @linode.send_request('test.echo', { })
178
178
  end
179
179
 
180
180
  it 'should provide the data hash to the HTTP API request' do
181
- HTTParty.expects(:get).with { |path, args|
182
- args[:query]['foo'] == 'bar'
181
+ HTTParty.expects(:post).with { |path, args|
182
+ args[:body]['foo'] == 'bar'
183
183
  }.returns(@json)
184
184
  @linode.send_request('test.echo', { 'foo' => 'bar' })
185
185
  end
186
186
 
187
187
  it 'should not allow overriding the API key via the data hash' do
188
- HTTParty.expects(:get).with { |path, args|
189
- args[:query][:api_key] == @api_key
188
+ HTTParty.expects(:post).with { |path, args|
189
+ args[:body][:api_key] == @api_key
190
190
  }.returns(@json)
191
191
  @linode.send_request('test.echo', { :api_key => 'h4x0r' })
192
192
  end
193
193
 
194
194
  it 'should not allow overriding the API action via the data hash' do
195
- HTTParty.expects(:get).with { |path, args|
196
- args[:query][:api_action] == 'test.echo'
195
+ HTTParty.expects(:post).with { |path, args|
196
+ args[:body][:api_action] == 'test.echo'
197
197
  }.returns(@json)
198
198
  @linode.send_request('test.echo', { :api_action => 'h4x0r' })
199
199
  end
200
200
 
201
201
  it 'should not allow overriding the API response format via the data hash' do
202
- HTTParty.expects(:get).with { |path, args|
203
- args[:query][:api_responseFormat] == 'json'
202
+ HTTParty.expects(:post).with { |path, args|
203
+ args[:body][:api_responseFormat] == 'json'
204
204
  }.returns(@json)
205
205
  @linode.send_request('test.echo', { :api_responseFormat => 'h4x0r' })
206
206
  end
207
207
 
208
208
  it 'should fail when the request submission fails' do
209
- HTTParty.stubs(:get).returns(%Q!{
209
+ HTTParty.stubs(:post).returns(%Q!{
210
210
  "ERRORARRAY":["failure"],
211
211
  "ACTION":"test.echo",
212
212
  "DATA":{"foo":"bar"}
@@ -216,7 +216,7 @@ describe 'Linode' do
216
216
 
217
217
  describe 'when the result is a list of hashes' do
218
218
  it 'should return a list of objects with lower-cased methods for the data fields' do
219
- HTTParty.stubs(:get).returns(%Q!{
219
+ HTTParty.stubs(:post).returns(%Q!{
220
220
  "ERRORARRAY":[],
221
221
  "ACTION":"test.echo",
222
222
  "DATA":[{"FOO":"bar"},{"BAR":"baz"}]
@@ -226,7 +226,7 @@ describe 'Linode' do
226
226
  end
227
227
 
228
228
  it 'should return a list of objects which do not respond to upper-case URLs for the data fields' do
229
- HTTParty.stubs(:get).returns(%Q!{
229
+ HTTParty.stubs(:post).returns(%Q!{
230
230
  "ERRORARRAY":[],
231
231
  "ACTION":"test.echo",
232
232
  "DATA":[{"FOO":"bar"},{"BAR":"baz"}]
@@ -248,7 +248,7 @@ describe 'Linode' do
248
248
 
249
249
  describe 'when the result is neither a list nor a hash' do
250
250
  it 'should return the result unchanged' do
251
- HTTParty.stubs(:get).returns(%Q!{
251
+ HTTParty.stubs(:post).returns(%Q!{
252
252
  "ERRORARRAY":[],
253
253
  "ACTION":"test.echo",
254
254
  "DATA":"thingie"
@@ -417,5 +417,37 @@ describe 'Linode' do
417
417
  linode.linode.should == result
418
418
  end
419
419
  end
420
+
421
+ it 'should be able to provide access to the Linode Nodebalancer API' do
422
+ @linode.should respond_to(:nodebalancer)
423
+ end
424
+
425
+ describe 'when providing access to the Linode Nodebalancer API' do
426
+ it 'should allow no arguments' do
427
+ lambda { @linode.nodebalancer }.should_not raise_error(ArgumentError)
428
+ end
429
+
430
+ it 'should require no arguments' do
431
+ lambda { @linode.nodebalancer(:foo) }.should raise_error(ArgumentError)
432
+ end
433
+
434
+ it 'should return a Linode::Nodebalancer instance' do
435
+ @linode.nodebalancer.class.should == Linode::Nodebalancer
436
+ end
437
+
438
+ it 'should set the API key on the Linode::Nodebalancer instance to be our API key' do
439
+ @linode.nodebalancer.api_key.should == @api_key
440
+ end
441
+
442
+ it 'should set the API url on the Linode::Nodebalancer instance to be our API url' do
443
+ @linode.nodebalancer.api_url.should == @api_url
444
+ end
445
+
446
+ it 'should return the same Linode::Nodebalancer instance when called again' do
447
+ linode = Linode.new(:api_key => @api_key)
448
+ result = linode.nodebalancer
449
+ linode.nodebalancer.should == result
450
+ end
451
+ end
420
452
  end
421
453
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linode
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 3
10
- version: 0.6.3
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rick Bradley
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-23 00:00:00 -06:00
18
+ date: 2011-07-07 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -59,6 +59,9 @@ files:
59
59
  - lib/linode/linode/disk.rb
60
60
  - lib/linode/linode/ip.rb
61
61
  - lib/linode/linode/job.rb
62
+ - lib/linode/nodebalancer.rb
63
+ - lib/linode/nodebalancer/config.rb
64
+ - lib/linode/nodebalancer/node.rb
62
65
  - lib/linode/stackscript.rb
63
66
  - lib/linode/test.rb
64
67
  - lib/linode/user.rb
@@ -71,6 +74,9 @@ files:
71
74
  - spec/linode/linode/ip_spec.rb
72
75
  - spec/linode/linode/job_spec.rb
73
76
  - spec/linode/linode_spec.rb
77
+ - spec/linode/nodebalancer/config_spec.rb
78
+ - spec/linode/nodebalancer/node_spec.rb
79
+ - spec/linode/nodebalancer_spec.rb
74
80
  - spec/linode/stackscript_spec.rb
75
81
  - spec/linode/test_spec.rb
76
82
  - spec/linode/user_spec.rb
@@ -119,6 +125,9 @@ test_files:
119
125
  - spec/linode/linode/ip_spec.rb
120
126
  - spec/linode/linode/job_spec.rb
121
127
  - spec/linode/linode_spec.rb
128
+ - spec/linode/nodebalancer/config_spec.rb
129
+ - spec/linode/nodebalancer/node_spec.rb
130
+ - spec/linode/nodebalancer_spec.rb
122
131
  - spec/linode/stackscript_spec.rb
123
132
  - spec/linode/test_spec.rb
124
133
  - spec/linode/user_spec.rb