vagrant-libvirt 0.11.2 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/vagrant-libvirt/action/create_domain.rb +15 -1
  3. data/lib/vagrant-libvirt/action/create_domain_volume.rb +1 -0
  4. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +8 -4
  5. data/lib/vagrant-libvirt/action/create_networks.rb +1 -1
  6. data/lib/vagrant-libvirt/action/destroy_domain_confirm.rb +22 -0
  7. data/lib/vagrant-libvirt/action/forward_ports.rb +1 -1
  8. data/lib/vagrant-libvirt/action/handle_box_image.rb +6 -3
  9. data/lib/vagrant-libvirt/action/start_domain.rb +38 -9
  10. data/lib/vagrant-libvirt/action.rb +0 -2
  11. data/lib/vagrant-libvirt/config.rb +78 -28
  12. data/lib/vagrant-libvirt/templates/domain.xml.erb +25 -14
  13. data/lib/vagrant-libvirt/templates/public_interface.xml.erb +22 -17
  14. data/lib/vagrant-libvirt/util/network_util.rb +27 -22
  15. data/lib/vagrant-libvirt/version +1 -1
  16. data/spec/support/libvirt_acceptance_context.rb +1 -1
  17. data/spec/support/matchers/have_file_content.rb +1 -1
  18. data/spec/support/unit_context.rb +0 -3
  19. data/spec/unit/action/clean_machine_folder_spec.rb +3 -3
  20. data/spec/unit/action/create_domain_volume_spec/one_disk_in_storage.xml +1 -0
  21. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_0.xml +1 -0
  22. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_1.xml +1 -0
  23. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_2.xml +1 -0
  24. data/spec/unit/action/create_network_interfaces.rb +355 -0
  25. data/spec/unit/action/handle_box_image_spec.rb +9 -2
  26. data/spec/unit/action/start_domain_spec.rb +42 -0
  27. data/spec/unit/action_spec.rb +62 -1
  28. data/spec/unit/cap/mount_9p_spec.rb +4 -0
  29. data/spec/unit/config_spec.rb +39 -10
  30. data/spec/unit/driver_spec.rb +29 -18
  31. data/spec/unit/templates/domain_all_settings.xml +2 -2
  32. data/spec/unit/templates/domain_spec.rb +2 -1
  33. metadata +5 -2
@@ -18,22 +18,24 @@ module VagrantPlugins
18
18
  module NetworkUtil
19
19
  include Vagrant::Util::NetworkIP
20
20
 
21
- def configured_networks(env, logger)
22
- qemu_use_session = env[:machine].provider_config.qemu_use_session
23
- qemu_use_agent = env[:machine].provider_config.qemu_use_agent
24
- management_network_device = env[:machine].provider_config.management_network_device
25
- management_network_name = env[:machine].provider_config.management_network_name
26
- management_network_address = env[:machine].provider_config.management_network_address
27
- management_network_mode = env[:machine].provider_config.management_network_mode
28
- management_network_mac = env[:machine].provider_config.management_network_mac
29
- management_network_guest_ipv6 = env[:machine].provider_config.management_network_guest_ipv6
30
- management_network_autostart = env[:machine].provider_config.management_network_autostart
31
- management_network_pci_bus = env[:machine].provider_config.management_network_pci_bus
32
- management_network_pci_slot = env[:machine].provider_config.management_network_pci_slot
33
- management_network_domain = env[:machine].provider_config.management_network_domain
34
- management_network_mtu = env[:machine].provider_config.management_network_mtu
35
- management_network_keep = env[:machine].provider_config.management_network_keep
36
- management_network_driver_iommu = env[:machine].provider_config.management_network_driver_iommu
21
+ def configured_networks(machine, logger)
22
+ qemu_use_session = machine.provider_config.qemu_use_session
23
+ qemu_use_agent = machine.provider_config.qemu_use_agent
24
+ management_network_device = machine.provider_config.management_network_device
25
+ management_network_name = machine.provider_config.management_network_name
26
+ management_network_address = machine.provider_config.management_network_address
27
+ management_network_mode = machine.provider_config.management_network_mode
28
+ management_network_mac = machine.provider_config.management_network_mac
29
+ management_network_guest_ipv6 = machine.provider_config.management_network_guest_ipv6
30
+ management_network_autostart = machine.provider_config.management_network_autostart
31
+ management_network_pci_bus = machine.provider_config.management_network_pci_bus
32
+ management_network_pci_slot = machine.provider_config.management_network_pci_slot
33
+ management_network_domain = machine.provider_config.management_network_domain
34
+ management_network_mtu = machine.provider_config.management_network_mtu
35
+ management_network_keep = machine.provider_config.management_network_keep
36
+ management_network_driver_iommu = machine.provider_config.management_network_driver_iommu
37
+ management_network_iface_name = machine.provider_config.management_network_iface_name
38
+ management_network_model_type = machine.provider_config.management_network_model_type
37
39
  logger.info "Using #{management_network_name} at #{management_network_address} as the management network #{management_network_mode} is the mode"
38
40
 
39
41
  begin
@@ -54,6 +56,7 @@ module VagrantPlugins
54
56
  if qemu_use_session
55
57
  management_network_options = {
56
58
  iface_type: :public_network,
59
+ model_type: management_network_model_type,
57
60
  dev: management_network_device,
58
61
  mode: 'bridge',
59
62
  type: 'bridge',
@@ -63,6 +66,7 @@ module VagrantPlugins
63
66
  else
64
67
  management_network_options = {
65
68
  iface_type: :private_network,
69
+ model_type: management_network_model_type,
66
70
  network_name: management_network_name,
67
71
  ip: Regexp.last_match(1),
68
72
  netmask: Regexp.last_match(2),
@@ -76,6 +80,7 @@ module VagrantPlugins
76
80
  end
77
81
 
78
82
  management_network_options[:driver_iommu] = management_network_driver_iommu
83
+ management_network_options[:iface_name] = management_network_iface_name
79
84
 
80
85
  unless management_network_mac.nil?
81
86
  management_network_options[:mac] = management_network_mac
@@ -101,23 +106,23 @@ module VagrantPlugins
101
106
  # if there is a box and management network is disabled
102
107
  # need qemu agent enabled and at least one network that can be accessed
103
108
  if (
104
- env[:machine].config.vm.box &&
105
- !env[:machine].provider_config.mgmt_attach &&
106
- !env[:machine].provider_config.qemu_use_agent &&
107
- !env[:machine].config.vm.networks.any? { |type, _| ["private_network", "public_network"].include?(type.to_s) }
109
+ machine.config.vm.box &&
110
+ !machine.provider_config.mgmt_attach &&
111
+ !machine.provider_config.qemu_use_agent &&
112
+ !machine.config.vm.networks.any? { |type, _| ["private_network", "public_network"].include?(type.to_s) }
108
113
  )
109
114
  raise Errors::ManagementNetworkRequired
110
115
  end
111
116
 
112
117
  # add management network to list of networks to check
113
118
  # unless mgmt_attach set to false
114
- networks = if env[:machine].provider_config.mgmt_attach
119
+ networks = if machine.provider_config.mgmt_attach
115
120
  [management_network_options]
116
121
  else
117
122
  []
118
123
  end
119
124
 
120
- env[:machine].config.vm.networks.each do |type, original_options|
125
+ machine.config.vm.networks.each do |type, original_options|
121
126
  logger.debug "In config found network type #{type} options #{original_options}"
122
127
  # Options can be specified in Vagrantfile in short format (:ip => ...),
123
128
  # or provider format # (:libvirt__network_name => ...).
@@ -1 +1 @@
1
- 0.11.2
1
+ 0.12.1
@@ -71,7 +71,7 @@ shared_context 'libvirt_acceptance' do
71
71
  # allows for a helper Vagrantfile to force specific provider options if testing
72
72
  # environment needs them
73
73
  vagrantfile = File.join(vagrant_home, 'Vagrantfile')
74
- if File.exists?(vagrantfile) and !File.exists?(File.join(target_env.homedir, 'Vagrantfile'))
74
+ if File.exist?(vagrantfile) and !File.exist?(File.join(target_env.homedir, 'Vagrantfile'))
75
75
  FileUtils.cp(vagrantfile, target_env.homedir)
76
76
  end
77
77
  end
@@ -45,7 +45,7 @@ require "rspec/expectations/version"
45
45
  # end
46
46
  RSpec::Matchers.define :have_file_content do |expected|
47
47
  match do |actual|
48
- next false unless File.exists?(actual)
48
+ next false unless File.exist?(actual)
49
49
 
50
50
  @actual = File.read(actual).chomp
51
51
  @expected = if expected.is_a? String
@@ -29,12 +29,9 @@ shared_context 'unit' do
29
29
 
30
30
  # Mock the communicator to prevent SSH commands for being executed.
31
31
  let(:communicator) { double('communicator') }
32
- # Mock the guest operating system.
33
- let(:guest) { double('guest') }
34
32
  let(:app) { ->(env) {} }
35
33
 
36
34
  before (:each) do
37
- allow(machine).to receive(:guest).and_return(guest)
38
35
  allow(machine).to receive(:communicate).and_return(communicator)
39
36
  allow(machine).to receive(:ui).and_return(ui)
40
37
  end
@@ -20,7 +20,7 @@ describe VagrantPlugins::ProviderLibvirt::Action::CleanMachineFolder do
20
20
 
21
21
  expect(subject.call(env)).to be_nil
22
22
 
23
- expect(File.exists?(machine.data_dir)).to eq(true)
23
+ expect(File.exist?(machine.data_dir)).to eq(true)
24
24
  expect(Dir.entries(machine.data_dir)).to match_array([".", ".."])
25
25
  end
26
26
  end
@@ -38,7 +38,7 @@ describe VagrantPlugins::ProviderLibvirt::Action::CleanMachineFolder do
38
38
 
39
39
  expect(subject.call(env)).to be_nil
40
40
 
41
- expect(File.exists?(machine.data_dir)).to eq(true)
41
+ expect(File.exist?(machine.data_dir)).to eq(true)
42
42
  expect(Dir.entries(machine.data_dir)).to match_array([".", ".."])
43
43
  end
44
44
  end
@@ -51,7 +51,7 @@ describe VagrantPlugins::ProviderLibvirt::Action::CleanMachineFolder do
51
51
 
52
52
  expect(subject.call(env)).to be_nil
53
53
 
54
- expect(File.exists?(machine.data_dir)).to eq(true)
54
+ expect(File.exist?(machine.data_dir)).to eq(true)
55
55
  expect(Dir.entries(machine.data_dir)).to match_array([".", ".."])
56
56
  end
57
57
  end
@@ -8,6 +8,7 @@
8
8
  <group>0</group>
9
9
  <label>virt_image_t</label>
10
10
  </permissions>
11
+ <compat>1.1</compat>
11
12
  </target>
12
13
  <backingStore>
13
14
  <path>/test/path_0.img</path>
@@ -8,6 +8,7 @@
8
8
  <group>0</group>
9
9
  <label>virt_image_t</label>
10
10
  </permissions>
11
+ <compat>1.1</compat>
11
12
  </target>
12
13
  <backingStore>
13
14
  <path>/test/path_0.img</path>
@@ -8,6 +8,7 @@
8
8
  <group>0</group>
9
9
  <label>virt_image_t</label>
10
10
  </permissions>
11
+ <compat>1.1</compat>
11
12
  </target>
12
13
  <backingStore>
13
14
  <path>/test/path_1.img</path>
@@ -8,6 +8,7 @@
8
8
  <group>0</group>
9
9
  <label>virt_image_t</label>
10
10
  </permissions>
11
+ <compat>1.1</compat>
11
12
  </target>
12
13
  <backingStore>
13
14
  <path>/test/path_2.img</path>
@@ -0,0 +1,355 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../spec_helper'
4
+
5
+ require 'vagrant-libvirt/errors'
6
+ require 'vagrant-libvirt/action/create_network_interfaces'
7
+ require 'vagrant-libvirt/util/unindent'
8
+
9
+ describe VagrantPlugins::ProviderLibvirt::Action::CreateNetworkInterfaces do
10
+ subject { described_class.new(app, env) }
11
+
12
+ include_context 'unit'
13
+ include_context 'libvirt'
14
+
15
+ let(:networks) { [
16
+ instance_double(::Libvirt::Network),
17
+ instance_double(::Libvirt::Network),
18
+ ] }
19
+ let(:default_network_xml) {
20
+ <<-EOF
21
+ <network>
22
+ <name>default</name>
23
+ <uuid>e5f871eb-2899-48b2-83df-78aa43efa360</uuid>
24
+ <forward mode='nat'>
25
+ <nat>
26
+ <port start='1024' end='65535'/>
27
+ </nat>
28
+ </forward>
29
+ <bridge name='virbr0' stp='on' delay='0'/>
30
+ <mac address='52:54:00:71:ce:a6'/>
31
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
32
+ <dhcp>
33
+ <range start='192.168.122.2' end='192.168.122.254'/>
34
+ </dhcp>
35
+ </ip>
36
+ </network>
37
+ EOF
38
+ }
39
+ let(:management_network_xml) {
40
+ <<-EOF
41
+ <network ipv6='yes'>
42
+ <name>vagrant-libvirt</name>
43
+ <uuid>46360938-0607-4168-a182-1352fac4a4f9</uuid>
44
+ <forward mode='nat'/>
45
+ <bridge name='virbr1' stp='on' delay='0'/>
46
+ <mac address='52:54:00:c2:d5:a5'/>
47
+ <ip address='192.168.121.1' netmask='255.255.255.0'>
48
+ <dhcp>
49
+ <range start='192.168.121.1' end='192.168.121.254'/>
50
+ </dhcp>
51
+ </ip>
52
+ </network>
53
+ EOF
54
+ }
55
+ let(:default_management_nic_xml) {
56
+ <<-EOF.unindent
57
+ <interface type="network">
58
+ <alias name="ua-net-0"></alias>
59
+ <source network="vagrant-libvirt"></source>
60
+ <target dev="vnet0"></target>
61
+ <model type="virtio"></model>
62
+ <driver iommu="off"></driver>
63
+ </interface>
64
+ EOF
65
+ }
66
+
67
+ before do
68
+ allow(app).to receive(:call)
69
+ allow(libvirt_client).to receive(:lookup_domain_by_uuid).and_return(libvirt_domain)
70
+
71
+ allow(driver).to receive(:list_all_networks).and_return(networks)
72
+
73
+ allow(networks[0]).to receive(:xml_desc).and_return(default_network_xml)
74
+ allow(networks[0]).to receive(:name).and_return('default')
75
+ allow(networks[0]).to receive(:bridge_name).and_return('virbr0')
76
+ allow(networks[0]).to receive(:active?).and_return(true)
77
+ allow(networks[0]).to receive(:autostart?).and_return(true)
78
+ allow(networks[1]).to receive(:xml_desc).and_return(management_network_xml)
79
+ allow(networks[1]).to receive(:name).and_return('vagrant-libvirt')
80
+ allow(networks[1]).to receive(:bridge_name).and_return('virbr1')
81
+ allow(networks[1]).to receive(:active?).and_return(true)
82
+ allow(networks[1]).to receive(:autostart?).and_return(false)
83
+
84
+ allow(logger).to receive(:info)
85
+ allow(logger).to receive(:debug)
86
+ end
87
+
88
+ describe '#call' do
89
+ it 'should inject the management network definition' do
90
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
91
+
92
+ expect(subject.call(env)).to be_nil
93
+ end
94
+
95
+ context 'management network' do
96
+ let(:domain_xml) {
97
+ # don't need full domain here, just enough for the network element to work
98
+ <<-EOF.unindent
99
+ <domain type='qemu'>
100
+ <devices>
101
+ <interface type='network'>
102
+ <alias name='ua-net-0'/>
103
+ <mac address='52:54:00:7d:14:0e'/>
104
+ <source network='vagrant-libvirt'/>
105
+ <target dev="myvnet0"></target>
106
+ <model type='virtio'/>
107
+ <driver iommu='off'/>
108
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
109
+ </interface>
110
+ </devices>
111
+ </domain>
112
+ EOF
113
+ }
114
+
115
+ before do
116
+ allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
117
+ end
118
+
119
+ context 'when iface name is set' do
120
+ let(:vagrantfile_providerconfig) {
121
+ <<-EOF
122
+ libvirt.management_network_iface_name = 'myvnet0'
123
+ EOF
124
+ }
125
+ let(:management_nic_xml) {
126
+ <<-EOF.unindent
127
+ <interface type="network">
128
+ <alias name="ua-net-0"></alias>
129
+ <source network="vagrant-libvirt"></source>
130
+ <target dev="myvnet0"></target>
131
+ <model type="virtio"></model>
132
+ <driver iommu="off"></driver>
133
+ </interface>
134
+ EOF
135
+ }
136
+
137
+ it 'should set target appropriately' do
138
+ expect(driver).to receive(:attach_device).with(management_nic_xml)
139
+
140
+ expect(subject.call(env)).to be_nil
141
+ end
142
+ end
143
+ end
144
+
145
+ context 'private network' do
146
+ let(:vagrantfile) do
147
+ <<-EOF
148
+ Vagrant.configure('2') do |config|
149
+ config.vm.box = "vagrant-libvirt/test"
150
+ config.vm.define :test
151
+ config.vm.provider :libvirt do |libvirt|
152
+ #{vagrantfile_providerconfig}
153
+ end
154
+
155
+ config.vm.network :private_network, :ip => "10.20.30.40"
156
+ end
157
+ EOF
158
+ end
159
+ let(:private_network) { instance_double(::Libvirt::Network) }
160
+ let(:private_network_xml) {
161
+ <<-EOF
162
+ <network ipv6='yes'>
163
+ <name>test1</name>
164
+ <uuid>46360938-0607-4168-a182-1352fac4a4f9</uuid>
165
+ <forward mode='nat'/>
166
+ <bridge name='virbr2' stp='on' delay='0'/>
167
+ <mac address='52:54:00:c2:d5:a5'/>
168
+ <ip address='10.20.30.1' netmask='255.255.255.0'>
169
+ <dhcp>
170
+ <range start='10.20.30.1' end='10.20.30.254'/>
171
+ </dhcp>
172
+ </ip>
173
+ </network>
174
+ EOF
175
+ }
176
+ let(:private_nic_xml) {
177
+ <<-EOF.unindent
178
+ <interface type="network">
179
+ <alias name="ua-net-1"></alias>
180
+ <source network="test1"></source>
181
+ <target dev="vnet1"></target>
182
+ <model type="virtio"></model>
183
+ <driver iommu="off"></driver>
184
+ </interface>
185
+ EOF
186
+ }
187
+
188
+ before do
189
+ allow(private_network).to receive(:xml_desc).and_return(private_network_xml)
190
+ allow(private_network).to receive(:name).and_return('test1')
191
+ allow(private_network).to receive(:bridge_name).and_return('virbr2')
192
+ allow(private_network).to receive(:active?).and_return(true)
193
+ allow(private_network).to receive(:autostart?).and_return(false)
194
+ end
195
+
196
+ it 'should attach for two networks' do
197
+ expect(driver).to receive(:list_all_networks).and_return(networks + [private_network])
198
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
199
+ expect(driver).to receive(:attach_device).with(private_nic_xml)
200
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
201
+
202
+ expect(subject.call(env)).to be_nil
203
+ end
204
+
205
+ context 'when iface name is set' do
206
+ let(:private_nic_xml) {
207
+ <<-EOF.unindent
208
+ <interface type="network">
209
+ <alias name="ua-net-1"></alias>
210
+ <source network="test1"></source>
211
+ <target dev="myvnet0"></target>
212
+ <model type="virtio"></model>
213
+ <driver iommu="off"></driver>
214
+ </interface>
215
+ EOF
216
+ }
217
+
218
+ before do
219
+ machine.config.vm.networks[0][1][:libvirt__iface_name] = "myvnet0"
220
+ end
221
+
222
+ it 'should set target appropriately' do
223
+ expect(driver).to receive(:list_all_networks).and_return(networks + [private_network])
224
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
225
+ expect(driver).to receive(:attach_device).with(private_nic_xml)
226
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
227
+
228
+ expect(subject.call(env)).to be_nil
229
+ end
230
+ end
231
+
232
+ it 'should skip configuring networks in guest without box' do
233
+ machine.config.vm.box = nil
234
+
235
+ expect(driver).to receive(:list_all_networks).and_return(networks + [private_network])
236
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
237
+ expect(driver).to receive(:attach_device).with(private_nic_xml)
238
+ expect(guest).to_not receive(:capability).with(:configure_networks, any_args)
239
+
240
+ expect(subject.call(env)).to be_nil
241
+ end
242
+ end
243
+
244
+ context 'public network' do
245
+ let(:vagrantfile) do
246
+ <<-EOF
247
+ Vagrant.configure('2') do |config|
248
+ config.vm.box = "vagrant-libvirt/test"
249
+ config.vm.define :test
250
+ config.vm.provider :libvirt do |libvirt|
251
+ #{vagrantfile_providerconfig}
252
+ end
253
+
254
+ config.vm.network :public_network, :dev => "virbr1", :mode => "bridge", :type => "bridge"
255
+ end
256
+ EOF
257
+ end
258
+ let(:public_network) { instance_double(::Libvirt::Network) }
259
+ let(:public_network_xml) {
260
+ <<-EOF
261
+ <network ipv6='yes'>
262
+ <name>test1</name>
263
+ <uuid>46360938-0607-4168-a182-1352fac4a4f9</uuid>
264
+ <forward mode='nat'/>
265
+ <bridge name='virbr2' stp='on' delay='0'/>
266
+ <mac address='52:54:00:c2:d5:a5'/>
267
+ <ip address='10.20.30.1' netmask='255.255.255.0'>
268
+ <dhcp>
269
+ <range start='10.20.30.1' end='10.20.30.254'/>
270
+ </dhcp>
271
+ </ip>
272
+ </network>
273
+ EOF
274
+ }
275
+ let(:public_nic_xml) {
276
+ <<-EOF.unindent
277
+ <interface type='bridge'>
278
+ <alias name='ua-net-1'/>
279
+ <source bridge='virbr1'/>
280
+ <model type='virtio'/>
281
+ </interface>
282
+ EOF
283
+ }
284
+ let(:domain_xml) {
285
+ # don't need full domain here, just enough for the network element to work
286
+ <<-EOF.unindent
287
+ <domain type='qemu'>
288
+ <devices>
289
+ <interface type='network'>
290
+ <alias name='ua-net-0'/>
291
+ <mac address='52:54:00:7d:14:0e'/>
292
+ <source network='vagrant-libvirt'/>
293
+ <model type='virtio'/>
294
+ <driver iommu='off'/>
295
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
296
+ </interface>
297
+ <interface type='network'>
298
+ <alias name='ua-net-1'/>
299
+ <mac address='52:54:00:7d:14:0f'/>
300
+ <source bridge='virbr1'/>
301
+ <model type='virtio'/>
302
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
303
+ </interface>
304
+ </devices>
305
+ </domain>
306
+ EOF
307
+ }
308
+
309
+ before do
310
+ allow(public_network).to receive(:xml_desc).and_return(public_network_xml)
311
+ allow(public_network).to receive(:name).and_return('test1')
312
+ allow(public_network).to receive(:bridge_name).and_return('virbr2')
313
+ allow(public_network).to receive(:active?).and_return(true)
314
+ allow(public_network).to receive(:autostart?).and_return(false)
315
+
316
+ allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
317
+ end
318
+
319
+ it 'should attach for two networks' do
320
+ expect(driver).to receive(:list_all_networks).and_return(networks + [public_network])
321
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
322
+ expect(driver).to receive(:attach_device).with(public_nic_xml)
323
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
324
+
325
+ expect(subject.call(env)).to be_nil
326
+ end
327
+
328
+ context 'when iface name is set' do
329
+ let(:public_nic_xml) {
330
+ <<-EOF.unindent
331
+ <interface type='bridge'>
332
+ <alias name='ua-net-1'/>
333
+ <source bridge='virbr1'/>
334
+ <target dev='myvnet0'/>
335
+ <model type='virtio'/>
336
+ </interface>
337
+ EOF
338
+ }
339
+
340
+ before do
341
+ machine.config.vm.networks[0][1][:libvirt__iface_name] = "myvnet0"
342
+ end
343
+
344
+ it 'should set target appropriately' do
345
+ expect(driver).to receive(:list_all_networks).and_return(networks + [public_network])
346
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
347
+ expect(driver).to receive(:attach_device).with(public_nic_xml)
348
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
349
+
350
+ expect(subject.call(env)).to be_nil
351
+ end
352
+ end
353
+ end
354
+ end
355
+ end
@@ -88,6 +88,7 @@ describe VagrantPlugins::ProviderLibvirt::Action::HandleBoxImage do
88
88
  :virtual_size=>byte_number_5G,
89
89
  :format=>"qcow2",
90
90
  :device=>'vda',
91
+ :compat=>"1.1",
91
92
  }
92
93
  ]
93
94
  )
@@ -118,6 +119,7 @@ describe VagrantPlugins::ProviderLibvirt::Action::HandleBoxImage do
118
119
  :virtual_size=>byte_number_5G,
119
120
  :format=>"qcow2",
120
121
  :device=>'vda',
122
+ :compat=>"1.1",
121
123
  }
122
124
  ]
123
125
  )
@@ -156,6 +158,7 @@ describe VagrantPlugins::ProviderLibvirt::Action::HandleBoxImage do
156
158
  :virtual_size=>byte_number_5G,
157
159
  :format=>"qcow2",
158
160
  :device=>'vda',
161
+ :compat=>"1.1",
159
162
  }
160
163
  ]
161
164
  )
@@ -177,6 +180,7 @@ describe VagrantPlugins::ProviderLibvirt::Action::HandleBoxImage do
177
180
  :virtual_size=>byte_number_20G,
178
181
  :format=>"qcow2",
179
182
  :device=>'vda',
183
+ :compat=>"1.1",
180
184
  }
181
185
  ]
182
186
  )
@@ -269,18 +273,21 @@ describe VagrantPlugins::ProviderLibvirt::Action::HandleBoxImage do
269
273
  :virtual_size=>byte_number_5G,
270
274
  :format=>"qcow2",
271
275
  :device=>'vda',
276
+ :compat=>"0.10"
272
277
  },
273
278
  {
274
279
  :path=>"/test/disk.qcow2",
275
280
  :name=>"test_vagrant_box_image_1.1.1_disk.img",
276
281
  :virtual_size=>byte_number_10G,
277
- :format=>"qcow2"
282
+ :format=>"qcow2",
283
+ :compat=>"0.10"
278
284
  },
279
285
  {
280
286
  :path=>"/test/box_2.img",
281
287
  :name=>"test_vagrant_box_image_1.1.1_box_2.img",
282
288
  :virtual_size=>byte_number_20G,
283
- :format=>"qcow2"
289
+ :format=>"qcow2",
290
+ :compat=>"0.10"
284
291
  }
285
292
  ]
286
293
  )
@@ -349,6 +349,48 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
349
349
  expect(subject.call(env)).to be_nil
350
350
  end
351
351
  end
352
+
353
+ [
354
+ [
355
+ 'when port explicitly set, should set autoport=no',
356
+ proc { |config|
357
+ config.graphics_port = 5901
358
+ },
359
+ "<graphics autoport='yes' keymap='en-us' listen='127.0.0.1' port='-1' type='vnc' websocket='-1'/>",
360
+ "<graphics autoport='no' keymap='en-us' listen='127.0.0.1' port='5901' type='vnc' websocket='-1'/>",
361
+ ],
362
+ [
363
+ 'when port updated, should set autoport=no and update port',
364
+ proc { |config|
365
+ config.graphics_port = 5902
366
+ },
367
+ "<graphics autoport='no' keymap='en-us' listen='127.0.0.1' port='5901' type='vnc' websocket='-1'/>",
368
+ "<graphics autoport='no' keymap='en-us' listen='127.0.0.1' port='5902' type='vnc' websocket='-1'/>",
369
+ ],
370
+ [
371
+ 'when autoport set and no port, should set autoport=yes and update port to -1',
372
+ proc { |config|
373
+ config.graphics_autoport = 'yes'
374
+ },
375
+ "<graphics autoport='no' keymap='en-us' listen='127.0.0.1' port='5901' type='vnc' websocket='-1'/>",
376
+ "<graphics autoport='yes' keymap='en-us' listen='127.0.0.1' port='-1' type='vnc' websocket='-1'/>",
377
+ ],
378
+ ].each do |description, config_proc, graphics_xml_start, graphics_xml_output|
379
+ it "#{description}" do
380
+ config_proc.call(machine.provider_config)
381
+
382
+ initial_domain_xml = domain_xml.gsub(/<graphics .*\/>/, graphics_xml_start)
383
+ updated_domain_xml = domain_xml.gsub(/<graphics .*\/>/, graphics_xml_output)
384
+
385
+ expect(ui).to_not receive(:warn)
386
+ expect(connection).to receive(:define_domain).with(match(graphics_xml_output)).and_return(libvirt_domain)
387
+ expect(libvirt_domain).to receive(:xml_desc).and_return(initial_domain_xml, updated_domain_xml, updated_domain_xml)
388
+ expect(libvirt_domain).to receive(:autostart=)
389
+ expect(domain).to receive(:start)
390
+
391
+ expect(subject.call(env)).to be_nil
392
+ end
393
+ end
352
394
  end
353
395
 
354
396
  context 'nvram' do