openstack-compute 1.0.2 → 1.1.0.pre0

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/README.rdoc CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  == Description
4
4
 
5
- Ruby Openstack Compute binding for the v1.0 OSAPI.
6
-
7
- Currently supports both v1.0 and v2.0 (keystone) auth.
5
+ Ruby Openstack Compute binding.
8
6
 
9
7
  == Examples
10
8
 
@@ -12,7 +10,7 @@ See the class definitions for documentation on specific methods and operations.
12
10
 
13
11
  require 'openstack/compute'
14
12
 
15
- cs = OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, :auth_url => API_URL)
13
+ cs = OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, :api_url => API_URL)
16
14
 
17
15
  # Get a listing of all current servers
18
16
  >> cs.servers
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.1.0.pre0
@@ -9,7 +9,7 @@
9
9
  # To begin reviewing the available methods and examples, view the README.rdoc file, or begin by looking at documentation for the OpenStack::Compute::Connection class.
10
10
  #
11
11
  # Example:
12
- # OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, :auth_url => API_URL) method.
12
+ # OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, :api_url => API_URL) method.
13
13
  module OpenStack
14
14
  module Compute
15
15
 
@@ -38,7 +38,6 @@ module Compute
38
38
  MAX_PERSONALITY_ITEMS = 5
39
39
  MAX_PERSONALITY_FILE_SIZE = 10240
40
40
  MAX_SERVER_PATH_LENGTH = 255
41
- MAX_PERSONALITY_METADATA_ITEMS = 5
42
41
 
43
42
  # Helper method to recursively symbolize hash keys.
44
43
  def self.symbolize_keys(obj)
@@ -1,70 +1,19 @@
1
1
  module OpenStack
2
2
  module Compute
3
-
4
3
  class Authentication
5
-
6
- # Performs an authentication to the OpenStack auth server.
7
- # If it succeeds, it sets the svrmgmthost, svrmgtpath, svrmgmtport,
8
- # svrmgmtscheme, authtoken, and authok variables on the connection.
9
- # If it fails, it raises an exception.
10
- def self.init(conn)
11
- if conn.auth_path =~ /.*v2.0\/?$/
12
- AuthV20.new(conn)
13
- else
14
- AuthV10.new(conn)
15
- end
16
- end
17
-
18
- end
19
-
20
- private
21
- class AuthV20
22
-
23
- def initialize(connection)
24
- begin
25
- server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.auth_host, connection.auth_port)
26
- if connection.auth_scheme == "https"
27
- server.use_ssl = true
28
- server.verify_mode = OpenSSL::SSL::VERIFY_NONE
29
- end
30
- server.start
31
- rescue
32
- raise OpenStack::Compute::Exception::Connection, "Unable to connect to #{server}"
33
- end
34
-
35
- auth_data = JSON.generate({ "passwordCredentials" => { "username" => connection.authuser, "password" => connection.authkey }})
36
- response = server.post(connection.auth_path.chomp("/")+"/tokens", auth_data, {'Content-Type' => 'application/json'})
37
- if (response.code =~ /^20./)
38
- resp_data=JSON.parse(response.body)
39
- connection.authtoken = resp_data['auth']['token']['id']
40
- if resp_data['auth']['serviceCatalog'] and resp_data['auth']['serviceCatalog'][connection.service_name] and resp_data['auth']['serviceCatalog'][connection.service_name][0] then
41
- uri = URI.parse(resp_data['auth']['serviceCatalog'][connection.service_name][0]['publicURL'])
42
- connection.svrmgmthost = uri.host
43
- connection.svrmgmtpath = uri.path
44
- # Force the path into the v1.0 URL space
45
- connection.svrmgmtpath.sub!(/\/.*\/?/, '/v1.0/')
46
- connection.svrmgmtport = uri.port
47
- connection.svrmgmtscheme = uri.scheme
48
- connection.authok = true
49
- else
50
- connection.authok = false
51
- end
52
- else
53
- connection.authtoken = false
54
- raise OpenStack::Compute::Exception::Authentication, "Authentication failed with response code #{response.code}"
55
- end
56
- server.finish
57
- end
58
- end
59
-
60
- class AuthV10
61
4
 
5
+ # Performs an authentication to the OpenStack authorization servers. Opens a new HTTP connection to the API server,
6
+ # sends the credentials, and looks for a successful authentication. If it succeeds, it sets the svrmgmthost,
7
+ # svrmgtpath, svrmgmtport, svrmgmtscheme, authtoken, and authok variables on the connection. If it fails, it raises
8
+ # an exception.
9
+ #
10
+ # Should probably never be called directly.
62
11
  def initialize(connection)
63
- path = '/v1.0'
12
+ path = connection.api_path
64
13
  hdrhash = { "X-Auth-User" => connection.authuser, "X-Auth-Key" => connection.authkey }
65
14
  begin
66
- server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.auth_host, connection.auth_port)
67
- if connection.auth_scheme == "https"
15
+ server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.api_host, connection.api_port)
16
+ if connection.api_scheme == "https"
68
17
  server.use_ssl = true
69
18
  server.verify_mode = OpenSSL::SSL::VERIFY_NONE
70
19
  end
@@ -75,13 +24,11 @@ module Compute
75
24
  response = server.get(path,hdrhash)
76
25
  if (response.code =~ /^20./)
77
26
  connection.authtoken = response["x-auth-token"]
78
- uri = URI.parse(response["x-server-management-url"])
79
- connection.svrmgmthost = uri.host
80
- connection.svrmgmtpath = uri.path
27
+ connection.svrmgmthost = URI.parse(response["x-server-management-url"]).host
28
+ connection.svrmgmtpath = URI.parse(response["x-server-management-url"]).path
81
29
  # Force the path into the v1.0 URL space
82
- connection.svrmgmtpath.sub!(/\/.*\/?/, '/v1.0/')
83
- connection.svrmgmtport = uri.port
84
- connection.svrmgmtscheme = uri.scheme
30
+ connection.svrmgmtport = URI.parse(response["x-server-management-url"]).port
31
+ connection.svrmgmtscheme = URI.parse(response["x-server-management-url"]).scheme
85
32
  connection.authok = true
86
33
  else
87
34
  connection.authtoken = false
@@ -90,6 +37,5 @@ module Compute
90
37
  server.finish
91
38
  end
92
39
  end
93
-
94
40
  end
95
41
  end
@@ -10,11 +10,10 @@ module Compute
10
10
  attr_accessor :svrmgmtpath
11
11
  attr_accessor :svrmgmtport
12
12
  attr_accessor :svrmgmtscheme
13
- attr_reader :auth_host
14
- attr_reader :auth_port
15
- attr_reader :auth_scheme
16
- attr_reader :auth_path
17
- attr_accessor :service_name
13
+ attr_reader :api_host
14
+ attr_reader :api_port
15
+ attr_reader :api_scheme
16
+ attr_reader :api_path
18
17
  attr_reader :proxy_host
19
18
  attr_reader :proxy_port
20
19
 
@@ -24,37 +23,36 @@ module Compute
24
23
  #
25
24
  # :username - Your Openstack username *required*
26
25
  # :api_key - Your Openstack API key *required*
27
- # :auth_url - Configurable auth_url endpoint.
28
- # :service_name - (Optional for v2.0 auth only). The name of the compute service to use. Defaults to 'nova'.
26
+ # :api_url - The url of the Openstack Compute API server.
29
27
  # :retry_auth - Whether to retry if your auth token expires (defaults to true)
30
28
  # :proxy_host - If you need to connect through a proxy, supply the hostname here
31
29
  # :proxy_port - If you need to connect through a proxy, supply the port here
32
30
  #
33
- # cf = OpenStack::Compute::Connection.new(:username => 'USERNAME', :api_key => 'API_KEY', :auth_url => 'AUTH_URL')
31
+ # cf = OpenStack::Compute::Connection.new(:username => 'USERNAME', :api_key => 'API_KEY', :api_url => 'API_URL')
34
32
  def initialize(options = {:retry_auth => true})
35
33
  @authuser = options[:username] || (raise Exception::MissingArgument, "Must supply a :username")
36
34
  @authkey = options[:api_key] || (raise Exception::MissingArgument, "Must supply an :api_key")
37
- @auth_url = options[:auth_url] || (raise Exception::MissingArgument, "Must supply an :auth_url")
38
- @service_name = options[:service_name] || "nova"
35
+ @api_url = options[:api_url] || (raise Exception::MissingArgument, "Must supply an :api_url")
36
+ @is_debug = options[:is_debug]
39
37
 
40
- auth_uri=nil
38
+ api_uri=nil
41
39
  begin
42
- auth_uri=URI.parse(@auth_url)
40
+ api_uri=URI.parse(@api_url)
43
41
  rescue Exception => e
44
- raise Exception::InvalidArgument, "Invalid :auth_url parameter: #{e.message}"
42
+ raise Exception::InvalidArgument, "Invalid :api_url parameter: #{e.message}"
45
43
  end
46
- raise Exception::InvalidArgument, "Invalid :auth_url parameter." if auth_uri.nil? or auth_uri.host.nil?
47
- @auth_host = auth_uri.host
48
- @auth_port = auth_uri.port
49
- @auth_scheme = auth_uri.scheme
50
- @auth_path = auth_uri.path
44
+ raise Exception::InvalidArgument, "Invalid :api_url parameter." if api_uri.nil? or api_uri.host.nil?
45
+ @api_host = api_uri.host
46
+ @api_port = api_uri.port
47
+ @api_scheme = api_uri.scheme
48
+ @api_path = api_uri.path.sub(/\/$/, '')
51
49
 
52
50
  @retry_auth = options[:retry_auth]
53
51
  @proxy_host = options[:proxy_host]
54
52
  @proxy_port = options[:proxy_port]
55
53
  @authok = false
56
54
  @http = {}
57
- OpenStack::Compute::Authentication.init(self)
55
+ OpenStack::Compute::Authentication.new(self)
58
56
  end
59
57
 
60
58
  # Returns true if the authentication was successful and returns false otherwise.
@@ -64,7 +62,7 @@ module Compute
64
62
  def authok?
65
63
  @authok
66
64
  end
67
-
65
+
68
66
  # This method actually makes the HTTP REST calls out to the server
69
67
  def csreq(method,server,path,port,scheme,headers = {},data = nil,attempts = 0) # :nodoc:
70
68
  start = Time.now
@@ -73,6 +71,12 @@ module Compute
73
71
  request = Net::HTTP.const_get(method.to_s.capitalize).new(path,hdrhash)
74
72
  request.body = data
75
73
  response = @http[server].request(request)
74
+ if @is_debug
75
+ puts "REQUEST: #{method} => #{path}"
76
+ puts data if data
77
+ puts "RESPONSE: #{response.body}"
78
+ puts '----------------------------------------'
79
+ end
76
80
  raise OpenStack::Compute::Exception::ExpiredAuthToken if response.code == "401"
77
81
  response
78
82
  rescue Errno::EPIPE, Timeout::Error, Errno::EINVAL, EOFError
@@ -84,10 +88,27 @@ module Compute
84
88
  retry
85
89
  rescue OpenStack::Compute::Exception::ExpiredAuthToken
86
90
  raise OpenStack::Compute::Exception::Connection, "Authentication token expired and you have requested not to retry" if @retry_auth == false
87
- OpenStack::Compute::Authentication.init(self)
91
+ OpenStack::Compute::Authentication.new(self)
88
92
  retry
89
93
  end
90
-
94
+
95
+ # This is a much more sane way to make a http request to the api.
96
+ # Example: res = conn.req('GET', "/servers/#{id}")
97
+ def req(method, path, options = {})
98
+ server = options[:server] || @svrmgmthost
99
+ port = options[:port] || @svrmgmtport
100
+ scheme = options[:scheme] || @svrmgmtscheme
101
+ headers = options[:headers] || {'content-type' => 'application/json'}
102
+ data = options[:data]
103
+ attempts = options[:attempts] || 0
104
+ path = @svrmgmtpath + path
105
+ res = csreq(method,server,path,port,scheme,headers,data,attempts)
106
+ if not res.code.match(/^20.$/)
107
+ OpenStack::Compute::Exception.raise_exception(res)
108
+ end
109
+ return res
110
+ end;
111
+
91
112
  # Returns the OpenStack::Compute::Server object identified by the given id.
92
113
  #
93
114
  # >> server = cs.get_server(110917)
@@ -139,21 +160,32 @@ module Compute
139
160
 
140
161
  # Creates a new server instance on OpenStack Compute
141
162
  #
142
- # The argument is a hash of options. The keys :name, :flavorId, and :imageId are required, :metadata and :personality are optional.
163
+ # The argument is a hash of options. The keys :name, :flavorRef,
164
+ # and :imageRef are required; :metadata and :personality are optional.
143
165
  #
144
- # :flavorId and :imageId are numbers identifying a particular server flavor and image to use when building the server. The :imageId can either
145
- # be a stock image, or one of your own created with the server.create_image method.
166
+ # :flavorRef and :imageRef are href strings identifying a particular
167
+ # server flavor and image to use when building the server. The :imageRef
168
+ # can either be a stock image, or one of your own created with the
169
+ # server.create_image method.
146
170
  #
147
- # The :metadata argument will take a hash of up to five key/value pairs. This metadata will be applied to the server at the OpenStack Compute
148
- # API level.
171
+ # The :metadata argument should be a hash of key/value pairs. This
172
+ # metadata will be applied to the server at the OpenStack Compute API level.
149
173
  #
150
- # The "Personality" option allows you to include up to five files, of 10Kb or less in size, that will be placed on the created server.
151
- # For :personality, pass a hash of the form {'local_path' => 'server_path'}. The file located at local_path will be base64-encoded
152
- # and placed at the location identified by server_path on the new server.
174
+ # The "Personality" option allows you to include up to five files, # of
175
+ # 10Kb or less in size, that will be placed on the created server.
176
+ # For :personality, pass a hash of the form {'local_path' => 'server_path'}.
177
+ # The file located at local_path will be base64-encoded and placed at the
178
+ # location identified by server_path on the new server.
153
179
  #
154
- # Returns a OpenStack::Compute::Server object. The root password is available in the adminPass instance method.
180
+ # Returns a OpenStack::Compute::Server object. The root password is
181
+ # available in the adminPass instance method.
155
182
  #
156
- # >> server = cs.create_server(:name => "New Server", :imageId => 2, :flavorId => 2, :metadata => {'Racker' => 'Fanatical'}, :personality => {'/Users/me/Pictures/wedding.jpg' => '/root/me.jpg'})
183
+ # >> server = cs.create_server(
184
+ # :name => 'NewServer',
185
+ # :imageRef => 'http://172.19.0.3/v1.1/images/3',
186
+ # :flavorRef => 'http://172.19.0.3/v1.1/flavors/1',
187
+ # :metadata => {'Racker' => 'Fanatical'},
188
+ # :personality => {'/home/bob/wedding.jpg' => '/root/wedding.jpg'})
157
189
  # => #<OpenStack::Compute::Server:0x101229eb0 ...>
158
190
  # >> server.name
159
191
  # => "NewServer"
@@ -162,9 +194,8 @@ module Compute
162
194
  # >> server.adminPass
163
195
  # => "NewServerSHMGpvI"
164
196
  def create_server(options)
165
- raise OpenStack::Compute::Exception::MissingArgument, "Server name, flavor ID, and image ID must be supplied" unless (options[:name] && options[:flavorId] && options[:imageId])
197
+ raise OpenStack::Compute::Exception::MissingArgument, "Server name, flavorRef, and imageRef, must be supplied" unless (options[:name] && options[:flavorRef] && options[:imageRef])
166
198
  options[:personality] = get_personality(options[:personality])
167
- raise TooManyMetadataItems, "Metadata is limited to a total of #{MAX_PERSONALITY_METADATA_ITEMS} key/value pairs" if options[:metadata].is_a?(Hash) && options[:metadata].keys.size > MAX_PERSONALITY_METADATA_ITEMS
168
199
  data = JSON.generate(:server => options)
169
200
  response = csreq("POST",svrmgmthost,"#{svrmgmtpath}/servers",svrmgmtport,svrmgmtscheme,{'content-type' => 'application/json'},data)
170
201
  OpenStack::Compute::Exception.raise_exception(response) unless response.code.match(/^20.$/)
@@ -2,6 +2,8 @@ module OpenStack
2
2
  module Compute
3
3
  class Image
4
4
 
5
+ require 'compute/metadata'
6
+
5
7
  attr_reader :id
6
8
  attr_reader :name
7
9
  attr_reader :serverId
@@ -9,6 +11,7 @@ module Compute
9
11
  attr_reader :created
10
12
  attr_reader :status
11
13
  attr_reader :progress
14
+ attr_reader :metadata
12
15
 
13
16
  # This class provides an object for the "Image" of a server. The Image refers to the Operating System type and version.
14
17
  #
@@ -23,6 +26,7 @@ module Compute
23
26
  def initialize(connection,id)
24
27
  @id = id
25
28
  @connection = connection
29
+ @metadata = OpenStack::Compute::ImageMetadata.new(connection, id)
26
30
  populate
27
31
  end
28
32
 
@@ -0,0 +1,52 @@
1
+ module OpenStack
2
+ module Compute
3
+
4
+ class AbstractMetadata
5
+
6
+ def initialize(connection, server_id)
7
+ @connection = connection
8
+ @server_id = server_id
9
+ end
10
+
11
+ def get_item(key)
12
+ response = @connection.req('GET', "#{@base_url}/#{key}")
13
+ return JSON.parse(response.body)['meta'][key]
14
+ end
15
+
16
+ def set_item(key, value)
17
+ json = JSON.generate(:meta => { key => value })
18
+ @connection.req('PUT', "#{@base_url}/#{key}", :data => json)
19
+ end
20
+
21
+ def delete_item(key)
22
+ @connection.req('DELETE', "#{@base_url}/#{key}")
23
+ end
24
+
25
+ def get_data()
26
+ response = @connection.req('GET', @base_url)
27
+ return JSON.parse(response.body)['metadata']
28
+ end
29
+
30
+ def set_data(data = {})
31
+ json = JSON.generate(:metadata => data)
32
+ @connection.req('POST', @base_url, :data => json)
33
+ end
34
+
35
+ end
36
+
37
+ class ServerMetadata < AbstractMetadata
38
+ def initialize(connection, server_id)
39
+ super(connection, server_id)
40
+ @base_url = "/servers/#{@server_id}/metadata"
41
+ end
42
+ end
43
+
44
+ class ImageMetadata < AbstractMetadata
45
+ def initialize(connection, server_id)
46
+ super(connection, server_id)
47
+ @base_url = "/images/#{@server_id}/metadata"
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -2,15 +2,17 @@ module OpenStack
2
2
  module Compute
3
3
  class Server
4
4
 
5
+ require 'compute/metadata'
6
+
5
7
  attr_reader :id
6
8
  attr_reader :name
7
9
  attr_reader :status
8
10
  attr_reader :progress
9
11
  attr_reader :addresses
10
- attr_reader :metadata
11
12
  attr_reader :hostId
12
13
  attr_reader :imageId
13
14
  attr_reader :flavorId
15
+ attr_reader :metadata
14
16
  attr_accessor :adminPass
15
17
 
16
18
  # This class is the representation of a single Server object. The constructor finds the server identified by the specified
@@ -50,10 +52,10 @@ module Compute
50
52
  @status = data["status"]
51
53
  @progress = data["progress"]
52
54
  @addresses = OpenStack::Compute.symbolize_keys(data["addresses"])
53
- @metadata = data["metadata"]
55
+ @metadata = OpenStack::Compute::ServerMetadata.new(@connection, @id)
54
56
  @hostId = data["hostId"]
55
- @imageId = data["imageId"]
56
- @flavorId = data["flavorId"]
57
+ @imageId = data["image"]["id"]
58
+ @flavorId = data["flavor"]["id"]
57
59
  true
58
60
  end
59
61
  alias :refresh :populate
@@ -65,7 +67,7 @@ module Compute
65
67
  # >> flavor.name
66
68
  # => "256 server"
67
69
  def flavor
68
- OpenStack::Compute::Flavor.new(@connection,self.flavorId)
70
+ OpenStack::Compute::Flavor.new(@connection, self.flavorId)
69
71
  end
70
72
 
71
73
  # Returns a new OpenStack::Compute::Image object for the image assigned to this server.
@@ -75,7 +77,7 @@ module Compute
75
77
  # >> image.name
76
78
  # => "Ubuntu 8.04.2 LTS (hardy)"
77
79
  def image
78
- OpenStack::Compute::Image.new(@connection,self.imageId)
80
+ OpenStack::Compute::Image.new(@connection, self.imageId)
79
81
  end
80
82
 
81
83
  # Sends an API request to reboot this server. Takes an optional argument for the type of reboot, which can be "SOFT" (graceful shutdown)
@@ -133,19 +135,36 @@ module Compute
133
135
  true
134
136
  end
135
137
 
136
- # Takes the existing server and rebuilds it with the image identified by the imageId argument. If no imageId is provided, the current image
137
- # will be used.
138
- #
139
- # This will wipe and rebuild the server, but keep the server ID number, name, and IP addresses the same.
138
+ # The rebuild function removes all data on the server and replaces it with
139
+ # the specified image. The serverRef and all IP addresses will remain the
140
+ # same. If name and metadata are specified, they will replace existing
141
+ # values, otherwise they will not change. A rebuild operation always
142
+ # removes data injected into the file system via server personality. You
143
+ # may reinsert data into the filesystem during the rebuild.
144
+ #
145
+ # This method expects a hash of the form:
146
+ # {
147
+ # :imageId => "https://foo.com/v1.1/images/2",
148
+ # :name => "newName",
149
+ # :metadata => { :values => { :foo : "bar" } },
150
+ # :personality => [
151
+ # {
152
+ # :path => "/etc/banner.txt",
153
+ # :contents => : "ICAgpY2hhcmQgQmFjaA=="
154
+ # }
155
+ # ]
156
+ # }
157
+ #
158
+ # This will wipe and rebuild the server, but keep the server ID number,
159
+ # name, and IP addresses the same.
140
160
  #
141
161
  # Returns true if the API call succeeds.
142
162
  #
143
163
  # >> server.rebuild!
144
164
  # => true
145
- def rebuild!(imageId = self.imageId)
146
- data = JSON.generate(:rebuild => {:imageId => imageId})
147
- response = @connection.csreq("POST",@svrmgmthost,"#{@svrmgmtpath}/servers/#{URI.encode(self.id.to_s)}/action",@svrmgmtport,@svrmgmtscheme,{'content-type' => 'application/json'},data)
148
- OpenStack::Compute::Exception.raise_exception(response) unless response.code.match(/^20.$/)
165
+ def rebuild!(options)
166
+ json = JSON.generate(:rebuild => options)
167
+ @connection.req('POST', "/servers/#{@id}/action", :data => json)
149
168
  self.populate
150
169
  true
151
170
  end
@@ -214,6 +233,14 @@ module Compute
214
233
  true
215
234
  end
216
235
 
236
+ # Changes the admin password.
237
+ # Returns the password if it succeeds.
238
+ def change_password!(password)
239
+ json = JSON.generate(:changePassword => { :adminPass => password })
240
+ @connection.req('POST', "/servers/#{@id}/action", :data => json)
241
+ @adminPass = password
242
+ end
243
+
217
244
  end
218
245
  end
219
246
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstack-compute
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
4
+ hash: -1876988165
5
+ prerelease: true
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 1.0.2
10
+ - pre0
11
+ version: 1.1.0.pre0
11
12
  platform: ruby
12
13
  authors:
13
14
  - Dan Prince
@@ -15,7 +16,7 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2011-09-07 00:00:00 -04:00
19
+ date: 2011-10-13 00:00:00 -04:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
@@ -50,19 +51,15 @@ files:
50
51
  - lib/openstack/compute/exception.rb
51
52
  - lib/openstack/compute/flavor.rb
52
53
  - lib/openstack/compute/image.rb
54
+ - lib/openstack/compute/metadata.rb
53
55
  - lib/openstack/compute/server.rb
54
- - test/authentication_test.rb
55
- - test/exception_test.rb
56
- - test/test_helper.rb
57
- - test/connection_test.rb
58
- - test/servers_test.rb
59
56
  has_rdoc: true
60
57
  homepage: https://launchpad.net/ruby-openstack-compute
61
58
  licenses: []
62
59
 
63
60
  post_install_message:
64
- rdoc_options:
65
- - --charset=UTF-8
61
+ rdoc_options: []
62
+
66
63
  require_paths:
67
64
  - lib
68
65
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -77,12 +74,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
74
  required_rubygems_version: !ruby/object:Gem::Requirement
78
75
  none: false
79
76
  requirements:
80
- - - ">="
77
+ - - ">"
81
78
  - !ruby/object:Gem::Version
82
- hash: 3
79
+ hash: 25
83
80
  segments:
84
- - 0
85
- version: "0"
81
+ - 1
82
+ - 3
83
+ - 1
84
+ version: 1.3.1
86
85
  requirements: []
87
86
 
88
87
  rubyforge_project:
@@ -90,9 +89,5 @@ rubygems_version: 1.3.7
90
89
  signing_key:
91
90
  specification_version: 3
92
91
  summary: OpenStack Compute Ruby API
93
- test_files:
94
- - test/authentication_test.rb
95
- - test/exception_test.rb
96
- - test/test_helper.rb
97
- - test/connection_test.rb
98
- - test/servers_test.rb
92
+ test_files: []
93
+
@@ -1,36 +0,0 @@
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 => 'bad_user', :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v1.0", :authok= => true, :authtoken= => true, :svrmgmthost= => "", :svrmgmtpath= => "", :svrmgmtpath => "", :svrmgmtport= => "", :svrmgmtscheme= => "", :proxy_host => nil, :proxy_port => nil)
12
- result = OpenStack::Compute::Authentication.init(connection)
13
- assert_equal result.class, OpenStack::Compute::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', :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)
23
- assert_raises(OpenStack::Compute::Exception::Authentication) do
24
- result = OpenStack::Compute::Authentication.init(connection)
25
- end
26
- end
27
-
28
- def test_bad_hostname
29
- Net::HTTP.stubs(:new).raises(OpenStack::Compute::Exception::Connection)
30
- connection = stub(:authuser => 'bad_user', :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)
31
- assert_raises(OpenStack::Compute::Exception::Connection) do
32
- result = OpenStack::Compute::Authentication.init(connection)
33
- end
34
- end
35
-
36
- end
@@ -1,39 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class ComputeConnectionTest < Test::Unit::TestCase
4
-
5
- def setup
6
- connection = stub()
7
- OpenStack::Compute::Authentication.stubs(:init).returns(connection)
8
- end
9
-
10
- def test_init_connection_no_credentials
11
- assert_raises(OpenStack::Compute::Exception::MissingArgument) do
12
- conn = OpenStack::Compute::Connection.new(:api_key => "AABBCCDD11", :auth_url => "a.b.c")
13
- end
14
- end
15
-
16
- def test_init_connection_no_password
17
- assert_raises(OpenStack::Compute::Exception::MissingArgument) do
18
- conn = OpenStack::Compute::Connection.new(: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::Compute::Exception::MissingArgument) do
24
- conn = OpenStack::Compute::Connection.new(:username => "test_account", :api_key => "AABBCCDD11")
25
- end
26
- end
27
-
28
- def test_init_connection_bad_auth_url
29
- assert_raises(OpenStack::Compute::Exception::InvalidArgument) do
30
- conn = OpenStack::Compute::Connection.new(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "***")
31
- end
32
- end
33
-
34
- def test_init_connection
35
- conn = OpenStack::Compute::Connection.new(: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
@@ -1,49 +0,0 @@
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::Compute::Exception.raise_exception(response)
11
- rescue Exception => e
12
- exception=e
13
- end
14
- assert_equal(OpenStack::Compute::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::Compute::Exception.raise_exception(response)
25
- rescue Exception => e
26
- exception=e
27
- end
28
- assert_equal(OpenStack::Compute::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::Compute::Exception.raise_exception(response)
40
- rescue Exception => e
41
- exception=e
42
- end
43
- assert_equal(OpenStack::Compute::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
data/test/servers_test.rb DELETED
@@ -1,123 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class ServersTest < Test::Unit::TestCase
4
-
5
- include TestConnection
6
-
7
- def setup
8
- @conn=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
- "imageId" : 2,
19
- "flavorId" : 1,
20
- "hostId" : "e4d909c290d0fb1ca068ffaddf22cbd0",
21
- "status" : "BUILD",
22
- "progress" : 60,
23
- "addresses" : {
24
- "public" : [
25
- "67.23.10.132",
26
- "67.23.10.131"
27
- ],
28
- "private" : [
29
- "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
- "imageId" : 2,
41
- "flavorId" : 1,
42
- "hostId" : "9e107d9d372bb6826bd81d3542a419d6",
43
- "status" : "ACTIVE",
44
- "addresses" : {
45
- "public" : [
46
- "67.23.10.133"
47
- ],
48
- "private" : [
49
- "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
-
61
- @conn.stubs(:csreq).returns(response)
62
- servers=@conn.list_servers
63
-
64
- assert_equal 2, servers.size
65
- assert_equal 1234, servers[0][:id]
66
- assert_equal "sample-server", servers[0][:name]
67
-
68
- end
69
-
70
- def test_get_server
71
-
72
- server=get_test_server
73
- assert "sample-server", server.name
74
- assert "2", server.imageId
75
- assert "1", server.flavorId
76
- assert "e4d909c290d0fb1ca068ffaddf22cbd0", server.hostId
77
- assert "BUILD", server.status
78
- assert "60", server.progress
79
- assert "67.23.10.132", server.addresses[:public][0]
80
- assert "67.23.10.131", server.addresses[:public][1]
81
- assert "10.176.42.16", server.addresses[:private][1]
82
-
83
- end
84
-
85
- private
86
- def get_test_server
87
-
88
- json_response = %{{
89
- "server" : {
90
- "id" : 1234,
91
- "name" : "sample-server",
92
- "imageId" : 2,
93
- "flavorId" : 1,
94
- "hostId" : "e4d909c290d0fb1ca068ffaddf22cbd0",
95
- "status" : "BUILD",
96
- "progress" : 60,
97
- "addresses" : {
98
- "public" : [
99
- "67.23.10.132",
100
- "67.23.10.131"
101
- ],
102
- "private" : [
103
- "10.176.42.16"
104
- ]
105
- },
106
- "metadata" : {
107
- "Server Label" : "Web Head 1",
108
- "Image Version" : "2.1"
109
- }
110
- }
111
- }}
112
-
113
- response = mock()
114
- response.stubs(:code => "200", :body => json_response)
115
-
116
- @conn=get_test_connection
117
-
118
- @conn.stubs(:csreq).returns(response)
119
- return @conn.server(1234)
120
-
121
- end
122
-
123
- end
data/test/test_helper.rb DELETED
@@ -1,23 +0,0 @@
1
- require 'test/unit'
2
- $:.unshift File.dirname(__FILE__) + '/../lib'
3
- require 'openstack/compute'
4
- require 'rubygems'
5
- require 'mocha'
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
-
19
- OpenStack::Compute::Connection.new(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "http://a.b.c")
20
-
21
- end
22
-
23
- end