vagrant-openstack-provider 0.5.2 → 0.6.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -0
- data/lib/vagrant-openstack-provider.rb +2 -31
- data/lib/vagrant-openstack-provider/action.rb +21 -7
- data/lib/vagrant-openstack-provider/action/abstract_action.rb +22 -0
- data/lib/vagrant-openstack-provider/action/connect_openstack.rb +19 -40
- data/lib/vagrant-openstack-provider/action/create_server.rb +10 -6
- data/lib/vagrant-openstack-provider/action/create_stack.rb +67 -0
- data/lib/vagrant-openstack-provider/action/delete_server.rb +28 -3
- data/lib/vagrant-openstack-provider/action/delete_stack.rb +72 -0
- data/lib/vagrant-openstack-provider/action/message.rb +4 -2
- data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +4 -2
- data/lib/vagrant-openstack-provider/action/read_state.rb +9 -4
- data/lib/vagrant-openstack-provider/action/resume.rb +4 -2
- data/lib/vagrant-openstack-provider/action/start_server.rb +4 -2
- data/lib/vagrant-openstack-provider/action/stop_server.rb +4 -2
- data/lib/vagrant-openstack-provider/action/suspend.rb +4 -2
- data/lib/vagrant-openstack-provider/action/sync_folders.rb +17 -13
- data/lib/vagrant-openstack-provider/action/wait_accessible.rb +5 -2
- data/lib/vagrant-openstack-provider/action/wait_active.rb +5 -3
- data/lib/vagrant-openstack-provider/action/wait_stop.rb +5 -3
- data/lib/vagrant-openstack-provider/catalog/openstack_catalog.rb +66 -0
- data/lib/vagrant-openstack-provider/client/domain.rb +41 -1
- data/lib/vagrant-openstack-provider/client/glance.rb +63 -0
- data/lib/vagrant-openstack-provider/client/heat.rb +50 -0
- data/lib/vagrant-openstack-provider/client/http_utils.rb +18 -0
- data/lib/vagrant-openstack-provider/client/neutron.rb +9 -15
- data/lib/vagrant-openstack-provider/client/nova.rb +3 -3
- data/lib/vagrant-openstack-provider/client/openstack.rb +10 -0
- data/lib/vagrant-openstack-provider/command/abstract_command.rb +7 -0
- data/lib/vagrant-openstack-provider/command/image_list.rb +12 -2
- data/lib/vagrant-openstack-provider/command/main.rb +1 -0
- data/lib/vagrant-openstack-provider/command/network_list.rb +3 -3
- data/lib/vagrant-openstack-provider/command/subnet_list.rb +25 -0
- data/lib/vagrant-openstack-provider/config.rb +78 -7
- data/lib/vagrant-openstack-provider/config_resolver.rb +36 -5
- data/lib/vagrant-openstack-provider/errors.rb +30 -2
- data/lib/vagrant-openstack-provider/logging.rb +39 -0
- data/lib/vagrant-openstack-provider/version.rb +1 -1
- data/locales/en.yml +107 -4
- data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +255 -8
- data/spec/vagrant-openstack-provider/action/create_server_spec.rb +6 -1
- data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +97 -0
- data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +34 -6
- data/spec/vagrant-openstack-provider/action/delete_stack_spec.rb +64 -0
- data/spec/vagrant-openstack-provider/action/read_state_spec.rb +13 -1
- data/spec/vagrant-openstack-provider/action/sync_folders_spec.rb +1 -0
- data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +1 -1
- data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +1 -1
- data/spec/vagrant-openstack-provider/client/glance_spec.rb +128 -0
- data/spec/vagrant-openstack-provider/client/heat_spec.rb +124 -0
- data/spec/vagrant-openstack-provider/client/neutron_spec.rb +33 -1
- data/spec/vagrant-openstack-provider/client/nova_spec.rb +2 -2
- data/spec/vagrant-openstack-provider/command/image_list_spec.rb +75 -23
- data/spec/vagrant-openstack-provider/command/subnet_list_spec.rb +46 -0
- data/spec/vagrant-openstack-provider/config_resolver_spec.rb +85 -19
- data/spec/vagrant-openstack-provider/config_spec.rb +177 -1
- data/spec/vagrant-openstack-provider/spec_helper.rb +3 -0
- metadata +20 -2
@@ -87,6 +87,38 @@ describe VagrantPlugins::Openstack::NeutronClient do
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
describe 'get_subnets' do
|
91
|
+
context 'with token' do
|
92
|
+
it 'returns all available subnets' do
|
93
|
+
|
94
|
+
stub_request(:get, 'http://neutron/subnets')
|
95
|
+
.with(
|
96
|
+
headers:
|
97
|
+
{
|
98
|
+
'Accept' => 'application/json',
|
99
|
+
'X-Auth-Token' => '123456'
|
100
|
+
})
|
101
|
+
.to_return(
|
102
|
+
status: 200,
|
103
|
+
body: '
|
104
|
+
{
|
105
|
+
"subnets": [
|
106
|
+
{ "id": "subnet-01", "name": "Subnet 1", "cidr": "192.168.1.0/24", "enable_dhcp": true, "network_id": "net-01" },
|
107
|
+
{ "id": "subnet-02", "name": "Subnet 2", "cidr": "192.168.2.0/24", "enable_dhcp": false, "network_id": "net-01" },
|
108
|
+
{ "id": "subnet-03", "name": "Subnet 3", "cidr": "192.168.100.0/24", "enable_dhcp": true, "network_id": "net-02" }
|
109
|
+
]
|
110
|
+
}
|
111
|
+
')
|
112
|
+
|
113
|
+
networks = @neutron_client.get_subnets(env)
|
114
|
+
|
115
|
+
expect(networks).to eq [Subnet.new('subnet-01', 'Subnet 1', '192.168.1.0/24', true, 'net-01'),
|
116
|
+
Subnet.new('subnet-02', 'Subnet 2', '192.168.2.0/24', false, 'net-01'),
|
117
|
+
Subnet.new('subnet-03', 'Subnet 3', '192.168.100.0/24', true, 'net-02')]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
90
122
|
describe 'get_api_version_list' do
|
91
123
|
context 'basic' do
|
92
124
|
it 'returns version list' do
|
@@ -118,7 +150,7 @@ describe VagrantPlugins::Openstack::NeutronClient do
|
|
118
150
|
}
|
119
151
|
]}')
|
120
152
|
|
121
|
-
versions = @neutron_client.get_api_version_list(
|
153
|
+
versions = @neutron_client.get_api_version_list(:network)
|
122
154
|
|
123
155
|
expect(versions.size).to eq(2)
|
124
156
|
end
|
@@ -590,7 +590,7 @@ describe VagrantPlugins::Openstack::NovaClient do
|
|
590
590
|
]
|
591
591
|
}')
|
592
592
|
|
593
|
-
expect { @nova_client.add_floating_ip(env, 'o1o2o3', '1.2.3.4') }.to raise_error(
|
593
|
+
expect { @nova_client.add_floating_ip(env, 'o1o2o3', '1.2.3.4') }.to raise_error(Errors::FloatingIPAlreadyAssigned)
|
594
594
|
end
|
595
595
|
end
|
596
596
|
|
@@ -616,7 +616,7 @@ describe VagrantPlugins::Openstack::NovaClient do
|
|
616
616
|
]
|
617
617
|
}')
|
618
618
|
|
619
|
-
expect { @nova_client.add_floating_ip(env, 'o1o2o3', '1.2.3.4') }.to raise_error(
|
619
|
+
expect { @nova_client.add_floating_ip(env, 'o1o2o3', '1.2.3.4') }.to raise_error(Errors::FloatingIPNotAvailable)
|
620
620
|
end
|
621
621
|
end
|
622
622
|
end
|
@@ -1,40 +1,61 @@
|
|
1
1
|
require 'vagrant-openstack-provider/spec_helper'
|
2
2
|
|
3
3
|
describe VagrantPlugins::Openstack::Command::ImageList do
|
4
|
-
describe 'cmd' do
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
5
|
+
let(:nova) do
|
6
|
+
double('nova').tap do |nova|
|
7
|
+
nova.stub(:get_all_images) do
|
8
|
+
[
|
9
|
+
Image.new('0001', 'ubuntu'),
|
10
|
+
Image.new('0002', 'centos'),
|
11
|
+
Image.new('0003', 'debian')
|
12
|
+
]
|
15
13
|
end
|
16
14
|
end
|
15
|
+
end
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
let(:glance) do
|
18
|
+
double('nova').tap do |nova|
|
19
|
+
nova.stub(:get_all_images) do
|
20
|
+
[
|
21
|
+
Image.new('0001', 'ubuntu', 'public', 700 * 1024 * 1024, 1, 10),
|
22
|
+
Image.new('0002', 'centos', 'private', 800 * 1024 * 1024, 2, 20),
|
23
|
+
Image.new('0003', 'debian', 'shared', 900 * 1024 * 1024, 4, 30)
|
24
|
+
]
|
24
25
|
end
|
25
26
|
end
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
+
let(:env) do
|
30
|
+
Hash.new.tap do |env|
|
31
|
+
env[:ui] = double('ui')
|
32
|
+
env[:ui].stub(:info).with(anything)
|
33
|
+
env[:openstack_client] = double
|
34
|
+
env[:openstack_client].stub(:nova) { nova }
|
35
|
+
env[:openstack_client].stub(:glance) { glance }
|
29
36
|
end
|
37
|
+
end
|
30
38
|
|
31
|
-
|
39
|
+
before :each do
|
40
|
+
@image_list_cmd = VagrantPlugins::Openstack::Command::ImageList.new(['--'], env)
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'cmd' do
|
44
|
+
context 'when glance is not available' do
|
45
|
+
|
46
|
+
let(:session) do
|
47
|
+
double('session').tap do |s|
|
48
|
+
s.stub(:endpoints) { {} }
|
49
|
+
end
|
50
|
+
end
|
32
51
|
|
33
|
-
|
52
|
+
it 'prints image list with only the id and the name' do
|
34
53
|
|
35
|
-
|
54
|
+
env[:openstack_client].stub(:session) { session }
|
55
|
+
allow(@image_list_cmd).to receive(:with_target_vms).and_return(nil)
|
56
|
+
nova.should_receive(:get_all_images).with(env)
|
36
57
|
|
37
|
-
|
58
|
+
expect(env[:ui]).to receive(:info).with('
|
38
59
|
+------+--------+
|
39
60
|
| Id | Name |
|
40
61
|
+------+--------+
|
@@ -42,7 +63,38 @@ describe VagrantPlugins::Openstack::Command::ImageList do
|
|
42
63
|
| 0002 | centos |
|
43
64
|
| 0003 | debian |
|
44
65
|
+------+--------+')
|
45
|
-
|
66
|
+
@image_list_cmd.cmd('image-list', [], env)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when glance is available' do
|
71
|
+
|
72
|
+
let(:session) do
|
73
|
+
double('session').tap do |s|
|
74
|
+
s.stub(:endpoints) do
|
75
|
+
{
|
76
|
+
image: 'http://glance'
|
77
|
+
}
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'prints image list with id, name and details' do
|
83
|
+
|
84
|
+
env[:openstack_client].stub(:session) { session }
|
85
|
+
allow(@image_list_cmd).to receive(:with_target_vms).and_return(nil)
|
86
|
+
glance.should_receive(:get_all_images).with(env)
|
87
|
+
|
88
|
+
expect(env[:ui]).to receive(:info).with('
|
89
|
+
+------+--------+------------+-----------+--------------+---------------+
|
90
|
+
| Id | Name | Visibility | Size (Mo) | Min RAM (Go) | Min Disk (Go) |
|
91
|
+
+------+--------+------------+-----------+--------------+---------------+
|
92
|
+
| 0001 | ubuntu | public | 700 | 1 | 10 |
|
93
|
+
| 0002 | centos | private | 800 | 2 | 20 |
|
94
|
+
| 0003 | debian | shared | 900 | 4 | 30 |
|
95
|
+
+------+--------+------------+-----------+--------------+---------------+')
|
96
|
+
@image_list_cmd.cmd('image-list', [], env)
|
97
|
+
end
|
46
98
|
end
|
47
99
|
end
|
48
100
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'vagrant-openstack-provider/spec_helper'
|
2
|
+
|
3
|
+
describe VagrantPlugins::Openstack::Command::SubnetList do
|
4
|
+
describe 'cmd' do
|
5
|
+
|
6
|
+
let(:neutron) do
|
7
|
+
double('neutron').tap do |neutron|
|
8
|
+
neutron.stub(:get_subnets) do
|
9
|
+
[
|
10
|
+
Subnet.new('subnet-01', 'Subnet 1', '192.168.1.0/24', true, 'net-01'),
|
11
|
+
Subnet.new('subnet-02', 'Subnet 2', '192.168.2.0/24', false, 'net-01'),
|
12
|
+
Subnet.new('subnet-03', 'Subnet 3', '192.168.100.0/24', true, 'net-02')
|
13
|
+
]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:env) do
|
19
|
+
Hash.new.tap do |env|
|
20
|
+
env[:ui] = double('ui')
|
21
|
+
env[:ui].stub(:info).with(anything)
|
22
|
+
env[:openstack_client] = double
|
23
|
+
env[:openstack_client].stub(:neutron) { neutron }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
before :each do
|
28
|
+
@subnet_list_cmd = VagrantPlugins::Openstack::Command::SubnetList.new(nil, env)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'prints subnet list from server' do
|
32
|
+
neutron.should_receive(:get_subnets).with(env)
|
33
|
+
|
34
|
+
expect(env[:ui]).to receive(:info).with('
|
35
|
+
+-----------+----------+------------------+-------+------------+
|
36
|
+
| Id | Name | CIDR | DHCP | Network Id |
|
37
|
+
+-----------+----------+------------------+-------+------------+
|
38
|
+
| subnet-01 | Subnet 1 | 192.168.1.0/24 | true | net-01 |
|
39
|
+
| subnet-02 | Subnet 2 | 192.168.2.0/24 | false | net-01 |
|
40
|
+
| subnet-03 | Subnet 3 | 192.168.100.0/24 | true | net-02 |
|
41
|
+
+-----------+----------+------------------+-------+------------+')
|
42
|
+
|
43
|
+
@subnet_list_cmd.cmd('subnet-list', [], env)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -25,16 +25,6 @@ describe VagrantPlugins::Openstack::ConfigResolver do
|
|
25
25
|
|
26
26
|
let(:neutron) do
|
27
27
|
double('neutron').tap do |neutron|
|
28
|
-
neutron.stub(:get_private_networks).with(anything) do
|
29
|
-
[Item.new('001', 'net-01'),
|
30
|
-
Item.new('002', 'net-02'),
|
31
|
-
Item.new('003', 'net-03'),
|
32
|
-
Item.new('004', 'net-04'),
|
33
|
-
Item.new('005', 'net-05'),
|
34
|
-
Item.new('006', 'net-06'),
|
35
|
-
Item.new('007', 'net-07-08'),
|
36
|
-
Item.new('008', 'net-07-08')]
|
37
|
-
end
|
38
28
|
neutron.stub(:get_all_networks).with(anything) do
|
39
29
|
[Item.new('001', 'net-01'),
|
40
30
|
Item.new('002', 'net-02'),
|
@@ -223,9 +213,9 @@ describe VagrantPlugins::Openstack::ConfigResolver do
|
|
223
213
|
end
|
224
214
|
end
|
225
215
|
|
226
|
-
context 'with config.
|
227
|
-
context 'if
|
228
|
-
context 'with config.
|
216
|
+
context 'with only one config.floating_ip_pool specified' do
|
217
|
+
context 'if an ip in the same pool is available' do
|
218
|
+
context 'with config.floating_ip_pool_always_allocate true' do
|
229
219
|
it 'allocate a new floating_ip from the pool' do
|
230
220
|
config.stub(:floating_ip_pool_always_allocate) { true }
|
231
221
|
nova.stub(:get_all_floating_ips).with(anything) do
|
@@ -233,21 +223,21 @@ describe VagrantPlugins::Openstack::ConfigResolver do
|
|
233
223
|
FloatingIP.new('80.81.82.83', 'pool-1', nil)]
|
234
224
|
end
|
235
225
|
nova.stub(:allocate_floating_ip).with(env, 'pool-1') do
|
236
|
-
FloatingIP.new('80.81.82.
|
226
|
+
FloatingIP.new('80.81.82.85', 'pool-1', nil)
|
237
227
|
end
|
238
|
-
config.stub(:floating_ip_pool) { 'pool-1' }
|
239
|
-
@action.resolve_floating_ip(env).should eq('80.81.82.
|
228
|
+
config.stub(:floating_ip_pool) { ['pool-1'] }
|
229
|
+
@action.resolve_floating_ip(env).should eq('80.81.82.85')
|
240
230
|
end
|
241
231
|
end
|
242
232
|
|
243
|
-
context 'with config.
|
233
|
+
context 'with config.floating_ip_pool_always_allocate false' do
|
244
234
|
it 'return one of the available ips' do
|
245
235
|
config.stub(:floating_ip_pool_always_allocate) { false }
|
246
236
|
nova.stub(:get_all_floating_ips).with(anything) do
|
247
237
|
[FloatingIP.new('80.81.82.84', 'pool-1', '1234'),
|
248
238
|
FloatingIP.new('80.81.82.83', 'pool-1', nil)]
|
249
239
|
end
|
250
|
-
config.stub(:floating_ip_pool) { 'pool-1' }
|
240
|
+
config.stub(:floating_ip_pool) { ['pool-1'] }
|
251
241
|
@action.resolve_floating_ip(env).should eq('80.81.82.83')
|
252
242
|
end
|
253
243
|
end
|
@@ -261,12 +251,88 @@ describe VagrantPlugins::Openstack::ConfigResolver do
|
|
261
251
|
nova.stub(:allocate_floating_ip).with(env, 'pool-1') do
|
262
252
|
FloatingIP.new('80.81.82.84', 'pool-1', nil)
|
263
253
|
end
|
264
|
-
config.stub(:floating_ip_pool) { 'pool-1' }
|
254
|
+
config.stub(:floating_ip_pool) { ['pool-1'] }
|
265
255
|
@action.resolve_floating_ip(env).should eq('80.81.82.84')
|
266
256
|
end
|
267
257
|
end
|
268
258
|
end
|
269
259
|
|
260
|
+
context 'with several floating_ip_pool defined' do
|
261
|
+
context 'if an ip in a pool is available' do
|
262
|
+
context 'with config.floating_ip_pool_always_allocate true' do
|
263
|
+
it 'allocate a new floating_ip from the first pool defined' do
|
264
|
+
config.stub(:floating_ip_pool_always_allocate) { true }
|
265
|
+
nova.stub(:get_all_floating_ips).with(anything) do
|
266
|
+
[FloatingIP.new('80.81.82.84', 'pool-1', '1234'),
|
267
|
+
FloatingIP.new('80.81.82.83', 'pool-1', nil),
|
268
|
+
FloatingIP.new('80.81.82.82', 'pool-2', '5678')]
|
269
|
+
end
|
270
|
+
nova.stub(:allocate_floating_ip).with(env, 'pool-1') do
|
271
|
+
FloatingIP.new('80.81.82.85', 'pool-1', nil)
|
272
|
+
end
|
273
|
+
config.stub(:floating_ip_pool) { %w(pool-1 pool-2) }
|
274
|
+
@action.resolve_floating_ip(env).should eq('80.81.82.85')
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
context 'with config.floating_ip_pool_always_allocate false' do
|
279
|
+
it 'return one of the available ips' do
|
280
|
+
config.stub(:floating_ip_pool_always_allocate) { false }
|
281
|
+
nova.stub(:get_all_floating_ips).with(anything) do
|
282
|
+
[FloatingIP.new('80.81.82.84', 'pool-1', '1234'),
|
283
|
+
FloatingIP.new('80.81.82.83', 'pool-2', nil)]
|
284
|
+
end
|
285
|
+
config.stub(:floating_ip_pool) { %w(pool-1 pool-2) }
|
286
|
+
@action.resolve_floating_ip(env).should eq('80.81.82.83')
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
context 'if no ip in the pools is available' do
|
292
|
+
context 'if allocate an ip in first pool is possible' do
|
293
|
+
it 'allocate a new floating_ip from first pool' do
|
294
|
+
nova.stub(:get_all_floating_ips).with(anything) do
|
295
|
+
[FloatingIP.new('80.81.82.83', 'pool-1', '1234'),
|
296
|
+
FloatingIP.new('80.81.82.82', 'pool-2', '5678')]
|
297
|
+
end
|
298
|
+
nova.stub(:allocate_floating_ip).with(env, 'pool-1') do
|
299
|
+
FloatingIP.new('80.81.82.84', 'pool-1', nil)
|
300
|
+
end
|
301
|
+
config.stub(:floating_ip_pool) { %w(pool-1 pool-2) }
|
302
|
+
@action.resolve_floating_ip(env).should eq('80.81.82.84')
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
context 'if allocate an ip in first pool is not possible' do
|
307
|
+
it 'allocate a new floating_ip from second pool' do
|
308
|
+
nova.stub(:get_all_floating_ips).with(anything) do
|
309
|
+
[FloatingIP.new('80.81.82.83', 'pool-1', '1234'),
|
310
|
+
FloatingIP.new('80.81.82.82', 'pool-2', '5678')]
|
311
|
+
end
|
312
|
+
nova.stub(:allocate_floating_ip).with(env, 'pool-1').and_raise Errors::VagrantOpenstackError, message: 'error', code: 404
|
313
|
+
nova.stub(:allocate_floating_ip).with(env, 'pool-2') do
|
314
|
+
FloatingIP.new('80.81.82.84', 'pool-2', nil)
|
315
|
+
end
|
316
|
+
config.stub(:floating_ip_pool) { %w(pool-1 pool-2) }
|
317
|
+
@action.resolve_floating_ip(env).should eq('80.81.82.84')
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
context 'if allocate an ip in either first and second pool is not possible' do
|
322
|
+
it 'shoud raise an error', :simon do
|
323
|
+
nova.stub(:get_all_floating_ips).with(anything) do
|
324
|
+
[FloatingIP.new('80.81.82.83', 'pool-1', '1234'),
|
325
|
+
FloatingIP.new('80.81.82.82', 'pool-2', '5678')]
|
326
|
+
end
|
327
|
+
nova.stub(:allocate_floating_ip).with(env, 'pool-1').and_raise Errors::VagrantOpenstackError, message: 'error', code: 404
|
328
|
+
nova.stub(:allocate_floating_ip).with(env, 'pool-2').and_raise Errors::VagrantOpenstackError, message: 'error', code: 404
|
329
|
+
config.stub(:floating_ip_pool) { %w(pool-1 pool-2) }
|
330
|
+
expect { @action.resolve_floating_ip(env) }.to raise_error(Errors::VagrantOpenstackError)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
270
336
|
context 'with neither floating_ip nor floating_ip_pool' do
|
271
337
|
it 'fails with an UnableToResolveFloatingIP error' do
|
272
338
|
config.stub(:floating_ip) { nil }
|
@@ -13,6 +13,7 @@ describe VagrantPlugins::Openstack::Config do
|
|
13
13
|
its(:password) { should be_nil }
|
14
14
|
its(:openstack_compute_url) { should be_nil }
|
15
15
|
its(:openstack_auth_url) { should be_nil }
|
16
|
+
its(:openstack_orchestration_url) { should be_nil }
|
16
17
|
its(:flavor) { should be_nil }
|
17
18
|
its(:image) { should be_nil }
|
18
19
|
its(:server_name) { should be_nil }
|
@@ -43,6 +44,8 @@ describe VagrantPlugins::Openstack::Config do
|
|
43
44
|
:floating_ip_pool_always_allocate,
|
44
45
|
:scheduler_hints,
|
45
46
|
:security_groups,
|
47
|
+
:openstack_orchestration_url,
|
48
|
+
:stacks,
|
46
49
|
:user_data,
|
47
50
|
:metadata,
|
48
51
|
:availability_zone,
|
@@ -62,6 +65,146 @@ describe VagrantPlugins::Openstack::Config do
|
|
62
65
|
end
|
63
66
|
end
|
64
67
|
|
68
|
+
describe 'merge' do
|
69
|
+
let(:foo_class) do
|
70
|
+
Class.new(described_class) do
|
71
|
+
attr_accessor :networks
|
72
|
+
attr_accessor :floating_ip_pool
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
subject { foo_class.new }
|
77
|
+
|
78
|
+
context 'with original network not empty' do
|
79
|
+
it 'should overidde the config' do
|
80
|
+
one = foo_class.new
|
81
|
+
one.networks = ['foo']
|
82
|
+
|
83
|
+
two = foo_class.new
|
84
|
+
two.networks = ['bar']
|
85
|
+
|
86
|
+
result = one.merge(two)
|
87
|
+
result.networks.should =~ ['bar']
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'with original network empty' do
|
92
|
+
it 'should add the network to the existing list' do
|
93
|
+
one = foo_class.new
|
94
|
+
one.networks = []
|
95
|
+
|
96
|
+
two = foo_class.new
|
97
|
+
two.networks = ['bar']
|
98
|
+
|
99
|
+
result = one.merge(two)
|
100
|
+
result.networks.should =~ ['bar']
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'with original network not empty and new empty' do
|
105
|
+
it 'should keep the original network' do
|
106
|
+
one = foo_class.new
|
107
|
+
one.networks = ['foo']
|
108
|
+
|
109
|
+
two = foo_class.new
|
110
|
+
two.networks = []
|
111
|
+
|
112
|
+
result = one.merge(two)
|
113
|
+
result.networks.should =~ ['foo']
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'with original floating_ip_pool as string' do
|
118
|
+
context 'and new as empty array' do
|
119
|
+
it 'should put original string in a single entry array' do
|
120
|
+
one = foo_class.new
|
121
|
+
one.floating_ip_pool = 'pool'
|
122
|
+
|
123
|
+
two = foo_class.new
|
124
|
+
two.floating_ip_pool = []
|
125
|
+
|
126
|
+
result = one.merge(two)
|
127
|
+
result.floating_ip_pool.should =~ ['pool']
|
128
|
+
end
|
129
|
+
end
|
130
|
+
context 'and new as empty string' do
|
131
|
+
it 'should put original string in a single entry array' do
|
132
|
+
one = foo_class.new
|
133
|
+
one.floating_ip_pool = 'pool'
|
134
|
+
|
135
|
+
two = foo_class.new
|
136
|
+
two.floating_ip_pool = ''
|
137
|
+
|
138
|
+
result = one.merge(two)
|
139
|
+
result.floating_ip_pool.should =~ ['']
|
140
|
+
end
|
141
|
+
end
|
142
|
+
context 'and new as string' do
|
143
|
+
it 'should put new string in a single entry array' do
|
144
|
+
one = foo_class.new
|
145
|
+
one.floating_ip_pool = 'pool'
|
146
|
+
|
147
|
+
two = foo_class.new
|
148
|
+
two.floating_ip_pool = 'new-pool'
|
149
|
+
|
150
|
+
result = one.merge(two)
|
151
|
+
result.floating_ip_pool.should =~ ['new-pool']
|
152
|
+
end
|
153
|
+
end
|
154
|
+
context 'and new as array' do
|
155
|
+
it 'should put new array' do
|
156
|
+
one = foo_class.new
|
157
|
+
one.floating_ip_pool = 'pool'
|
158
|
+
|
159
|
+
two = foo_class.new
|
160
|
+
two.floating_ip_pool = %w(pool-1 pool-2)
|
161
|
+
|
162
|
+
result = one.merge(two)
|
163
|
+
result.floating_ip_pool.should =~ %w(pool-1 pool-2)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'with original floating_ip_pool as array' do
|
169
|
+
context 'and new empty' do
|
170
|
+
it 'should put original array' do
|
171
|
+
one = foo_class.new
|
172
|
+
one.floating_ip_pool = %w(pool-1 pool-2)
|
173
|
+
|
174
|
+
two = foo_class.new
|
175
|
+
two.floating_ip_pool = []
|
176
|
+
|
177
|
+
result = one.merge(two)
|
178
|
+
result.floating_ip_pool.should =~ %w(pool-1 pool-2)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
context 'and new as string' do
|
182
|
+
it 'should put new string in a single entry array' do
|
183
|
+
one = foo_class.new
|
184
|
+
one.floating_ip_pool = %w(pool-1 pool-2)
|
185
|
+
|
186
|
+
two = foo_class.new
|
187
|
+
two.floating_ip_pool = 'pool'
|
188
|
+
|
189
|
+
result = one.merge(two)
|
190
|
+
result.floating_ip_pool.should =~ ['pool']
|
191
|
+
end
|
192
|
+
end
|
193
|
+
context 'and new as array' do
|
194
|
+
it 'should put new array' do
|
195
|
+
one = foo_class.new
|
196
|
+
one.floating_ip_pool = %w(pool-1 pool-2)
|
197
|
+
|
198
|
+
two = foo_class.new
|
199
|
+
two.floating_ip_pool = %w(new-pool-1 new-pool-2)
|
200
|
+
|
201
|
+
result = one.merge(two)
|
202
|
+
result.floating_ip_pool.should =~ %w(new-pool-1 new-pool-2)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
65
208
|
describe 'validation' do
|
66
209
|
let(:machine) { double('machine') }
|
67
210
|
let(:validation_errors) { subject.validate(machine)['Openstack Provider'] }
|
@@ -88,6 +231,39 @@ describe VagrantPlugins::Openstack::Config do
|
|
88
231
|
end
|
89
232
|
end
|
90
233
|
|
234
|
+
context 'with invalid stack' do
|
235
|
+
it 'should raise an error' do
|
236
|
+
subject.stacks = [
|
237
|
+
{
|
238
|
+
name: 'test1'
|
239
|
+
}
|
240
|
+
]
|
241
|
+
I18n.should_receive(:t).with('vagrant_openstack.config.invalid_stack').and_return error_message
|
242
|
+
validation_errors.first.should == error_message
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'should raise an error' do
|
246
|
+
subject.stacks = [
|
247
|
+
{
|
248
|
+
name: 'test1',
|
249
|
+
tempslate: 'tes1'
|
250
|
+
}
|
251
|
+
]
|
252
|
+
I18n.should_receive(:t).with('vagrant_openstack.config.invalid_stack').and_return error_message
|
253
|
+
validation_errors.first.should == error_message
|
254
|
+
end
|
255
|
+
|
256
|
+
it 'should not raise an error' do
|
257
|
+
subject.stacks = [
|
258
|
+
{
|
259
|
+
name: 'test1',
|
260
|
+
template: 'tes1'
|
261
|
+
}
|
262
|
+
]
|
263
|
+
expect(validation_errors).to be_empty
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
91
267
|
context 'with invalid key' do
|
92
268
|
it 'should raise an error' do
|
93
269
|
subject.nonsense1 = true
|
@@ -153,7 +329,7 @@ describe VagrantPlugins::Openstack::Config do
|
|
153
329
|
end
|
154
330
|
end
|
155
331
|
|
156
|
-
[:openstack_compute_url, :openstack_auth_url].each do |url|
|
332
|
+
[:openstack_compute_url, :openstack_auth_url, :openstack_orchestration_url].each do |url|
|
157
333
|
context "the #{url}" do
|
158
334
|
it 'should not validate if the URL is invalid' do
|
159
335
|
subject.send "#{url}=", 'baz'
|