openstack 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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