fog 0.2.15 → 0.2.16
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/fog.gemspec +12 -2
- data/lib/fog.rb +3 -3
- data/lib/fog/aws/ec2.rb +2 -0
- data/lib/fog/aws/models/ec2/server.rb +12 -0
- data/lib/fog/aws/parsers/ec2/start_stop_instances.rb +41 -0
- data/lib/fog/aws/requests/ec2/describe_instances.rb +1 -1
- data/lib/fog/aws/requests/ec2/start_instances.rb +38 -0
- data/lib/fog/aws/requests/ec2/stop_instances.rb +38 -0
- data/lib/fog/aws/requests/ec2/terminate_instances.rb +4 -2
- data/lib/fog/linode.rb +10 -10
- data/lib/fog/linode/requests/avail_distributions.rb +6 -3
- data/lib/fog/linode/requests/avail_linodeplans.rb +6 -2
- data/lib/fog/linode/requests/linode_list.rb +6 -3
- data/lib/fog/model.rb +2 -2
- data/lib/fog/rackspace/models/files/file.rb +2 -2
- data/lib/fog/rackspace/models/servers/server.rb +1 -1
- data/lib/fog/slicehost/models/server.rb +5 -0
- data/lib/fog/vcloud.rb +24 -13
- data/lib/fog/vcloud/extension.rb +0 -7
- data/lib/fog/vcloud/requests/login.rb +1 -1
- data/lib/fog/vcloud/terremark/ecloud.rb +3 -20
- data/lib/fog/vcloud/terremark/vcloud.rb +3 -14
- data/spec/vcloud/requests/get_versions_spec.rb +40 -14
- data/spec/vcloud/requests/login_spec.rb +15 -2
- data/spec/vcloud/spec_helper.rb +57 -8
- data/tests/aws/models/s3/directory_tests.rb +8 -0
- data/tests/helper.rb +2 -0
- data/tests/helpers/model_helper.rb +76 -0
- data/tests/linode/helper.rb +25 -0
- data/tests/linode/requests/datacenter_tests.rb +18 -0
- data/tests/linode/requests/distribution_tests.rb +30 -0
- data/tests/linode/requests/linode_tests.rb +79 -0
- data/tests/linode/requests/linodeplans_tests.rb +37 -0
- data/tests/slicehost/requests/slice_tests.rb +1 -1
- metadata +13 -3
data/fog.gemspec
CHANGED
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
|
|
7
7
|
## If your rubyforge_project name is different, then edit it and comment out
|
8
8
|
## the sub! line in the Rakefile
|
9
9
|
s.name = 'fog'
|
10
|
-
s.version = '0.2.
|
11
|
-
s.date = '2010-07-
|
10
|
+
s.version = '0.2.16'
|
11
|
+
s.date = '2010-07-22'
|
12
12
|
s.rubyforge_project = 'fog'
|
13
13
|
|
14
14
|
## Make sure your summary is short. The description may be as long
|
@@ -116,6 +116,7 @@ Gem::Specification.new do |s|
|
|
116
116
|
lib/fog/aws/parsers/ec2/detach_volume.rb
|
117
117
|
lib/fog/aws/parsers/ec2/get_console_output.rb
|
118
118
|
lib/fog/aws/parsers/ec2/run_instances.rb
|
119
|
+
lib/fog/aws/parsers/ec2/start_stop_instances.rb
|
119
120
|
lib/fog/aws/parsers/ec2/terminate_instances.rb
|
120
121
|
lib/fog/aws/parsers/elb/create_load_balancer.rb
|
121
122
|
lib/fog/aws/parsers/elb/delete_load_balancer.rb
|
@@ -169,6 +170,8 @@ Gem::Specification.new do |s|
|
|
169
170
|
lib/fog/aws/requests/ec2/release_address.rb
|
170
171
|
lib/fog/aws/requests/ec2/revoke_security_group_ingress.rb
|
171
172
|
lib/fog/aws/requests/ec2/run_instances.rb
|
173
|
+
lib/fog/aws/requests/ec2/start_instances.rb
|
174
|
+
lib/fog/aws/requests/ec2/stop_instances.rb
|
172
175
|
lib/fog/aws/requests/ec2/terminate_instances.rb
|
173
176
|
lib/fog/aws/requests/elb/create_load_balancer.rb
|
174
177
|
lib/fog/aws/requests/elb/delete_load_balancer.rb
|
@@ -570,6 +573,7 @@ Gem::Specification.new do |s|
|
|
570
573
|
spec/vcloud/terremark/ecloud/requests/login_spec.rb
|
571
574
|
spec/vcloud/vcloud_spec.rb
|
572
575
|
tests/aws/helper.rb
|
576
|
+
tests/aws/models/s3/directory_tests.rb
|
573
577
|
tests/aws/requests/ec2/address_tests.rb
|
574
578
|
tests/aws/requests/ec2/availability_zone_tests.rb
|
575
579
|
tests/aws/requests/ec2/instance_tests.rb
|
@@ -584,6 +588,12 @@ Gem::Specification.new do |s|
|
|
584
588
|
tests/bluebox/requests/template_tests.rb
|
585
589
|
tests/helper.rb
|
586
590
|
tests/helper_tests.rb
|
591
|
+
tests/helpers/model_helper.rb
|
592
|
+
tests/linode/helper.rb
|
593
|
+
tests/linode/requests/datacenter_tests.rb
|
594
|
+
tests/linode/requests/distribution_tests.rb
|
595
|
+
tests/linode/requests/linode_tests.rb
|
596
|
+
tests/linode/requests/linodeplans_tests.rb
|
587
597
|
tests/rackspace/helper.rb
|
588
598
|
tests/rackspace/requests/servers/address_tests.rb
|
589
599
|
tests/rackspace/requests/servers/flavor_tests.rb
|
data/lib/fog.rb
CHANGED
@@ -40,7 +40,7 @@ require 'fog/vcloud'
|
|
40
40
|
module Fog
|
41
41
|
|
42
42
|
unless const_defined?(:VERSION)
|
43
|
-
VERSION = '0.2.
|
43
|
+
VERSION = '0.2.16'
|
44
44
|
end
|
45
45
|
|
46
46
|
module Mock
|
@@ -68,11 +68,11 @@ module Fog
|
|
68
68
|
!!@mocking
|
69
69
|
end
|
70
70
|
|
71
|
-
def self.wait_for(timeout
|
71
|
+
def self.wait_for(timeout=600, interval=1, &block)
|
72
72
|
duration = 0
|
73
73
|
start = Time.now
|
74
74
|
until yield || duration > timeout
|
75
|
-
sleep(
|
75
|
+
sleep(interval)
|
76
76
|
duration = Time.now - start
|
77
77
|
end
|
78
78
|
if duration > timeout
|
data/lib/fog/aws/ec2.rb
CHANGED
@@ -132,6 +132,18 @@ module Fog
|
|
132
132
|
true
|
133
133
|
end
|
134
134
|
|
135
|
+
def start
|
136
|
+
requires :id
|
137
|
+
connection.stop_instances(@id)
|
138
|
+
true
|
139
|
+
end
|
140
|
+
|
141
|
+
def stop
|
142
|
+
requires :id
|
143
|
+
connection.stop_instances(@id)
|
144
|
+
true
|
145
|
+
end
|
146
|
+
|
135
147
|
def volumes
|
136
148
|
requires :id
|
137
149
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Fog
|
2
|
+
module Parsers
|
3
|
+
module AWS
|
4
|
+
module EC2
|
5
|
+
|
6
|
+
class StartStopInstances < Fog::Parsers::Base
|
7
|
+
|
8
|
+
def reset
|
9
|
+
@instance = { 'currentState' => {}, 'previousState' => {} }
|
10
|
+
@response = { 'instancesSet' => [] }
|
11
|
+
@state = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def start_element(name, attrs = [])
|
15
|
+
super
|
16
|
+
case name
|
17
|
+
when 'currentState', 'previousState'
|
18
|
+
@state = name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def end_element(name)
|
23
|
+
case name
|
24
|
+
when 'code'
|
25
|
+
@instance[@state][name] = @value.to_s
|
26
|
+
when 'instanceId'
|
27
|
+
@instance[name] = @value
|
28
|
+
when 'item'
|
29
|
+
@response['instancesSet'] << @instance
|
30
|
+
@instance = { 'currentState' => {}, 'previousState' => {} }
|
31
|
+
when 'name'
|
32
|
+
@instance[@state][name] = @value
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -93,7 +93,7 @@ module Fog
|
|
93
93
|
@data[:deleted_at].delete(instance['instanceId'])
|
94
94
|
@data[:instances].delete(instance['instanceId'])
|
95
95
|
elsif Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay
|
96
|
-
instance['instanceState'] = { 'code' =>
|
96
|
+
instance['instanceState'] = { 'code' => 48, 'name' => 'terminating' }
|
97
97
|
end
|
98
98
|
when 'terminating'
|
99
99
|
if Time.now - @data[:deleted_at][instance['instanceId']] > Fog::Mock.delay
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
module EC2
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/aws/parsers/ec2/start_stop_instances'
|
7
|
+
|
8
|
+
# Start specified instance
|
9
|
+
#
|
10
|
+
# ==== Parameters
|
11
|
+
# * instance_id<~Array> - Id of instance to start
|
12
|
+
#
|
13
|
+
# ==== Returns
|
14
|
+
# * response<~Excon::Response>:
|
15
|
+
# * body<~Hash>:
|
16
|
+
# * 'requestId'<~String> - Id of request
|
17
|
+
# * TODO: fill in the blanks
|
18
|
+
def start_instances(instance_id)
|
19
|
+
params = AWS.indexed_param('InstanceId', instance_id)
|
20
|
+
request({
|
21
|
+
'Action' => 'StartInstances',
|
22
|
+
:idempotent => true,
|
23
|
+
:parser => Fog::Parsers::AWS::EC2::StartStopInstances.new
|
24
|
+
}.merge!(params))
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
class Mock
|
30
|
+
|
31
|
+
def start_instances(instance_id)
|
32
|
+
Fog::Mock.not_implemented
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
module EC2
|
4
|
+
class Real
|
5
|
+
|
6
|
+
require 'fog/aws/parsers/ec2/start_stop_instances'
|
7
|
+
|
8
|
+
# Stop specified instance
|
9
|
+
#
|
10
|
+
# ==== Parameters
|
11
|
+
# * instance_id<~Array> - Id of instance to start
|
12
|
+
#
|
13
|
+
# ==== Returns
|
14
|
+
# * response<~Excon::Response>:
|
15
|
+
# * body<~Hash>:
|
16
|
+
# * 'requestId'<~String> - Id of request
|
17
|
+
# * TODO: fill in the blanks
|
18
|
+
def stop_instances(instance_id)
|
19
|
+
params = AWS.indexed_param('InstanceId', instance_id)
|
20
|
+
request({
|
21
|
+
'Action' => 'StopInstances',
|
22
|
+
:idempotent => true,
|
23
|
+
:parser => Fog::Parsers::AWS::EC2::StartStopInstances.new
|
24
|
+
}.merge!(params))
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
class Mock
|
30
|
+
|
31
|
+
def stop_instances(instance_id)
|
32
|
+
Fog::Mock.not_implemented
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/fog/linode.rb
CHANGED
@@ -58,19 +58,19 @@ module Fog
|
|
58
58
|
params[:query] ||= {}
|
59
59
|
params[:query].merge!(:api_key => @linode_api_key)
|
60
60
|
|
61
|
-
|
62
|
-
response = @connection.request(params.merge!({:host => @host}))
|
63
|
-
rescue Excon::Errors::Error => error
|
64
|
-
raise case error
|
65
|
-
when Excon::Errors::NotFound
|
66
|
-
Fog::Linode::NotFound.slurp(error)
|
67
|
-
else
|
68
|
-
error
|
69
|
-
end
|
70
|
-
end
|
61
|
+
response = @connection.request(params.merge!({:host => @host}))
|
71
62
|
|
72
63
|
unless response.body.empty?
|
73
64
|
response.body = JSON.parse(response.body)
|
65
|
+
if data = response.body['ERRORARRAY'].first
|
66
|
+
error = case data['ERRORCODE']
|
67
|
+
when 5
|
68
|
+
Fog::Linode::NotFound
|
69
|
+
else
|
70
|
+
Fog::Linode::Error
|
71
|
+
end
|
72
|
+
raise error.new(data['ERRORMESSAGE'])
|
73
|
+
end
|
74
74
|
end
|
75
75
|
response
|
76
76
|
end
|
@@ -5,14 +5,17 @@ module Fog
|
|
5
5
|
# Get available distributions
|
6
6
|
#
|
7
7
|
# ==== Parameters
|
8
|
-
# *
|
9
|
-
# * distributionId<~Integer>: id to limit results to
|
8
|
+
# * distributionId<~Integer>: id to limit results to
|
10
9
|
#
|
11
10
|
# ==== Returns
|
12
11
|
# * response<~Excon::Response>:
|
13
12
|
# * body<~Array>:
|
14
13
|
# TODO: docs
|
15
|
-
def avail_distributions(
|
14
|
+
def avail_distributions(distribution_id=nil)
|
15
|
+
options = {}
|
16
|
+
if distribution_id
|
17
|
+
options.merge!(:distributionId => distribution_id)
|
18
|
+
end
|
16
19
|
request(
|
17
20
|
:expects => 200,
|
18
21
|
:method => 'GET',
|
@@ -8,11 +8,15 @@ module Fog
|
|
8
8
|
# * response<~Excon::Response>:
|
9
9
|
# * body<~Array>:
|
10
10
|
# TODO: docs
|
11
|
-
def avail_linodeplans
|
11
|
+
def avail_linodeplans(linodeplan_id=nil)
|
12
|
+
options = {}
|
13
|
+
if linodeplan_id
|
14
|
+
options.merge!(:planId => linodeplan_id)
|
15
|
+
end
|
12
16
|
request(
|
13
17
|
:expects => 200,
|
14
18
|
:method => 'GET',
|
15
|
-
:query => { :api_action => 'avail.linodeplans' }
|
19
|
+
:query => { :api_action => 'avail.linodeplans' }.merge!(options)
|
16
20
|
)
|
17
21
|
end
|
18
22
|
|
@@ -5,14 +5,17 @@ module Fog
|
|
5
5
|
# List all linodes user has access or delete to
|
6
6
|
#
|
7
7
|
# ==== Parameters
|
8
|
-
# *
|
9
|
-
# * linodeId<~Integer>: Limit the list to the specified LinodeID
|
8
|
+
# * linodeId<~Integer>: Limit the list to the specified LinodeID
|
10
9
|
#
|
11
10
|
# ==== Returns
|
12
11
|
# * response<~Excon::Response>:
|
13
12
|
# * body<~Array>:
|
14
13
|
# TODO: docs
|
15
|
-
def linode_list(
|
14
|
+
def linode_list(linode_id=nil)
|
15
|
+
options = {}
|
16
|
+
if linode_id
|
17
|
+
options.merge!(:linodeId => linode_id)
|
18
|
+
end
|
16
19
|
request(
|
17
20
|
:expects => 200,
|
18
21
|
:method => 'GET',
|
data/lib/fog/model.rb
CHANGED
@@ -39,9 +39,9 @@ module Fog
|
|
39
39
|
attributes.to_json
|
40
40
|
end
|
41
41
|
|
42
|
-
def wait_for(timeout
|
42
|
+
def wait_for(timeout=600, interval=1, &block)
|
43
43
|
reload
|
44
|
-
Fog.wait_for(timeout) do
|
44
|
+
Fog.wait_for(timeout, interval) do
|
45
45
|
reload or raise StandardError.new("Reload failed, #{self.class} #{self.identity} went away.")
|
46
46
|
instance_eval(&block)
|
47
47
|
end
|
@@ -41,9 +41,9 @@ module Fog
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def save
|
44
|
+
def save
|
45
45
|
requires :body, :directory, :key
|
46
|
-
data = connection.put_object(directory.name, @key, @body
|
46
|
+
data = connection.put_object(directory.name, @key, @body)
|
47
47
|
@etag = data.headers['ETag']
|
48
48
|
true
|
49
49
|
end
|
data/lib/fog/vcloud.rb
CHANGED
@@ -3,8 +3,9 @@ require 'fog/vcloud/model'
|
|
3
3
|
require 'fog/vcloud/collection'
|
4
4
|
require 'fog/vcloud/generators'
|
5
5
|
require 'fog/vcloud/extension'
|
6
|
-
require 'fog/vcloud/terremark/vcloud'
|
7
6
|
require 'fog/vcloud/terremark/ecloud'
|
7
|
+
require 'fog/vcloud/terremark/vcloud'
|
8
|
+
|
8
9
|
|
9
10
|
module URI
|
10
11
|
class Generic
|
@@ -46,6 +47,10 @@ module Fog
|
|
46
47
|
attr_accessor :login_uri
|
47
48
|
attr_reader :versions_uri
|
48
49
|
|
50
|
+
def supporting_versions
|
51
|
+
["v0.8"]
|
52
|
+
end
|
53
|
+
|
49
54
|
def initialize(options = {})
|
50
55
|
@connections = {}
|
51
56
|
@versions_uri = URI.parse(options[:versions_uri])
|
@@ -138,18 +143,21 @@ module Fog
|
|
138
143
|
end
|
139
144
|
end
|
140
145
|
|
141
|
-
#
|
142
|
-
# If
|
143
|
-
# And choose a default version is none is specified
|
146
|
+
# If we don't support any versions the service does, then raise an error.
|
147
|
+
# If the @version that super selected isn't in our supported list, then select one that is.
|
144
148
|
def check_versions
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
149
|
+
if @version
|
150
|
+
unless supported_version_numbers.include?(@version.to_s)
|
151
|
+
raise UnsupportedVersion.new("#{@version} is not supported by the server.")
|
152
|
+
end
|
153
|
+
unless supporting_versions.include?(@version.to_s)
|
154
|
+
raise UnsupportedVersion.new("#{@version} is not supported by #{self.class}")
|
155
|
+
end
|
156
|
+
else
|
157
|
+
unless @version = (supported_version_numbers & supporting_versions).sort.first
|
158
|
+
raise UnsupportedVersion.new("\nService @ #{@versions_uri} supports: #{supported_version_numbers.join(', ')}\n" +
|
159
|
+
"#{self.class} supports: #{supporting_versions.join(', ')}")
|
160
|
+
end
|
153
161
|
end
|
154
162
|
end
|
155
163
|
|
@@ -163,10 +171,13 @@ module Fog
|
|
163
171
|
"Basic #{Base64.encode64("#{@username}:#{@password}").chomp!}"
|
164
172
|
end
|
165
173
|
|
174
|
+
def login_uri
|
175
|
+
@login_uri ||= get_login_uri
|
176
|
+
end
|
177
|
+
|
166
178
|
# login handles the auth, but we just need the Set-Cookie
|
167
179
|
# header from that call.
|
168
180
|
def do_login
|
169
|
-
@login_uri ||= get_login_uri
|
170
181
|
@login_results = login
|
171
182
|
@cookie = @login_results.headers['Set-Cookie']
|
172
183
|
end
|
data/lib/fog/vcloud/extension.rb
CHANGED
@@ -12,9 +12,6 @@ module Fog
|
|
12
12
|
end
|
13
13
|
module #{other}::Mock
|
14
14
|
end
|
15
|
-
def self.supported_versions
|
16
|
-
@versions
|
17
|
-
end
|
18
15
|
def self.extended(klass)
|
19
16
|
unless @required
|
20
17
|
models.each do |model|
|
@@ -35,10 +32,6 @@ module Fog
|
|
35
32
|
EOS
|
36
33
|
end
|
37
34
|
|
38
|
-
def versions(*args)
|
39
|
-
@versions = args
|
40
|
-
end
|
41
|
-
|
42
35
|
end
|
43
36
|
end
|
44
37
|
end
|
@@ -63,8 +63,6 @@ module Fog
|
|
63
63
|
request :power_reset
|
64
64
|
request :power_shutdown
|
65
65
|
|
66
|
-
versions "v0.8b-ext2.3", "0.8b-ext2.3"
|
67
|
-
|
68
66
|
module Mock
|
69
67
|
def self.base_url
|
70
68
|
"https://fakey.com/api/v0.8b-ext2.3"
|
@@ -190,26 +188,11 @@ module Fog
|
|
190
188
|
end
|
191
189
|
|
192
190
|
module Real
|
193
|
-
|
194
|
-
|
195
|
-
# If we don't support any versions the service does, then raise an error.
|
196
|
-
# If the @version that super selected isn't in our supported list, then select one that is.
|
197
|
-
def check_versions
|
198
|
-
if @version
|
199
|
-
unless supported_version_numbers.include?(@version.to_s)
|
200
|
-
raise UnsupportedVersion.new("#{@version} is not supported by the server.")
|
201
|
-
end
|
202
|
-
unless Fog::Vcloud::Terremark::Ecloud.supported_versions.include?(@version.to_s)
|
203
|
-
raise UnsupportedVersion.new("#{@version} is not supported by Fog::Vcloud::Terremark::Ecloud")
|
204
|
-
end
|
205
|
-
else
|
206
|
-
unless @version = (supported_version_numbers & Fog::Vcloud::Terremark::Ecloud.supported_versions).sort.first
|
207
|
-
raise UnsupportedVersion.new("\nService @ #{@versions_uri} supports: #{supported_version_numbers.join(', ')}\n" +
|
208
|
-
"Fog::Vcloud::Terremark::Ecloud supports: #{Fog::Vcloud::Terremark::Ecloud.supported_versions.join(', ')}")
|
209
|
-
end
|
210
|
-
end
|
191
|
+
def supporting_versions
|
192
|
+
["v0.8b-ext2.3", "0.8b-ext2.3"]
|
211
193
|
end
|
212
194
|
end
|
195
|
+
|
213
196
|
end
|
214
197
|
end
|
215
198
|
end
|
@@ -4,23 +4,12 @@ module Fog
|
|
4
4
|
module Vcloud
|
5
5
|
extend Fog::Vcloud::Extension
|
6
6
|
|
7
|
-
versions "v0.8"
|
8
|
-
|
9
7
|
request_path 'fog/vcloud/terremark/vcloud/requests'
|
10
8
|
request :get_vdc
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
# If the @version that super selected isn't in our supported list, then select one that is.
|
16
|
-
def check_versions
|
17
|
-
super
|
18
|
-
unless (supported_version_ids & Versions::SUPPORTED).length > 0
|
19
|
-
raise UnsupportedVersion.new("\nService @ #{@versions_uri} supports: #{supported_version_ids.join(', ')}\n" +
|
20
|
-
"Fog::Vcloud::Terremark::Vcloud supports: #{Versions::SUPPORTED.join(', ')}")
|
21
|
-
end
|
22
|
-
unless supported_version_ids.include?(@version)
|
23
|
-
@version = (supported_version_ids & Versions::SUPPORTED).sort.first
|
10
|
+
module Real
|
11
|
+
def supporting_versions
|
12
|
+
["0.8", "0.8a-ext1.6"]
|
24
13
|
end
|
25
14
|
end
|
26
15
|
end
|
@@ -1,28 +1,54 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
shared_examples_for "real or mock get_versions requests" do
|
4
|
+
|
5
|
+
subject { @vcloud }
|
6
|
+
|
7
|
+
it { should respond_to :get_versions }
|
6
8
|
|
7
|
-
|
9
|
+
describe "#get_versions" do
|
10
|
+
subject { @vcloud.get_versions( @vcloud.versions_uri ) }
|
8
11
|
|
9
|
-
|
10
|
-
before { @versions = @vcloud.get_versions( @vcloud.versions_uri ) }
|
11
|
-
subject { @versions }
|
12
|
+
it_should_behave_like "all responses"
|
12
13
|
|
13
|
-
|
14
|
+
describe "body" do
|
15
|
+
subject { @vcloud.get_versions( @vcloud.versions_uri ).body }
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
+
it { should have(4).keys }
|
18
|
+
it_should_behave_like "it has the standard xmlns attributes" # 2 keys
|
17
19
|
|
18
|
-
|
19
|
-
it_should_behave_like "it has the standard xmlns attributes" # 2 keys
|
20
|
+
its(:xmlns) { should == "http://www.vmware.com/vcloud/versions" }
|
20
21
|
|
21
|
-
|
22
|
-
its(:VersionInfo) { should == { :LoginUrl => @mock_version[:login_url] , :Version => @mock_version[:version] } }
|
22
|
+
its(:VersionInfo) { should be_either_a_hash_or_array }
|
23
23
|
|
24
|
+
describe ":VersionInfo" do
|
25
|
+
subject { arrayify(@vcloud.get_versions( @vcloud.versions_uri ).body[:VersionInfo]) }
|
26
|
+
|
27
|
+
specify {
|
28
|
+
subject.each do |version_info|
|
29
|
+
version_info.should include(:LoginUrl)
|
30
|
+
version_info[:LoginUrl].should be_a_url
|
31
|
+
version_info.should include(:Version)
|
32
|
+
version_info[:Version].should be_an_instance_of String
|
33
|
+
end
|
34
|
+
}
|
24
35
|
end
|
25
36
|
end
|
26
37
|
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if Fog.mocking?
|
41
|
+
describe Fog::Vcloud, :type => :mock_vcloud_request do
|
42
|
+
|
43
|
+
it_should_behave_like "real or mock get_versions requests"
|
44
|
+
|
45
|
+
describe "body" do
|
46
|
+
subject { @vcloud.get_versions( @vcloud.versions_uri ).body }
|
47
|
+
its(:VersionInfo) { should == { :LoginUrl => @mock_version[:login_url] , :Version => @mock_version[:version] } }
|
48
|
+
end
|
49
|
+
end
|
27
50
|
else
|
51
|
+
describe Fog::Vcloud, :type => :vcloud_request do
|
52
|
+
it_should_behave_like "real or mock get_versions requests"
|
53
|
+
end
|
28
54
|
end
|
@@ -1,11 +1,24 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
2
|
|
3
|
+
shared_examples_for "real or mock login requests" do
|
4
|
+
subject { @vcloud }
|
5
|
+
it_should_behave_like "all login requests"
|
6
|
+
end
|
7
|
+
|
3
8
|
if Fog.mocking?
|
4
9
|
describe Fog::Vcloud, :type => :mock_vcloud_request do
|
5
|
-
|
10
|
+
it_should_behave_like "real or mock login requests"
|
6
11
|
|
7
|
-
|
12
|
+
describe "#body" do
|
13
|
+
subject { @vcloud.login.body }
|
14
|
+
its(:Org) { should == { :type => "application/vnd.vmware.vcloud.org+xml",
|
15
|
+
:href => @mock_organization[:info][:href],
|
16
|
+
:name => @mock_organization[:info][:name]} }
|
17
|
+
end
|
8
18
|
end
|
9
19
|
else
|
20
|
+
describe Fog::Vcloud, :type => :vcloud_request do
|
21
|
+
it_should_behave_like "real or mock login requests"
|
22
|
+
end
|
10
23
|
end
|
11
24
|
|
data/spec/vcloud/spec_helper.rb
CHANGED
@@ -27,6 +27,10 @@ Fog.mock! if ENV['FOG_MOCK']
|
|
27
27
|
|
28
28
|
require "#{current_directory}/../../lib/fog/vcloud/bin"
|
29
29
|
|
30
|
+
def arrayify(item)
|
31
|
+
item.is_a?(Array) ? item : [ item ]
|
32
|
+
end
|
33
|
+
|
30
34
|
shared_examples_for "all responses" do
|
31
35
|
it { should be_an_instance_of Excon::Response }
|
32
36
|
it { should respond_to :body }
|
@@ -98,17 +102,27 @@ shared_examples_for "all login requests" do
|
|
98
102
|
|
99
103
|
its(:headers) { should include "Set-Cookie" }
|
100
104
|
|
101
|
-
it { should have_headers_denoting_a_content_type_of "application/vnd.vmware.vcloud.orgslist+xml" }
|
102
|
-
|
103
105
|
describe "#body" do
|
104
106
|
subject { @login.body }
|
105
107
|
|
106
|
-
it { should have(4).
|
107
|
-
|
108
|
+
it { should have(4).items }
|
108
109
|
it_should_behave_like "it has the standard vcloud v0.8 xmlns attributes" # 3 keys
|
109
|
-
|
110
|
-
|
111
|
-
|
110
|
+
it { should include(:Org) }
|
111
|
+
|
112
|
+
describe ":Org" do
|
113
|
+
subject { arrayify(@login.body[:Org]) }
|
114
|
+
|
115
|
+
specify do
|
116
|
+
subject.each do |org|
|
117
|
+
org.should include(:type)
|
118
|
+
org[:type].should be_of_type "application/vnd.vmware.vcloud.org+xml"
|
119
|
+
org.should include(:name)
|
120
|
+
org[:name].should be_an_instance_of String
|
121
|
+
org.should include(:href)
|
122
|
+
org[:href].should be_a_url
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
112
126
|
end
|
113
127
|
end
|
114
128
|
end
|
@@ -218,7 +232,12 @@ Spec::Runner.configure do |config|
|
|
218
232
|
config.after(:all) do
|
219
233
|
Fog::Vcloud::Mock.data_reset
|
220
234
|
end
|
221
|
-
|
235
|
+
|
236
|
+
config.before(:each, :type => :vcloud_request) do
|
237
|
+
@vcloud = Fog.services.detect { |service| service == Vcloud }[:vcloud]
|
238
|
+
end
|
239
|
+
|
240
|
+
config.before(:all, :type => :mock_vcloud_model) do
|
222
241
|
@vcloud = Fog::Vcloud.new(:username => "foo", :password => "bar", :versions_uri => "http://fakey.com/api/versions")
|
223
242
|
end
|
224
243
|
config.before(:all, :type => :mock_vcloud_model) do
|
@@ -332,3 +351,33 @@ Spec::Matchers.define :have_all_attributes_be_nil do
|
|
332
351
|
actual.class.attributes.all? { |attribute| actual.send(attribute.to_sym) == nil }
|
333
352
|
end
|
334
353
|
end
|
354
|
+
|
355
|
+
Spec::Matchers.define :be_a_url do
|
356
|
+
match do |actual|
|
357
|
+
actual.match(/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix)
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
Spec::Matchers.define :be_either_a_hash_or_array do
|
362
|
+
match do |actual|
|
363
|
+
actual.is_a?(Hash) || actual.is_a?(Array)
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
Spec::Matchers.define :be_a_known_vmware_type do
|
368
|
+
match do |actual|
|
369
|
+
["application/vnd.vmware.vcloud.org+xml"].include?(actual)
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
Spec::Matchers.define :be_of_type do |type|
|
374
|
+
match do |actual|
|
375
|
+
actual == type ||
|
376
|
+
if actual.is_a?(Hash) && actual[:type]
|
377
|
+
actual[:type] == type
|
378
|
+
end ||
|
379
|
+
if actual.respond_to(:type)
|
380
|
+
actual.type == type
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
data/tests/helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'fog'))
|
2
2
|
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'fog', 'bin'))
|
3
3
|
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helpers', 'model_helper'))
|
5
|
+
|
4
6
|
if ENV["FOG_MOCK"] == "true"
|
5
7
|
Fog.mock!
|
6
8
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
def tests_models
|
2
|
+
|
3
|
+
after do
|
4
|
+
if @model && !@model.new_record?
|
5
|
+
if @model.respond_to?(:ready?)
|
6
|
+
@model.wait_for { ready? }
|
7
|
+
end
|
8
|
+
@model.destroy
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
tests('collection') do
|
13
|
+
|
14
|
+
test('#all includes persisted models') do
|
15
|
+
@model.save
|
16
|
+
@collection.all.map {|model| model.identity}.include? @model.identity
|
17
|
+
end
|
18
|
+
|
19
|
+
tests('#get') do
|
20
|
+
|
21
|
+
test 'should return a matching model if one exists' do
|
22
|
+
@model.save
|
23
|
+
get = @collection.get(@model.identity)
|
24
|
+
@model.attributes == get.attributes
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'should return nil if no matching model exists' do
|
28
|
+
!@collection.get('0')
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
test('#reload') do
|
34
|
+
@model.save
|
35
|
+
@collection.all
|
36
|
+
reloaded = @collection.reload
|
37
|
+
@collection.attributes == reloaded.attributes
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
tests('model') do
|
43
|
+
|
44
|
+
test('#reload') do
|
45
|
+
@model.save
|
46
|
+
if @model.respond_to?(:ready?)
|
47
|
+
@model.wait_for { ready? }
|
48
|
+
end
|
49
|
+
reloaded = @model.reload
|
50
|
+
@model.attributes == reloaded.attributes
|
51
|
+
end
|
52
|
+
|
53
|
+
tests('#save') do
|
54
|
+
|
55
|
+
test('does not exist remotely before save') do
|
56
|
+
!@collection.get(@model.identity)
|
57
|
+
end
|
58
|
+
|
59
|
+
test('succeeds') do
|
60
|
+
@model.save
|
61
|
+
end
|
62
|
+
|
63
|
+
test('does exist remotely after save') do
|
64
|
+
@model.save
|
65
|
+
if @model.respond_to?(:ready?)
|
66
|
+
@model.wait_for { ready? }
|
67
|
+
end
|
68
|
+
reloaded = @model.reload
|
69
|
+
@model.attributes == reloaded.attributes
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Linode
|
2
|
+
|
3
|
+
def self.[](service)
|
4
|
+
@@connections ||= Hash.new do |hash, key|
|
5
|
+
credentials = Fog.credentials.reject do |k,v|
|
6
|
+
![:linode_api_key].include?(k)
|
7
|
+
end
|
8
|
+
hash[key] = case key
|
9
|
+
when :linode
|
10
|
+
Fog::Linode.new(credentials)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
@@connections[service]
|
14
|
+
end
|
15
|
+
|
16
|
+
module Formats
|
17
|
+
|
18
|
+
BASIC = {
|
19
|
+
'ERRORARRAY' => [],
|
20
|
+
'ACTION' => String
|
21
|
+
}
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Shindo.tests('Linode | datacenter requests', ['linode']) do
|
2
|
+
|
3
|
+
@datacenters_format = Linode::Formats::BASIC.merge({
|
4
|
+
'DATA' => [{
|
5
|
+
'DATACENTERID' => Integer,
|
6
|
+
'LOCATION' => String
|
7
|
+
}]
|
8
|
+
})
|
9
|
+
|
10
|
+
tests('success') do
|
11
|
+
|
12
|
+
tests('#avail_datacenters').formats(@datacenters_format) do
|
13
|
+
Linode[:linode].avail_datacenters.body
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Shindo.tests('Linode | distribution requests', ['linode']) do
|
2
|
+
|
3
|
+
@distributions_format = Linode::Formats::BASIC.merge({
|
4
|
+
'DATA' => [{
|
5
|
+
'CREATE_DT' => String,
|
6
|
+
'DISTRIBUTIONID' => Integer,
|
7
|
+
'IS64BIT' => Integer,
|
8
|
+
'LABEL' => String,
|
9
|
+
'MINIMAGESIZE' => Integer,
|
10
|
+
'REQUIRESPVOPSKERNEL' => Integer
|
11
|
+
}]
|
12
|
+
})
|
13
|
+
|
14
|
+
tests('success') do
|
15
|
+
|
16
|
+
@distribution_id = nil
|
17
|
+
|
18
|
+
tests('#avail_distributions').formats(@distributions_format) do
|
19
|
+
data = Linode[:linode].avail_distributions.body
|
20
|
+
@distribution_id = data['DATA'].first['DISTRIBUTIONID']
|
21
|
+
data
|
22
|
+
end
|
23
|
+
|
24
|
+
tests("@avail_distributions(#{@distribution_id})").formats(@distributions_format) do
|
25
|
+
Linode[:linode].avail_distributions(@distribution_id).body
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
Shindo.tests('Linode | linode requests', ['linode']) do
|
2
|
+
|
3
|
+
@linode_format = Linode::Formats::BASIC.merge({
|
4
|
+
'DATA' => { 'LinodeID' => Integer }
|
5
|
+
})
|
6
|
+
|
7
|
+
@linodes_format = Linode::Formats::BASIC.merge({
|
8
|
+
'DATA' => [{
|
9
|
+
'ALERT_BWIN_ENABLED' => Integer,
|
10
|
+
'ALERT_CPU_THRESHOLD' => Integer,
|
11
|
+
'ALERT_BWOUT_ENABLED' => Integer,
|
12
|
+
'ALERT_BWOUT_THRESHOLD' => Integer,
|
13
|
+
'ALERT_BWQUOTA_ENABLED' => Integer,
|
14
|
+
'ALERT_BWQUOTA_THRESHOLD' => Integer,
|
15
|
+
'ALERT_BWIN_THRESHOLD' => Integer,
|
16
|
+
'ALERT_CPU_ENABLED' => Integer,
|
17
|
+
'ALERT_DISKIO_ENABLED' => Integer,
|
18
|
+
'ALERT_DISKIO_THRESHOLD' => Integer,
|
19
|
+
'BACKUPSENABLED' => Integer,
|
20
|
+
'BACKUPWEEKLYDAY' => Integer,
|
21
|
+
'BACKUPWINDOW' => Integer,
|
22
|
+
'DATACENTERID' => Integer,
|
23
|
+
'LABEL' => String,
|
24
|
+
'LINODEID' => Integer,
|
25
|
+
'LPM_DISPLAYGROUP' => String,
|
26
|
+
'STATUS' => Integer,
|
27
|
+
'TOTALHD' => Integer,
|
28
|
+
'TOTALRAM' => Integer,
|
29
|
+
'TOTALXFER' => Integer,
|
30
|
+
'WATCHDOG' => Integer,
|
31
|
+
}]
|
32
|
+
})
|
33
|
+
|
34
|
+
@reboot_format = Linode::Formats::BASIC.merge({
|
35
|
+
'DATA' => { 'JobID' => Integer }
|
36
|
+
})
|
37
|
+
|
38
|
+
tests('success') do
|
39
|
+
|
40
|
+
@linode_id = nil
|
41
|
+
|
42
|
+
# (2 => Dallas, TX, USA), (1 => 1 month), (1 => Linode 512)
|
43
|
+
tests('#linode_create(2, 1, 1)').formats(@linode_format) do
|
44
|
+
data = Linode[:linode].linode_create(2, 1, 1).body
|
45
|
+
@linode_id = data['DATA']['LinodeID']
|
46
|
+
data
|
47
|
+
end
|
48
|
+
|
49
|
+
tests("#linode_list(#{@linode_id})").formats(@linodes_format) do
|
50
|
+
Linode[:linode].linode_list(@linode_id).body
|
51
|
+
end
|
52
|
+
|
53
|
+
tests('#linode_list').formats(@linodes_format) do
|
54
|
+
Linode[:linode].linode_list.body
|
55
|
+
end
|
56
|
+
|
57
|
+
# tests("#linode_reboot(#{@linode_id})").formats(@reboot_format) do
|
58
|
+
# Linode[:linode].linode_reboot(@linode_id).body
|
59
|
+
# end
|
60
|
+
|
61
|
+
tests('#linode_delete(#{@linode_id})').succeeds do
|
62
|
+
Linode[:linode].linode_delete(@linode_id)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
tests('failure') do
|
68
|
+
|
69
|
+
tests('#linode_reboot(0)').raises(Fog::Linode::NotFound) do
|
70
|
+
Linode[:linode].linode_reboot(0)
|
71
|
+
end
|
72
|
+
|
73
|
+
tests('#linode_delete(0)').raises(Fog::Linode::NotFound) do
|
74
|
+
Linode[:linode].linode_delete(0)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Shindo.tests('Linode | linodeplans requests', ['linode']) do
|
2
|
+
|
3
|
+
@linodeplans_format = Linode::Formats::BASIC.merge({
|
4
|
+
'DATA' => [{
|
5
|
+
'AVAIL' => {
|
6
|
+
'2' => Integer,
|
7
|
+
'3' => Integer,
|
8
|
+
'4' => Integer,
|
9
|
+
'6' => Integer,
|
10
|
+
'7' => Integer
|
11
|
+
},
|
12
|
+
'DISK' => Integer,
|
13
|
+
'PLANID' => Integer,
|
14
|
+
'PRICE' => Float,
|
15
|
+
'RAM' => Integer,
|
16
|
+
'LABEL' => String,
|
17
|
+
'XFER' => Integer
|
18
|
+
}]
|
19
|
+
})
|
20
|
+
|
21
|
+
tests('success') do
|
22
|
+
|
23
|
+
@linodeplan_id = nil
|
24
|
+
|
25
|
+
tests('#avail_linodeplans').formats(@linodeplans_format) do
|
26
|
+
data = Linode[:linode].avail_linodeplans.body
|
27
|
+
@linodeplan_id = data['DATA'].first['PLANID']
|
28
|
+
data
|
29
|
+
end
|
30
|
+
|
31
|
+
tests("#avail_linodeplans(#{@linodeplan_id})").formats(@linodeplans_format) do
|
32
|
+
Linode[:linode].avail_linodeplans(@linodeplan_id).body
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -54,7 +54,7 @@ Shindo.tests('Slicehost | slice requests', ['slicehost']) do
|
|
54
54
|
Slicehost[:slices].reboot_slice(0)
|
55
55
|
end
|
56
56
|
|
57
|
-
tests('delete_slice(0)').raises(Fog::Slicehost::NotFound) do
|
57
|
+
tests('#delete_slice(0)').raises(Fog::Slicehost::NotFound) do
|
58
58
|
Slicehost[:slices].delete_slice(0)
|
59
59
|
end
|
60
60
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 16
|
9
|
+
version: 0.2.16
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- geemus (Wesley Beary)
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-07-
|
17
|
+
date: 2010-07-22 00:00:00 -07:00
|
18
18
|
default_executable: fog
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -205,6 +205,7 @@ files:
|
|
205
205
|
- lib/fog/aws/parsers/ec2/detach_volume.rb
|
206
206
|
- lib/fog/aws/parsers/ec2/get_console_output.rb
|
207
207
|
- lib/fog/aws/parsers/ec2/run_instances.rb
|
208
|
+
- lib/fog/aws/parsers/ec2/start_stop_instances.rb
|
208
209
|
- lib/fog/aws/parsers/ec2/terminate_instances.rb
|
209
210
|
- lib/fog/aws/parsers/elb/create_load_balancer.rb
|
210
211
|
- lib/fog/aws/parsers/elb/delete_load_balancer.rb
|
@@ -258,6 +259,8 @@ files:
|
|
258
259
|
- lib/fog/aws/requests/ec2/release_address.rb
|
259
260
|
- lib/fog/aws/requests/ec2/revoke_security_group_ingress.rb
|
260
261
|
- lib/fog/aws/requests/ec2/run_instances.rb
|
262
|
+
- lib/fog/aws/requests/ec2/start_instances.rb
|
263
|
+
- lib/fog/aws/requests/ec2/stop_instances.rb
|
261
264
|
- lib/fog/aws/requests/ec2/terminate_instances.rb
|
262
265
|
- lib/fog/aws/requests/elb/create_load_balancer.rb
|
263
266
|
- lib/fog/aws/requests/elb/delete_load_balancer.rb
|
@@ -659,6 +662,7 @@ files:
|
|
659
662
|
- spec/vcloud/terremark/ecloud/requests/login_spec.rb
|
660
663
|
- spec/vcloud/vcloud_spec.rb
|
661
664
|
- tests/aws/helper.rb
|
665
|
+
- tests/aws/models/s3/directory_tests.rb
|
662
666
|
- tests/aws/requests/ec2/address_tests.rb
|
663
667
|
- tests/aws/requests/ec2/availability_zone_tests.rb
|
664
668
|
- tests/aws/requests/ec2/instance_tests.rb
|
@@ -673,6 +677,12 @@ files:
|
|
673
677
|
- tests/bluebox/requests/template_tests.rb
|
674
678
|
- tests/helper.rb
|
675
679
|
- tests/helper_tests.rb
|
680
|
+
- tests/helpers/model_helper.rb
|
681
|
+
- tests/linode/helper.rb
|
682
|
+
- tests/linode/requests/datacenter_tests.rb
|
683
|
+
- tests/linode/requests/distribution_tests.rb
|
684
|
+
- tests/linode/requests/linode_tests.rb
|
685
|
+
- tests/linode/requests/linodeplans_tests.rb
|
676
686
|
- tests/rackspace/helper.rb
|
677
687
|
- tests/rackspace/requests/servers/address_tests.rb
|
678
688
|
- tests/rackspace/requests/servers/flavor_tests.rb
|