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.
- checksums.yaml +4 -4
- data/lib/vagrant-libvirt/action/create_domain.rb +15 -1
- data/lib/vagrant-libvirt/action/create_domain_volume.rb +1 -0
- data/lib/vagrant-libvirt/action/create_network_interfaces.rb +8 -4
- data/lib/vagrant-libvirt/action/create_networks.rb +1 -1
- data/lib/vagrant-libvirt/action/destroy_domain_confirm.rb +22 -0
- data/lib/vagrant-libvirt/action/forward_ports.rb +1 -1
- data/lib/vagrant-libvirt/action/handle_box_image.rb +6 -3
- data/lib/vagrant-libvirt/action/start_domain.rb +38 -9
- data/lib/vagrant-libvirt/action.rb +0 -2
- data/lib/vagrant-libvirt/config.rb +78 -28
- data/lib/vagrant-libvirt/templates/domain.xml.erb +25 -14
- data/lib/vagrant-libvirt/templates/public_interface.xml.erb +22 -17
- data/lib/vagrant-libvirt/util/network_util.rb +27 -22
- data/lib/vagrant-libvirt/version +1 -1
- data/spec/support/libvirt_acceptance_context.rb +1 -1
- data/spec/support/matchers/have_file_content.rb +1 -1
- data/spec/support/unit_context.rb +0 -3
- data/spec/unit/action/clean_machine_folder_spec.rb +3 -3
- data/spec/unit/action/create_domain_volume_spec/one_disk_in_storage.xml +1 -0
- data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_0.xml +1 -0
- data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_1.xml +1 -0
- data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_2.xml +1 -0
- data/spec/unit/action/create_network_interfaces.rb +355 -0
- data/spec/unit/action/handle_box_image_spec.rb +9 -2
- data/spec/unit/action/start_domain_spec.rb +42 -0
- data/spec/unit/action_spec.rb +62 -1
- data/spec/unit/cap/mount_9p_spec.rb +4 -0
- data/spec/unit/config_spec.rb +39 -10
- data/spec/unit/driver_spec.rb +29 -18
- data/spec/unit/templates/domain_all_settings.xml +2 -2
- data/spec/unit/templates/domain_spec.rb +2 -1
- 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(
|
22
|
-
qemu_use_session =
|
23
|
-
qemu_use_agent =
|
24
|
-
management_network_device =
|
25
|
-
management_network_name =
|
26
|
-
management_network_address =
|
27
|
-
management_network_mode =
|
28
|
-
management_network_mac =
|
29
|
-
management_network_guest_ipv6 =
|
30
|
-
management_network_autostart =
|
31
|
-
management_network_pci_bus =
|
32
|
-
management_network_pci_slot =
|
33
|
-
management_network_domain =
|
34
|
-
management_network_mtu =
|
35
|
-
management_network_keep =
|
36
|
-
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
|
-
|
105
|
-
!
|
106
|
-
!
|
107
|
-
!
|
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
|
119
|
+
networks = if machine.provider_config.mgmt_attach
|
115
120
|
[management_network_options]
|
116
121
|
else
|
117
122
|
[]
|
118
123
|
end
|
119
124
|
|
120
|
-
|
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 => ...).
|
data/lib/vagrant-libvirt/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
@@ -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
|