vagrant-libvirt 0.11.2 → 0.12.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.
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 +7 -3
  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 +75 -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 +25 -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 +305 -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,23 @@ 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_model_type = machine.provider_config.management_network_model_type
37
38
  logger.info "Using #{management_network_name} at #{management_network_address} as the management network #{management_network_mode} is the mode"
38
39
 
39
40
  begin
@@ -54,6 +55,7 @@ module VagrantPlugins
54
55
  if qemu_use_session
55
56
  management_network_options = {
56
57
  iface_type: :public_network,
58
+ model_type: management_network_model_type,
57
59
  dev: management_network_device,
58
60
  mode: 'bridge',
59
61
  type: 'bridge',
@@ -63,6 +65,7 @@ module VagrantPlugins
63
65
  else
64
66
  management_network_options = {
65
67
  iface_type: :private_network,
68
+ model_type: management_network_model_type,
66
69
  network_name: management_network_name,
67
70
  ip: Regexp.last_match(1),
68
71
  netmask: Regexp.last_match(2),
@@ -101,23 +104,23 @@ module VagrantPlugins
101
104
  # if there is a box and management network is disabled
102
105
  # need qemu agent enabled and at least one network that can be accessed
103
106
  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) }
107
+ machine.config.vm.box &&
108
+ !machine.provider_config.mgmt_attach &&
109
+ !machine.provider_config.qemu_use_agent &&
110
+ !machine.config.vm.networks.any? { |type, _| ["private_network", "public_network"].include?(type.to_s) }
108
111
  )
109
112
  raise Errors::ManagementNetworkRequired
110
113
  end
111
114
 
112
115
  # add management network to list of networks to check
113
116
  # unless mgmt_attach set to false
114
- networks = if env[:machine].provider_config.mgmt_attach
117
+ networks = if machine.provider_config.mgmt_attach
115
118
  [management_network_options]
116
119
  else
117
120
  []
118
121
  end
119
122
 
120
- env[:machine].config.vm.networks.each do |type, original_options|
123
+ machine.config.vm.networks.each do |type, original_options|
121
124
  logger.debug "In config found network type #{type} options #{original_options}"
122
125
  # Options can be specified in Vagrantfile in short format (:ip => ...),
123
126
  # or provider format # (:libvirt__network_name => ...).
@@ -1 +1 @@
1
- 0.11.2
1
+ 0.12.0
@@ -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,305 @@
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 'private network' do
96
+ let(:vagrantfile) do
97
+ <<-EOF
98
+ Vagrant.configure('2') do |config|
99
+ config.vm.box = "vagrant-libvirt/test"
100
+ config.vm.define :test
101
+ config.vm.provider :libvirt do |libvirt|
102
+ #{vagrantfile_providerconfig}
103
+ end
104
+
105
+ config.vm.network :private_network, :ip => "10.20.30.40"
106
+ end
107
+ EOF
108
+ end
109
+ let(:private_network) { instance_double(::Libvirt::Network) }
110
+ let(:private_network_xml) {
111
+ <<-EOF
112
+ <network ipv6='yes'>
113
+ <name>test1</name>
114
+ <uuid>46360938-0607-4168-a182-1352fac4a4f9</uuid>
115
+ <forward mode='nat'/>
116
+ <bridge name='virbr2' stp='on' delay='0'/>
117
+ <mac address='52:54:00:c2:d5:a5'/>
118
+ <ip address='10.20.30.1' netmask='255.255.255.0'>
119
+ <dhcp>
120
+ <range start='10.20.30.1' end='10.20.30.254'/>
121
+ </dhcp>
122
+ </ip>
123
+ </network>
124
+ EOF
125
+ }
126
+ let(:private_nic_xml) {
127
+ <<-EOF.unindent
128
+ <interface type="network">
129
+ <alias name="ua-net-1"></alias>
130
+ <source network="test1"></source>
131
+ <target dev="vnet1"></target>
132
+ <model type="virtio"></model>
133
+ <driver iommu="off"></driver>
134
+ </interface>
135
+ EOF
136
+ }
137
+
138
+ before do
139
+ allow(private_network).to receive(:xml_desc).and_return(private_network_xml)
140
+ allow(private_network).to receive(:name).and_return('test1')
141
+ allow(private_network).to receive(:bridge_name).and_return('virbr2')
142
+ allow(private_network).to receive(:active?).and_return(true)
143
+ allow(private_network).to receive(:autostart?).and_return(false)
144
+ end
145
+
146
+ it 'should attach for two networks' do
147
+ expect(driver).to receive(:list_all_networks).and_return(networks + [private_network])
148
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
149
+ expect(driver).to receive(:attach_device).with(private_nic_xml)
150
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
151
+
152
+ expect(subject.call(env)).to be_nil
153
+ end
154
+
155
+ context 'when iface name is set' do
156
+ let(:private_nic_xml) {
157
+ <<-EOF.unindent
158
+ <interface type="network">
159
+ <alias name="ua-net-1"></alias>
160
+ <source network="test1"></source>
161
+ <target dev="myvnet0"></target>
162
+ <model type="virtio"></model>
163
+ <driver iommu="off"></driver>
164
+ </interface>
165
+ EOF
166
+ }
167
+
168
+ before do
169
+ machine.config.vm.networks[0][1][:libvirt__iface_name] = "myvnet0"
170
+ end
171
+
172
+ it 'should set target appropriately' do
173
+ expect(driver).to receive(:list_all_networks).and_return(networks + [private_network])
174
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
175
+ expect(driver).to receive(:attach_device).with(private_nic_xml)
176
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
177
+
178
+ expect(subject.call(env)).to be_nil
179
+ end
180
+ end
181
+
182
+ it 'should skip configuring networks in guest without box' do
183
+ machine.config.vm.box = nil
184
+
185
+ expect(driver).to receive(:list_all_networks).and_return(networks + [private_network])
186
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
187
+ expect(driver).to receive(:attach_device).with(private_nic_xml)
188
+ expect(guest).to_not receive(:capability).with(:configure_networks, any_args)
189
+
190
+ expect(subject.call(env)).to be_nil
191
+ end
192
+ end
193
+
194
+ context 'public network' do
195
+ let(:vagrantfile) do
196
+ <<-EOF
197
+ Vagrant.configure('2') do |config|
198
+ config.vm.box = "vagrant-libvirt/test"
199
+ config.vm.define :test
200
+ config.vm.provider :libvirt do |libvirt|
201
+ #{vagrantfile_providerconfig}
202
+ end
203
+
204
+ config.vm.network :public_network, :dev => "virbr1", :mode => "bridge", :type => "bridge"
205
+ end
206
+ EOF
207
+ end
208
+ let(:public_network) { instance_double(::Libvirt::Network) }
209
+ let(:public_network_xml) {
210
+ <<-EOF
211
+ <network ipv6='yes'>
212
+ <name>test1</name>
213
+ <uuid>46360938-0607-4168-a182-1352fac4a4f9</uuid>
214
+ <forward mode='nat'/>
215
+ <bridge name='virbr2' stp='on' delay='0'/>
216
+ <mac address='52:54:00:c2:d5:a5'/>
217
+ <ip address='10.20.30.1' netmask='255.255.255.0'>
218
+ <dhcp>
219
+ <range start='10.20.30.1' end='10.20.30.254'/>
220
+ </dhcp>
221
+ </ip>
222
+ </network>
223
+ EOF
224
+ }
225
+ let(:public_nic_xml) {
226
+ <<-EOF.unindent
227
+ <interface type='bridge'>
228
+ <alias name='ua-net-1'/>
229
+ <source bridge='virbr1'/>
230
+ <model type='virtio'/>
231
+ </interface>
232
+ EOF
233
+ }
234
+ let(:domain_xml) {
235
+ # don't need full domain here, just enough for the network element to work
236
+ <<-EOF.unindent
237
+ <domain type='qemu'>
238
+ <devices>
239
+ <interface type='network'>
240
+ <alias name='ua-net-0'/>
241
+ <mac address='52:54:00:7d:14:0e'/>
242
+ <source network='vagrant-libvirt'/>
243
+ <model type='virtio'/>
244
+ <driver iommu='off'/>
245
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
246
+ </interface>
247
+ <interface type='network'>
248
+ <alias name='ua-net-1'/>
249
+ <mac address='52:54:00:7d:14:0f'/>
250
+ <source bridge='virbr1'/>
251
+ <model type='virtio'/>
252
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
253
+ </interface>
254
+ </devices>
255
+ </domain>
256
+ EOF
257
+ }
258
+
259
+ before do
260
+ allow(public_network).to receive(:xml_desc).and_return(public_network_xml)
261
+ allow(public_network).to receive(:name).and_return('test1')
262
+ allow(public_network).to receive(:bridge_name).and_return('virbr2')
263
+ allow(public_network).to receive(:active?).and_return(true)
264
+ allow(public_network).to receive(:autostart?).and_return(false)
265
+
266
+ allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
267
+ end
268
+
269
+ it 'should attach for two networks' do
270
+ expect(driver).to receive(:list_all_networks).and_return(networks + [public_network])
271
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
272
+ expect(driver).to receive(:attach_device).with(public_nic_xml)
273
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
274
+
275
+ expect(subject.call(env)).to be_nil
276
+ end
277
+
278
+ context 'when iface name is set' do
279
+ let(:public_nic_xml) {
280
+ <<-EOF.unindent
281
+ <interface type='bridge'>
282
+ <alias name='ua-net-1'/>
283
+ <source bridge='virbr1'/>
284
+ <target dev='myvnet0'/>
285
+ <model type='virtio'/>
286
+ </interface>
287
+ EOF
288
+ }
289
+
290
+ before do
291
+ machine.config.vm.networks[0][1][:libvirt__iface_name] = "myvnet0"
292
+ end
293
+
294
+ it 'should set target appropriately' do
295
+ expect(driver).to receive(:list_all_networks).and_return(networks + [public_network])
296
+ expect(driver).to receive(:attach_device).with(default_management_nic_xml)
297
+ expect(driver).to receive(:attach_device).with(public_nic_xml)
298
+ expect(guest).to receive(:capability).with(:configure_networks, any_args)
299
+
300
+ expect(subject.call(env)).to be_nil
301
+ end
302
+ end
303
+ end
304
+ end
305
+ 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