vagrant-libvirt 0.6.3 → 0.8.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/README.md +65 -13
- data/lib/vagrant-libvirt/action/cleanup_on_failure.rb +76 -0
- data/lib/vagrant-libvirt/action/create_domain.rb +56 -10
- data/lib/vagrant-libvirt/action/create_network_interfaces.rb +5 -1
- data/lib/vagrant-libvirt/action/create_networks.rb +24 -0
- data/lib/vagrant-libvirt/action/destroy_domain.rb +106 -21
- data/lib/vagrant-libvirt/action/destroy_networks.rb +1 -1
- data/lib/vagrant-libvirt/action/forward_ports.rb +12 -11
- data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +1 -1
- data/lib/vagrant-libvirt/action/start_domain.rb +36 -0
- data/lib/vagrant-libvirt/action/wait_till_up.rb +6 -32
- data/lib/vagrant-libvirt/action.rb +72 -83
- data/lib/vagrant-libvirt/config.rb +85 -30
- data/lib/vagrant-libvirt/driver.rb +11 -9
- data/lib/vagrant-libvirt/errors.rb +12 -0
- data/lib/vagrant-libvirt/templates/domain.xml.erb +228 -218
- data/lib/vagrant-libvirt/templates/private_network.xml.erb +4 -1
- data/lib/vagrant-libvirt/util/network_util.rb +15 -3
- data/lib/vagrant-libvirt/util/nfs.rb +2 -0
- data/lib/vagrant-libvirt/util/resolvers.rb +80 -0
- data/lib/vagrant-libvirt/version +1 -1
- data/locales/en.yml +17 -0
- data/spec/spec_helper.rb +36 -23
- data/spec/support/libvirt_context.rb +7 -4
- data/spec/support/sharedcontext.rb +1 -1
- data/spec/unit/action/cleanup_on_failure_spec.rb +131 -0
- data/spec/unit/action/create_domain_spec/additional_disks_domain.xml +6 -18
- data/spec/unit/action/create_domain_spec/custom_disk_settings.xml +43 -0
- data/spec/unit/action/create_domain_spec/default_domain.xml +6 -18
- data/spec/unit/action/create_domain_spec/two_disk_settings.xml +49 -0
- data/spec/unit/action/create_domain_spec.rb +51 -7
- data/spec/unit/action/create_domain_volume_spec.rb +5 -3
- data/spec/unit/action/destroy_domain_spec/additional_disks_domain.xml +47 -0
- data/spec/unit/action/destroy_domain_spec/box_multiple_disks.xml +55 -0
- data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_and_custom_disks.xml +72 -0
- data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_and_custom_disks_no_aliases.xml +67 -0
- data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_disks.xml +67 -0
- data/spec/unit/action/destroy_domain_spec/cdrom_domain.xml +48 -0
- data/spec/unit/action/destroy_domain_spec.rb +134 -30
- data/spec/unit/action/forward_ports_spec.rb +10 -2
- data/spec/unit/action/prepare_nfs_settings_spec.rb +59 -0
- data/spec/unit/action/shutdown_domain_spec.rb +1 -1
- data/spec/unit/action/start_domain_spec/clock_timer_rtc.xml +6 -18
- data/spec/unit/action/start_domain_spec/default.xml +6 -18
- data/spec/unit/action/start_domain_spec/default_added_tpm_path.xml +6 -18
- data/spec/unit/action/start_domain_spec/default_added_tpm_version.xml +6 -18
- data/spec/unit/action/start_domain_spec/existing.xml +1 -1
- data/spec/unit/action/wait_till_up_spec.rb +4 -43
- data/spec/unit/action_spec.rb +2 -0
- data/spec/unit/config_spec.rb +133 -26
- data/spec/unit/driver_spec.rb +154 -10
- data/spec/unit/templates/domain_all_settings.xml +56 -77
- data/spec/unit/templates/domain_cpu_mode_passthrough.xml +39 -0
- data/spec/unit/templates/domain_custom_cpu_model.xml +6 -18
- data/spec/unit/templates/domain_defaults.xml +6 -18
- data/spec/unit/templates/domain_spec.rb +39 -13
- data/spec/unit/templates/tpm/version_1.2.xml +6 -18
- data/spec/unit/templates/tpm/version_2.0.xml +6 -18
- data/spec/unit/util/resolvers_spec.rb +116 -0
- metadata +40 -41
data/spec/unit/driver_spec.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'fog/libvirt/requests/compute/dhcp_leases'
|
4
|
+
|
3
5
|
require 'spec_helper'
|
4
6
|
require 'support/binding_proc'
|
5
7
|
require 'support/sharedcontext'
|
@@ -8,6 +10,7 @@ require 'vagrant-libvirt/driver'
|
|
8
10
|
|
9
11
|
describe VagrantPlugins::ProviderLibvirt::Driver do
|
10
12
|
include_context 'unit'
|
13
|
+
include_context 'libvirt'
|
11
14
|
|
12
15
|
subject { described_class.new(machine) }
|
13
16
|
|
@@ -27,14 +30,23 @@ describe VagrantPlugins::ProviderLibvirt::Driver do
|
|
27
30
|
end
|
28
31
|
EOF
|
29
32
|
end
|
33
|
+
|
30
34
|
# need to override the default package iso_env as using a different
|
31
35
|
# name for the test machines above.
|
32
36
|
let(:machine) { iso_env.machine(:test1, :libvirt) }
|
33
37
|
let(:machine2) { iso_env.machine(:test2, :libvirt) }
|
34
|
-
let(:connection1) { double("connection 1") }
|
35
|
-
let(:connection2) { double("connection 2") }
|
36
|
-
let(:system_connection1) { double("system connection 1") }
|
37
|
-
let(:system_connection2) { double("system connection 2") }
|
38
|
+
let(:connection1) { double("connection 1") }
|
39
|
+
let(:connection2) { double("connection 2") }
|
40
|
+
let(:system_connection1) { double("system connection 1") }
|
41
|
+
let(:system_connection2) { double("system connection 2") }
|
42
|
+
|
43
|
+
# make it easier for distros that want to switch the default value for
|
44
|
+
# qemu_use_session to true by ensuring it is explicitly false for tests.
|
45
|
+
before do
|
46
|
+
allow(machine.provider_config).to receive(:qemu_use_session).and_return(false)
|
47
|
+
allow(logger).to receive(:info)
|
48
|
+
allow(logger).to receive(:debug)
|
49
|
+
end
|
38
50
|
|
39
51
|
describe '#connection' do
|
40
52
|
it 'should configure a separate connection per machine' do
|
@@ -68,15 +80,15 @@ describe VagrantPlugins::ProviderLibvirt::Driver do
|
|
68
80
|
# system_uri should be 'qemu+ssh://user@remote1/system'
|
69
81
|
# and not 'qemu:///system'.
|
70
82
|
it 'should configure a separate connection per machine' do
|
71
|
-
expect(Libvirt).to receive(:
|
72
|
-
expect(Libvirt).to receive(:
|
83
|
+
expect(Libvirt).to receive(:open_read_only).with('qemu+ssh://user@remote1/system').and_return(system_connection1)
|
84
|
+
expect(Libvirt).to receive(:open_read_only).with('qemu+ssh://vms@remote2/system').and_return(system_connection2)
|
73
85
|
|
74
86
|
expect(machine.provider.driver.system_connection).to eq(system_connection1)
|
75
87
|
expect(machine2.provider.driver.system_connection).to eq(system_connection2)
|
76
88
|
end
|
77
89
|
|
78
90
|
it 'should configure the connection once' do
|
79
|
-
expect(Libvirt).to receive(:
|
91
|
+
expect(Libvirt).to receive(:open_read_only).with('qemu+ssh://user@remote1/system').and_return(system_connection1)
|
80
92
|
|
81
93
|
expect(machine.provider.driver.system_connection).to eq(system_connection1)
|
82
94
|
expect(machine.provider.driver.system_connection).to eq(system_connection1)
|
@@ -84,6 +96,129 @@ describe VagrantPlugins::ProviderLibvirt::Driver do
|
|
84
96
|
end
|
85
97
|
end
|
86
98
|
|
99
|
+
describe '#get_ipaddress' do
|
100
|
+
context 'when domain exists' do
|
101
|
+
# not used yet, but this is the form that is returned from addresses
|
102
|
+
let(:addresses) { {
|
103
|
+
:public => ["192.168.122.111"],
|
104
|
+
:private => ["192.168.122.111"],
|
105
|
+
} }
|
106
|
+
|
107
|
+
before do
|
108
|
+
allow(subject).to receive(:get_domain).and_return(domain)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should retrieve the address via domain fog-libvirt API' do
|
112
|
+
# ideally should be able to yield a block to wait_for and check that
|
113
|
+
# the 'addresses' function on the domain is called correctly.
|
114
|
+
expect(domain).to receive(:wait_for).and_return(nil)
|
115
|
+
expect(subject.get_ipaddress(machine)).to eq(nil)
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when qemu_use_agent is enabled' do
|
119
|
+
let(:qemu_agent_interfaces) {
|
120
|
+
<<-EOF
|
121
|
+
{
|
122
|
+
"return": [
|
123
|
+
{
|
124
|
+
"name": "lo",
|
125
|
+
"ip-addresses": [
|
126
|
+
{
|
127
|
+
"ip-address-type": "ipv4",
|
128
|
+
"ip-address": "127.0.0.1",
|
129
|
+
"prefix": 8
|
130
|
+
}
|
131
|
+
],
|
132
|
+
"hardware-address": "00:00:00:00:00:00"
|
133
|
+
},
|
134
|
+
{
|
135
|
+
"name": "eth0",
|
136
|
+
"ip-addresses": [
|
137
|
+
{
|
138
|
+
"ip-address-type": "ipv4",
|
139
|
+
"ip-address": "192.168.122.42",
|
140
|
+
"prefix": 24
|
141
|
+
}
|
142
|
+
],
|
143
|
+
"hardware-address": "52:54:00:f8:67:98"
|
144
|
+
}
|
145
|
+
]
|
146
|
+
}
|
147
|
+
EOF
|
148
|
+
}
|
149
|
+
|
150
|
+
before do
|
151
|
+
allow(machine.provider_config).to receive(:qemu_use_agent).and_return(true)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should retrieve the address via the agent' do
|
155
|
+
expect(subject).to receive(:connection).and_return(connection)
|
156
|
+
expect(libvirt_client).to receive(:lookup_domain_by_uuid).and_return(libvirt_domain)
|
157
|
+
expect(libvirt_domain).to receive(:qemu_agent_command).and_return(qemu_agent_interfaces)
|
158
|
+
expect(domain).to receive(:mac).and_return("52:54:00:f8:67:98").exactly(2).times
|
159
|
+
|
160
|
+
expect(subject.get_ipaddress(machine)).to eq("192.168.122.42")
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'when qemu_use_session is enabled' do
|
164
|
+
before do
|
165
|
+
allow(machine.provider_config).to receive(:qemu_use_session).and_return(true)
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'should still retrieve the address via the agent' do
|
169
|
+
expect(subject).to receive(:connection).and_return(connection)
|
170
|
+
expect(libvirt_client).to receive(:lookup_domain_by_uuid).and_return(libvirt_domain)
|
171
|
+
expect(libvirt_domain).to receive(:qemu_agent_command).and_return(qemu_agent_interfaces)
|
172
|
+
expect(domain).to receive(:mac).and_return("52:54:00:f8:67:98").exactly(2).times
|
173
|
+
|
174
|
+
expect(subject.get_ipaddress(machine)).to eq("192.168.122.42")
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'when qemu_use_session is enabled' do
|
180
|
+
let(:networks) { [instance_double(::Fog::Libvirt::Compute::Real)] }
|
181
|
+
let(:dhcp_leases) {
|
182
|
+
{
|
183
|
+
"iface" =>"virbr0",
|
184
|
+
"expirytime" =>1636287162,
|
185
|
+
"type" =>0,
|
186
|
+
"mac" =>"52:54:00:8b:dc:5f",
|
187
|
+
"ipaddr" =>"192.168.122.43",
|
188
|
+
"prefix" =>24,
|
189
|
+
"hostname" =>"vagrant-default_test",
|
190
|
+
"clientid" =>"ff:00:8b:dc:5f:00:01:00:01:29:1a:65:42:52:54:00:8b:dc:5f",
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
before do
|
195
|
+
allow(machine.provider_config).to receive(:qemu_use_session).and_return(true)
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'should retreive the address via the system dhcp-leases API' do
|
199
|
+
expect(domain).to receive(:mac).and_return("52:54:00:8b:dc:5f")
|
200
|
+
expect(subject).to receive(:system_connection).and_return(system_connection1)
|
201
|
+
expect(system_connection1).to receive(:list_all_networks).and_return(networks)
|
202
|
+
expect(networks[0]).to receive(:dhcp_leases).and_return([dhcp_leases])
|
203
|
+
|
204
|
+
expect(subject.get_ipaddress(machine)).to eq("192.168.122.43")
|
205
|
+
end
|
206
|
+
|
207
|
+
context 'when qemu_use_agent is enabled' do
|
208
|
+
before do
|
209
|
+
allow(machine.provider_config).to receive(:qemu_use_agent).and_return(true)
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'should retrieve the address via the agent' do
|
213
|
+
expect(subject).to receive(:get_ipaddress_from_qemu_agent).and_return("192.168.122.44")
|
214
|
+
|
215
|
+
expect(subject.get_ipaddress(machine)).to eq("192.168.122.44")
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
87
222
|
describe '#state' do
|
88
223
|
let(:domain) { double('domain') }
|
89
224
|
|
@@ -110,12 +245,21 @@ describe VagrantPlugins::ProviderLibvirt::Driver do
|
|
110
245
|
end,
|
111
246
|
}
|
112
247
|
],
|
248
|
+
[
|
249
|
+
nil,
|
250
|
+
:unknown,
|
251
|
+
{
|
252
|
+
:setup => ProcWithBinding.new do
|
253
|
+
expect(domain).to receive(:state).and_return('unknown').at_least(:once)
|
254
|
+
end,
|
255
|
+
}
|
256
|
+
],
|
113
257
|
[
|
114
258
|
'terminated',
|
115
259
|
:not_created,
|
116
260
|
{
|
117
261
|
:setup => ProcWithBinding.new do
|
118
|
-
expect(domain).to receive(:state).and_return('terminated')
|
262
|
+
expect(domain).to receive(:state).and_return('terminated').at_least(:once)
|
119
263
|
end,
|
120
264
|
}
|
121
265
|
],
|
@@ -124,7 +268,7 @@ describe VagrantPlugins::ProviderLibvirt::Driver do
|
|
124
268
|
:inaccessible,
|
125
269
|
{
|
126
270
|
:setup => ProcWithBinding.new do
|
127
|
-
expect(domain).to receive(:state).and_return('running').
|
271
|
+
expect(domain).to receive(:state).and_return('running').at_least(:once)
|
128
272
|
expect(subject).to receive(:get_domain_ipaddress).and_raise(Fog::Errors::TimeoutError)
|
129
273
|
end,
|
130
274
|
}
|
@@ -134,7 +278,7 @@ describe VagrantPlugins::ProviderLibvirt::Driver do
|
|
134
278
|
:running,
|
135
279
|
{
|
136
280
|
:setup => ProcWithBinding.new do
|
137
|
-
expect(domain).to receive(:state).and_return('running').
|
281
|
+
expect(domain).to receive(:state).and_return('running').at_least(:once)
|
138
282
|
expect(subject).to receive(:get_domain_ipaddress).and_return('192.168.121.2')
|
139
283
|
end,
|
140
284
|
}
|
@@ -5,25 +5,21 @@
|
|
5
5
|
<uuid></uuid>
|
6
6
|
<memory></memory>
|
7
7
|
<vcpu cpuset='1-4,^3,6'>1</vcpu>
|
8
|
-
|
9
|
-
|
10
8
|
<cpu mode='custom'>
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
<model fallback='allow'>qemu64</model>
|
10
|
+
<feature name='AAA' policy='required'/>
|
11
|
+
<topology sockets='1' cores='3' threads='2'/>
|
14
12
|
</cpu>
|
15
|
-
|
16
13
|
<numatune>
|
17
14
|
<memory nodeset='1-4,^3,6'/>
|
18
15
|
</numatune>
|
19
16
|
<cputune>
|
20
17
|
<shares>1024</shares>
|
21
18
|
</cputune>
|
22
|
-
|
23
19
|
<os>
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
<type arch='x86_64' machine='pc-compatible'>hvm</type>
|
21
|
+
<loader readonly='yes' type='rom'>/efi/loader</loader>
|
22
|
+
<bootmenu enable='yes'/>
|
27
23
|
<kernel></kernel>
|
28
24
|
<initrd></initrd>
|
29
25
|
<cmdline></cmdline>
|
@@ -59,15 +55,14 @@
|
|
59
55
|
<alias name='ua-disk-volume-0'/>
|
60
56
|
<driver name='qemu' type='qcow2' cache='default'/>
|
61
57
|
<source file='/var/lib/libvirt/images/test-disk1.qcow2'/>
|
62
|
-
<target dev='
|
58
|
+
<target dev='vdc' bus='virtio'/>
|
63
59
|
</disk>
|
64
60
|
<disk type='file' device='disk'>
|
65
61
|
<alias name='ua-disk-volume-1'/>
|
66
62
|
<driver name='qemu' type='qcow2' cache='default' io='threads' copy_on_read='on' discard='unmap' detect_zeroes='on'/>
|
67
63
|
<source file='/var/lib/libvirt/images/test-disk2.qcow2'/>
|
68
|
-
<target dev='
|
64
|
+
<target dev='vdd' bus='virtio'/>
|
69
65
|
</disk>
|
70
|
-
|
71
66
|
<disk type='file' device='cdrom'>
|
72
67
|
<driver name='qemu' type='raw' />
|
73
68
|
<source file=''/>
|
@@ -80,75 +75,60 @@
|
|
80
75
|
<target dev='hdb' bus='ide'/>
|
81
76
|
<readonly/>
|
82
77
|
</disk>
|
83
|
-
|
84
|
-
|
78
|
+
<serial type='file'>
|
79
|
+
<source path='/var/log/vm_consoles/machine.log'/>
|
85
80
|
<target port='0'/>
|
86
81
|
</serial>
|
87
|
-
<console type='
|
82
|
+
<console type='file'>
|
83
|
+
<source path='/var/log/vm_consoles/machine.log'/>
|
88
84
|
<target port='0'/>
|
89
85
|
</console>
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
/>
|
95
|
-
|
96
|
-
|
97
|
-
<
|
98
|
-
|
99
|
-
|
100
|
-
</channel>
|
101
|
-
<channel type='unix' >
|
102
|
-
<source
|
103
|
-
path="/tmp/foo"
|
104
|
-
/>
|
105
|
-
<target type='guestfwd'
|
106
|
-
address="192.0.2.42"
|
107
|
-
port="4242"
|
108
|
-
/>
|
109
|
-
</channel>
|
110
|
-
|
86
|
+
<channel type='unix' >
|
87
|
+
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
88
|
+
</channel>
|
89
|
+
<channel type='spicevmc' >
|
90
|
+
<target type='virtio' name='com.redhat.spice.0'/>
|
91
|
+
</channel>
|
92
|
+
<channel type='unix' >
|
93
|
+
<source path='/tmp/foo'/>
|
94
|
+
<target type='guestfwd' address='192.0.2.42' port='4242'/>
|
95
|
+
</channel>
|
111
96
|
<input type='mouse' bus='ps2'/>
|
112
|
-
|
113
|
-
<
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
<redirfilter>
|
146
|
-
<usbdev class='0x0b' vendor='0x08e6' product='0x3437' version='2.00' allow='yes'/>
|
147
|
-
</redirfilter>
|
97
|
+
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'>
|
98
|
+
<gl enable='yes'/>
|
99
|
+
</graphics>
|
100
|
+
<video>
|
101
|
+
<model type='cirrus' vram='16384' heads='1'>
|
102
|
+
<acceleration accel3d='yes'/>
|
103
|
+
</model>
|
104
|
+
</video>
|
105
|
+
<rng model='virtio'>
|
106
|
+
<backend model='random'>/dev/random</backend>
|
107
|
+
</rng>
|
108
|
+
<hostdev mode='subsystem' type='pci' managed='yes'>
|
109
|
+
<source>
|
110
|
+
<address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
|
111
|
+
</source>
|
112
|
+
</hostdev>
|
113
|
+
<hostdev mode='subsystem' type='pci' managed='yes'>
|
114
|
+
<source>
|
115
|
+
<address domain='0x0001' bus='0x03' slot='0x00' function='0x0'/>
|
116
|
+
</source>
|
117
|
+
</hostdev>
|
118
|
+
<hostdev mode='subsystem' type='usb'>
|
119
|
+
<source startupPolicy='mandatory'>
|
120
|
+
<vendor id='0x1234'/>
|
121
|
+
<product id='0xabcd'/>
|
122
|
+
<address bus='1' device='2'/>
|
123
|
+
</source>
|
124
|
+
</hostdev>
|
125
|
+
<redirdev bus='usb' type='tcp'>
|
126
|
+
</redirdev>
|
127
|
+
<redirfilter>
|
128
|
+
<usbdev class='0x0b' vendor='0x08e6' product='0x3437' version='2.00' allow='yes'/>
|
129
|
+
</redirfilter>
|
148
130
|
<watchdog model='i6300esb' action='reset'/>
|
149
|
-
|
150
|
-
<smartcard mode='passthrough' type='spicevmc'/>
|
151
|
-
|
131
|
+
<smartcard mode='passthrough' type='spicevmc'/>
|
152
132
|
<tpm model='tpm-tis'>
|
153
133
|
<backend type='passthrough'>
|
154
134
|
<device path='/dev/tpm0'/>
|
@@ -156,7 +136,6 @@
|
|
156
136
|
</tpm>
|
157
137
|
<controller type='usb' model='nec-xhci' ports="4" />
|
158
138
|
</devices>
|
159
|
-
|
160
139
|
<qemu:commandline>
|
161
140
|
<qemu:arg value='-device'/>
|
162
141
|
<qemu:arg value='dummy-device'/>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<domain type='' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
|
2
|
+
<name></name>
|
3
|
+
<title></title>
|
4
|
+
<description></description>
|
5
|
+
<uuid></uuid>
|
6
|
+
<memory></memory>
|
7
|
+
<vcpu>1</vcpu>
|
8
|
+
<cpu mode='host-passthrough'>
|
9
|
+
<feature policy='optional' name='vmx'/>
|
10
|
+
<feature policy='optional' name='svm'/>
|
11
|
+
<topology sockets='1' cores='2' threads='1'/>
|
12
|
+
</cpu>
|
13
|
+
<os>
|
14
|
+
<type>hvm</type>
|
15
|
+
<kernel></kernel>
|
16
|
+
<initrd></initrd>
|
17
|
+
<cmdline></cmdline>
|
18
|
+
</os>
|
19
|
+
<features>
|
20
|
+
<acpi/>
|
21
|
+
<apic/>
|
22
|
+
<pae/>
|
23
|
+
</features>
|
24
|
+
<clock offset='utc'>
|
25
|
+
</clock>
|
26
|
+
<devices>
|
27
|
+
<serial type='pty'>
|
28
|
+
<target port='0'/>
|
29
|
+
</serial>
|
30
|
+
<console type='pty'>
|
31
|
+
<target port='0'/>
|
32
|
+
</console>
|
33
|
+
<input type='mouse' bus='ps2'/>
|
34
|
+
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
|
35
|
+
<video>
|
36
|
+
<model type='cirrus' vram='16384' heads='1'/>
|
37
|
+
</video>
|
38
|
+
</devices>
|
39
|
+
</domain>
|
@@ -5,15 +5,11 @@
|
|
5
5
|
<uuid></uuid>
|
6
6
|
<memory></memory>
|
7
7
|
<vcpu>1</vcpu>
|
8
|
-
|
9
|
-
|
10
8
|
<cpu mode='custom'>
|
11
|
-
|
9
|
+
<model fallback='allow'>SandyBridge</model>
|
12
10
|
</cpu>
|
13
|
-
|
14
|
-
|
15
11
|
<os>
|
16
|
-
|
12
|
+
<type>hvm</type>
|
17
13
|
<kernel></kernel>
|
18
14
|
<initrd></initrd>
|
19
15
|
<cmdline></cmdline>
|
@@ -26,24 +22,16 @@
|
|
26
22
|
<clock offset='utc'>
|
27
23
|
</clock>
|
28
24
|
<devices>
|
29
|
-
|
30
|
-
|
31
25
|
<serial type='pty'>
|
32
26
|
<target port='0'/>
|
33
27
|
</serial>
|
34
28
|
<console type='pty'>
|
35
29
|
<target port='0'/>
|
36
30
|
</console>
|
37
|
-
|
38
|
-
|
39
31
|
<input type='mouse' bus='ps2'/>
|
40
|
-
|
41
|
-
|
42
|
-
<
|
43
|
-
|
44
|
-
</video>
|
45
|
-
|
46
|
-
|
32
|
+
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
|
33
|
+
<video>
|
34
|
+
<model type='cirrus' vram='16384' heads='1'/>
|
35
|
+
</video>
|
47
36
|
</devices>
|
48
|
-
|
49
37
|
</domain>
|
@@ -5,15 +5,11 @@
|
|
5
5
|
<uuid></uuid>
|
6
6
|
<memory></memory>
|
7
7
|
<vcpu>1</vcpu>
|
8
|
-
|
9
|
-
|
10
8
|
<cpu mode='host-model'>
|
11
|
-
|
9
|
+
<model fallback='allow'></model>
|
12
10
|
</cpu>
|
13
|
-
|
14
|
-
|
15
11
|
<os>
|
16
|
-
|
12
|
+
<type>hvm</type>
|
17
13
|
<kernel></kernel>
|
18
14
|
<initrd></initrd>
|
19
15
|
<cmdline></cmdline>
|
@@ -26,24 +22,16 @@
|
|
26
22
|
<clock offset='utc'>
|
27
23
|
</clock>
|
28
24
|
<devices>
|
29
|
-
|
30
|
-
|
31
25
|
<serial type='pty'>
|
32
26
|
<target port='0'/>
|
33
27
|
</serial>
|
34
28
|
<console type='pty'>
|
35
29
|
<target port='0'/>
|
36
30
|
</console>
|
37
|
-
|
38
|
-
|
39
31
|
<input type='mouse' bus='ps2'/>
|
40
|
-
|
41
|
-
|
42
|
-
<
|
43
|
-
|
44
|
-
</video>
|
45
|
-
|
46
|
-
|
32
|
+
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
|
33
|
+
<video>
|
34
|
+
<model type='cirrus' vram='16384' heads='1'/>
|
35
|
+
</video>
|
47
36
|
</devices>
|
48
|
-
|
49
37
|
</domain>
|
@@ -59,13 +59,13 @@ describe 'templates/domain' do
|
|
59
59
|
domain.disk_device = 'vda'
|
60
60
|
domain.disk_driver(:cache => 'unsafe', :io => 'threads', :copy_on_read => 'on', :discard => 'unmap', :detect_zeroes => 'on')
|
61
61
|
domain.domain_volumes.push({
|
62
|
-
:dev =>
|
62
|
+
:dev => 'vda',
|
63
63
|
:cache => 'unsafe',
|
64
64
|
:bus => domain.disk_bus,
|
65
65
|
:path => '/var/lib/libvirt/images/test.qcow2'
|
66
66
|
})
|
67
67
|
domain.domain_volumes.push({
|
68
|
-
:dev =>
|
68
|
+
:dev => 'vdb',
|
69
69
|
:cache => 'unsafe',
|
70
70
|
:bus => domain.disk_bus,
|
71
71
|
:path => '/var/lib/libvirt/images/test2.qcow2'
|
@@ -89,6 +89,7 @@ describe 'templates/domain' do
|
|
89
89
|
target_port: '4242',
|
90
90
|
source_path: '/tmp/foo')
|
91
91
|
domain.random(model: 'random')
|
92
|
+
domain.serial(:type => 'file', :source => {:path => '/var/log/vm_consoles/machine.log'})
|
92
93
|
domain.pci(bus: '0x06', slot: '0x12', function: '0x5')
|
93
94
|
domain.pci(domain: '0x0001', bus: '0x03', slot: '0x00', function: '0x0')
|
94
95
|
domain.usb_controller(model: 'nec-xhci', ports: '4')
|
@@ -111,23 +112,48 @@ describe 'templates/domain' do
|
|
111
112
|
domain.shares = '1024'
|
112
113
|
domain.cpuset = '1-4,^3,6'
|
113
114
|
domain.nodeset = '1-4,^3,6'
|
115
|
+
|
116
|
+
domain.video_accel3d = true
|
114
117
|
end
|
115
118
|
let(:test_file) { 'domain_all_settings.xml' }
|
116
119
|
it 'renders template' do
|
117
120
|
domain.finalize!
|
121
|
+
# resolving is now done during create domain, so need to recreate
|
122
|
+
# the same behaviour before calling the template until that
|
123
|
+
# is separated out from create domain.
|
124
|
+
resolver = ::VagrantPlugins::ProviderLibvirt::Util::DiskDeviceResolver.new(prefix=domain.disk_device[0..1])
|
125
|
+
resolver.resolve!(domain.domain_volumes.dup.each { |volume| volume[:device] = volume[:dev] })
|
126
|
+
resolver.resolve!(domain.disks)
|
127
|
+
|
118
128
|
expect(domain.to_xml('domain')).to eq xml_expected
|
119
129
|
end
|
120
130
|
end
|
121
131
|
|
122
|
-
context 'when
|
123
|
-
|
124
|
-
|
125
|
-
|
132
|
+
context 'when cpu mode is set' do
|
133
|
+
context 'to host-passthrough' do
|
134
|
+
before do
|
135
|
+
domain.cpu_mode = 'host-passthrough'
|
136
|
+
domain.cpu_model = 'SandyBridge'
|
137
|
+
domain.cputopology :sockets => '1', :cores => '2', :threads => '1'
|
138
|
+
domain.nested = true
|
139
|
+
end
|
140
|
+
let(:test_file) { 'domain_cpu_mode_passthrough.xml' }
|
141
|
+
it 'should allow features and topology and ignore model' do
|
142
|
+
domain.finalize!
|
143
|
+
expect(domain.to_xml('domain')).to eq xml_expected
|
144
|
+
end
|
126
145
|
end
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
146
|
+
|
147
|
+
context 'to custom and model is set' do
|
148
|
+
before do
|
149
|
+
domain.cpu_mode = 'custom'
|
150
|
+
domain.cpu_model = 'SandyBridge'
|
151
|
+
end
|
152
|
+
let(:test_file) { 'domain_custom_cpu_model.xml' }
|
153
|
+
it 'renders template' do
|
154
|
+
domain.finalize!
|
155
|
+
expect(domain.to_xml('domain')).to eq xml_expected
|
156
|
+
end
|
131
157
|
end
|
132
158
|
end
|
133
159
|
|
@@ -164,12 +190,12 @@ describe 'templates/domain' do
|
|
164
190
|
end
|
165
191
|
end
|
166
192
|
|
167
|
-
context '
|
193
|
+
context 'memballoon enabled' do
|
168
194
|
before do
|
169
195
|
domain.memballoon_enabled = true
|
170
196
|
end
|
171
197
|
|
172
|
-
it 'renders with
|
198
|
+
it 'renders with memballoon element' do
|
173
199
|
domain.finalize!
|
174
200
|
|
175
201
|
expect(domain.to_xml('domain')).to match(/<memballoon model='virtio'>/)
|
@@ -192,7 +218,7 @@ describe 'templates/domain' do
|
|
192
218
|
end
|
193
219
|
end
|
194
220
|
|
195
|
-
context '
|
221
|
+
context 'memballoon disabled' do
|
196
222
|
before do
|
197
223
|
domain.memballoon_enabled = false
|
198
224
|
end
|