2014-01-20 20:09:13 +04:00
# Copyright (C) 2013, 2014 Red Hat, Inc.
2013-03-18 01:06:52 +04:00
#
2018-03-20 22:00:02 +03:00
# This work is licensed under the GNU GPLv2.
# See the COPYING file in the top-level directory.
2013-03-18 01:06:52 +04:00
import os
2018-03-18 18:32:25 +03:00
import tempfile
import unittest
2013-03-18 01:06:52 +04:00
import virtinst
2018-03-20 19:18:35 +03:00
from virtinst import DeviceDisk
2015-04-06 22:42:40 +03:00
from virtcli import CLIConfig
2013-04-12 00:32:00 +04:00
2013-04-11 03:48:07 +04:00
from tests import utils
2013-03-18 01:06:52 +04:00
2013-04-12 00:32:00 +04:00
2017-06-28 23:12:04 +03:00
def _make_guest ( installer = None , conn = None , os_variant = None ) :
2018-02-20 21:00:24 +03:00
if not conn :
if installer :
conn = installer . conn
else :
2018-02-22 22:57:10 +03:00
conn = utils . URIs . open_testdriver_cached ( )
2018-02-20 21:00:24 +03:00
if not installer :
installer = _make_installer ( conn = conn )
2014-12-09 19:33:43 +03:00
2015-07-10 13:06:48 +03:00
g = conn . caps . lookup_virtinst_guest ( )
2014-12-09 19:33:43 +03:00
g . type = " kvm "
g . name = " TestGuest "
g . memory = int ( 200 * 1024 )
g . maxmemory = int ( 400 * 1024 )
g . uuid = " 12345678-1234-1234-1234-123456789012 "
2018-03-20 19:18:35 +03:00
gdev = virtinst . DeviceGraphics ( conn )
2014-12-09 19:33:43 +03:00
gdev . type = " vnc "
gdev . keymap = " ja "
g . add_device ( gdev )
g . features . pae = False
g . vcpus = 5
g . installer = installer
g . emulator = " /usr/lib/xen/bin/qemu-dm "
g . os . arch = " i686 "
g . os . os_type = " hvm "
2017-06-28 23:12:04 +03:00
if os_variant :
g . os_variant = os_variant
2014-12-09 19:33:43 +03:00
g . add_default_input_device ( )
g . add_default_console_device ( )
2018-03-20 19:18:35 +03:00
g . add_device ( virtinst . DeviceSound ( g . conn ) )
2014-12-09 19:33:43 +03:00
# Floppy disk
path = " /dev/default-pool/testvol1.img "
2018-03-20 19:18:35 +03:00
d = DeviceDisk ( conn )
2014-12-09 19:33:43 +03:00
d . path = path
d . device = d . DEVICE_FLOPPY
d . validate ( )
g . add_device ( d )
# File disk
path = " /dev/default-pool/new-test-suite.img "
2018-03-20 19:18:35 +03:00
d = virtinst . DeviceDisk ( conn )
2014-12-09 19:33:43 +03:00
d . path = path
if d . wants_storage_creation ( ) :
parent_pool = d . get_parent_pool ( )
2018-03-20 19:18:35 +03:00
vol_install = virtinst . DeviceDisk . build_vol_install ( conn ,
2014-12-09 19:33:43 +03:00
os . path . basename ( path ) , parent_pool , .0000001 , True )
d . set_vol_install ( vol_install )
d . validate ( )
g . add_device ( d )
# Block disk
path = " /dev/disk-pool/diskvol1 "
2018-03-20 19:18:35 +03:00
d = virtinst . DeviceDisk ( conn )
2014-12-09 19:33:43 +03:00
d . path = path
d . validate ( )
g . add_device ( d )
# Network device
2018-03-20 19:18:35 +03:00
dev = virtinst . DeviceInterface ( conn )
2014-12-09 19:33:43 +03:00
dev . macaddr = " 22:22:33:44:55:66 "
2018-03-20 19:18:35 +03:00
dev . type = virtinst . DeviceInterface . TYPE_VIRTUAL
2014-12-09 19:33:43 +03:00
dev . source = " default "
g . add_device ( dev )
return g
def _make_installer ( location = None , conn = None ) :
2018-02-22 22:57:10 +03:00
conn = conn or utils . URIs . open_testdriver_cached ( )
2014-12-09 19:33:43 +03:00
inst = virtinst . DistroInstaller ( conn )
if location :
inst . location = location
else :
inst . location = " /dev/null "
inst . cdrom = True
return inst
class TestXMLMisc ( unittest . TestCase ) :
"""
Misc tests for various XML special behavior . These should only aim for
testing any particularly tricky bits , general XML generation should
be through virt - install examples in clitest
"""
2018-02-22 22:57:10 +03:00
@property
def conn ( self ) :
return utils . URIs . open_testdefault_cached ( )
2014-12-09 19:33:43 +03:00
def _compare ( self , guest , filebase , do_install ) :
filename = os . path . join ( " tests/xmlconfig-xml " , filebase + " .xml " )
2013-03-18 01:06:52 +04:00
2013-08-15 03:43:02 +04:00
inst_xml , boot_xml = guest . start_install ( return_xml = True , dry = True )
2014-12-09 19:33:43 +03:00
if do_install :
2013-08-15 03:43:02 +04:00
actualXML = inst_xml
else :
actualXML = boot_xml
2014-12-09 19:33:43 +03:00
utils . diff_compare ( actualXML , filename )
utils . test_create ( guest . conn , actualXML )
2013-03-18 01:06:52 +04:00
def testDefaultBridge ( self ) :
2014-12-09 19:33:43 +03:00
# Test our handling of the default bridge routines
2018-03-20 19:27:37 +03:00
from virtinst . devices import interface as deviceinterface
2017-06-15 15:18:26 +03:00
origfunc = getattr ( deviceinterface , " _default_bridge " )
2013-03-18 01:06:52 +04:00
try :
def newbridge ( ignore_conn ) :
2014-10-28 02:26:31 +03:00
return " bzz0 "
2016-08-24 23:14:33 +03:00
setattr ( deviceinterface , " _default_bridge " , newbridge )
2013-03-18 01:06:52 +04:00
2018-03-20 19:18:35 +03:00
dev1 = virtinst . DeviceInterface ( self . conn )
2013-03-18 01:06:52 +04:00
dev1 . macaddr = " 22:22:33:44:55:66 "
2018-03-20 19:18:35 +03:00
dev2 = virtinst . DeviceInterface ( self . conn ,
2013-07-18 01:58:24 +04:00
parsexml = dev1 . get_xml_config ( ) )
2013-03-18 01:06:52 +04:00
dev2 . source = None
dev2 . source = " foobr0 "
dev2 . macaddr = " 22:22:33:44:55:67 "
2018-03-20 19:18:35 +03:00
dev3 = virtinst . DeviceInterface ( self . conn ,
2013-07-18 01:58:24 +04:00
parsexml = dev1 . get_xml_config ( ) )
2013-03-18 01:06:52 +04:00
dev3 . source = None
dev3 . macaddr = " 22:22:33:44:55:68 "
2013-07-18 01:58:24 +04:00
utils . diff_compare ( dev1 . get_xml_config ( ) , None ,
2013-07-24 22:37:07 +04:00
" <interface type= \" bridge \" > \n "
" <source bridge= \" bzz0 \" /> \n "
" <mac address= \" 22:22:33:44:55:66 \" /> \n "
" </interface> \n " )
2013-07-18 01:58:24 +04:00
utils . diff_compare ( dev2 . get_xml_config ( ) , None ,
" <interface type= \" bridge \" > \n "
2013-07-24 22:37:07 +04:00
" <source bridge= \" foobr0 \" /> \n "
" <mac address= \" 22:22:33:44:55:67 \" /> \n "
" </interface> \n " )
2013-07-18 01:58:24 +04:00
utils . diff_compare ( dev3 . get_xml_config ( ) , None ,
" <interface type= \" bridge \" > \n "
2013-07-24 22:37:07 +04:00
" <mac address= \" 22:22:33:44:55:68 \" /> \n "
" </interface> \n " )
2013-03-18 01:06:52 +04:00
finally :
2017-06-15 15:18:26 +03:00
setattr ( deviceinterface , " _default_bridge " , origfunc )
2013-03-18 01:06:52 +04:00
def testCpustrToTuple ( self ) :
2014-12-09 19:33:43 +03:00
# Various testing our cpustr handling
2018-02-22 22:57:10 +03:00
conn = self . conn
2013-03-18 01:06:52 +04:00
base = [ False ] * 16
expect = base [ : ]
expect [ 1 ] = expect [ 2 ] = expect [ 3 ] = True
2017-05-05 18:39:59 +03:00
self . assertEqual ( tuple ( expect ) ,
2014-12-09 19:33:43 +03:00
virtinst . DomainNumatune . cpuset_str_to_tuple ( conn , " 1-3 " ) )
2013-03-18 01:06:52 +04:00
expect = base [ : ]
expect [ 1 ] = expect [ 3 ] = expect [ 5 ] = expect [ 10 ] = expect [ 11 ] = True
2017-05-05 18:39:59 +03:00
self . assertEqual ( tuple ( expect ) ,
2014-12-09 19:33:43 +03:00
virtinst . DomainNumatune . cpuset_str_to_tuple ( conn , " 1,3,5,10-11 " ) )
2013-03-18 01:06:52 +04:00
self . assertRaises ( ValueError ,
2014-12-09 19:33:43 +03:00
virtinst . DomainNumatune . cpuset_str_to_tuple ,
conn , " 16 " )
2013-03-18 01:06:52 +04:00
2013-10-03 15:20:54 +04:00
def testDiskNumbers ( self ) :
2014-12-09 19:33:43 +03:00
# Various testing our target generation
2018-03-20 19:18:35 +03:00
self . assertEqual ( " a " , DeviceDisk . num_to_target ( 1 ) )
self . assertEqual ( " b " , DeviceDisk . num_to_target ( 2 ) )
self . assertEqual ( " z " , DeviceDisk . num_to_target ( 26 ) )
self . assertEqual ( " aa " , DeviceDisk . num_to_target ( 27 ) )
self . assertEqual ( " ab " , DeviceDisk . num_to_target ( 28 ) )
self . assertEqual ( " az " , DeviceDisk . num_to_target ( 52 ) )
self . assertEqual ( " ba " , DeviceDisk . num_to_target ( 53 ) )
self . assertEqual ( " zz " , DeviceDisk . num_to_target ( 27 * 26 ) )
self . assertEqual ( " aaa " , DeviceDisk . num_to_target ( 27 * 26 + 1 ) )
self . assertEqual ( DeviceDisk . target_to_num ( " hda " ) , 0 )
self . assertEqual ( DeviceDisk . target_to_num ( " hdb " ) , 1 )
self . assertEqual ( DeviceDisk . target_to_num ( " sdz " ) , 25 )
self . assertEqual ( DeviceDisk . target_to_num ( " sdaa " ) , 26 )
self . assertEqual ( DeviceDisk . target_to_num ( " vdab " ) , 27 )
self . assertEqual ( DeviceDisk . target_to_num ( " vdaz " ) , 51 )
self . assertEqual ( DeviceDisk . target_to_num ( " xvdba " ) , 52 )
self . assertEqual ( DeviceDisk . target_to_num ( " xvdzz " ) ,
2014-12-09 19:33:43 +03:00
26 * ( 25 + 1 ) + 25 )
2018-03-20 19:18:35 +03:00
self . assertEqual ( DeviceDisk . target_to_num ( " xvdaaa " ) ,
2014-12-09 19:33:43 +03:00
26 * 26 * 1 + 26 * 1 + 0 )
2014-02-12 18:44:40 +04:00
2018-03-20 19:18:35 +03:00
disk = virtinst . DeviceDisk ( self . conn )
2013-10-03 16:40:24 +04:00
disk . bus = " ide "
2017-05-05 18:39:59 +03:00
self . assertEqual ( " hda " , disk . generate_target ( [ ] ) )
self . assertEqual ( " hdb " , disk . generate_target ( [ " hda " ] ) )
self . assertEqual ( " hdc " , disk . generate_target ( [ " hdb " , " sda " ] ) )
self . assertEqual ( " hdb " , disk . generate_target ( [ " hda " , " hdd " ] ) )
2013-10-03 16:40:24 +04:00
2014-02-17 19:41:02 +04:00
disk . bus = " virtio-scsi "
2017-05-05 18:39:59 +03:00
self . assertEqual ( " sdb " ,
2014-12-09 19:33:43 +03:00
disk . generate_target ( [ " sda " , " sdg " , " sdi " ] , 0 ) )
2017-05-05 18:39:59 +03:00
self . assertEqual ( " sdh " , disk . generate_target ( [ " sda " , " sdg " ] , 1 ) )
2014-02-12 18:44:40 +04:00
2014-12-09 19:33:43 +03:00
def testQuickTreeinfo ( self ) :
# Simple sanity test to make sure detect_distro works. test-urls
# does much more exhaustive testing but it's only run occasionally
i = _make_installer (
location = " tests/cli-test-xml/fakefedoratree " )
g = _make_guest ( i )
2013-08-11 02:48:43 +04:00
v = i . detect_distro ( g )
2017-05-05 18:39:59 +03:00
self . assertEqual ( v , " fedora17 " )
2013-03-18 01:06:52 +04:00
2014-12-09 19:33:43 +03:00
i = _make_installer (
location = " tests/cli-test-xml/fakerhel6tree " )
g = _make_guest ( i )
v = i . detect_distro ( g )
2017-05-05 18:39:59 +03:00
self . assertEqual ( v , " rhel6.0 " )
2014-12-09 19:33:43 +03:00
def testCPUTopology ( self ) :
# Test CPU topology determining
2018-03-20 22:10:04 +03:00
cpu = virtinst . DomainCpu ( self . conn )
2014-12-09 19:33:43 +03:00
cpu . sockets = " 2 "
cpu . set_topology_defaults ( 6 )
2017-05-05 18:39:59 +03:00
self . assertEqual ( [ cpu . sockets , cpu . cores , cpu . threads ] , [ 2 , 3 , 1 ] )
2014-12-09 19:33:43 +03:00
2018-03-20 22:10:04 +03:00
cpu = virtinst . DomainCpu ( self . conn )
2014-12-09 19:33:43 +03:00
cpu . cores = " 4 "
cpu . set_topology_defaults ( 9 )
2017-05-05 18:39:59 +03:00
self . assertEqual ( [ cpu . sockets , cpu . cores , cpu . threads ] , [ 2 , 4 , 1 ] )
2014-12-09 19:33:43 +03:00
2018-03-20 22:10:04 +03:00
cpu = virtinst . DomainCpu ( self . conn )
2014-12-09 19:33:43 +03:00
cpu . threads = " 3 "
cpu . set_topology_defaults ( 14 )
2017-05-05 18:39:59 +03:00
self . assertEqual ( [ cpu . sockets , cpu . cores , cpu . threads ] , [ 4 , 1 , 3 ] )
2014-12-09 19:33:43 +03:00
2018-03-20 22:10:04 +03:00
cpu = virtinst . DomainCpu ( self . conn )
2014-12-09 19:33:43 +03:00
cpu . sockets = 5
cpu . cores = 2
2017-05-05 18:39:59 +03:00
self . assertEqual ( cpu . vcpus_from_topology ( ) , 10 )
2014-12-09 19:33:43 +03:00
2018-03-20 22:10:04 +03:00
cpu = virtinst . DomainCpu ( self . conn )
2017-05-05 18:39:59 +03:00
self . assertEqual ( cpu . vcpus_from_topology ( ) , 1 )
2014-12-09 19:33:43 +03:00
def testAC97 ( self ) :
# Test setting ac97 version given various version combos
def has_ac97 ( conn ) :
2017-06-28 23:12:04 +03:00
g = _make_guest ( conn = conn , os_variant = " fedora11 " )
2014-12-09 19:33:43 +03:00
# pylint: disable=unpacking-non-sequence
xml , ignore = g . start_install ( return_xml = True , dry = True )
return " ac97 " in xml
2018-02-22 22:57:10 +03:00
self . assertTrue ( has_ac97 ( utils . URIs . open_kvm ( connver = 11000 ) ) )
self . assertFalse ( has_ac97 ( utils . URIs . open_kvm ( libver = 5000 ) ) )
self . assertFalse ( has_ac97 (
utils . URIs . open_kvm ( libver = 7000 , connver = 7000 ) ) )
2014-12-09 19:33:43 +03:00
def testOSDeviceDefaultChange ( self ) :
"""
Make sure device defaults are properly changed if we change OS
distro / variant mid process
"""
2015-03-23 23:48:43 +03:00
# Use connver=12005 so that non-rhel displays ac97
2018-02-22 22:57:10 +03:00
conn = utils . URIs . open_kvm_rhel ( connver = 12005 )
2014-12-09 19:33:43 +03:00
2017-06-28 23:12:04 +03:00
g = _make_guest ( conn = conn , os_variant = " fedora11 " )
2015-04-07 23:38:52 +03:00
self . _compare ( g , " install-f11-norheldefaults " , False )
2014-12-09 19:33:43 +03:00
try :
2015-04-06 22:42:40 +03:00
CLIConfig . stable_defaults = True
2015-04-07 23:38:52 +03:00
2017-06-28 23:12:04 +03:00
g = _make_guest ( conn = conn , os_variant = " fedora11 " )
2014-12-09 19:33:43 +03:00
origemu = g . emulator
g . emulator = " /usr/libexec/qemu-kvm "
2015-03-23 23:48:43 +03:00
self . assertTrue ( g . conn . stable_defaults ( ) )
2014-12-09 19:33:43 +03:00
setattr ( g . conn , " _support_cache " , { } )
2015-04-07 23:38:52 +03:00
self . _compare ( g , " install-f11-rheldefaults " , False )
2014-12-09 19:33:43 +03:00
g . emulator = origemu
setattr ( g . conn , " _support_cache " , { } )
finally :
2015-04-06 22:42:40 +03:00
CLIConfig . stable_defaults = False
2014-12-09 19:33:43 +03:00
2015-07-20 20:06:34 +03:00
def test_hyperv_clock ( self ) :
def _make ( connver ) :
2018-02-22 22:57:10 +03:00
conn = utils . URIs . open_kvm ( libver = 1002002 , connver = connver )
2017-06-28 23:12:04 +03:00
g = _make_guest ( conn = conn , os_variant = " win7 " )
2015-07-20 20:06:34 +03:00
g . emulator = " /usr/libexec/qemu-kvm "
return g
try :
g = _make ( 2000000 )
self . _compare ( g , " install-hyperv-clock " , True )
g = _make ( 1009000 )
self . _compare ( g , " install-hyperv-noclock " , True )
CLIConfig . stable_defaults = True
g = _make ( 1005003 )
self . _compare ( g , " install-hyperv-clock " , True )
g = _make ( 1005002 )
self . _compare ( g , " install-hyperv-noclock " , True )
finally :
CLIConfig . stable_defaults = False
2018-03-18 18:32:25 +03:00
def test_dir_searchable ( self ) :
# Normally the dir searchable test is skipped in the unittest,
# but let's contrive an example that should trigger all the code
2018-03-20 19:27:37 +03:00
from virtinst . devices . disk import _is_dir_searchable
2018-03-18 18:32:25 +03:00
oldtest = os . environ . pop ( " VIRTINST_TEST_SUITE " )
try :
uid = - 1
username = " fakeuser-zzzz "
with tempfile . TemporaryDirectory ( ) as tmpdir :
self . assertFalse ( _is_dir_searchable ( uid , username , tmpdir ) )
finally :
os . environ [ " VIRTINST_TEST_SUITE " ] = oldtest