2
# This program is free software; you can redistribute it and/or modify
3
# it under the terms of the GNU General Public License as published by
4
# the Free Software Foundation; either version 2 of the License, or
5
# (at your option) any later version.
7
# This program is distributed in the hope that it will be useful,
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
# GNU General Public License for more details.
12
# You should have received a copy of the GNU General Public License
13
# along with this program; if not, write to the Free Software
14
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
import urlgrabber.progress as progress
23
from virtinst import VirtualDisk
24
from virtinst import VirtualAudio
25
from virtinst import VirtualNetworkInterface
26
from virtinst import VirtualHostDeviceUSB, VirtualHostDevicePCI
27
from virtinst import VirtualCharDevice
28
from virtinst import VirtualVideoDevice
29
from virtinst import VirtualController
30
from virtinst import VirtualWatchdog
33
conn = tests.open_testdriver()
35
def get_basic_paravirt_guest():
36
g = virtinst.ParaVirtGuest(connection=conn, type="xen")
39
g.maxmemory = int(400)
40
g.uuid = "12345678-1234-1234-1234-123456789012"
41
g.boot = ["/boot/vmlinuz","/boot/initrd"]
42
g.graphics = (True, "vnc", None, "ja")
46
def get_basic_fullyvirt_guest(typ="xen"):
47
g = virtinst.FullVirtGuest(connection=conn, type=typ,
48
emulator="/usr/lib/xen/bin/qemu-dm",
52
g.maxmemory = int(400)
53
g.uuid = "12345678-1234-1234-1234-123456789012"
54
g.cdrom = "/dev/loop0"
55
g.set_os_type("other")
56
g.set_os_variant("generic")
57
g.graphics = (True, "sdl")
62
def get_floppy(path="/default-pool/testvol1.img"):
63
return VirtualDisk(path, conn=conn, device=VirtualDisk.DEVICE_FLOPPY)
65
def get_filedisk(path="/tmp/test.img"):
66
return VirtualDisk(path, size=.0001, conn=conn)
69
return VirtualDisk("/dev/loop0", conn=conn)
71
def get_virtual_network():
72
dev = virtinst.VirtualNetworkInterface()
73
dev.macaddr = "11:22:33:44:55:66"
74
dev.type = virtinst.VirtualNetworkInterface.TYPE_VIRTUAL
75
dev.network = "default"
79
return "qemu:///system"
84
class TestXMLConfig(unittest.TestCase):
86
def _compare(self, xenguest, filebase, do_install, do_disk_boot=False):
87
filename = os.path.join("tests/xmlconfig-xml", filebase + ".xml")
88
xenguest._prepare_install(progress.BaseMeter())
90
actualXML = xenguest.get_config_xml(install=do_install,
91
disk_boot=do_disk_boot)
92
tests.diff_compare(actualXML, filename)
93
# Libvirt throws errors since we are defining domain
94
# type='xen', when test driver can only handle type='test'
95
# Sanitize the XML so we can define
96
actualXML = actualXML.replace("<domain type='xen'>",
97
"<domain type='test'>")
98
actualXML = actualXML.replace(">linux<", ">xen<")
100
# Should probably break this out into a separate function
101
dom = xenguest.conn.defineXML(actualXML)
106
xenguest._cleanup_install()
108
def conn_function_wrappers(self, guest, filename, do_boot,
111
libvirt_version=None,
113
testconn = guest.conn
115
def set_func(newfunc, funcname, obj, force=False):
118
if hasattr(obj, funcname):
119
orig = getattr(obj, funcname)
121
setattr(obj, funcname, newfunc)
126
def set_version(newfunc, force=False):
127
return set_func(newfunc, "getVersion", testconn, force)
128
def set_uri(newfunc, force=False):
129
return set_func(newfunc, "getURI", testconn, force)
130
def set_libvirt_version(newfunc, force=False):
131
return set_func(newfunc, "getVersion", libvirt, force)
135
old_libvirt_version = None
137
old_version = set_version(conn_version)
138
old_uri = set_uri(conn_uri)
139
old_libvirt_version = set_libvirt_version(libvirt_version)
140
self._compare(guest, filename, do_boot, do_disk_boot)
142
set_version(*old_version)
144
set_libvirt_version(*old_libvirt_version)
146
def testBootParavirtDiskFile(self):
147
g = get_basic_paravirt_guest()
148
g.disks.append(get_filedisk())
149
self._compare(g, "boot-paravirt-disk-file", False)
151
def testBootParavirtDiskFileBlktapCapable(self):
152
oldblktap = virtinst._util.is_blktap_capable
154
virtinst._util.is_blktap_capable = lambda: True
155
g = get_basic_paravirt_guest()
156
g.disks.append(get_filedisk())
157
self._compare(g, "boot-paravirt-disk-drv-tap", False)
159
virtinst._util.is_blktap_capable = oldblktap
161
def testBootParavirtDiskBlock(self):
162
g = get_basic_paravirt_guest()
163
g.disks.append(get_blkdisk())
164
self._compare(g, "boot-paravirt-disk-block", False)
166
def testBootParavirtDiskDrvPhy(self):
167
g = get_basic_paravirt_guest()
169
disk.driver_name = VirtualDisk.DRIVER_PHY
171
self._compare(g, "boot-paravirt-disk-drv-phy", False)
173
def testBootParavirtDiskDrvFile(self):
174
g = get_basic_paravirt_guest()
175
disk = get_filedisk()
176
disk.driver_name = VirtualDisk.DRIVER_FILE
178
self._compare(g, "boot-paravirt-disk-drv-file", False)
180
def testBootParavirtDiskDrvTap(self):
181
g = get_basic_paravirt_guest()
182
disk = get_filedisk()
183
disk.driver_name = VirtualDisk.DRIVER_TAP
185
self._compare(g, "boot-paravirt-disk-drv-tap", False)
187
def testBootParavirtDiskDrvTapQCow(self):
188
g = get_basic_paravirt_guest()
189
disk = get_filedisk()
190
disk.driver_name = VirtualDisk.DRIVER_TAP
191
disk.driver_type = VirtualDisk.DRIVER_TAP_QCOW
193
self._compare(g, "boot-paravirt-disk-drv-tap-qcow", False)
195
def testBootParavirtManyDisks(self):
196
g = get_basic_paravirt_guest()
197
disk = get_filedisk("/tmp/test2.img")
198
disk.driver_name = VirtualDisk.DRIVER_TAP
199
disk.driver_type = VirtualDisk.DRIVER_TAP_QCOW
201
g.disks.append(get_filedisk("/tmp/test1.img"))
203
g.disks.append(get_blkdisk())
204
self._compare(g, "boot-paravirt-many-disks", False)
206
def testBootFullyvirtDiskFile(self):
207
g = get_basic_fullyvirt_guest()
208
g.disks.append(get_filedisk())
209
self._compare(g, "boot-fullyvirt-disk-file", False)
211
def testBootFullyvirtDiskBlock(self):
212
g = get_basic_fullyvirt_guest()
213
g.disks.append(get_blkdisk())
214
self._compare(g, "boot-fullyvirt-disk-block", False)
219
def testInstallParavirtDiskFile(self):
220
g = get_basic_paravirt_guest()
221
g.disks.append(get_filedisk())
222
self._compare(g, "install-paravirt-disk-file", True)
224
def testInstallParavirtDiskBlock(self):
225
g = get_basic_paravirt_guest()
226
g.disks.append(get_blkdisk())
227
self._compare(g, "install-paravirt-disk-block", True)
229
def testInstallParavirtDiskDrvPhy(self):
230
g = get_basic_paravirt_guest()
232
disk.driver_name = VirtualDisk.DRIVER_PHY
234
self._compare(g, "install-paravirt-disk-drv-phy", True)
236
def testInstallParavirtDiskDrvFile(self):
237
g = get_basic_paravirt_guest()
238
disk = get_filedisk()
239
disk.driver_name = VirtualDisk.DRIVER_FILE
241
self._compare(g, "install-paravirt-disk-drv-file", True)
243
def testInstallParavirtDiskDrvTap(self):
244
g = get_basic_paravirt_guest()
245
disk = get_filedisk()
246
disk.driver_name = VirtualDisk.DRIVER_TAP
248
self._compare(g, "install-paravirt-disk-drv-tap", True)
250
def testInstallParavirtDiskDrvTapQCow(self):
251
g = get_basic_paravirt_guest()
252
disk = get_filedisk()
253
disk.driver_name = VirtualDisk.DRIVER_TAP
254
disk.driver_type = VirtualDisk.DRIVER_TAP_QCOW
256
self._compare(g, "install-paravirt-disk-drv-tap-qcow", True)
258
def testInstallParavirtManyDisks(self):
259
g = get_basic_paravirt_guest()
260
disk = get_filedisk("/tmp/test2.img")
261
disk.driver_name = VirtualDisk.DRIVER_TAP
262
disk.driver_type = VirtualDisk.DRIVER_TAP_QCOW
264
g.disks.append(get_filedisk("/tmp/test1.img"))
266
g.disks.append(get_blkdisk())
267
self._compare(g, "install-paravirt-many-disks", True)
269
def testInstallFullyvirtDiskFile(self):
270
g = get_basic_fullyvirt_guest()
271
g.disks.append(get_filedisk())
272
self._compare(g, "install-fullyvirt-disk-file", True)
274
def testInstallFullyvirtDiskBlock(self):
275
g = get_basic_fullyvirt_guest()
276
g.disks.append(get_blkdisk())
277
self._compare(g, "install-fullyvirt-disk-block", True)
279
def testInstallFVPXE(self):
280
g = get_basic_fullyvirt_guest()
281
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
283
g.disks.append(get_filedisk())
284
self._compare(g, "install-fullyvirt-pxe", True)
286
def testBootFVPXE(self):
287
g = get_basic_fullyvirt_guest()
288
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
290
g.disks.append(get_filedisk())
291
self._compare(g, "boot-fullyvirt-pxe", False)
293
def testInstallFVPXENoDisks(self):
294
g = get_basic_fullyvirt_guest()
295
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
297
self._compare(g, "install-fullyvirt-pxe-nodisks", True)
299
def testBootFVPXENoDisks(self):
300
g = get_basic_fullyvirt_guest()
301
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
303
self._compare(g, "boot-fullyvirt-pxe-nodisks", False)
305
def testInstallFVLiveCD(self):
306
g = get_basic_fullyvirt_guest()
307
g.installer = virtinst.LiveCDInstaller(type="xen", os_type="hvm",
309
location="/dev/loop0")
310
self._compare(g, "install-fullyvirt-livecd", False)
312
def testDoubleInstall(self):
313
# Make sure that installing twice generates the same XML, to ensure
314
# we aren't polluting the device list during the install process
315
g = get_basic_fullyvirt_guest()
316
g.installer = virtinst.LiveCDInstaller(type="xen", os_type="hvm",
318
location="/dev/loop0")
319
self._compare(g, "install-fullyvirt-livecd", False)
320
self._compare(g, "install-fullyvirt-livecd", False)
323
def testInstallFVImport(self):
324
g = get_basic_fullyvirt_guest()
325
g.disks.append(get_filedisk())
326
g.installer = virtinst.ImportInstaller(type="xen", os_type="hvm",
328
self._compare(g, "install-fullyvirt-import", False)
330
def testInstallPVImport(self):
331
g = get_basic_paravirt_guest()
332
g.disks.append(get_filedisk())
333
g.installer = virtinst.ImportInstaller(type="xen", os_type="xen",
335
self._compare(g, "install-paravirt-import", False)
337
def testQEMUDriverName(self):
338
g = get_basic_fullyvirt_guest()
339
g.disks.append(get_blkdisk())
340
self.conn_function_wrappers(g, "misc-qemu-driver-name", True,
343
g = get_basic_fullyvirt_guest()
344
g.disks.append(get_filedisk())
345
self.conn_function_wrappers(g, "misc-qemu-driver-type", True,
348
g = get_basic_fullyvirt_guest()
349
g.disks.append(get_filedisk("/default-pool/iso-vol"))
350
self.conn_function_wrappers(g, "misc-qemu-iso-disk", True,
353
def testXMLEscaping(self):
354
g = get_basic_fullyvirt_guest()
355
g.disks.append(get_filedisk("/tmp/ISO&'&s"))
356
self._compare(g, "misc-xml-escaping", True)
358
# OS Type/Version configurations
360
g = get_basic_fullyvirt_guest("kvm")
362
g.os_variant = "fedora10"
363
g.installer = virtinst.PXEInstaller(type="kvm", os_type="hvm",
365
g.disks.append(get_filedisk())
366
g.disks.append(get_blkdisk())
367
g.nics.append(get_virtual_network())
368
self.conn_function_wrappers(g, "install-f10", True,
372
g = get_basic_fullyvirt_guest("kvm")
374
g.os_variant = "fedora11"
375
g.installer = virtinst.DistroInstaller(type="kvm", os_type="hvm",
377
location="/default-pool/default-vol")
378
g.installer.cdrom = True
379
g.disks.append(get_floppy())
380
g.disks.append(get_filedisk())
381
g.disks.append(get_blkdisk())
382
g.nics.append(get_virtual_network())
383
self.conn_function_wrappers(g, "install-f11", False,
386
def testF11AC97(self):
388
g = get_basic_fullyvirt_guest("kvm")
390
g.os_variant = "fedora11"
391
g.installer = virtinst.DistroInstaller(type="kvm", os_type="hvm",
392
conn=g.conn, location="/default-pool/default-vol")
393
g.installer.cdrom = True
394
g.disks.append(get_floppy())
395
g.disks.append(get_filedisk())
396
g.disks.append(get_blkdisk())
397
g.nics.append(get_virtual_network())
398
g.add_device(VirtualAudio())
401
def libvirt_nosupport_ac97(drv=None):
404
return (libver, libver)
407
def conn_nosupport_ac97():
410
def conn_support_ac97():
414
self.conn_function_wrappers(g, "install-f11-ac97", False,
416
conn_version=conn_support_ac97)
419
self.conn_function_wrappers(g, "install-f11-noac97", False,
420
libvirt_version=libvirt_nosupport_ac97,
424
self.conn_function_wrappers(g, "install-f11-noac97", False,
425
conn_version=conn_nosupport_ac97,
429
def testF11Qemu(self):
430
g = get_basic_fullyvirt_guest("qemu")
432
g.os_variant = "fedora11"
433
g.installer = virtinst.DistroInstaller(type="qemu", os_type="hvm",
435
location="/default-pool/default-vol")
436
g.installer.cdrom = True
437
g.disks.append(get_floppy())
438
g.disks.append(get_filedisk())
439
g.disks.append(get_blkdisk())
440
g.nics.append(get_virtual_network())
441
self.conn_function_wrappers(g, "install-f11-qemu", False,
444
def testF11Xen(self):
445
g = get_basic_fullyvirt_guest("xen")
447
g.os_variant = "fedora11"
448
g.installer = virtinst.DistroInstaller(type="xen", os_type="hvm",
450
location="/default-pool/default-vol")
451
g.installer.cdrom = True
452
g.disks.append(get_floppy())
453
g.disks.append(get_filedisk())
454
g.disks.append(get_blkdisk())
455
g.nics.append(get_virtual_network())
456
self.conn_function_wrappers(g, "install-f11-xen", False,
459
def _build_win_kvm(self):
460
g = get_basic_fullyvirt_guest("kvm")
461
g.os_type = "windows"
462
g.os_variant = "winxp"
463
g.disks.append(get_filedisk())
464
g.disks.append(get_blkdisk())
465
g.nics.append(get_virtual_network())
466
g.add_device(VirtualAudio())
467
g.add_device(VirtualVideoDevice(g.conn))
471
def testInstallWindowsKVM(self):
472
g = self._build_win_kvm()
473
self.conn_function_wrappers(g, "winxp-kvm-stage1", True,
476
def testContinueWindowsKVM(self):
477
g = self._build_win_kvm()
478
self.conn_function_wrappers(g, "winxp-kvm-stage2", True,
482
def testBootWindowsKVM(self):
483
g = self._build_win_kvm()
484
self.conn_function_wrappers(g, "winxp-kvm-stage3", False,
488
def testInstallWindowsXenNew(self):
496
g = get_basic_fullyvirt_guest("xen")
497
g.os_type = "windows"
498
g.os_variant = "winxp"
499
g.disks.append(get_filedisk())
500
g.disks.append(get_blkdisk())
501
g.nics.append(get_virtual_network())
502
g.add_device(VirtualAudio())
504
for f, xml in [(old_xen_ver, "install-windowsxp-xenold"),
505
(new_xen_ver, "install-windowsxp-xennew")]:
507
self.conn_function_wrappers(g, xml, True,
512
# Device heavy configurations
513
def testManyDisks2(self):
514
g = get_basic_fullyvirt_guest()
515
g.disks.append(get_filedisk())
516
g.disks.append(get_blkdisk())
517
g.disks.append(VirtualDisk(conn=g.conn, path="/dev/loop0",
518
device=VirtualDisk.DEVICE_CDROM))
519
g.disks.append(VirtualDisk(conn=g.conn, path=None,
520
device=VirtualDisk.DEVICE_CDROM,
522
g.disks.append(VirtualDisk(conn=g.conn, path=None,
523
device=VirtualDisk.DEVICE_FLOPPY))
524
g.disks.append(VirtualDisk(conn=g.conn, path="/dev/loop0",
525
device=VirtualDisk.DEVICE_FLOPPY))
526
g.disks.append(VirtualDisk(conn=g.conn, path="/dev/loop0",
529
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
531
self._compare(g, "boot-many-disks2", False)
533
def testManyNICs(self):
534
g = get_basic_fullyvirt_guest()
535
net1 = VirtualNetworkInterface(type="user",
536
macaddr="11:11:11:11:11:11")
537
net2 = get_virtual_network()
538
net3 = get_virtual_network()
540
net4 = VirtualNetworkInterface(bridge="foobr0",
541
macaddr="22:22:22:22:22:22")
547
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
549
self._compare(g, "boot-many-nics", False)
551
def testManyHostdevs(self):
552
g = get_basic_fullyvirt_guest()
553
dev1 = VirtualHostDeviceUSB(g.conn)
554
dev1.product = "0x1234"
555
dev1.vendor = "0x4321"
557
dev2 = VirtualHostDevicePCI(g.conn)
560
dev2.function = "0x33"
562
g.hostdevs.append(dev1)
563
g.hostdevs.append(dev2)
564
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
566
self._compare(g, "boot-many-hostdevs", False)
568
def testManySounds(self):
569
g = get_basic_fullyvirt_guest()
570
g.sound_devs.append(VirtualAudio("sb16", conn=g.conn))
571
g.sound_devs.append(VirtualAudio("es1370", conn=g.conn))
572
g.sound_devs.append(VirtualAudio("pcspk", conn=g.conn))
573
g.sound_devs.append(VirtualAudio(conn=g.conn))
575
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
577
self._compare(g, "boot-many-sounds", False)
579
def testManyChars(self):
580
g = get_basic_fullyvirt_guest()
581
dev1 = VirtualCharDevice.get_dev_instance(g.conn,
582
VirtualCharDevice.DEV_SERIAL,
583
VirtualCharDevice.CHAR_NULL)
584
dev2 = VirtualCharDevice.get_dev_instance(g.conn,
585
VirtualCharDevice.DEV_PARALLEL,
586
VirtualCharDevice.CHAR_UNIX)
587
dev2.source_path = "/tmp/foobar"
588
dev3 = VirtualCharDevice.get_dev_instance(g.conn,
589
VirtualCharDevice.DEV_SERIAL,
590
VirtualCharDevice.CHAR_TCP)
591
dev3.protocol = "telnet"
592
dev3.source_host = "my.source.host"
593
dev3.source_port = "1234"
594
dev4 = VirtualCharDevice.get_dev_instance(g.conn,
595
VirtualCharDevice.DEV_PARALLEL,
596
VirtualCharDevice.CHAR_UDP)
597
dev4.bind_host = "my.bind.host"
598
dev4.bind_port = "1111"
599
dev4.source_host = "my.source.host"
600
dev4.source_port = "2222"
606
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
608
self._compare(g, "boot-many-chars", False)
610
def testManyDevices(self):
611
g = get_basic_fullyvirt_guest()
612
g.description = "foooo barrrr \n baz && snarf. '' \"\" @@$\n"
615
dev1 = VirtualHostDeviceUSB(g.conn)
616
dev1.product = "0x1234"
617
dev1.vendor = "0x4321"
618
g.hostdevs.append(dev1)
621
g.sound_devs.append(VirtualAudio("sb16", conn=g.conn))
622
g.sound_devs.append(VirtualAudio("es1370", conn=g.conn))
625
g.disks.append(VirtualDisk(conn=g.conn, path="/dev/loop0",
626
device=VirtualDisk.DEVICE_FLOPPY))
627
g.disks.append(VirtualDisk(conn=g.conn, path="/dev/loop0",
629
g.disks.append(VirtualDisk(conn=g.conn, path="/tmp", device="floppy"))
630
d3 = VirtualDisk(conn=g.conn, path="/default-pool/testvol1.img",
631
bus="scsi", driverName="qemu")
635
c1 = VirtualController.get_class_for_type(VirtualController.CONTROLLER_TYPE_IDE)(g.conn)
637
c2 = VirtualController.get_class_for_type(VirtualController.CONTROLLER_TYPE_VIRTIOSERIAL)(g.conn)
644
net1 = get_virtual_network()
646
net2 = VirtualNetworkInterface(type="user",
647
macaddr="11:11:11:11:11:11")
652
cdev1 = VirtualCharDevice.get_dev_instance(g.conn,
653
VirtualCharDevice.DEV_SERIAL,
654
VirtualCharDevice.CHAR_NULL)
655
cdev2 = VirtualCharDevice.get_dev_instance(g.conn,
656
VirtualCharDevice.DEV_PARALLEL,
657
VirtualCharDevice.CHAR_UNIX)
658
cdev2.source_path = "/tmp/foobar"
663
vdev1 = VirtualVideoDevice(g.conn)
664
vdev1.model_type = "vmvga"
666
vdev2 = VirtualVideoDevice(g.conn)
667
vdev2.model_type = "cirrus"
668
vdev2.vram = 10 * 1024
671
vdev3 = VirtualVideoDevice(g.conn)
676
wdev2 = VirtualWatchdog(g.conn)
677
wdev2.model = "ib700"
678
wdev2.action = "none"
681
g.clock.offset = "localtime"
683
seclabel = virtinst.Seclabel(g.conn)
684
seclabel.type = seclabel.SECLABEL_TYPE_STATIC
685
seclabel.model = "selinux"
686
seclabel.label = "foolabel"
687
seclabel.imagelabel = "imagelabel"
688
g.seclabel = seclabel
690
g.installer = virtinst.PXEInstaller(type="xen", os_type="hvm",
692
self._compare(g, "boot-many-devices", False)
694
if __name__ == "__main__":