vagrant-openstack-provider-illuin 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rubocop.yml +40 -0
  4. data/CHANGELOG.md +276 -0
  5. data/Gemfile +22 -0
  6. data/RELEASE.md +15 -0
  7. data/Rakefile +25 -0
  8. data/Vagrantfile +20 -0
  9. data/dummy.box +0 -0
  10. data/example_box/README.md +13 -0
  11. data/example_box/metadata.json +3 -0
  12. data/functional_tests/Vagrantfile +58 -0
  13. data/functional_tests/keys/vagrant-openstack +27 -0
  14. data/functional_tests/keys/vagrant-openstack.pub +1 -0
  15. data/functional_tests/run_tests.sh +142 -0
  16. data/lib/vagrant-openstack-provider.rb +29 -0
  17. data/lib/vagrant-openstack-provider/action.rb +344 -0
  18. data/lib/vagrant-openstack-provider/action/abstract_action.rb +22 -0
  19. data/lib/vagrant-openstack-provider/action/connect_openstack.rb +60 -0
  20. data/lib/vagrant-openstack-provider/action/create_server.rb +184 -0
  21. data/lib/vagrant-openstack-provider/action/create_stack.rb +76 -0
  22. data/lib/vagrant-openstack-provider/action/delete_server.rb +53 -0
  23. data/lib/vagrant-openstack-provider/action/delete_stack.rb +73 -0
  24. data/lib/vagrant-openstack-provider/action/message.rb +19 -0
  25. data/lib/vagrant-openstack-provider/action/provision.rb +60 -0
  26. data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +74 -0
  27. data/lib/vagrant-openstack-provider/action/read_state.rb +43 -0
  28. data/lib/vagrant-openstack-provider/action/resume.rb +24 -0
  29. data/lib/vagrant-openstack-provider/action/snapshot_cleanup.rb +32 -0
  30. data/lib/vagrant-openstack-provider/action/snapshot_delete.rb +32 -0
  31. data/lib/vagrant-openstack-provider/action/snapshot_list.rb +22 -0
  32. data/lib/vagrant-openstack-provider/action/snapshot_restore.rb +29 -0
  33. data/lib/vagrant-openstack-provider/action/snapshot_save.rb +51 -0
  34. data/lib/vagrant-openstack-provider/action/start_server.rb +24 -0
  35. data/lib/vagrant-openstack-provider/action/stop_server.rb +25 -0
  36. data/lib/vagrant-openstack-provider/action/suspend.rb +24 -0
  37. data/lib/vagrant-openstack-provider/action/sync_folders.rb +138 -0
  38. data/lib/vagrant-openstack-provider/action/wait_active.rb +33 -0
  39. data/lib/vagrant-openstack-provider/action/wait_stop.rb +33 -0
  40. data/lib/vagrant-openstack-provider/cap/snapshot_list.rb +15 -0
  41. data/lib/vagrant-openstack-provider/catalog/openstack_catalog.rb +90 -0
  42. data/lib/vagrant-openstack-provider/client/cinder.rb +39 -0
  43. data/lib/vagrant-openstack-provider/client/domain.rb +163 -0
  44. data/lib/vagrant-openstack-provider/client/glance.rb +65 -0
  45. data/lib/vagrant-openstack-provider/client/heat.rb +49 -0
  46. data/lib/vagrant-openstack-provider/client/http_utils.rb +116 -0
  47. data/lib/vagrant-openstack-provider/client/keystone.rb +128 -0
  48. data/lib/vagrant-openstack-provider/client/neutron.rb +48 -0
  49. data/lib/vagrant-openstack-provider/client/nova.rb +303 -0
  50. data/lib/vagrant-openstack-provider/client/openstack.rb +59 -0
  51. data/lib/vagrant-openstack-provider/client/request_logger.rb +23 -0
  52. data/lib/vagrant-openstack-provider/client/rest_utils.rb +28 -0
  53. data/lib/vagrant-openstack-provider/command/abstract_command.rb +51 -0
  54. data/lib/vagrant-openstack-provider/command/flavor_list.rb +24 -0
  55. data/lib/vagrant-openstack-provider/command/floatingip_list.rb +32 -0
  56. data/lib/vagrant-openstack-provider/command/image_list.rb +29 -0
  57. data/lib/vagrant-openstack-provider/command/main.rb +52 -0
  58. data/lib/vagrant-openstack-provider/command/network_list.rb +25 -0
  59. data/lib/vagrant-openstack-provider/command/openstack_command.rb +16 -0
  60. data/lib/vagrant-openstack-provider/command/reset.rb +20 -0
  61. data/lib/vagrant-openstack-provider/command/subnet_list.rb +22 -0
  62. data/lib/vagrant-openstack-provider/command/utils.rb +22 -0
  63. data/lib/vagrant-openstack-provider/command/volume_list.rb +25 -0
  64. data/lib/vagrant-openstack-provider/config.rb +498 -0
  65. data/lib/vagrant-openstack-provider/config/http.rb +39 -0
  66. data/lib/vagrant-openstack-provider/config_resolver.rb +334 -0
  67. data/lib/vagrant-openstack-provider/errors.rb +187 -0
  68. data/lib/vagrant-openstack-provider/logging.rb +39 -0
  69. data/lib/vagrant-openstack-provider/plugin.rb +58 -0
  70. data/lib/vagrant-openstack-provider/provider.rb +50 -0
  71. data/lib/vagrant-openstack-provider/utils.rb +36 -0
  72. data/lib/vagrant-openstack-provider/version.rb +15 -0
  73. data/lib/vagrant-openstack-provider/version_checker.rb +76 -0
  74. data/locales/en.yml +412 -0
  75. data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +770 -0
  76. data/spec/vagrant-openstack-provider/action/create_server_spec.rb +260 -0
  77. data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +99 -0
  78. data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +89 -0
  79. data/spec/vagrant-openstack-provider/action/delete_stack_spec.rb +63 -0
  80. data/spec/vagrant-openstack-provider/action/message_spec.rb +33 -0
  81. data/spec/vagrant-openstack-provider/action/provision_spec.rb +97 -0
  82. data/spec/vagrant-openstack-provider/action/read_ssh_info_spec.rb +201 -0
  83. data/spec/vagrant-openstack-provider/action/read_state_spec.rb +81 -0
  84. data/spec/vagrant-openstack-provider/action/resume_server_spec.rb +49 -0
  85. data/spec/vagrant-openstack-provider/action/start_server_spec.rb +49 -0
  86. data/spec/vagrant-openstack-provider/action/stop_server_spec.rb +49 -0
  87. data/spec/vagrant-openstack-provider/action/suspend_server_spec.rb +49 -0
  88. data/spec/vagrant-openstack-provider/action/sync_folders_spec.rb +155 -0
  89. data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +53 -0
  90. data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +53 -0
  91. data/spec/vagrant-openstack-provider/action_spec.rb +120 -0
  92. data/spec/vagrant-openstack-provider/client/cinder_spec.rb +129 -0
  93. data/spec/vagrant-openstack-provider/client/glance_spec.rb +145 -0
  94. data/spec/vagrant-openstack-provider/client/heat_spec.rb +130 -0
  95. data/spec/vagrant-openstack-provider/client/keystone_spec.rb +226 -0
  96. data/spec/vagrant-openstack-provider/client/neutron_spec.rb +173 -0
  97. data/spec/vagrant-openstack-provider/client/nova_spec.rb +760 -0
  98. data/spec/vagrant-openstack-provider/client/utils_spec.rb +176 -0
  99. data/spec/vagrant-openstack-provider/command/flavor_list_spec.rb +43 -0
  100. data/spec/vagrant-openstack-provider/command/floatingip_list_spec.rb +74 -0
  101. data/spec/vagrant-openstack-provider/command/image_list_spec.rb +95 -0
  102. data/spec/vagrant-openstack-provider/command/network_list_spec.rb +65 -0
  103. data/spec/vagrant-openstack-provider/command/reset_spec.rb +24 -0
  104. data/spec/vagrant-openstack-provider/command/subnet_list_spec.rb +45 -0
  105. data/spec/vagrant-openstack-provider/command/volume_list_spec.rb +40 -0
  106. data/spec/vagrant-openstack-provider/config_resolver_spec.rb +879 -0
  107. data/spec/vagrant-openstack-provider/config_spec.rb +414 -0
  108. data/spec/vagrant-openstack-provider/e2e_spec.rb.save +27 -0
  109. data/spec/vagrant-openstack-provider/provider_spec.rb +13 -0
  110. data/spec/vagrant-openstack-provider/spec_helper.rb +37 -0
  111. data/spec/vagrant-openstack-provider/utils_spec.rb +128 -0
  112. data/spec/vagrant-openstack-provider/version_checker_spec.rb +39 -0
  113. data/stackrc +25 -0
  114. data/vagrant-openstack-provider-illuin.gemspec +34 -0
  115. metadata +362 -0
@@ -0,0 +1,770 @@
1
+ require 'vagrant-openstack-provider/spec_helper'
2
+
3
+ include VagrantPlugins::Openstack::Action
4
+ include VagrantPlugins::Openstack::HttpUtils
5
+
6
+ describe VagrantPlugins::Openstack::Action::ConnectOpenstack do
7
+ let(:app) do
8
+ double.tap do |app|
9
+ app.stub(:call)
10
+ end
11
+ end
12
+
13
+ let(:config) do
14
+ double.tap do |config|
15
+ config.stub(:openstack_auth_url) { 'http://keystoneAuthV2' }
16
+ config.stub(:openstack_compute_url) { nil }
17
+ config.stub(:openstack_network_url) { nil }
18
+ config.stub(:openstack_volume_url) { nil }
19
+ config.stub(:openstack_image_url) { nil }
20
+ config.stub(:tenant_name) { 'testTenant' }
21
+ config.stub(:project_name) { 'testTenant' }
22
+ config.stub(:username) { 'username' }
23
+ config.stub(:password) { 'password' }
24
+ config.stub(:region) { nil }
25
+ config.stub(:endpoint_type) { 'publicURL' }
26
+ config.stub(:interface_type) { 'public' }
27
+ config.stub(:identity_api_version) { '2' }
28
+ end
29
+ end
30
+
31
+ let(:neutron) do
32
+ double.tap do |neutron|
33
+ neutron.stub(:get_api_version_list).with(anything, anything) do
34
+ [
35
+ {
36
+ 'status' => 'CURRENT',
37
+ 'id' => 'v2.0',
38
+ 'links' => [
39
+ {
40
+ 'href' => 'http://neutron/v2.0',
41
+ 'rel' => 'self'
42
+ }
43
+ ]
44
+ }
45
+ ]
46
+ end
47
+ end
48
+ end
49
+
50
+ let(:neutron_admin_url) do
51
+ double.tap do |neutron|
52
+ neutron.stub(:get_api_version_list).with(anything, anything) do
53
+ [
54
+ {
55
+ 'status' => 'CURRENT',
56
+ 'id' => 'v2.0',
57
+ 'links' => [
58
+ {
59
+ 'href' => 'http://neutron/v2.0/admin',
60
+ 'rel' => 'self'
61
+ }
62
+ ]
63
+ }
64
+ ]
65
+ end
66
+ end
67
+ end
68
+
69
+ let(:neutron_france) do
70
+ double.tap do |neutron|
71
+ neutron.stub(:get_api_version_list).with(anything, anything) do
72
+ [
73
+ {
74
+ 'status' => 'CURRENT',
75
+ 'id' => 'v2.0',
76
+ 'links' => [
77
+ {
78
+ 'href' => 'http://france.neutron/v2.0',
79
+ 'rel' => 'self'
80
+ }
81
+ ]
82
+ }
83
+ ]
84
+ end
85
+ end
86
+ end
87
+
88
+ let(:glance) do
89
+ double.tap do |glance|
90
+ glance.stub(:get_api_version_list).with(anything) do
91
+ [
92
+ {
93
+ 'status' => 'CURRENT',
94
+ 'id' => 'v2.1',
95
+ 'links' => [
96
+ {
97
+ 'href' => 'http://glance/v2.0',
98
+ 'rel' => 'self'
99
+ }
100
+ ]
101
+ }
102
+ ]
103
+ end
104
+ end
105
+ end
106
+
107
+ let(:glance_admin_url) do
108
+ double.tap do |glance|
109
+ glance.stub(:get_api_version_list).with(anything) do
110
+ [
111
+ {
112
+ 'status' => 'CURRENT',
113
+ 'id' => 'v2.1',
114
+ 'links' => [
115
+ {
116
+ 'href' => 'http://glance/v2.0/admin',
117
+ 'rel' => 'self'
118
+ }
119
+ ]
120
+ }
121
+ ]
122
+ end
123
+ end
124
+ end
125
+
126
+ let(:glance_v1) do
127
+ double.tap do |glance|
128
+ glance.stub(:get_api_version_list).with(anything) do
129
+ [
130
+ {
131
+ 'status' => 'CURRENT',
132
+ 'id' => 'v1.0',
133
+ 'links' => [
134
+ {
135
+ 'href' => 'http://glance/v1',
136
+ 'rel' => 'self'
137
+ }
138
+ ]
139
+ }
140
+ ]
141
+ end
142
+ end
143
+ end
144
+
145
+ let(:glance_france) do
146
+ double.tap do |glance|
147
+ glance.stub(:get_api_version_list).with(anything) do
148
+ [
149
+ {
150
+ 'status' => 'CURRENT',
151
+ 'id' => 'v2.1',
152
+ 'links' => [
153
+ {
154
+ 'href' => 'http://france.glance/v2.0',
155
+ 'rel' => 'self'
156
+ }
157
+ ]
158
+ }
159
+ ]
160
+ end
161
+ end
162
+ end
163
+
164
+ let(:env) do
165
+ {}.tap do |env|
166
+ env[:ui] = double
167
+ env[:ui].stub(:info).with(anything)
168
+ env[:ui].stub(:warn).with(anything)
169
+ env[:machine] = double('machine')
170
+ env[:machine].stub(:provider_config) { config }
171
+ env[:openstack_client] = double('openstack_client')
172
+ env[:openstack_client].stub(:neutron) { neutron }
173
+ env[:openstack_client].stub(:glance) { glance }
174
+ end
175
+ end
176
+
177
+ before(:all) do
178
+ ConnectOpenstack.send(:public, *ConnectOpenstack.private_instance_methods)
179
+ end
180
+
181
+ before :each do
182
+ VagrantPlugins::Openstack.session.reset
183
+ @action = ConnectOpenstack.new(app, env)
184
+ end
185
+
186
+ describe 'ConnectOpenstack' do
187
+ context 'with one endpoint by service' do
188
+ it 'read service catalog and stores endpoints URL in session' do
189
+ catalog = [
190
+ {
191
+ 'endpoints' => [
192
+ {
193
+ 'publicURL' => 'http://nova/v2/projectId',
194
+ 'id' => '1'
195
+ }
196
+ ],
197
+ 'type' => 'compute',
198
+ 'name' => 'nova'
199
+ },
200
+ {
201
+ 'endpoints' => [
202
+ {
203
+ 'publicURL' => 'http://neutron',
204
+ 'id' => '2'
205
+ }
206
+ ],
207
+ 'type' => 'network',
208
+ 'name' => 'neutron'
209
+ },
210
+ {
211
+ 'endpoints' => [
212
+ {
213
+ 'publicURL' => 'http://cinder/v2/projectId',
214
+ 'id' => '2'
215
+ }
216
+ ],
217
+ 'type' => 'volume',
218
+ 'name' => 'cinder'
219
+ },
220
+ {
221
+ 'endpoints' => [
222
+ {
223
+ 'publicURL' => 'http://glance',
224
+ 'id' => '2'
225
+ }
226
+ ],
227
+ 'type' => 'image',
228
+ 'name' => 'glance'
229
+ }
230
+ ]
231
+
232
+ double.tap do |keystone|
233
+ keystone.stub(:authenticate).with(anything) { catalog }
234
+ env[:openstack_client].stub(:keystone) { keystone }
235
+ end
236
+ env[:openstack_client].stub(:neutron) { neutron }
237
+ env[:openstack_client].stub(:glance) { glance }
238
+
239
+ @action.call(env)
240
+
241
+ expect(env[:openstack_client].session.endpoints)
242
+ .to eq(compute: 'http://nova/v2/projectId',
243
+ network: 'http://neutron/v2.0',
244
+ volume: 'http://cinder/v2/projectId',
245
+ image: 'http://glance/v2.0')
246
+ end
247
+ end
248
+
249
+ context 'with one endpoint by service v3' do
250
+ it 'read service catalog and stores endpoints URL in session v3' do
251
+ catalog = [
252
+ {
253
+ 'endpoints' => [
254
+ {
255
+ 'url' => 'http://nova/v2/projectId',
256
+ 'interface' => 'public',
257
+ 'region' => 'RegionOne',
258
+ 'id' => '1'
259
+ }
260
+ ],
261
+ 'type' => 'compute',
262
+ 'name' => 'nova'
263
+ },
264
+ {
265
+ 'endpoints' => [
266
+ {
267
+ 'url' => 'http://neutron',
268
+ 'interface' => 'public',
269
+ 'region' => 'RegionOne',
270
+ 'id' => '2'
271
+ }
272
+ ],
273
+ 'type' => 'network',
274
+ 'name' => 'neutron'
275
+ },
276
+ {
277
+ 'endpoints' => [
278
+ {
279
+ 'url' => 'http://cinder/v2/projectId',
280
+ 'interface' => 'public',
281
+ 'region' => 'RegionOne',
282
+ 'id' => '2'
283
+ }
284
+ ],
285
+ 'type' => 'volume',
286
+ 'name' => 'cinder'
287
+ },
288
+ {
289
+ 'endpoints' => [
290
+ {
291
+ 'url' => 'http://glance',
292
+ 'interface' => 'public',
293
+ 'region' => 'RegionOne',
294
+ 'id' => '2'
295
+ }
296
+ ],
297
+ 'type' => 'image',
298
+ 'name' => 'glance'
299
+ }
300
+ ]
301
+
302
+ double.tap do |keystone|
303
+ keystone.stub(:authenticate).with(anything) { catalog }
304
+ env[:openstack_client].stub(:keystone) { keystone }
305
+ end
306
+ env[:openstack_client].stub(:neutron) { neutron }
307
+ env[:openstack_client].stub(:glance) { glance }
308
+ config.stub(:domain_name) { 'dummy' }
309
+ config.stub(:identity_api_version) { '3' }
310
+
311
+ @action.call(env)
312
+
313
+ expect(env[:openstack_client].session.endpoints)
314
+ .to eq(compute: 'http://nova/v2/projectId',
315
+ network: 'http://neutron/v2.0',
316
+ volume: 'http://cinder/v2/projectId',
317
+ image: 'http://glance/v2.0')
318
+ end
319
+ end
320
+
321
+ context 'with multiple regions' do
322
+ it 'read service catalog and stores endpoints URL for desired regions in session' do
323
+ catalog = [
324
+ {
325
+ 'endpoints' => [
326
+ {
327
+ 'publicURL' => 'http://france.nova/v2/projectId',
328
+ 'id' => '1',
329
+ 'region' => 'france'
330
+ },
331
+ {
332
+ 'publicURL' => 'http://us.nova/v2/projectId',
333
+ 'id' => '4',
334
+ 'region' => 'us'
335
+ }
336
+ ],
337
+ 'type' => 'compute',
338
+ 'name' => 'nova'
339
+ },
340
+ {
341
+ 'endpoints' => [
342
+ {
343
+ 'publicURL' => 'http://france.neutron',
344
+ 'id' => '2',
345
+ 'region' => 'france'
346
+ },
347
+ {
348
+ 'publicURL' => 'http://us.neutron',
349
+ 'id' => '5',
350
+ 'region' => 'us'
351
+ }
352
+ ],
353
+ 'type' => 'network',
354
+ 'name' => 'neutron'
355
+ },
356
+ {
357
+ 'endpoints' => [
358
+ {
359
+ 'publicURL' => 'http://france.glance',
360
+ 'id' => '3',
361
+ 'region' => 'france'
362
+ },
363
+ {
364
+ 'publicURL' => 'http://us.glance',
365
+ 'id' => '6',
366
+ 'region' => 'us'
367
+ }
368
+ ],
369
+ 'type' => 'image',
370
+ 'name' => 'glance'
371
+ }
372
+ ]
373
+
374
+ double.tap do |keystone|
375
+ keystone.stub(:authenticate).with(anything) { catalog }
376
+ env[:openstack_client].stub(:keystone) { keystone }
377
+ end
378
+
379
+ env[:openstack_client].stub(:neutron) { neutron_france }
380
+ env[:openstack_client].stub(:glance) { glance_france }
381
+ config.stub(:region) { 'france' }
382
+
383
+ @action.call(env)
384
+
385
+ expect(env[:openstack_client].session.endpoints)
386
+ .to eq(compute: 'http://france.nova/v2/projectId',
387
+ network: 'http://france.neutron/v2.0',
388
+ image: 'http://france.glance/v2.0')
389
+ end
390
+ end
391
+
392
+ context 'with multiple endpoints for a service' do
393
+ it 'takes the first one' do
394
+ catalog = [
395
+ {
396
+ 'endpoints' => [
397
+ {
398
+ 'publicURL' => 'http://nova',
399
+ 'id' => '1'
400
+ }
401
+ ],
402
+ 'type' => 'compute',
403
+ 'name' => 'nova'
404
+ },
405
+ {
406
+ 'endpoints' => [
407
+ {
408
+ 'publicURL' => 'http://neutron/alt',
409
+ 'id' => '2'
410
+ },
411
+ {
412
+ 'publicURL' => 'http://neutron',
413
+ 'id' => '3'
414
+ }
415
+ ],
416
+ 'type' => 'network',
417
+ 'name' => 'neutron'
418
+ }
419
+ ]
420
+
421
+ double.tap do |keystone|
422
+ keystone.stub(:authenticate).with(anything) { catalog }
423
+ env[:openstack_client].stub(:keystone) { keystone }
424
+ end
425
+ env[:openstack_client].stub(:neutron) { neutron }
426
+
427
+ @action.call(env)
428
+
429
+ expect(env[:openstack_client].session.endpoints).to eq(compute: 'http://nova', network: 'http://neutron/v2.0')
430
+ end
431
+ end
432
+
433
+ describe 'endpoint_type' do
434
+ context 'with adminURL specified' do
435
+ it 'read service catalog and stores endpoints URL in session' do
436
+ catalog = [
437
+ {
438
+ 'endpoints' => [
439
+ {
440
+ 'publicURL' => 'http://nova/v2/projectId',
441
+ 'adminURL' => 'http://nova/v2/projectId/admin',
442
+ 'id' => '1'
443
+ }
444
+ ],
445
+ 'type' => 'compute',
446
+ 'name' => 'nova'
447
+ },
448
+ {
449
+ 'endpoints' => [
450
+ {
451
+ 'publicURL' => 'http://neutron',
452
+ 'adminURL' => 'http://neutron/admin',
453
+ 'id' => '2'
454
+ }
455
+ ],
456
+ 'type' => 'network',
457
+ 'name' => 'neutron'
458
+ },
459
+ {
460
+ 'endpoints' => [
461
+ {
462
+ 'publicURL' => 'http://cinder/v2/projectId',
463
+ 'adminURL' => 'http://cinder/v2/projectId/admin',
464
+ 'id' => '2'
465
+ }
466
+ ],
467
+ 'type' => 'volume',
468
+ 'name' => 'cinder'
469
+ },
470
+ {
471
+ 'endpoints' => [
472
+ {
473
+ 'publicURL' => 'http://glance',
474
+ 'adminURL' => 'http://glance/admin',
475
+ 'id' => '2'
476
+ }
477
+ ],
478
+ 'type' => 'image',
479
+ 'name' => 'glance'
480
+ }
481
+ ]
482
+
483
+ double.tap do |keystone|
484
+ keystone.stub(:authenticate).with(anything) { catalog }
485
+ env[:openstack_client].stub(:keystone) { keystone }
486
+ end
487
+ env[:openstack_client].stub(:neutron) { neutron_admin_url }
488
+ env[:openstack_client].stub(:glance) { glance_admin_url }
489
+ config.stub(:endpoint_type) { 'adminURL' }
490
+
491
+ @action.call(env)
492
+
493
+ expect(env[:openstack_client].session.endpoints)
494
+ .to eq(compute: 'http://nova/v2/projectId/admin',
495
+ network: 'http://neutron/v2.0/admin',
496
+ volume: 'http://cinder/v2/projectId/admin',
497
+ image: 'http://glance/v2.0/admin')
498
+ end
499
+ end
500
+ end
501
+
502
+ describe 'endpoint_type' do
503
+ context 'with internalURL specified' do
504
+ it 'read service catalog and stores endpoints URL in session' do
505
+ catalog = [
506
+ {
507
+ 'endpoints' => [
508
+ {
509
+ 'publicURL' => 'http://nova/v2/projectId',
510
+ 'adminURL' => 'http://nova/v2/projectId/admin',
511
+ 'internalURL' => 'http://nova/v2/projectId/internal',
512
+ 'id' => '1'
513
+ }
514
+ ],
515
+ 'type' => 'compute',
516
+ 'name' => 'nova'
517
+ },
518
+ {
519
+ 'endpoints' => [
520
+ {
521
+ 'publicURL' => 'http://cinder/v2/projectId',
522
+ 'adminURL' => 'http://cinder/v2/projectId/admin',
523
+ 'internalURL' => 'http://cinder/v2/projectId/internal',
524
+ 'id' => '2'
525
+ }
526
+ ],
527
+ 'type' => 'volume',
528
+ 'name' => 'cinder'
529
+ }
530
+ ]
531
+
532
+ double.tap do |keystone|
533
+ keystone.stub(:authenticate).with(anything) { catalog }
534
+ env[:openstack_client].stub(:keystone) { keystone }
535
+ end
536
+ config.stub(:endpoint_type) { 'internalURL' }
537
+
538
+ @action.call(env)
539
+
540
+ expect(env[:openstack_client].session.endpoints)
541
+ .to eq(compute: 'http://nova/v2/projectId/internal',
542
+ volume: 'http://cinder/v2/projectId/internal')
543
+ end
544
+ end
545
+ end
546
+
547
+ describe 'endpoint_type' do
548
+ context 'with publicURL specified' do
549
+ it 'read service catalog and stores endpoints URL in session' do
550
+ catalog = [
551
+ {
552
+ 'endpoints' => [
553
+ {
554
+ 'publicURL' => 'http://nova/v2/projectId',
555
+ 'adminURL' => 'http://nova/v2/projectId/admin',
556
+ 'id' => '1'
557
+ }
558
+ ],
559
+ 'type' => 'compute',
560
+ 'name' => 'nova'
561
+ },
562
+ {
563
+ 'endpoints' => [
564
+ {
565
+ 'publicURL' => 'http://neutron',
566
+ 'adminURL' => 'http://neutron/admin',
567
+ 'id' => '2'
568
+ }
569
+ ],
570
+ 'type' => 'network',
571
+ 'name' => 'neutron'
572
+ },
573
+ {
574
+ 'endpoints' => [
575
+ {
576
+ 'publicURL' => 'http://cinder/v2/projectId',
577
+ 'adminURL' => 'http://cinder/v2/projectId/admin',
578
+ 'id' => '2'
579
+ }
580
+ ],
581
+ 'type' => 'volume',
582
+ 'name' => 'cinder'
583
+ },
584
+ {
585
+ 'endpoints' => [
586
+ {
587
+ 'publicURL' => 'http://glance',
588
+ 'adminURL' => 'http://glance/admin',
589
+ 'id' => '2'
590
+ }
591
+ ],
592
+ 'type' => 'image',
593
+ 'name' => 'glance'
594
+ }
595
+ ]
596
+
597
+ double.tap do |keystone|
598
+ keystone.stub(:authenticate).with(anything) { catalog }
599
+ env[:openstack_client].stub(:keystone) { keystone }
600
+ end
601
+ env[:openstack_client].stub(:neutron) { neutron }
602
+ env[:openstack_client].stub(:glance) { glance }
603
+ config.stub(:endpoint_type) { 'publicURL' }
604
+
605
+ @action.call(env)
606
+
607
+ expect(env[:openstack_client].session.endpoints)
608
+ .to eq(compute: 'http://nova/v2/projectId',
609
+ network: 'http://neutron/v2.0',
610
+ volume: 'http://cinder/v2/projectId',
611
+ image: 'http://glance/v2.0')
612
+ end
613
+ end
614
+ end
615
+
616
+ context 'with glance v1 only' do
617
+ it 'read service catalog and stores endpoints URL in session' do
618
+ catalog = [
619
+ {
620
+ 'endpoints' => [
621
+ {
622
+ 'publicURL' => 'http://nova/v2/projectId',
623
+ 'id' => '1'
624
+ }
625
+ ],
626
+ 'type' => 'compute',
627
+ 'name' => 'nova'
628
+ },
629
+ {
630
+ 'endpoints' => [
631
+ {
632
+ 'publicURL' => 'http://glance',
633
+ 'id' => '2'
634
+ }
635
+ ],
636
+ 'type' => 'image',
637
+ 'name' => 'glance'
638
+ }
639
+ ]
640
+
641
+ double.tap do |keystone|
642
+ keystone.stub(:authenticate).with(anything) { catalog }
643
+ env[:openstack_client].stub(:keystone) { keystone }
644
+ end
645
+ env[:openstack_client].stub(:glance) { glance_v1 }
646
+
647
+ @action.call(env)
648
+
649
+ expect(env[:openstack_client].session.endpoints)
650
+ .to eq(compute: 'http://nova/v2/projectId',
651
+ image: 'http://glance/v1')
652
+ end
653
+ end
654
+
655
+ context 'with nova endpoint missing' do
656
+ it 'raise an error' do
657
+ catalog = [
658
+ {
659
+ 'endpoints' => [
660
+ {
661
+ 'publicURL' => 'http://keystone',
662
+ 'id' => '1'
663
+ }
664
+ ],
665
+ 'type' => 'identity',
666
+ 'name' => 'keystone'
667
+ }
668
+ ]
669
+
670
+ double.tap do |keystone|
671
+ keystone.stub(:authenticate).with(anything) { catalog }
672
+ env[:openstack_client].stub(:keystone) { keystone }
673
+ end
674
+
675
+ expect { @action.call(env) }.to raise_error Errors::MissingNovaEndpoint
676
+ end
677
+ end
678
+
679
+ context 'with no matching versions for network service' do
680
+ let(:neutron) do
681
+ double.tap do |neutron|
682
+ neutron.stub(:get_api_version_list).with(anything, anything) do
683
+ [
684
+ {
685
+ 'status' => 'CURRENT',
686
+ 'id' => 'v1.1',
687
+ 'links' => [
688
+ {
689
+ 'href' => 'http://neutron/v1.1',
690
+ 'rel' => 'self'
691
+ }
692
+ ]
693
+ },
694
+ {
695
+ 'status' => '...',
696
+ 'id' => 'v1.0',
697
+ 'links' => [
698
+ {
699
+ 'href' => 'http://neutron/v1.0',
700
+ 'rel' => 'self'
701
+ }
702
+ ]
703
+ }
704
+ ]
705
+ end
706
+ end
707
+ end
708
+
709
+ it 'raise an error' do
710
+ catalog = [
711
+ {
712
+ 'endpoints' => [
713
+ {
714
+ 'publicURL' => 'http://neutron',
715
+ 'id' => '3'
716
+ }
717
+ ],
718
+ 'type' => 'network',
719
+ 'name' => 'neutron'
720
+ }
721
+ ]
722
+
723
+ double.tap do |keystone|
724
+ keystone.stub(:authenticate).with(anything) { catalog }
725
+ env[:openstack_client].stub(:keystone) { keystone }
726
+ end
727
+ env[:openstack_client].stub(:neutron) { neutron }
728
+
729
+ expect { @action.call(env) }.to raise_error(Errors::NoMatchingApiVersion)
730
+ end
731
+ end
732
+
733
+ context 'with only keystone and nova' do
734
+ it 'read service catalog and stores endpoints URL in session' do
735
+ catalog = [
736
+ {
737
+ 'endpoints' => [
738
+ {
739
+ 'publicURL' => 'http://nova/v2/projectId',
740
+ 'id' => '1'
741
+ }
742
+ ],
743
+ 'type' => 'compute',
744
+ 'name' => 'nova'
745
+ },
746
+ {
747
+ 'endpoints' => [
748
+ {
749
+ 'publicURL' => 'http://keystone/v2.0',
750
+ 'id' => '2'
751
+ }
752
+ ],
753
+ 'type' => 'identity',
754
+ 'name' => 'keystone'
755
+ }
756
+ ]
757
+
758
+ double.tap do |keystone|
759
+ keystone.stub(:authenticate).with(anything) { catalog }
760
+ env[:openstack_client].stub(:keystone) { keystone }
761
+ end
762
+
763
+ @action.call(env)
764
+
765
+ expect(env[:openstack_client].session.endpoints)
766
+ .to eq(compute: 'http://nova/v2/projectId', identity: 'http://keystone/v2.0')
767
+ end
768
+ end
769
+ end
770
+ end