openstack 1.0.4 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,7 +6,7 @@ Ruby Openstack Compute and Object-Store bindings for the v1.0 OSAPI.
6
6
 
7
7
  Currently supports both v1.0 and v2.0 (keystone) auth.
8
8
 
9
- Use OpenStack::Connection.create to get a handle to an OpenStack service - set the :service_type parameter to either 'compute' or 'object-store' (defaults to 'compute')
9
+ Use OpenStack::Connection.create to get a handle to an OpenStack service - set the :service_type parameter to either 'compute' or 'object-store' (defaults to 'compute'). If the requested service is not deployed the gem will throw a OpenStack::Exception::NotImplemented (501) - e.g. :service_type is 'object-store' but swift service isn't deployed.
10
10
 
11
11
  The OpenStack::Connection.create class method is a factory constructor which will return the appropriate Connection object, depending on the ':service_type' parameter passed with the options hash: set to either 'compute' or 'object-store' (defaults to 'compute') - see below for examples.
12
12
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.4
1
+ 1.0.6
@@ -245,7 +245,6 @@ end
245
245
 
246
246
  class AuthV20
247
247
  attr_reader :uri
248
-
249
248
  def initialize(connection)
250
249
  begin
251
250
  server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.auth_host, connection.auth_port)
@@ -275,6 +274,9 @@ class AuthV20
275
274
  if (response.code =~ /^20./)
276
275
  resp_data=JSON.parse(response.body)
277
276
  connection.authtoken = resp_data['access']['token']['id']
277
+ implemented_services = resp_data["access"]["serviceCatalog"].inject([]){|res, current| res << current["type"] ;res}
278
+ raise OpenStack::Exception::NotImplemented.new("The requested service: \"#{connection.service_type}\" is not present " +
279
+ "in the returned service catalogue.", 501, "#{resp_data["access"]["serviceCatalog"]}") unless implemented_services.include?(connection.service_type)
278
280
  resp_data['access']['serviceCatalog'].each do |service|
279
281
  if service['type'] == connection.service_type
280
282
  endpoints = service["endpoints"]
@@ -0,0 +1,134 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class AuthenticationTest < Test::Unit::TestCase
4
+
5
+ def test_good_authentication
6
+ response = {'x-server-management-url' => 'http://server-manage.example.com/path', 'x-auth-token' => 'dummy_token'}
7
+ response.stubs(:code).returns('204')
8
+ server = mock(:use_ssl= => true, :verify_mode= => true, :start => true, :finish => true)
9
+ server.stubs(:get).returns(response)
10
+ Net::HTTP.stubs(:new).returns(server)
11
+ connection = stub(:authuser => 'good_user',:authtenant => {:type=>"tenantName", :value=>'good_tenant'}, :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v1.0", :service_type=>"compute", :authok= => true, :authtoken= => true, :service_host= => "", :service_path= => "", :service_path => "", :service_port= => "", :service_scheme= => "", :proxy_host => nil, :proxy_port => nil, :api_path => '/foo')
12
+ result = OpenStack::Authentication.init(connection)
13
+ assert_equal result.class, OpenStack::AuthV10
14
+ end
15
+
16
+ def test_bad_authentication
17
+ response = mock()
18
+ response.stubs(:code).returns('499')
19
+ server = mock(:use_ssl= => true, :verify_mode= => true, :start => true)
20
+ server.stubs(:get).returns(response)
21
+ Net::HTTP.stubs(:new).returns(server)
22
+ connection = stub(:authuser => 'bad_user', :authtenant => {:type=>"tenantName", :value=>'good_tenant'}, :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v1.0", :authok= => true, :authtoken= => true, :proxy_host => nil, :proxy_port => nil, :api_path => '/foo')
23
+ assert_raises(OpenStack::Exception::Authentication) do
24
+ result = OpenStack::Authentication.init(connection)
25
+ end
26
+ end
27
+
28
+ def test_bad_hostname
29
+ Net::HTTP.stubs(:new).raises(OpenStack::Exception::Connection)
30
+ connection = stub(:authuser => 'bad_user', :authtenant => {:type=>"tenantName", :value=>'good_tenant'}, :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v1.0", :authok= => true, :authtoken= => true, :proxy_host => nil, :proxy_port => nil, :api_path => '/foo')
31
+ assert_raises(OpenStack::Exception::Connection) do
32
+ result = OpenStack::Authentication.init(connection)
33
+ end
34
+ end
35
+
36
+ def test_service_region
37
+ server = get_test_auth_server
38
+ Net::HTTP.stubs(:new).returns(server)
39
+ server.stubs(:started?).returns(true)
40
+ connection = stub(:authuser => 'good_user', :auth_method => "password",:authtenant => {:type=>"tenantName", :value=>'good_tenant'} , :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v2.0", :authok= => true, :authtoken= => true, :service_host= => "", :service_path= => "", :service_path => "", :service_port= => "", :service_scheme= => "", :proxy_host => nil, :proxy_port => nil, :api_path => '/foo', :service_type => "compute", :service_name => "cloudServers", :region => "South")
41
+ result = OpenStack::Authentication.init(connection)
42
+ assert_equal("compute.south.host", result.uri.host)
43
+ end
44
+
45
+ def test_service_name
46
+ server = get_test_auth_server
47
+ Net::HTTP.stubs(:new).returns(server)
48
+ server.stubs(:started?).returns(true)
49
+ connection = stub(:authuser => 'good_user', :auth_method=>"password", :authtenant => {:type=>"tenantName", :value=>'good_tenant'}, :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v2.0", :authok= => true, :authtoken= => true, :service_host= => "", :service_path= => "", :service_path => "", :service_port= => "", :service_scheme= => "", :proxy_host => nil, :proxy_port => nil, :api_path => '/foo', :service_type => "nova", :service_name => "cloudCompute", :region => "South")
50
+ result = OpenStack::Authentication.init(connection)
51
+ assert_equal("nova.south.host", result.uri.host)
52
+ end
53
+
54
+ def test_service_type
55
+ server = get_test_auth_server
56
+ Net::HTTP.stubs(:new).returns(server)
57
+ server.stubs(:started?).returns(true)
58
+ connection = stub(:authuser => 'good_user', :auth_method => "password", :authtenant => {:type=>"tenantName", :value=>'good_tenant'}, :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v2.0", :authok= => true, :authtoken= => true, :service_host= => "", :service_path= => "", :service_path => "", :service_port= => "", :service_scheme= => "", :proxy_host => nil, :proxy_port => nil, :api_path => '/foo', :service_type => "nova", :service_name => nil, :region => "North")
59
+ result = OpenStack::Authentication.init(connection)
60
+ assert_equal("nova.north.host", result.uri.host)
61
+ end
62
+
63
+
64
+ private
65
+ def get_test_auth_server
66
+ json_response = %{{
67
+ "access":{
68
+ "token":{
69
+ "id":"asdasdasd-adsasdads-asdasdasd-adsadsasd",
70
+ "expires":"2010-11-01T03:32:15-05:00"
71
+ },
72
+ "user":{
73
+ "id":"123",
74
+ "name":"testName",
75
+ "roles":[{
76
+ "id":"234",
77
+ "name":"compute:admin"
78
+ },
79
+ {
80
+ "id":"235",
81
+ "name":"object-store:admin",
82
+ "tenantId":"1"
83
+ }
84
+ ],
85
+ "roles_links":[]
86
+ },
87
+ "serviceCatalog":[{
88
+ "name":"cloudServers",
89
+ "type":"compute",
90
+ "endpoints":[{
91
+ "publicURL":"https://compute.north.host/v1.1",
92
+ "region":"North"
93
+ },
94
+ {
95
+ "publicURL":"https://compute.south.host/v1.1",
96
+ "region":"South"
97
+ }
98
+ ],
99
+ "endpoints_links":[]
100
+ },
101
+ {
102
+ "name":"cloudCompute",
103
+ "type":"nova",
104
+ "endpoints":[{
105
+ "publicURL":"https://nova.north.host/v1.1",
106
+ "region":"North"
107
+ },
108
+ {
109
+ "publicURL":"https://nova.south.host/v1.1",
110
+ "region":"South"
111
+ }
112
+ ],
113
+ "endpoints_links":[{
114
+ "rel":"next",
115
+ "href":"https://identity.north.host/v2.0/endpoints?marker=2"
116
+ }
117
+ ]
118
+ }
119
+ ],
120
+ "serviceCatalog_links":[{
121
+ "rel":"next",
122
+ "href":"https://identity.host/v2.0/endpoints?session=2hfh8Ar&marker=2"
123
+ }
124
+ ]
125
+ }
126
+ }}
127
+
128
+ response = {'x-server-management-url' => 'http://server-manage.example.com/path', 'x-auth-token' => 'dummy_token'}
129
+ response.stubs(:code => "200", :body => json_response)
130
+ server = mock(:use_ssl= => true, :verify_mode= => true, :start => true, :finish => true)
131
+ server.stubs(:post).returns(response)
132
+ return server
133
+ end
134
+ end
@@ -0,0 +1,39 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ComputeConnectionTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ connection = stub()
7
+ OpenStack::Authentication.stubs(:init).returns(connection)
8
+ end
9
+
10
+ def test_init_connection_no_credentials
11
+ assert_raises(OpenStack::Exception::MissingArgument) do
12
+ conn = OpenStack::Connection.create(:api_key => "AABBCCDD11", :auth_url => "a.b.c")
13
+ end
14
+ end
15
+
16
+ def test_init_connection_no_password
17
+ assert_raises(OpenStack::Exception::MissingArgument) do
18
+ conn = OpenStack::Connection.create(:username => "test_account", :auth_url => "a.b.c")
19
+ end
20
+ end
21
+
22
+ def test_init_connection_no_auth_url
23
+ assert_raises(OpenStack::Exception::MissingArgument) do
24
+ conn = OpenStack::Connection.create(:username => "test_account", :api_key => "AABBCCDD11")
25
+ end
26
+ end
27
+
28
+ def test_init_connection_bad_auth_url
29
+ assert_raises(OpenStack::Exception::InvalidArgument) do
30
+ conn = OpenStack::Connection.create(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "***")
31
+ end
32
+ end
33
+
34
+ def test_init_connection
35
+ conn = OpenStack::Connection.create(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "https://a.b.c")
36
+ assert_not_nil conn, "Connection.new returned nil."
37
+ end
38
+
39
+ end
@@ -0,0 +1,49 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ExceptionTest < Test::Unit::TestCase
4
+
5
+ def test_400_cloud_servers_fault
6
+ response = mock()
7
+ response.stubs(:code => "400", :body => "{\"ComputeFault\":{\"message\":\"422 Unprocessable Entity: We could not process your request at this time. We have been notified and are looking into the issue. [E03]\",\"details\":\"com.rackspace.cloud.service.servers.OpenStack::ComputeFault: Fault occured\",\"code\":400}}" )
8
+ exception=nil
9
+ begin
10
+ OpenStack::Exception.raise_exception(response)
11
+ rescue Exception => e
12
+ exception=e
13
+ end
14
+ assert_equal(OpenStack::Exception::ComputeFault, e.class)
15
+ assert_equal("400", e.response_code)
16
+ assert_not_nil(e.response_body)
17
+ end
18
+
19
+ def test_413_over_limit
20
+ response = mock()
21
+ response.stubs(:code => "413", :body => "{\"overLimit\":{\"message\":\"Too many requests...\",\"code\":413,\"retryAfter\":\"2010-08-25T10:47:57.890-05:00\"}}")
22
+ exception=nil
23
+ begin
24
+ OpenStack::Exception.raise_exception(response)
25
+ rescue Exception => e
26
+ exception=e
27
+ end
28
+ assert_equal(OpenStack::Exception::OverLimit, e.class)
29
+ assert_equal("413", e.response_code)
30
+ assert_not_nil(e.response_body)
31
+ end
32
+
33
+ def test_other
34
+ response = mock()
35
+ body="{\"blahblah\":{\"message\":\"Failed...\",\"code\":500}}"
36
+ response.stubs(:code => "500", :body => body)
37
+ exception=nil
38
+ begin
39
+ OpenStack::Exception.raise_exception(response)
40
+ rescue Exception => e
41
+ exception=e
42
+ end
43
+ assert_equal(OpenStack::Exception::Other, exception.class)
44
+ assert_equal("500", exception.response_code)
45
+ assert_not_nil(exception.response_body)
46
+ assert_equal(body, exception.response_body)
47
+ end
48
+
49
+ end
@@ -0,0 +1,210 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class MetadataTest < Test::Unit::TestCase
4
+
5
+ include TestConnection
6
+
7
+ def setup
8
+ @compute=get_test_connection
9
+ end
10
+
11
+ def test_metadata_uses_initial_values
12
+ data = {'key1' => 'value1', 'key2' => 'value2'}
13
+ metadata = OpenStack::Compute::Metadata.new(@conn, 'blah', data)
14
+ assert_equal('value1', metadata['key1'])
15
+ assert_equal('value2', metadata['key2'])
16
+ assert_equal(nil, metadata['key0'])
17
+ end
18
+
19
+ def test_metadata_presents_saved_values
20
+ metadata = OpenStack::Compute::Metadata.new(@conn, 'blah')
21
+ metadata['key3'] = 'value3'
22
+ assert_equal('value3', metadata['key3'])
23
+ assert_equal(nil, metadata['key0'])
24
+ end
25
+
26
+ def test_metadata_presents_stored_values
27
+ metadata = OpenStack::Compute::Metadata.new(@conn, 'blah')
28
+ metadata.store('key3', 'value3')
29
+ assert_equal('value3', metadata['key3'])
30
+ assert_equal(nil, metadata['key0'])
31
+ end
32
+
33
+ def test_metadata_looks_up_values_if_none_provided
34
+ data = {'metadata' => {'key4' => 'value4'}}
35
+ json = JSON.generate(data)
36
+ response = mock()
37
+ response.stubs(:code => "200", :body => json)
38
+ conn = mock()
39
+ @compute.stubs(:connection).returns(conn)
40
+ conn.stubs(:req).returns(response)
41
+ metadata = OpenStack::Compute::Metadata.new(@compute, 'blah')
42
+ assert_equal('value4', metadata['key4'])
43
+ assert_equal(nil, metadata['key0'])
44
+ end
45
+
46
+ def test_metadata_save_nil
47
+ conn = mock()
48
+ metadata = OpenStack::Compute::Metadata.new(conn, 'blah')
49
+ metadata.save # do nothing or we'd likely be deleting unintentionally
50
+ end
51
+
52
+ def test_metadata_save
53
+ data = {'key1' => 'value1', 'key3' => 'value3'}
54
+ json = JSON.generate({'metadata' => data})
55
+ response = mock()
56
+ response.stubs(:code => "200", :body => json)
57
+ compute = mock()
58
+ conn = mock()
59
+ compute.stubs(:connection).returns(conn)
60
+ conn.expects(:req).with('PUT', 'blah/metadata', :data => json).returns(response)
61
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah', data)
62
+ metadata.save
63
+ end
64
+
65
+ def test_metadata_update_all
66
+ data_in = {'key5' => 'value5', 'key6' => 'value6'}
67
+ data_out = {'key5' => 'value5', 'key6' => 'value6', 'key7' => 'value7'}
68
+ json_in = JSON.generate({'metadata' => data_in})
69
+ json_out = JSON.generate({'metadata' => data_out})
70
+ response = mock()
71
+ response.stubs(:code => "200", :body => json_out)
72
+ compute = mock()
73
+ conn = mock()
74
+ compute.stubs(:connection).returns(conn)
75
+ conn.expects(:req).with('POST', 'blah/metadata', :data => json_in).returns(response)
76
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah')
77
+ metadata['key5'] = 'value5'
78
+ metadata['key6'] = 'value6'
79
+ metadata.update
80
+ assert_equal('value5', metadata['key5'])
81
+ assert_equal('value6', metadata['key6'])
82
+ assert_equal('value7', metadata['key7'])
83
+ end
84
+
85
+ def test_metadata_update_some_keys
86
+ json1 = JSON.generate({'meta' => {'key1' => 'value1'}})
87
+ response1 = mock()
88
+ response1.stubs(:code => "200", :body => json1)
89
+ json2 = JSON.generate({'meta' => {'key2' => 'value2'}})
90
+ response2 = mock()
91
+ response2.stubs(:code => "200", :body => json2)
92
+ conn = mock()
93
+ compute = mock()
94
+ compute.stubs(:connection).returns(conn)
95
+ conn.expects(:req).with('PUT', 'blah/metadata/key1', :data => json1).returns(response1)
96
+ conn.expects(:req).with('PUT', 'blah/metadata/key2', :data => json2).returns(response2)
97
+ data = {'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}
98
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah', data)
99
+ metadata.update(['key1', 'key2'])
100
+ end
101
+
102
+ def test_metadata_update_one_key
103
+ json = JSON.generate({'meta' => {'key2' => 'value2'}})
104
+ response = mock()
105
+ response.stubs(:code => "200", :body => json)
106
+ compute = mock()
107
+ conn = mock()
108
+ compute.stubs(:connection).returns(conn)
109
+ conn.expects(:req).with('PUT', 'blah/metadata/key2', :data => json).returns(response)
110
+ data = {'key1' => 'value1', 'key2' => 'value2'}
111
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah', data)
112
+ metadata.update(['key2'])
113
+ end
114
+
115
+ def test_metadata_update_nonexistent_key
116
+ data = {'key1' => 'value1', 'key2' => 'value2'}
117
+ compute = mock()
118
+ conn = mock()
119
+ compute.stubs(:connection).returns(conn)
120
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah', data)
121
+ metadata.update(['key3']) # just asserting nothing is called on conn
122
+ end
123
+
124
+ def test_metadata_update_nil
125
+ compute = mock()
126
+ conn = mock()
127
+ compute.stubs(:connection).returns(conn)
128
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah')
129
+ metadata.update # just asserting nothing is called on the connection
130
+ end
131
+
132
+ def test_refresh_one_key
133
+ json = JSON.generate({'meta' => {'key1' => 'value1'}})
134
+ response = mock()
135
+ response.stubs(:code => "200", :body => json)
136
+ compute = mock()
137
+ conn = mock()
138
+ compute.stubs(:connection).returns(conn)
139
+ conn.expects(:req).with('GET', 'blah/metadata/key1').returns(response)
140
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah')
141
+ metadata.refresh(['key1'])
142
+ assert_equal('value1', metadata['key1'])
143
+ end
144
+
145
+ def test_refresh_some_keys_with_key_not_found
146
+ json = JSON.generate({'meta' => {'key1' => 'value1'}})
147
+ response = mock()
148
+ response.stubs(:code => "200", :body => json)
149
+ not_found = mock()
150
+ not_found.stubs(:code => "404")
151
+ compute = mock()
152
+ conn = mock()
153
+ compute.stubs(:connection).returns(conn)
154
+ conn.expects(:req).with('GET', 'blah/metadata/key1').returns(response)
155
+ conn.expects(:req).with('GET', 'blah/metadata/key0').returns(not_found)
156
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah')
157
+ metadata.refresh(['key1', 'key0'])
158
+ assert_equal('value1', metadata['key1'])
159
+ assert(metadata['key0'].nil?)
160
+ end
161
+
162
+ def test_delete_a_key
163
+ response = mock()
164
+ response.stubs(:code => "204")
165
+ connection = mock()
166
+ compute = mock()
167
+ compute.stubs(:connection).returns(connection)
168
+ connection.expects(:req).with('DELETE', 'blah/metadata/key1').returns(response)
169
+ metadata = OpenStack::Compute::Metadata.new(compute, 'blah')
170
+ metadata.delete!(['key1'])
171
+ end
172
+
173
+ def test_delete_a_key_with_prior_information
174
+ response = mock()
175
+ response.stubs(:code => "204")
176
+ comp = mock()
177
+ conn = mock()
178
+ comp.stubs(:connection).returns(conn)
179
+ conn.expects(:req).with('DELETE', 'blah/metadata/key1').returns(response)
180
+ data = {'key1' => 'value1', 'key2' => 'value2'}
181
+ metadata = OpenStack::Compute::Metadata.new(comp, 'blah', data)
182
+ metadata.delete!(['key1'])
183
+ assert(metadata['key1'].nil?)
184
+ assert_equal('value2', metadata['key2'])
185
+ end
186
+ ##
187
+ def test_delete_keys_softly
188
+ comp = mock()
189
+ conn = mock()
190
+ comp.stubs(:connection).returns(conn)
191
+ data = {'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}
192
+ metadata = OpenStack::Compute::Metadata.new(comp, 'blah', data)
193
+ metadata.delete(['key1', 'key3'])
194
+ assert(metadata['key1'].nil?)
195
+ assert_equal('value2', metadata['key2'])
196
+ assert(metadata['key3'].nil?)
197
+ end
198
+
199
+ def test_each_pair
200
+ comp = mock()
201
+ conn = mock()
202
+ comp.stubs(:connection).returns(conn)
203
+ data = {'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}
204
+ metadata = OpenStack::Compute::Metadata.new(comp, 'blah', data)
205
+ metadata.each_pair do |k,v|
206
+ assert_equal v, data[k]
207
+ end
208
+ end
209
+
210
+ end
@@ -0,0 +1,210 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ServersTest < Test::Unit::TestCase
4
+
5
+ include TestConnection
6
+
7
+ def setup
8
+ @comp=get_test_connection
9
+ end
10
+
11
+ def test_list_servers
12
+
13
+ json_response = %{{
14
+ "servers" : [
15
+ {
16
+ "id" : 1234,
17
+ "name" : "sample-server",
18
+ "image" : { "id": "2" },
19
+ "flavor" : { "id" : "1" },
20
+ "hostId" : "e4d909c290d0fb1ca068ffaddf22cbd0",
21
+ "status" : "BUILD",
22
+ "progress" : 60,
23
+ "addresses" : {
24
+ "public" : [
25
+ { "version" : 4, "addr" : "67.23.10.132" },
26
+ { "version" : 4, "addr" : "67.23.10.131" }
27
+ ],
28
+ "private" : [
29
+ { "version" : 4, "addr" : "10.176.42.16" }
30
+ ]
31
+ },
32
+ "metadata" : {
33
+ "Server Label" : "Web Head 1",
34
+ "Image Version" : "2.1"
35
+ }
36
+ },
37
+ {
38
+ "id" : 5678,
39
+ "name" : "sample-server2",
40
+ "image" : { "id": "2" },
41
+ "flavor" : { "id" : "1" },
42
+ "hostId" : "9e107d9d372bb6826bd81d3542a419d6",
43
+ "status" : "ACTIVE",
44
+ "addresses" : {
45
+ "public" : [
46
+ { "version" : 4, "addr" : "67.23.10.133" }
47
+ ],
48
+ "private" : [
49
+ { "version" : 4, "addr" : "10.176.42.17" }
50
+ ]
51
+ },
52
+ "metadata" : {
53
+ "Server Label" : "DB 1"
54
+ }
55
+ }
56
+ ]
57
+ }}
58
+ response = mock()
59
+ response.stubs(:code => "200", :body => json_response)
60
+ @comp.connection.stubs(:csreq).returns(response)
61
+ servers=@comp.list_servers
62
+ assert_equal 2, servers.size
63
+ assert_equal 1234, servers[0][:id]
64
+ assert_equal "sample-server", servers[0][:name]
65
+ end
66
+
67
+ def test_get_server
68
+
69
+ server=get_test_server
70
+ assert_equal "sample-server", server.name
71
+ assert_equal "2", server.image['id']
72
+ assert_equal "1", server.flavor['id']
73
+ assert_equal "e4d909c290d0fb1ca068ffaddf22cbd0", server.hostId
74
+ assert_equal "BUILD", server.status
75
+ assert_equal 60, server.progress
76
+ assert_equal "67.23.10.132", server.addresses[:public][0].address
77
+ assert_equal "67.23.10.131", server.addresses[:public][1].address
78
+ assert_equal "10.176.42.16", server.addresses[:private][0].address
79
+
80
+ end
81
+
82
+ def test_rebuild_server
83
+
84
+ json_response = %{{
85
+ "server": {
86
+ "id": "52415800-8b69-11e0-9b19-734f565bc83b",
87
+ "tenantId": "1234",
88
+ "userId": "5678",
89
+ "name": "newName",
90
+ "created": "2010-11-11T12:00:00Z",
91
+ "hostId": "e4d909c290d0fb1ca068ffaddf22cbd0",
92
+ "accessIPv4" : "67.23.10.138",
93
+ "accessIPv6" : "::babe:67.23.10.138",
94
+ "progress": 0,
95
+ "status": "REBUILD",
96
+ "adminPass": "GFf1j9aP",
97
+ "image" : {
98
+ "id": "52415800-8b69-11e0-9b19-734f6f006e54",
99
+ "name": "CentOS 5.2",
100
+ "links": [
101
+ {
102
+ "rel": "self",
103
+ "href": "http://servers.api.openstack.org/v1.1/1234/images/52415800-8b69-11e0-9b19-734f6f006e54"
104
+ },
105
+ {
106
+ "rel": "bookmark",
107
+ "href": "http://servers.api.openstack.org/1234/images/52415800-8b69-11e0-9b19-734f6f006e54"
108
+ }
109
+ ]
110
+ },
111
+ "flavor" : {
112
+ "id": "52415800-8b69-11e0-9b19-734f1195ff37",
113
+ "name": "256 MB Server",
114
+ "links": [
115
+ {
116
+ "rel": "self",
117
+ "href": "http://servers.api.openstack.org/v1.1/1234/flavors/52415800-8b69-11e0-9b19-734f1195ff37"
118
+ },
119
+ {
120
+ "rel": "bookmark",
121
+ "href": "http://servers.api.openstack.org/1234/flavors/52415800-8b69-11e0-9b19-734f1195ff37"
122
+ }
123
+ ]
124
+ },
125
+ "metadata": {
126
+ "My Server Name": "Apache1"
127
+ },
128
+ "addresses": {
129
+ "public" : [
130
+ {
131
+ "version": 4,
132
+ "addr": "67.23.10.138"
133
+ },
134
+ {
135
+ "version": 6,
136
+ "addr": "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
137
+ }
138
+ ],
139
+ "private" : [
140
+ {
141
+ "version": 4,
142
+ "addr": "10.176.42.19"
143
+ },
144
+ {
145
+ "version": 6,
146
+ "addr": "fe80:0000:0000:0000:0202:b3ff:fe1e:8329"
147
+ }
148
+ ]
149
+ },
150
+ "links": [
151
+ {
152
+ "rel": "self",
153
+ "href": "http://servers.api.openstack.org/v1.1/1234/servers/52415800-8b69-11e0-9b19-734fcece0043"
154
+ },
155
+ {
156
+ "rel": "bookmark",
157
+ "href": "http://servers.api.openstack.org/1234/servers/52415800-8b69-11e0-9b19-734fcece0043"
158
+ }
159
+ ]
160
+ }
161
+ }}
162
+
163
+ server=get_test_server
164
+
165
+ response = mock()
166
+ response.stubs(:code => "200", :body => json_response)
167
+
168
+ @comp.connection.stubs(:csreq).returns(response)
169
+ server.rebuild!(:name => "newName")
170
+
171
+ assert_not_nil server.adminPass
172
+ assert_equal "newName", server.name
173
+
174
+ end
175
+
176
+ private
177
+ def get_test_server
178
+
179
+ json_response = %{{
180
+ "server" : {
181
+ "id" : 1234,
182
+ "name" : "sample-server",
183
+ "image" : { "id": "2" },
184
+ "flavor" : { "id" : "1" },
185
+ "hostId" : "e4d909c290d0fb1ca068ffaddf22cbd0",
186
+ "status" : "BUILD",
187
+ "progress" : 60,
188
+ "addresses" : {
189
+ "public" : [
190
+ { "version" : 4, "addr" : "67.23.10.132" },
191
+ { "version" : 4, "addr" : "67.23.10.131" }
192
+ ],
193
+ "private" : [
194
+ { "version" : 4, "addr" : "10.176.42.16" }
195
+ ]
196
+ },
197
+ "metadata" : {
198
+ "Server Label" : "Web Head 1",
199
+ "Image Version" : "2.1"
200
+ }
201
+ }
202
+ }}
203
+
204
+ response = mock()
205
+ response.stubs(:code => "200", :body => json_response)
206
+ @comp.connection.stubs(:csreq).returns(response)
207
+ return @comp.server(1234)
208
+ end
209
+
210
+ end
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'mocha'
4
+ $:.unshift File.dirname(__FILE__) + '/../lib'
5
+ require 'openstack'
6
+
7
+ module TestConnection
8
+
9
+ def get_test_connection
10
+
11
+ conn_response = {'x-server-management-url' => 'http://server-manage.example.com/path', 'x-auth-token' => 'dummy_token'}
12
+ conn_response.stubs(:code).returns('204')
13
+ #server = mock(:use_ssl= => true, :verify_mode= => true, :start => true, :finish => true)
14
+ server = mock(:start => true, :finish => true)
15
+ server.stubs(:get => conn_response, :use_ssl= => true, :verify_mode= => true)
16
+ #server.stubs(:get).returns(conn_response)
17
+ Net::HTTP.stubs(:new).returns(server)
18
+ OpenStack::Connection.create(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "http://a.b.c")
19
+
20
+ end
21
+
22
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,8 +10,40 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-09-05 00:00:00.000000000 Z
13
+ date: 2012-09-13 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mocha
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: test-unit
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
15
47
  - !ruby/object:Gem::Dependency
16
48
  name: json
17
49
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +84,12 @@ files:
52
84
  - lib/openstack/swift/connection.rb
53
85
  - lib/openstack/swift/container.rb
54
86
  - lib/openstack/swift/storage_object.rb
87
+ - test/authentication_test.rb
88
+ - test/connection_test.rb
89
+ - test/exception_test.rb
90
+ - test/metadata_test.rb
91
+ - test/servers_test.rb
92
+ - test/test_helper.rb
55
93
  homepage: https://github.com/ruby-openstack/ruby-openstack
56
94
  licenses: []
57
95
  post_install_message: