openstack 1.1.1 → 1.1.2

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.
@@ -18,7 +18,6 @@
18
18
 
19
19
  module OpenStack
20
20
 
21
- VERSION = IO.read(File.dirname(__FILE__) + '/../VERSION')
22
21
  require 'net/http'
23
22
  require 'net/https'
24
23
  require 'uri'
@@ -49,7 +48,9 @@ module OpenStack
49
48
  require 'openstack/network/connection'
50
49
  require 'openstack/network/network'
51
50
  require 'openstack/network/subnet'
51
+ require 'openstack/network/router'
52
52
  require 'openstack/network/port'
53
+ require 'openstack/version'
53
54
  # Constants that set limits on server creation
54
55
  MAX_PERSONALITY_ITEMS = 5
55
56
  MAX_PERSONALITY_FILE_SIZE = 10240
@@ -78,7 +78,22 @@ module Compute
78
78
  @pool = addr_hash["pool"]
79
79
  end
80
80
 
81
+ end
81
82
 
83
+ class FloatingIPInfo
84
+ attr_reader :address
85
+ attr_reader :instance_uuid
86
+ attr_reader :interface
87
+ attr_reader :pool
88
+ attr_reader :project_id
89
+
90
+ def initialize(info_hash)
91
+ @address = info_hash['address']
92
+ @instance_uuid = info_hash['instance_uuid']
93
+ @interface = info_hash['interface']
94
+ @pool = info_hash['pool']
95
+ @project_id = info_hash['project_id']
96
+ end
82
97
  end
83
98
 
84
99
  end
@@ -465,6 +465,37 @@ module Compute
465
465
  true
466
466
  end
467
467
 
468
+ def get_floating_ip_polls
469
+ check_extension 'os-floating-ip-pools'
470
+ response = @connection.req('GET', '/os-floating-ip-pools')
471
+ res = JSON.parse(response.body)['floating_ip_pools']
472
+ end
473
+
474
+ def get_floating_ips_bulk
475
+ check_extension 'os-floating-ips-bulk'
476
+ response = @connection.req('GET', '/os-floating-ips-bulk')
477
+ res = JSON.parse(response.body)['floating_ip_info']
478
+ res.inject([]){|result, c| result << OpenStack::Compute::FloatingIPInfo.new(c); result}
479
+ end
480
+
481
+ def create_floating_ips_bulk(opts = {})
482
+ raise ArgumentError, 'Should not be empty' if opts.empty?
483
+ data = JSON.generate({:floating_ips_bulk_create => opts})
484
+ check_extension 'os-floating-ips-bulk'
485
+ response = @connection.req('POST', '/os-floating-ips-bulk', {:data => data})
486
+ JSON.parse(response.body)['floating_ips_bulk_create']
487
+ end
488
+
489
+ # Not working
490
+ # Nova does not supported deletion via API
491
+ def delete_floating_ips_bulk(opts = {})
492
+ raise ArgumentError, 'Should not be empty' if opts.empty?
493
+ data = JSON.generate(opts)
494
+ check_extension 'os-floating-ips-bulk'
495
+ response = @connection.req('POST', '/os-floating-ips-bulk/delete', {:data => data})
496
+ res = JSON.generate(response)
497
+ end
498
+
468
499
  private
469
500
 
470
501
  def check_extension(name)
@@ -472,7 +503,6 @@ module Compute
472
503
  true
473
504
  end
474
505
 
475
-
476
506
  end
477
507
 
478
508
  end
@@ -12,6 +12,8 @@ class Connection
12
12
  attr_accessor :service_path
13
13
  attr_accessor :service_port
14
14
  attr_accessor :service_scheme
15
+ attr_accessor :quantum_version
16
+ attr_reader :retries
15
17
  attr_reader :auth_host
16
18
  attr_reader :auth_port
17
19
  attr_reader :auth_scheme
@@ -78,6 +80,7 @@ class Connection
78
80
  private_class_method :new
79
81
 
80
82
  def initialize(options = {:retry_auth => true})
83
+ @retries = options[:retries] || 3
81
84
  @authuser = options[:username] || (raise Exception::MissingArgument, "Must supply a :username")
82
85
  @authkey = options[:api_key] || (raise Exception::MissingArgument, "Must supply an :api_key")
83
86
  @auth_url = options[:auth_url] || (raise Exception::MissingArgument, "Must supply an :auth_url")
@@ -104,10 +107,15 @@ class Connection
104
107
  @proxy_port = options[:proxy_port]
105
108
  @authok = false
106
109
  @http = {}
110
+ @quantum_version = 'v2.0' if @service_type == 'network'
107
111
  end
108
112
 
109
113
  #specialised from of csreq for PUT object... uses body_stream if possible
110
114
  def put_object(server,path,port,scheme,headers = {},data = nil,attempts = 0) # :nodoc:
115
+
116
+ tries = @retries
117
+ time = 3
118
+
111
119
  if data.respond_to? :read
112
120
  headers['Transfer-Encoding'] = 'chunked'
113
121
  hdrhash = headerprep(headers)
@@ -132,11 +140,12 @@ class Connection
132
140
  response
133
141
  rescue Errno::EPIPE, Timeout::Error, Errno::EINVAL, EOFError
134
142
  # Server closed the connection, retry
135
- raise OpenStack::Exception::Connection, "Unable to reconnect to #{server} after #{attempts} attempts" if attempts >= 5
136
- attempts += 1
143
+ puts "Can't connect to the server: #{tries} tries to reconnect" if @is_debug
144
+ sleep time += 1
137
145
  @http[server].finish if @http[server].started?
138
- start_http(server,path,port,scheme,headers)
139
- retry
146
+ retry unless (tries -= 1) <= 0
147
+ raise OpenStack::Exception::Connection, "Unable to connect to #{server} after #{@retries} retries"
148
+
140
149
  rescue OpenStack::Exception::ExpiredAuthToken
141
150
  raise OpenStack::Exception::Connection, "Authentication token expired and you have requested not to retry" if @retry_auth == false
142
151
  OpenStack::Authentication.init(self)
@@ -146,6 +155,10 @@ class Connection
146
155
 
147
156
  # This method actually makes the HTTP REST calls out to the server
148
157
  def csreq(method,server,path,port,scheme,headers = {},data = nil,attempts = 0, &block) # :nodoc:
158
+
159
+ tries = @retries
160
+ time = 3
161
+
149
162
  hdrhash = headerprep(headers)
150
163
  start_http(server,path,port,scheme,hdrhash)
151
164
  request = Net::HTTP.const_get(method.to_s.capitalize).new(path,hdrhash)
@@ -169,11 +182,11 @@ class Connection
169
182
  response
170
183
  rescue Errno::EPIPE, Timeout::Error, Errno::EINVAL, EOFError
171
184
  # Server closed the connection, retry
172
- raise OpenStack::Exception::Connection, "Unable to reconnect to #{server} after #{attempts} attempts" if attempts >= 5
173
- attempts += 1
185
+ puts "Can't connect to the server: #{tries} tries to reconnect" if @is_debug
186
+ sleep time += 1
174
187
  @http[server].finish if @http[server].started?
175
- start_http(server,path,port,scheme,headers)
176
- retry
188
+ retry unless (tries -= 1) <= 0
189
+ raise OpenStack::Exception::Connection, "Unable to connect to #{server} after #{@retries} retries"
177
190
  rescue OpenStack::Exception::ExpiredAuthToken
178
191
  raise OpenStack::Exception::Connection, "Authentication token expired and you have requested not to retry" if @retry_auth == false
179
192
  OpenStack::Authentication.init(self)
@@ -189,13 +202,10 @@ class Connection
189
202
  headers = options[:headers] || {'content-type' => 'application/json'}
190
203
  data = options[:data]
191
204
  attempts = options[:attempts] || 0
192
- path = @service_path + path
205
+ path = @service_path + @quantum_version.to_s + path
193
206
  res = csreq(method,server,path,port,scheme,headers,data,attempts)
194
- if not res.code.match(/^20.$/)
195
- OpenStack::Exception.raise_exception(res)
196
- end
197
- return res
198
- end;
207
+ res.code.match(/^20.$/) ? (return res) : OpenStack::Exception.raise_exception(res)
208
+ end
199
209
 
200
210
  private
201
211
 
@@ -205,13 +215,17 @@ class Connection
205
215
  default_headers["X-Auth-Token"] = @authtoken if authok
206
216
  default_headers["X-Storage-Token"] = @authtoken if authok
207
217
  default_headers["Connection"] = "Keep-Alive"
208
- default_headers["User-Agent"] = "OpenStack Ruby API #{VERSION}"
218
+ default_headers["User-Agent"] = "OpenStack Ruby API #{OpenStack::VERSION}"
209
219
  default_headers["Accept"] = "application/json"
210
220
  default_headers.merge(headers)
211
221
  end
212
222
 
213
223
  # Starts (or restarts) the HTTP connection
214
224
  def start_http(server,path,port,scheme,headers) # :nodoc:
225
+
226
+ tries = @retries
227
+ time = 3
228
+
215
229
  if (@http[server].nil?)
216
230
  begin
217
231
  @http[server] = Net::HTTP::Proxy(@proxy_host, @proxy_port).new(server,port)
@@ -221,6 +235,9 @@ class Connection
221
235
  end
222
236
  @http[server].start
223
237
  rescue
238
+ puts "Can't connect to the server: #{tries} tries to reconnect" if @is_debug
239
+ sleep time += 1
240
+ retry unless (tries -= 1) <= 0
224
241
  raise OpenStack::Exception::Connection, "Unable to connect to #{server}"
225
242
  end
226
243
  end
@@ -254,6 +271,10 @@ class AuthV20
254
271
  attr_reader :uri
255
272
  attr_reader :version
256
273
  def initialize(connection)
274
+
275
+ tries = connection.retries
276
+ time = 3
277
+
257
278
  begin
258
279
  server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.auth_host, connection.auth_port)
259
280
  if connection.auth_scheme == "https"
@@ -262,7 +283,10 @@ class AuthV20
262
283
  end
263
284
  server.start
264
285
  rescue
265
- raise OpenStack::Exception::Connection, "Unable to connect to #{server}"
286
+ puts "Can't connect to the server: #{tries} tries to reconnect" if connection.is_debug
287
+ sleep time += 1
288
+ retry unless (tries -= 1) <= 0
289
+ raise OpenStack::Exception::Connection, "Unable to connect to #{server}"
266
290
  end
267
291
 
268
292
  @uri = String.new
@@ -347,6 +371,10 @@ end
347
371
  class AuthV10
348
372
 
349
373
  def initialize(connection)
374
+
375
+ tries = connection.retries
376
+ time = 3
377
+
350
378
  hdrhash = { "X-Auth-User" => connection.authuser, "X-Auth-Key" => connection.authkey }
351
379
  begin
352
380
  server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.auth_host, connection.auth_port)
@@ -356,9 +384,14 @@ class AuthV10
356
384
  end
357
385
  server.start
358
386
  rescue
387
+ puts "Can't connect to the server: #{tries} tries to reconnect" if connection.is_debug
388
+ sleep time += 1
389
+ retry unless (tries -= 1) <= 0
359
390
  raise OpenStack::Exception::Connection, "Unable to connect to #{server}"
360
391
  end
392
+
361
393
  response = server.get(connection.auth_path, hdrhash)
394
+
362
395
  if (response.code =~ /^20./)
363
396
  connection.authtoken = response["x-auth-token"]
364
397
  case connection.service_type
@@ -31,8 +31,10 @@ module Network
31
31
  end
32
32
  alias :network :get_network
33
33
 
34
- def create_network(name)
35
- req_body = JSON.generate({"network"=>{"name"=>name}})
34
+ def create_network(name, parameter={})
35
+ body_hash = {"network" => {"name"=>name}}
36
+ body_hash['network'].merge! parameter
37
+ req_body = JSON.generate(body_hash)
36
38
  response = @connection.req("POST", "/networks", {:data=>req_body})
37
39
  OpenStack::Network::Network.new(JSON.parse(response.body)["network"])
38
40
  end
@@ -94,6 +96,61 @@ module Network
94
96
  true
95
97
  end
96
98
 
99
+ def list_routers
100
+ response = @connection.req('GET', '/routers')
101
+ nets_hash = JSON.parse(response.body)['routers']
102
+ nets_hash.inject([]){|res, current| res << OpenStack::Network::Router.new(current); res}
103
+ end
104
+ alias :routers :list_routers
105
+
106
+ def create_router(name, admin_state_up, opts={})
107
+ body_hash = {'router'=> {'name' => name, 'admin_state_up' => admin_state_up}}
108
+ body_hash['router'].merge! opts
109
+ req_body = JSON.generate body_hash
110
+ response = @connection.req('POST', '/routers', {:data => req_body })
111
+ OpenStack::Network::Router.new(JSON.parse(response.body)['router'])
112
+ end
113
+
114
+ def delete_router_by_name(name)
115
+ @connection.req('DELETE', "/routers/#{get_router_id(name)}")
116
+ end
117
+
118
+ def delete_router(id)
119
+ @connection.req('DELETE', "/routers/#{id}")
120
+ end
121
+
122
+ def add_router_interface_by_name(name, interface)
123
+ @connection.req('PUT', "/routers/#{get_router_id(name)}/#{interface}")
124
+ end
125
+
126
+ def add_router_interface(id, subnet_id)
127
+ req_body = JSON.generate({'subnet_id' => subnet_id})
128
+ @connection.req('PUT', "/routers/#{id}/add_router_interface", {:data => req_body})
129
+ end
130
+
131
+ def remove_router_interface(id, subnet_id)
132
+ req_body = JSON.generate({'subnet_id' => subnet_id})
133
+ @connection.req('PUT', "/routers/#{id}/remove_router_interface", {:data => req_body})
134
+ end
135
+
136
+ def update_router_by_name(name,opts={})
137
+ req_body = JSON.generate opts
138
+ response = @connection.req('PUT',"/routers/#{get_router_id(name)}",{:data => req_body})
139
+ OpenStack::Network::Router.new(JSON.parse(response.body)['router'])
140
+ end
141
+
142
+ def update_router(id,opts={})
143
+ req_body = JSON.generate({'router' => opts})
144
+ response = @connection.req('PUT',"/routers/#{id}",{:data => req_body})
145
+ OpenStack::Network::Router.new(JSON.parse(response.body)['router'])
146
+ end
147
+
148
+ def get_router_id(name)
149
+ routers.detect do |value|
150
+ return value.id if value.name == name
151
+ end
152
+ end
153
+
97
154
  end
98
155
 
99
156
  end
@@ -13,7 +13,7 @@ module Network
13
13
  attr_reader :device_owner
14
14
  attr_reader :tenant_id
15
15
 
16
- def initialize(port_hash)
16
+ def initialize(port_hash={})
17
17
  @id = port_hash["id"]
18
18
  @network_id = port_hash["network_id"]
19
19
  @name = port_hash["name"]
@@ -0,0 +1,27 @@
1
+ module OpenStack
2
+ module Network
3
+ class Router
4
+
5
+ attr_reader :id
6
+ attr_reader :name
7
+ attr_reader :admin_state_up
8
+ attr_reader :status
9
+ attr_reader :external_gateway_info
10
+ attr_reader :tenant_ip
11
+ attr_reader :enable_snat
12
+ attr_reader :admin_state_up
13
+
14
+ def initialize(router_info={})
15
+ @name = router_info['name']
16
+ @status = router_info['status']
17
+ @external_geteway_info = router_info['external_gateway_info']
18
+ @admin_state_up = router_info['admin_state_up']
19
+ @tenant_ip = router_info['tenant_ip']
20
+ @id = router_info['id']
21
+ @enable_snat = router_info['enable_snat']
22
+ # @admin_state_up = router_info['external_gateway_info']['admin_state_up']
23
+ # @network_id = router_info['external_gateway_info']['network_id']
24
+ end
25
+ end
26
+ end
27
+ end
@@ -14,7 +14,7 @@ module Network
14
14
  attr_reader :enable_dhcp
15
15
  attr_reader :tenant_id
16
16
 
17
- def initialize(subnet_hash)
17
+ def initialize(subnet_hash={})
18
18
  @id = subnet_hash["id"]
19
19
  @network_id = subnet_hash["network_id"]
20
20
  @name = subnet_hash["name"]
@@ -0,0 +1,3 @@
1
+ module OpenStack
2
+ VERSION = '1.1.2'
3
+ 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.1.1
4
+ version: 1.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -28,6 +28,22 @@ dependencies:
28
28
  - - ! '>='
29
29
  - !ruby/object:Gem::Version
30
30
  version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: rake
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'
31
47
  - !ruby/object:Gem::Dependency
32
48
  name: test-unit
33
49
  requirement: !ruby/object:Gem::Requirement
@@ -71,7 +87,7 @@ extra_rdoc_files:
71
87
  files:
72
88
  - COPYING
73
89
  - README.rdoc
74
- - VERSION
90
+ - lib/openstack/version.rb
75
91
  - lib/openstack.rb
76
92
  - lib/openstack/compute/address.rb
77
93
  - lib/openstack/compute/connection.rb
@@ -86,6 +102,7 @@ files:
86
102
  - lib/openstack/network/network.rb
87
103
  - lib/openstack/network/port.rb
88
104
  - lib/openstack/network/subnet.rb
105
+ - lib/openstack/network/router.rb
89
106
  - lib/openstack/swift/connection.rb
90
107
  - lib/openstack/swift/container.rb
91
108
  - lib/openstack/swift/storage_object.rb
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.1.1