vagrant-openstack-provider 0.6.0 → 0.6.1

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.
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',