vagrant-libvirt 0.11.2 → 0.12.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 (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