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
@@ -195,17 +195,20 @@ describe VagrantPlugins::Openstack::Action::CreateServer do
195
195
  it 'become active after one retry' do
196
196
  nova.stub(:get_server_details).and_return({ 'status' => 'BUILD' }, { 'status' => 'ACTIVE' })
197
197
  nova.should_receive(:get_server_details).with(env, 'server-01').exactly(2).times
198
- @action.waiting_for_server_to_be_built(env, 'server-01', 1, 5)
198
+ config.stub(:server_create_timeout) { 5 }
199
+ @action.waiting_for_server_to_be_built(env, 'server-01', 1)
199
200
  end
200
201
  it 'timeout before the server become active' do
201
202
  nova.stub(:get_server_details).and_return({ 'status' => 'BUILD' }, { 'status' => 'BUILD' })
202
203
  nova.should_receive(:get_server_details).with(env, 'server-01').at_least(2).times
203
- expect { @action.waiting_for_server_to_be_built(env, 'server-01', 1, 3) }.to raise_error Errors::Timeout
204
+ config.stub(:server_create_timeout) { 3 }
205
+ expect { @action.waiting_for_server_to_be_built(env, 'server-01', 1) }.to raise_error Errors::Timeout
204
206
  end
205
207
  it 'raise an error after one retry' do
206
208
  nova.stub(:get_server_details).and_return({ 'status' => 'BUILD' }, { 'status' => 'ERROR' })
207
209
  nova.should_receive(:get_server_details).with(env, 'server-01').exactly(2).times
208
- expect { @action.waiting_for_server_to_be_built(env, 'server-01', 1, 3) }.to raise_error Errors::ServerStatusError
210
+ config.stub(:server_create_timeout) { 3 }
211
+ expect { @action.waiting_for_server_to_be_built(env, 'server-01', 1) }.to raise_error Errors::ServerStatusError
209
212
  end
210
213
  end
211
214
  end
@@ -22,6 +22,7 @@ describe VagrantPlugins::Openstack::Action::CreateStack do
22
22
  }
23
23
  ]
24
24
  end
25
+ config.stub(:stack_create_timeout) { 200 }
25
26
  end
26
27
  end
27
28
 
@@ -80,17 +81,20 @@ describe VagrantPlugins::Openstack::Action::CreateStack do
80
81
  it 'become active after one retry' do
81
82
  heat.stub(:get_stack_details).and_return({ 'stack_status' => 'CREATE_IN_PROGRESS' }, { 'stack_status' => 'CREATE_COMPLETE' })
82
83
  heat.should_receive(:get_stack_details).with(env, 'stack1', 'id-01').exactly(2).times
83
- @action.waiting_for_stack_to_be_created(env, 'stack1', 'id-01', 1, 5)
84
+ config.stub(:stack_create_timeout) { 5 }
85
+ @action.waiting_for_stack_to_be_created(env, 'stack1', 'id-01', 1)
84
86
  end
85
87
  it 'timeout before the server become active' do
86
88
  heat.stub(:get_stack_details).and_return({ 'stack_status' => 'CREATE_IN_PROGRESS' }, { 'stack_status' => 'CREATE_IN_PROGRESS' })
87
89
  heat.should_receive(:get_stack_details).with(env, 'stack1', 'id-01').at_least(2).times
88
- expect { @action.waiting_for_stack_to_be_created(env, 'stack1', 'id-01', 1, 3) }.to raise_error Errors::Timeout
90
+ config.stub(:stack_create_timeout) { 3 }
91
+ expect { @action.waiting_for_stack_to_be_created(env, 'stack1', 'id-01', 1) }.to raise_error Errors::Timeout
89
92
  end
90
93
  it 'raise an error after one retry' do
91
94
  heat.stub(:get_stack_details).and_return({ 'stack_status' => 'CREATE_IN_PROGRESS' }, { 'stack_status' => 'CREATE_FAILED' })
92
95
  heat.should_receive(:get_stack_details).with(env, 'stack1', 'id-01').exactly(2).times
93
- expect { @action.waiting_for_stack_to_be_created(env, 'stack1', 'id-01', 1, 3) }.to raise_error Errors::StackStatusError
96
+ config.stub(:stack_create_timeout) { 3 }
97
+ expect { @action.waiting_for_stack_to_be_created(env, 'stack1', 'id-01', 1) }.to raise_error Errors::StackStatusError
94
98
  end
95
99
  end
96
100
  end
@@ -15,6 +15,10 @@ describe VagrantPlugins::Openstack::Action::DeleteServer do
15
15
  end
16
16
  end
17
17
 
18
+ let(:config) do
19
+ double('config')
20
+ end
21
+
18
22
  let(:env) do
19
23
  Hash.new.tap do |env|
20
24
  env[:ui] = double('ui')
@@ -22,6 +26,7 @@ describe VagrantPlugins::Openstack::Action::DeleteServer do
22
26
  env[:ui].stub(:error).with(anything)
23
27
  env[:openstack_client] = openstack_client
24
28
  env[:machine] = OpenStruct.new.tap do |m|
29
+ m.provider_config = config
25
30
  m.id = 'server_id'
26
31
  end
27
32
  end
@@ -59,22 +64,26 @@ describe VagrantPlugins::Openstack::Action::DeleteServer do
59
64
  nova.stub(:get_server_details).once.and_return('status' => 'ACTIVE')
60
65
  nova.stub(:get_server_details).once.and_raise(Errors::InstanceNotFound)
61
66
  nova.should_receive(:get_server_details).with(env, 'server-01').exactly(1).times
62
- @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1, 5)
67
+ config.stub(:server_delete_timeout) { 5 }
68
+ @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1)
63
69
  end
64
70
  it 'become deleted after one retry' do
65
71
  nova.stub(:get_server_details).and_return({ 'status' => 'ACTIVE' }, { 'status' => 'DELETED' })
66
72
  nova.should_receive(:get_server_details).with(env, 'server-01').exactly(2).times
67
- @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1, 5)
73
+ config.stub(:server_delete_timeout) { 5 }
74
+ @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1)
68
75
  end
69
76
  it 'timeout before the server become active' do
70
77
  nova.stub(:get_server_details).and_return({ 'status' => 'ACTIVE' }, { 'status' => 'ACTIVE' })
71
78
  nova.should_receive(:get_server_details).with(env, 'server-01').at_least(2).times
72
- expect { @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1, 3) }.to raise_error Errors::Timeout
79
+ config.stub(:server_delete_timeout) { 3 }
80
+ expect { @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1) }.to raise_error Errors::Timeout
73
81
  end
74
82
  it 'raise an error after one retry' do
75
83
  nova.stub(:get_server_details).and_return({ 'status' => 'ACTIVE' }, { 'status' => 'ERROR' })
76
84
  nova.should_receive(:get_server_details).with(env, 'server-01').exactly(2).times
77
- expect { @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1, 3) }.to raise_error Errors::ServerStatusError
85
+ config.stub(:server_delete_timeout) { 3 }
86
+ expect { @action.waiting_for_instance_to_be_deleted(env, 'server-01', 1) }.to raise_error Errors::ServerStatusError
78
87
  end
79
88
  end
80
89
  end
@@ -25,8 +25,17 @@ describe VagrantPlugins::Openstack::Action::ReadSSHInfo do
25
25
 
26
26
  let(:nova) do
27
27
  double('nova').tap do |nova|
28
- nova.stub(:get_all_floating_ips).with(anything) do
29
- [FloatingIP.new('80.81.82.83', 'pool-1', nil), FloatingIP.new('30.31.32.33', 'pool-2', '1234')]
28
+ nova.stub(:get_server_details).with(env, '1234') do
29
+ {
30
+ 'addresses' => {
31
+ 'net' => [
32
+ {
33
+ 'addr' => '80.80.80.80',
34
+ 'OS-EXT-IPS:type' => 'floating'
35
+ }
36
+ ]
37
+ }
38
+ }
30
39
  end
31
40
  end
32
41
  end
@@ -136,7 +145,19 @@ describe VagrantPlugins::Openstack::Action::ReadSSHInfo do
136
145
  config.stub(:floating_ip) { '80.80.80.80' }
137
146
  config.stub(:keypair_name) { nil }
138
147
  config.stub(:public_key_path) { nil }
139
- nova.stub(:get_server_details) { { 'key_name' => 'my_keypair_name' } }
148
+ nova.stub(:get_server_details) do
149
+ {
150
+ 'key_name' => 'my_keypair_name',
151
+ 'addresses' => {
152
+ 'net' => [
153
+ {
154
+ 'addr' => '80.80.80.80',
155
+ 'OS-EXT-IPS:type' => 'floating'
156
+ }
157
+ ]
158
+ }
159
+ }
160
+ end
140
161
  expect(nova).to receive(:get_server_details).with(env, '1234')
141
162
  @action.read_ssh_info(env).should eq(
142
163
  host: '80.80.80.80',
@@ -6,6 +6,10 @@ describe VagrantPlugins::Openstack::Action::WaitForServerToBeActive do
6
6
  double('nova')
7
7
  end
8
8
 
9
+ let(:config) do
10
+ double('config')
11
+ end
12
+
9
13
  let(:env) do
10
14
  Hash.new.tap do |env|
11
15
  env[:ui] = double('ui').tap do |ui|
@@ -16,6 +20,7 @@ describe VagrantPlugins::Openstack::Action::WaitForServerToBeActive do
16
20
  os.stub(:nova) { nova }
17
21
  end
18
22
  env[:machine] = OpenStruct.new.tap do |m|
23
+ m.provider_config = config
19
24
  m.id = 'server_id'
20
25
  end
21
26
  end
@@ -33,13 +38,15 @@ describe VagrantPlugins::Openstack::Action::WaitForServerToBeActive do
33
38
  nova.stub(:get_server_details).and_return({ 'status' => 'BUILD' }, { 'status' => 'ACTIVE' })
34
39
  expect(nova).to receive(:get_server_details).with(env, 'server_id').exactly(2).times
35
40
  expect(app).to receive(:call)
36
- @action = WaitForServerToBeActive.new(app, nil, 1, 5)
41
+ config.stub(:server_active_timeout) { 5 }
42
+ @action = WaitForServerToBeActive.new(app, nil, 1)
37
43
  @action.call(env)
38
44
  end
39
45
  it 'timeout after one retry' do
40
46
  nova.stub(:get_server_details).and_return({ 'status' => 'BUILD' }, { 'status' => 'BUILD' })
41
47
  expect(nova).to receive(:get_server_details).with(env, 'server_id').at_least(2).times
42
- @action = WaitForServerToBeActive.new(app, nil, 1, 2)
48
+ config.stub(:server_active_timeout) { 2 }
49
+ @action = WaitForServerToBeActive.new(app, nil, 1)
43
50
  expect { @action.call(env) }.to raise_error Errors::Timeout
44
51
  end
45
52
  end
@@ -6,6 +6,10 @@ describe VagrantPlugins::Openstack::Action::WaitForServerToStop do
6
6
  double('nova')
7
7
  end
8
8
 
9
+ let(:config) do
10
+ double('config')
11
+ end
12
+
9
13
  let(:env) do
10
14
  Hash.new.tap do |env|
11
15
  env[:ui] = double('ui').tap do |ui|
@@ -16,6 +20,7 @@ describe VagrantPlugins::Openstack::Action::WaitForServerToStop do
16
20
  os.stub(:nova) { nova }
17
21
  end
18
22
  env[:machine] = OpenStruct.new.tap do |m|
23
+ m.provider_config = config
19
24
  m.id = 'server_id'
20
25
  end
21
26
  end
@@ -33,13 +38,15 @@ describe VagrantPlugins::Openstack::Action::WaitForServerToStop do
33
38
  nova.stub(:get_server_details).and_return({ 'status' => 'ACTIVE' }, { 'status' => 'SHUTOFF' })
34
39
  expect(nova).to receive(:get_server_details).with(env, 'server_id').exactly(2).times
35
40
  expect(app).to receive(:call)
36
- @action = WaitForServerToStop.new(app, nil, 1, 5)
41
+ config.stub(:server_stop_timeout) { 5 }
42
+ @action = WaitForServerToStop.new(app, nil, 1)
37
43
  @action.call(env)
38
44
  end
39
45
  it 'timeout after one retry' do
40
46
  nova.stub(:get_server_details).and_return({ 'status' => 'ACTIVE' }, { 'status' => 'ACTIVE' })
41
47
  expect(nova).to receive(:get_server_details).with(env, 'server_id').at_least(2).times
42
- @action = WaitForServerToStop.new(app, nil, 1, 2)
48
+ config.stub(:server_stop_timeout) { 2 }
49
+ @action = WaitForServerToStop.new(app, nil, 1)
43
50
  expect { @action.call(env) }.to raise_error Errors::Timeout
44
51
  end
45
52
  end
@@ -2,8 +2,24 @@ require 'vagrant-openstack-provider/spec_helper'
2
2
 
3
3
  describe VagrantPlugins::Openstack::CinderClient do
4
4
 
5
+ let(:http) do
6
+ double('http').tap do |http|
7
+ http.stub(:read_timeout) { 42 }
8
+ http.stub(:open_timeout) { 43 }
9
+ end
10
+ end
11
+
12
+ let(:config) do
13
+ double('config').tap do |config|
14
+ config.stub(:http) { http }
15
+ end
16
+ end
17
+
5
18
  let(:env) do
6
- Hash.new
19
+ Hash.new.tap do |env|
20
+ env[:machine] = double('machine')
21
+ env[:machine].stub(:provider_config) { config }
22
+ end
7
23
  end
8
24
 
9
25
  let(:session) do
@@ -2,8 +2,24 @@ require 'vagrant-openstack-provider/spec_helper'
2
2
 
3
3
  describe VagrantPlugins::Openstack::GlanceClient do
4
4
 
5
+ let(:http) do
6
+ double('http').tap do |http|
7
+ http.stub(:read_timeout) { 42 }
8
+ http.stub(:open_timeout) { 43 }
9
+ end
10
+ end
11
+
12
+ let(:config) do
13
+ double('config').tap do |config|
14
+ config.stub(:http) { http }
15
+ end
16
+ end
17
+
5
18
  let(:env) do
6
- Hash.new
19
+ Hash.new.tap do |env|
20
+ env[:machine] = double('machine')
21
+ env[:machine].stub(:provider_config) { config }
22
+ end
7
23
  end
8
24
 
9
25
  let(:session) do
@@ -120,7 +136,7 @@ describe VagrantPlugins::Openstack::GlanceClient do
120
136
  }
121
137
  ]}')
122
138
 
123
- versions = @glance_client.get_api_version_list(:image)
139
+ versions = @glance_client.get_api_version_list(env)
124
140
 
125
141
  expect(versions.size).to eq(2)
126
142
  end
@@ -3,6 +3,13 @@ require 'vagrant-openstack-provider/spec_helper'
3
3
  describe VagrantPlugins::Openstack::NovaClient do
4
4
  include FakeFS::SpecHelpers::All
5
5
 
6
+ let(:http) do
7
+ double('http').tap do |http|
8
+ http.stub(:read_timeout) { 42 }
9
+ http.stub(:open_timeout) { 43 }
10
+ end
11
+ end
12
+
6
13
  let(:config) do
7
14
  double('config').tap do |config|
8
15
  config.stub(:openstack_auth_url) { 'http://heatAuthV2' }
@@ -10,6 +17,7 @@ describe VagrantPlugins::Openstack::NovaClient do
10
17
  config.stub(:tenant_name) { 'testTenant' }
11
18
  config.stub(:username) { 'username' }
12
19
  config.stub(:password) { 'password' }
20
+ config.stub(:http) { http }
13
21
  end
14
22
  end
15
23
 
@@ -2,6 +2,13 @@ require 'vagrant-openstack-provider/spec_helper'
2
2
 
3
3
  describe VagrantPlugins::Openstack::KeystoneClient do
4
4
 
5
+ let(:http) do
6
+ double('http').tap do |http|
7
+ http.stub(:read_timeout) { 42 }
8
+ http.stub(:open_timeout) { 43 }
9
+ end
10
+ end
11
+
5
12
  let(:config) do
6
13
  double('config').tap do |config|
7
14
  config.stub(:openstack_auth_url) { 'http://keystoneAuthV2' }
@@ -10,6 +17,7 @@ describe VagrantPlugins::Openstack::KeystoneClient do
10
17
  config.stub(:tenant_name) { 'testTenant' }
11
18
  config.stub(:username) { 'username' }
12
19
  config.stub(:password) { 'password' }
20
+ config.stub(:http) { http }
13
21
  end
14
22
  end
15
23
 
@@ -2,8 +2,24 @@ require 'vagrant-openstack-provider/spec_helper'
2
2
 
3
3
  describe VagrantPlugins::Openstack::NeutronClient do
4
4
 
5
+ let(:http) do
6
+ double('http').tap do |http|
7
+ http.stub(:read_timeout) { 42 }
8
+ http.stub(:open_timeout) { 43 }
9
+ end
10
+ end
11
+
12
+ let(:config) do
13
+ double('config').tap do |config|
14
+ config.stub(:http) { http }
15
+ end
16
+ end
17
+
5
18
  let(:env) do
6
- Hash.new
19
+ Hash.new.tap do |env|
20
+ env[:machine] = double('machine')
21
+ env[:machine].stub(:provider_config) { config }
22
+ end
7
23
  end
8
24
 
9
25
  let(:session) do
@@ -150,7 +166,7 @@ describe VagrantPlugins::Openstack::NeutronClient do
150
166
  }
151
167
  ]}')
152
168
 
153
- versions = @neutron_client.get_api_version_list(:network)
169
+ versions = @neutron_client.get_api_version_list(env, :network)
154
170
 
155
171
  expect(versions.size).to eq(2)
156
172
  end
@@ -6,6 +6,13 @@ describe VagrantPlugins::Openstack::NovaClient do
6
6
  let(:filename) { 'key.pub' }
7
7
  let(:ssh_key_content) { 'my public key' }
8
8
 
9
+ let(:http) do
10
+ double('http').tap do |http|
11
+ http.stub(:read_timeout) { 42 }
12
+ http.stub(:open_timeout) { 43 }
13
+ end
14
+ end
15
+
9
16
  let(:config) do
10
17
  double('config').tap do |config|
11
18
  config.stub(:openstack_auth_url) { 'http://novaAuthV2' }
@@ -13,6 +20,7 @@ describe VagrantPlugins::Openstack::NovaClient do
13
20
  config.stub(:tenant_name) { 'testTenant' }
14
21
  config.stub(:username) { 'username' }
15
22
  config.stub(:password) { 'password' }
23
+ config.stub(:http) { http }
16
24
  end
17
25
  end
18
26
 
@@ -160,6 +160,16 @@ describe VagrantPlugins::Openstack::ConfigResolver do
160
160
  @action.resolve_flavor(env).should eq(Flavor.new('fl-002', 'flavor-02', 4, 2048, 50))
161
161
  end
162
162
  end
163
+ context 'with list' do
164
+ it 'returns the first matching flavor' do
165
+ config.stub(:flavor) { %w(not-existing flavor-02 flavor-01) }
166
+ nova.stub(:get_all_flavors).with(anything) do
167
+ [Flavor.new('fl-001', 'flavor-01', 2, 1024, 10),
168
+ Flavor.new('fl-002', 'flavor-02', 4, 2048, 50)]
169
+ end
170
+ @action.resolve_flavor(env).should eq(Flavor.new('fl-002', 'flavor-02', 4, 2048, 50))
171
+ end
172
+ end
163
173
  context 'with invalid identifier' do
164
174
  it 'raise an error' do
165
175
  config.stub(:flavor) { 'not-existing' }
@@ -75,7 +75,7 @@ describe VagrantPlugins::Openstack::Config do
75
75
 
76
76
  subject { foo_class.new }
77
77
 
78
- context 'with original network not empty' do
78
+ context 'with original network not empty array' do
79
79
  it 'should overidde the config' do
80
80
  one = foo_class.new
81
81
  one.networks = ['foo']
@@ -88,7 +88,7 @@ describe VagrantPlugins::Openstack::Config do
88
88
  end
89
89
  end
90
90
 
91
- context 'with original network empty' do
91
+ context 'with original network empty array' do
92
92
  it 'should add the network to the existing list' do
93
93
  one = foo_class.new
94
94
  one.networks = []
@@ -101,7 +101,7 @@ describe VagrantPlugins::Openstack::Config do
101
101
  end
102
102
  end
103
103
 
104
- context 'with original network not empty and new empty' do
104
+ context 'with original network not empty array and new empty array' do
105
105
  it 'should keep the original network' do
106
106
  one = foo_class.new
107
107
  one.networks = ['foo']
@@ -114,6 +114,32 @@ describe VagrantPlugins::Openstack::Config do
114
114
  end
115
115
  end
116
116
 
117
+ context 'with original network is a string and new empty array' do
118
+ it 'should keep the original network and wrap it into an array' do
119
+ one = foo_class.new
120
+ one.networks = 'foo'
121
+
122
+ two = foo_class.new
123
+ two.networks = []
124
+
125
+ result = one.merge(two)
126
+ result.networks.should =~ ['foo']
127
+ end
128
+ end
129
+
130
+ context 'with original network is a string and new is a string' do
131
+ it 'should overidde the config and wrap it into an array' do
132
+ one = foo_class.new
133
+ one.networks = 'foo'
134
+
135
+ two = foo_class.new
136
+ two.networks = 'bar'
137
+
138
+ result = one.merge(two)
139
+ result.networks.should =~ ['bar']
140
+ end
141
+ end
142
+
117
143
  context 'with original floating_ip_pool as string' do
118
144
  context 'and new as empty array' do
119
145
  it 'should put original string in a single entry array' do
@@ -222,6 +248,7 @@ describe VagrantPlugins::Openstack::Config do
222
248
  machine.stub(:config) { config }
223
249
  subject.username = 'foo'
224
250
  subject.password = 'bar'
251
+ subject.tenant_name = 'tenant'
225
252
  subject.keypair_name = 'keypair'
226
253
  end
227
254
 
@@ -299,7 +326,7 @@ describe VagrantPlugins::Openstack::Config do
299
326
  end
300
327
  end
301
328
 
302
- context 'the API key' do
329
+ context 'the password' do
303
330
  it 'should error if not given' do
304
331
  subject.password = nil
305
332
  I18n.should_receive(:t).with('vagrant_openstack.config.password_required').and_return error_message
@@ -315,6 +342,14 @@ describe VagrantPlugins::Openstack::Config do
315
342
  end
316
343
  end
317
344
 
345
+ context 'the tenant name' do
346
+ it 'should error if not given' do
347
+ subject.tenant_name = nil
348
+ I18n.should_receive(:t).with('vagrant_openstack.config.tenant_name_required').and_return error_message
349
+ validation_errors.first.should == error_message
350
+ end
351
+ end
352
+
318
353
  context 'the ssh_timeout' do
319
354
  it 'should error if do not represent an integer' do
320
355
  subject.ssh_timeout = 'timeout'