vagrant-openstack-provider 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/lib/vagrant-openstack-provider/action/connect_openstack.rb +0 -1
  4. data/lib/vagrant-openstack-provider/action/create_server.rb +3 -2
  5. data/lib/vagrant-openstack-provider/action/create_stack.rb +3 -2
  6. data/lib/vagrant-openstack-provider/action/delete_server.rb +3 -2
  7. data/lib/vagrant-openstack-provider/action/delete_stack.rb +3 -2
  8. data/lib/vagrant-openstack-provider/action/wait_active.rb +3 -3
  9. data/lib/vagrant-openstack-provider/action/wait_stop.rb +3 -3
  10. data/lib/vagrant-openstack-provider/catalog/openstack_catalog.rb +6 -5
  11. data/lib/vagrant-openstack-provider/client/cinder.rb +0 -1
  12. data/lib/vagrant-openstack-provider/client/domain.rb +0 -1
  13. data/lib/vagrant-openstack-provider/client/glance.rb +5 -3
  14. data/lib/vagrant-openstack-provider/client/heat.rb +0 -1
  15. data/lib/vagrant-openstack-provider/client/http_utils.rb +7 -6
  16. data/lib/vagrant-openstack-provider/client/keystone.rb +5 -4
  17. data/lib/vagrant-openstack-provider/client/neutron.rb +0 -1
  18. data/lib/vagrant-openstack-provider/client/nova.rb +0 -1
  19. data/lib/vagrant-openstack-provider/client/openstack.rb +0 -1
  20. data/lib/vagrant-openstack-provider/client/request_logger.rb +0 -1
  21. data/lib/vagrant-openstack-provider/client/rest_utils.rb +25 -0
  22. data/lib/vagrant-openstack-provider/command/abstract_command.rb +4 -1
  23. data/lib/vagrant-openstack-provider/command/flavor_list.rb +3 -5
  24. data/lib/vagrant-openstack-provider/command/floatingip_list.rb +3 -5
  25. data/lib/vagrant-openstack-provider/command/image_list.rb +3 -5
  26. data/lib/vagrant-openstack-provider/command/network_list.rb +3 -5
  27. data/lib/vagrant-openstack-provider/command/openstack_command.rb +16 -0
  28. data/lib/vagrant-openstack-provider/command/reset.rb +1 -2
  29. data/lib/vagrant-openstack-provider/command/subnet_list.rb +2 -5
  30. data/lib/vagrant-openstack-provider/command/volume_list.rb +3 -5
  31. data/lib/vagrant-openstack-provider/config.rb +59 -2
  32. data/lib/vagrant-openstack-provider/config/http.rb +39 -0
  33. data/lib/vagrant-openstack-provider/config_resolver.rb +13 -9
  34. data/lib/vagrant-openstack-provider/utils.rb +11 -6
  35. data/lib/vagrant-openstack-provider/version.rb +1 -1
  36. data/locales/en.yml +4 -0
  37. data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +226 -4
  38. data/spec/vagrant-openstack-provider/action/create_server_spec.rb +6 -3
  39. data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +7 -3
  40. data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +13 -4
  41. data/spec/vagrant-openstack-provider/action/read_ssh_info_spec.rb +24 -3
  42. data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +9 -2
  43. data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +9 -2
  44. data/spec/vagrant-openstack-provider/client/cinder_spec.rb +17 -1
  45. data/spec/vagrant-openstack-provider/client/glance_spec.rb +18 -2
  46. data/spec/vagrant-openstack-provider/client/heat_spec.rb +8 -0
  47. data/spec/vagrant-openstack-provider/client/keystone_spec.rb +8 -0
  48. data/spec/vagrant-openstack-provider/client/neutron_spec.rb +18 -2
  49. data/spec/vagrant-openstack-provider/client/nova_spec.rb +8 -0
  50. data/spec/vagrant-openstack-provider/config_resolver_spec.rb +10 -0
  51. data/spec/vagrant-openstack-provider/config_spec.rb +39 -4
  52. data/spec/vagrant-openstack-provider/utils_spec.rb +17 -17
  53. metadata +5 -2
@@ -0,0 +1,16 @@
1
+ require 'vagrant-openstack-provider/command/utils'
2
+ require 'vagrant-openstack-provider/command/abstract_command'
3
+
4
+ module VagrantPlugins
5
+ module Openstack
6
+ module Command
7
+ class OpenstackCommand < AbstractCommand
8
+ include VagrantPlugins::Openstack::Command::Utils
9
+
10
+ def before_cmd(_name, _argv, env)
11
+ VagrantPlugins::Openstack::Action::ConnectOpenstack.new(nil, env).call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -5,11 +5,10 @@ module VagrantPlugins
5
5
  module Openstack
6
6
  module Command
7
7
  class Reset < AbstractCommand
8
- include VagrantPlugins::Openstack::Command::Utils
9
-
10
8
  def self.synopsis
11
9
  I18n.t('vagrant_openstack.command.reset')
12
10
  end
11
+
13
12
  def cmd(name, argv, env)
14
13
  fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
15
14
  FileUtils.remove_dir("#{env[:machine].data_dir}")
@@ -1,12 +1,9 @@
1
- require 'vagrant-openstack-provider/command/utils'
2
- require 'vagrant-openstack-provider/command/abstract_command'
1
+ require 'vagrant-openstack-provider/command/openstack_command'
3
2
 
4
3
  module VagrantPlugins
5
4
  module Openstack
6
5
  module Command
7
- class SubnetList < AbstractCommand
8
- include VagrantPlugins::Openstack::Command::Utils
9
-
6
+ class SubnetList < OpenstackCommand
10
7
  def self.synopsis
11
8
  I18n.t('vagrant_openstack.command.subnet_list_synopsis')
12
9
  end
@@ -1,15 +1,13 @@
1
- require 'vagrant-openstack-provider/command/utils'
2
- require 'vagrant-openstack-provider/command/abstract_command'
1
+ require 'vagrant-openstack-provider/command/openstack_command'
3
2
 
4
3
  module VagrantPlugins
5
4
  module Openstack
6
5
  module Command
7
- class VolumeList < AbstractCommand
8
- include VagrantPlugins::Openstack::Command::Utils
9
-
6
+ class VolumeList < OpenstackCommand
10
7
  def self.synopsis
11
8
  I18n.t('vagrant_openstack.command.volume_list_synopsis')
12
9
  end
10
+
13
11
  def cmd(name, argv, env)
14
12
  fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
15
13
  volumes = env[:openstack_client].cinder.get_all_volumes(env)
@@ -1,5 +1,6 @@
1
1
  require 'vagrant'
2
2
  require 'colorize'
3
+ require 'vagrant-openstack-provider/config/http'
3
4
 
4
5
  module VagrantPlugins
5
6
  module Openstack
@@ -160,6 +161,39 @@ module VagrantPlugins
160
161
  # @return [Boolean]
161
162
  attr_accessor :ssh_disabled
162
163
 
164
+ # Specify the endpoint_type to use : publicURL, adminURL, or internalURL (default is publicURL)
165
+ #
166
+ # @return [String]
167
+ attr_accessor :endpoint_type
168
+
169
+ #
170
+ # @return [Integer]
171
+ attr_accessor :server_create_timeout
172
+
173
+ #
174
+ # @return [Integer]
175
+ attr_accessor :server_active_timeout
176
+
177
+ #
178
+ # @return [Integer]
179
+ attr_accessor :server_stop_timeout
180
+
181
+ #
182
+ # @return [Integer]
183
+ attr_accessor :server_delete_timeout
184
+
185
+ #
186
+ # @return [Integer]
187
+ attr_accessor :stack_create_timeout
188
+
189
+ #
190
+ # @return [Integer]
191
+ attr_accessor :stack_delete_timeout
192
+
193
+ #
194
+ # @return [HttpConfig]
195
+ attr_accessor :http
196
+
163
197
  def initialize
164
198
  @password = UNSET_VALUE
165
199
  @openstack_compute_url = UNSET_VALUE
@@ -168,6 +202,7 @@ module VagrantPlugins
168
202
  @openstack_orchestration_url = UNSET_VALUE
169
203
  @openstack_image_url = UNSET_VALUE
170
204
  @openstack_auth_url = UNSET_VALUE
205
+ @endpoint_type = UNSET_VALUE
171
206
  @region = UNSET_VALUE
172
207
  @flavor = UNSET_VALUE
173
208
  @image = UNSET_VALUE
@@ -194,6 +229,13 @@ module VagrantPlugins
194
229
  @user_data = UNSET_VALUE
195
230
  @metadata = UNSET_VALUE
196
231
  @ssh_disabled = UNSET_VALUE
232
+ @server_create_timeout = UNSET_VALUE
233
+ @server_active_timeout = UNSET_VALUE
234
+ @server_stop_timeout = UNSET_VALUE
235
+ @server_delete_timeout = UNSET_VALUE
236
+ @stack_create_timeout = UNSET_VALUE
237
+ @stack_delete_timeout = UNSET_VALUE
238
+ @http = HttpConfig.new
197
239
  end
198
240
 
199
241
  def merge(other)
@@ -210,11 +252,16 @@ module VagrantPlugins
210
252
  # Let user inputs a string or an array for floating ip pool attribute
211
253
  obj.floating_ip_pool = [obj.floating_ip_pool].flatten if key.eql?(:@floating_ip_pool) && !obj.floating_ip_pool.nil?
212
254
 
255
+ # Let user inputs a string or an array for networks attribute
256
+ obj.networks = [obj.networks].flatten if key.eql?(:@networks) && !obj.networks.nil?
257
+
213
258
  # Don't set the value if it is the unset value, either.
214
259
  value = obj.instance_variable_get(key)
215
260
 
216
261
  if [:@networks, :@volumes, :@rsync_includes, :@ignore_files, :@floating_ip_pool, :@stacks].include? key
217
262
  result.instance_variable_set(key, value) unless value.empty?
263
+ elsif [:@http].include? key
264
+ result.instance_variable_set(key, instance_variable_get(key).merge(other.instance_variable_get(key))) if value != UNSET_VALUE
218
265
  else
219
266
  result.instance_variable_set(key, value) if value != UNSET_VALUE
220
267
  end
@@ -238,6 +285,7 @@ module VagrantPlugins
238
285
  @openstack_volume_url = nil if @openstack_volume_url == UNSET_VALUE
239
286
  @openstack_image_url = nil if @openstack_image_url == UNSET_VALUE
240
287
  @openstack_auth_url = nil if @openstack_auth_url == UNSET_VALUE
288
+ @endpoint_type = 'publicURL' if @endpoint_type == UNSET_VALUE
241
289
  @region = nil if @region == UNSET_VALUE
242
290
  @flavor = nil if @flavor == UNSET_VALUE
243
291
  @image = nil if @image == UNSET_VALUE
@@ -264,9 +312,16 @@ module VagrantPlugins
264
312
  # `config.ssh` values are used.
265
313
  @ssh_username = nil if @ssh_username == UNSET_VALUE
266
314
  @ssh_timeout = 180 if @ssh_timeout == UNSET_VALUE
315
+ @server_create_timeout = 200 if @server_create_timeout == UNSET_VALUE
316
+ @server_active_timeout = 200 if @server_active_timeout == UNSET_VALUE
317
+ @server_stop_timeout = 200 if @server_stop_timeout == UNSET_VALUE
318
+ @server_delete_timeout = 200 if @server_delete_timeout == UNSET_VALUE
319
+ @stack_create_timeout = 200 if @stack_create_timeout == UNSET_VALUE
320
+ @stack_delete_timeout = 200 if @stack_delete_timeout == UNSET_VALUE
267
321
  @networks = nil if @networks.empty?
268
322
  @volumes = nil if @volumes.empty?
269
323
  @stacks = nil if @stacks.empty?
324
+ @http.finalize!
270
325
  end
271
326
  # rubocop:enable Style/CyclomaticComplexity
272
327
 
@@ -277,8 +332,10 @@ module VagrantPlugins
277
332
  def validate(machine)
278
333
  errors = _detected_errors
279
334
 
280
- errors << I18n.t('vagrant_openstack.config.password_required') unless @password
281
- errors << I18n.t('vagrant_openstack.config.username_required') unless @username
335
+ errors << I18n.t('vagrant_openstack.config.password_required') if @password.nil? || @password.empty?
336
+ errors << I18n.t('vagrant_openstack.config.username_required') if @username.nil? || @username.empty?
337
+ errors << I18n.t('vagrant_openstack.config.tenant_name_required') if @tenant_name.nil? || @tenant_name.empty?
338
+ errors << I18n.t('vagrant_openstack.config.invalid_endpoint_type') unless %w(publicURL adminURL internalURL).include?(@endpoint_type)
282
339
 
283
340
  validate_ssh_username(machine, errors)
284
341
  validate_stack_config(errors)
@@ -0,0 +1,39 @@
1
+ module VagrantPlugins
2
+ module Openstack
3
+ class HttpConfig
4
+ UNSET_VALUE = Vagrant.plugin('2', :config).const_get(:UNSET_VALUE)
5
+
6
+ #
7
+ # @return [Integer]
8
+ attr_accessor :open_timeout
9
+
10
+ #
11
+ # @return [Integer]
12
+ attr_accessor :read_timeout
13
+
14
+ def initialize
15
+ @open_timeout = UNSET_VALUE
16
+ @read_timeout = UNSET_VALUE
17
+ end
18
+
19
+ def finalize!
20
+ @open_timeout = 60 if @open_timeout == UNSET_VALUE
21
+ @read_timeout = 30 if @read_timeout == UNSET_VALUE
22
+ end
23
+
24
+ def merge(other)
25
+ result = self.class.new
26
+
27
+ [self, other].each do |obj|
28
+ obj.instance_variables.each do |key|
29
+ next if key.to_s.start_with?('@__')
30
+
31
+ value = obj.instance_variable_get(key)
32
+ result.instance_variable_set(key, value) if value != UNSET_VALUE
33
+ end
34
+ end
35
+ result
36
+ end
37
+ end
38
+ end
39
+ end
@@ -275,17 +275,21 @@ module VagrantPlugins
275
275
  { id: volume_id, device: device }
276
276
  end
277
277
 
278
- # This method finds a matching _thing_ in a collection of
279
- # _things_. This works matching if the ID or NAME equals to
280
- # `name`. Or, if `name` is a regexp, a partial match is chosen
278
+ # This method finds any matching _thing_ from a list of names
279
+ # in a collection of _things_. The first to match is the returned
280
+ # one. Names in list can be a regexp, a partial match is chosen
281
281
  # as well.
282
- def find_matching(collection, name)
283
- collection.each do |single|
284
- return single if single.id == name
285
- return single if single.name == name
286
- return single if name.is_a?(Regexp) && name =~ single.name
282
+
283
+ def find_matching(collection, name_or_names)
284
+ name_or_names = [name_or_names] if name_or_names.class != Array
285
+ name_or_names.each do |name|
286
+ collection.each do |single|
287
+ return single if single.id == name
288
+ return single if single.name == name
289
+ return single if name.is_a?(Regexp) && name =~ single.name
290
+ end
287
291
  end
288
- @logger.error "Element '#{name}' not found in collection #{collection}"
292
+ @logger.error "No element of '#{name_or_names}' found in collection #{collection}"
289
293
  nil
290
294
  end
291
295
  end
@@ -6,15 +6,20 @@ module VagrantPlugins
6
6
  end
7
7
 
8
8
  def get_ip_address(env)
9
- return env[:machine].provider_config.floating_ip unless env[:machine].provider_config.floating_ip.nil?
10
- details = env[:openstack_client].nova.get_server_details(env, env[:machine].id)
11
- details['addresses'].each do |network|
12
- network[1].each do |network_detail|
9
+ addresses = env[:openstack_client].nova.get_server_details(env, env[:machine].id)['addresses']
10
+ addresses.each do |_, network|
11
+ network.each do |network_detail|
13
12
  return network_detail['addr'] if network_detail['OS-EXT-IPS:type'] == 'floating'
14
13
  end
15
14
  end
16
- return details['addresses'].first[1][0]['addr'] if details['addresses'].size >= 1 && details['addresses'].first[1].size >= 1
17
- fail Errors::UnableToResolveIP
15
+ fail Errors::UnableToResolveIP if addresses.size == 0
16
+ if addresses.size == 1
17
+ net_addresses = addresses.first[1]
18
+ else
19
+ net_addresses = addresses[env[:machine].provider_config.networks[0]]
20
+ end
21
+ fail Errors::UnableToResolveIP if net_addresses.size == 0
22
+ net_addresses[0]['addr']
18
23
  end
19
24
  end
20
25
  end
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module Openstack
3
- VERSION = '0.6.0'
3
+ VERSION = '0.6.1'
4
4
  end
5
5
  end
data/locales/en.yml CHANGED
@@ -89,6 +89,8 @@ en:
89
89
  A password is required.
90
90
  username_required: |-
91
91
  A username is required.
92
+ tenant_name_required: |-
93
+ A tenant name is required.
92
94
  invalid_uri: |-
93
95
  The value for %{key} is not a valid URI: %{uri}
94
96
  invalid_stack: |-
@@ -98,6 +100,8 @@ en:
98
100
  name: 'mystack',
99
101
  template: '/path/to/heat_template.yml',
100
102
  }]
103
+ invalid_endpoint_type: |-
104
+ endpoint_type must be publicURL, adminURL or internalURL (if not provided, default is publicURL)
101
105
  metadata_must_be_hash: |-
102
106
  Metadata must be a hash.
103
107
  keypair_name_required: |-
@@ -22,12 +22,13 @@ describe VagrantPlugins::Openstack::Action::ConnectOpenstack do
22
22
  config.stub(:username) { 'username' }
23
23
  config.stub(:password) { 'password' }
24
24
  config.stub(:region) { nil }
25
+ config.stub(:endpoint_type) { 'publicURL' }
25
26
  end
26
27
  end
27
28
 
28
29
  let(:neutron) do
29
30
  double.tap do |neutron|
30
- neutron.stub(:get_api_version_list).with(anything) do
31
+ neutron.stub(:get_api_version_list).with(anything, anything) do
31
32
  [
32
33
  {
33
34
  'status' => 'CURRENT',
@@ -44,9 +45,28 @@ describe VagrantPlugins::Openstack::Action::ConnectOpenstack do
44
45
  end
45
46
  end
46
47
 
48
+ let(:neutron_admin_url) do
49
+ double.tap do |neutron|
50
+ neutron.stub(:get_api_version_list).with(anything, anything) do
51
+ [
52
+ {
53
+ 'status' => 'CURRENT',
54
+ 'id' => 'v2.0',
55
+ 'links' => [
56
+ {
57
+ 'href' => 'http://neutron/v2.0/admin',
58
+ 'rel' => 'self'
59
+ }
60
+ ]
61
+ }
62
+ ]
63
+ end
64
+ end
65
+ end
66
+
47
67
  let(:neutron_france) do
48
68
  double.tap do |neutron|
49
- neutron.stub(:get_api_version_list).with(anything) do
69
+ neutron.stub(:get_api_version_list).with(anything, anything) do
50
70
  [
51
71
  {
52
72
  'status' => 'CURRENT',
@@ -82,6 +102,25 @@ describe VagrantPlugins::Openstack::Action::ConnectOpenstack do
82
102
  end
83
103
  end
84
104
 
105
+ let(:glance_admin_url) do
106
+ double.tap do |glance|
107
+ glance.stub(:get_api_version_list).with(anything) do
108
+ [
109
+ {
110
+ 'status' => 'CURRENT',
111
+ 'id' => 'v2.1',
112
+ 'links' => [
113
+ {
114
+ 'href' => 'http://glance/v2.0/admin',
115
+ 'rel' => 'self'
116
+ }
117
+ ]
118
+ }
119
+ ]
120
+ end
121
+ end
122
+ end
123
+
85
124
  let(:glance_v1) do
86
125
  double.tap do |glance|
87
126
  glance.stub(:get_api_version_list).with(anything) do
@@ -317,8 +356,191 @@ describe VagrantPlugins::Openstack::Action::ConnectOpenstack do
317
356
  end
318
357
  end
319
358
 
359
+ describe 'endpoint_type' do
360
+ context 'with adminURL specified' do
361
+ it 'read service catalog and stores endpoints URL in session' do
362
+ catalog = [
363
+ {
364
+ 'endpoints' => [
365
+ {
366
+ 'publicURL' => 'http://nova/v2/projectId',
367
+ 'adminURL' => 'http://nova/v2/projectId/admin',
368
+ 'id' => '1'
369
+ }
370
+ ],
371
+ 'type' => 'compute',
372
+ 'name' => 'nova'
373
+ },
374
+ {
375
+ 'endpoints' => [
376
+ {
377
+ 'publicURL' => 'http://neutron',
378
+ 'adminURL' => 'http://neutron/admin',
379
+ 'id' => '2'
380
+ }
381
+ ],
382
+ 'type' => 'network',
383
+ 'name' => 'neutron'
384
+ },
385
+ {
386
+ 'endpoints' => [
387
+ {
388
+ 'publicURL' => 'http://cinder/v2/projectId',
389
+ 'adminURL' => 'http://cinder/v2/projectId/admin',
390
+ 'id' => '2'
391
+ }
392
+ ],
393
+ 'type' => 'volume',
394
+ 'name' => 'cinder'
395
+ },
396
+ {
397
+ 'endpoints' => [
398
+ {
399
+ 'publicURL' => 'http://glance',
400
+ 'adminURL' => 'http://glance/admin',
401
+ 'id' => '2'
402
+ }
403
+ ],
404
+ 'type' => 'image',
405
+ 'name' => 'glance'
406
+ }
407
+ ]
408
+
409
+ double.tap do |keystone|
410
+ keystone.stub(:authenticate).with(anything) { catalog }
411
+ env[:openstack_client].stub(:keystone) { keystone }
412
+ end
413
+ env[:openstack_client].stub(:neutron) { neutron_admin_url }
414
+ env[:openstack_client].stub(:glance) { glance_admin_url }
415
+ config.stub(:endpoint_type) { 'adminURL' }
416
+
417
+ @action.call(env)
418
+
419
+ expect(env[:openstack_client].session.endpoints)
420
+ .to eq(compute: 'http://nova/v2/projectId/admin',
421
+ network: 'http://neutron/v2.0/admin',
422
+ volume: 'http://cinder/v2/projectId/admin',
423
+ image: 'http://glance/v2.0/admin')
424
+ end
425
+ end
426
+ end
427
+
428
+ describe 'endpoint_type' do
429
+ context 'with internalURL specified' do
430
+ it 'read service catalog and stores endpoints URL in session' do
431
+ catalog = [
432
+ {
433
+ 'endpoints' => [
434
+ {
435
+ 'publicURL' => 'http://nova/v2/projectId',
436
+ 'adminURL' => 'http://nova/v2/projectId/admin',
437
+ 'internalURL' => 'http://nova/v2/projectId/internal',
438
+ 'id' => '1'
439
+ }
440
+ ],
441
+ 'type' => 'compute',
442
+ 'name' => 'nova'
443
+ },
444
+ {
445
+ 'endpoints' => [
446
+ {
447
+ 'publicURL' => 'http://cinder/v2/projectId',
448
+ 'adminURL' => 'http://cinder/v2/projectId/admin',
449
+ 'internalURL' => 'http://cinder/v2/projectId/internal',
450
+ 'id' => '2'
451
+ }
452
+ ],
453
+ 'type' => 'volume',
454
+ 'name' => 'cinder'
455
+ }
456
+ ]
457
+
458
+ double.tap do |keystone|
459
+ keystone.stub(:authenticate).with(anything) { catalog }
460
+ env[:openstack_client].stub(:keystone) { keystone }
461
+ end
462
+ config.stub(:endpoint_type) { 'internalURL' }
463
+
464
+ @action.call(env)
465
+
466
+ expect(env[:openstack_client].session.endpoints)
467
+ .to eq(compute: 'http://nova/v2/projectId/internal',
468
+ volume: 'http://cinder/v2/projectId/internal')
469
+ end
470
+ end
471
+ end
472
+
473
+ describe 'endpoint_type' do
474
+ context 'with publicURL specified' do
475
+ it 'read service catalog and stores endpoints URL in session' do
476
+ catalog = [
477
+ {
478
+ 'endpoints' => [
479
+ {
480
+ 'publicURL' => 'http://nova/v2/projectId',
481
+ 'adminURL' => 'http://nova/v2/projectId/admin',
482
+ 'id' => '1'
483
+ }
484
+ ],
485
+ 'type' => 'compute',
486
+ 'name' => 'nova'
487
+ },
488
+ {
489
+ 'endpoints' => [
490
+ {
491
+ 'publicURL' => 'http://neutron',
492
+ 'adminURL' => 'http://neutron/admin',
493
+ 'id' => '2'
494
+ }
495
+ ],
496
+ 'type' => 'network',
497
+ 'name' => 'neutron'
498
+ },
499
+ {
500
+ 'endpoints' => [
501
+ {
502
+ 'publicURL' => 'http://cinder/v2/projectId',
503
+ 'adminURL' => 'http://cinder/v2/projectId/admin',
504
+ 'id' => '2'
505
+ }
506
+ ],
507
+ 'type' => 'volume',
508
+ 'name' => 'cinder'
509
+ },
510
+ {
511
+ 'endpoints' => [
512
+ {
513
+ 'publicURL' => 'http://glance',
514
+ 'adminURL' => 'http://glance/admin',
515
+ 'id' => '2'
516
+ }
517
+ ],
518
+ 'type' => 'image',
519
+ 'name' => 'glance'
520
+ }
521
+ ]
522
+
523
+ double.tap do |keystone|
524
+ keystone.stub(:authenticate).with(anything) { catalog }
525
+ env[:openstack_client].stub(:keystone) { keystone }
526
+ end
527
+ env[:openstack_client].stub(:neutron) { neutron }
528
+ env[:openstack_client].stub(:glance) { glance }
529
+ config.stub(:endpoint_type) { 'publicURL' }
530
+
531
+ @action.call(env)
532
+
533
+ expect(env[:openstack_client].session.endpoints)
534
+ .to eq(compute: 'http://nova/v2/projectId',
535
+ network: 'http://neutron/v2.0',
536
+ volume: 'http://cinder/v2/projectId',
537
+ image: 'http://glance/v2.0')
538
+ end
539
+ end
540
+ end
541
+
320
542
  context 'with glance v1 only' do
321
- it 'read service catalog and stores endpoints URL in session', :focus do
543
+ it 'read service catalog and stores endpoints URL in session' do
322
544
  catalog = [
323
545
  {
324
546
  'endpoints' => [
@@ -384,7 +606,7 @@ describe VagrantPlugins::Openstack::Action::ConnectOpenstack do
384
606
 
385
607
  let(:neutron) do
386
608
  double.tap do |neutron|
387
- neutron.stub(:get_api_version_list).with(anything) do
609
+ neutron.stub(:get_api_version_list).with(anything, anything) do
388
610
  [
389
611
  {
390
612
  'status' => 'CURRENT',