2014-02-06 15:12:12 +04:00
# Copyright (C) 2013, 2014 Red Hat, Inc.
2013-03-18 01:06:52 +04:00
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
2013-10-28 00:59:47 +04:00
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
2013-03-18 01:06:52 +04:00
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
import atexit
import logging
import os
import shlex
2013-09-29 01:23:23 +04:00
import shutil
2013-03-18 01:06:52 +04:00
import sys
import traceback
import unittest
import StringIO
2013-08-18 16:19:58 +04:00
from virtinst import support
2013-03-18 01:06:52 +04:00
2014-09-07 02:05:43 +04:00
from tests import virtinstall , virtclone , virtconvert , virtxml
2013-04-11 03:48:07 +04:00
from tests import utils
2013-03-18 01:06:52 +04:00
os . environ [ " LANG " ] = " en_US.UTF-8 "
2013-09-28 22:42:37 +04:00
# Used to ensure consistent SDL xml output
os . environ [ " HOME " ] = " /tmp "
os . environ [ " DISPLAY " ] = " :3.4 "
2013-03-18 01:06:52 +04:00
# Location
image_prefix = " /tmp/__virtinst_cli_ "
xmldir = " tests/cli-test-xml "
treedir = " %s /faketree " % xmldir
vcdir = " %s /virtconv " % xmldir
compare_xmldir = " %s /compare " % xmldir
virtconv_out = " /tmp/__virtinst_tests__virtconv-outdir "
# Images that will be created by virt-install/virt-clone, and removed before
# each run
new_images = [
image_prefix + " new1.img " ,
image_prefix + " new2.img " ,
image_prefix + " new3.img " ,
image_prefix + " exist1-clone.img " ,
image_prefix + " exist2-clone.img " ,
]
# Images that are expected to exist before a command is run
exist_images = [
image_prefix + " exist1.img " ,
image_prefix + " exist2.img " ,
]
2015-04-23 00:48:40 +03:00
exist_files = exist_images
2014-09-07 02:05:43 +04:00
new_files = new_images
2015-04-23 00:48:40 +03:00
clean_files = ( new_images + exist_images )
2013-03-18 01:06:52 +04:00
test_files = {
2015-04-23 00:06:35 +03:00
' URI-TEST ' : utils . uri_test ,
' URI-TEST-DEFAULT ' : utils . uri_test_default ,
' URI-TEST-REMOTE ' : utils . uri_test_remote ,
' URI-KVM ' : utils . uri_kvm ,
2017-02-06 15:46:06 +03:00
' URI-KVM-Q35 ' : utils . uri_kvm_q35 ,
2015-08-10 19:46:47 +03:00
' URI-KVM-SESSION ' : utils . uri_kvm_session ,
2015-04-23 00:06:35 +03:00
' URI-KVM-REMOTE ' : utils . uri_kvm + " ,remote " ,
' URI-KVM-NODOMCAPS ' : utils . uri_kvm_nodomcaps ,
2017-08-05 09:39:32 +03:00
' URI-KVM-ARMV7L ' : utils . uri_kvm_armv7l ,
' URI-KVM-AARCH64 ' : utils . uri_kvm_aarch64 ,
' URI-KVM-PPC64LE ' : utils . uri_kvm_ppc64le ,
' URI-KVM-S390X ' : utils . uri_kvm_s390x ,
' URI-KVM-S390X-KVMIBM ' : utils . uri_kvm_s390x_KVMIBM ,
2015-04-23 00:06:35 +03:00
' URI-XEN ' : utils . uri_xen ,
' URI-LXC ' : utils . uri_lxc ,
2017-02-21 17:28:00 +03:00
' URI-VZ ' : utils . uri_vz ,
2015-04-23 00:06:35 +03:00
2017-08-05 09:39:32 +03:00
' CLONE_DISK_XML ' : " %s /clone-disk.xml " % xmldir ,
' CLONE_STORAGE_XML ' : " %s /clone-disk-managed.xml " % xmldir ,
' CLONE_NOEXIST_XML ' : " %s /clone-disk-noexist.xml " % xmldir ,
' IMAGE_XML ' : " %s /image.xml " % xmldir ,
' IMAGE_NOGFX_XML ' : " %s /image-nogfx.xml " % xmldir ,
' OVF_IMG1 ' : " %s /tests/virtconv-files/ovf_input/test1.ovf " % os . getcwd ( ) ,
' VMX_IMG1 ' : " %s /tests/virtconv-files/vmx_input/test1.vmx " % os . getcwd ( ) ,
2015-04-23 00:06:35 +03:00
2017-08-05 09:39:32 +03:00
' NEWIMG1 ' : " /dev/default-pool/new1.img " ,
' NEWIMG2 ' : " /dev/default-pool/new2.img " ,
' NEWCLONEIMG1 ' : new_images [ 0 ] ,
' NEWCLONEIMG2 ' : new_images [ 1 ] ,
' NEWCLONEIMG3 ' : new_images [ 2 ] ,
' AUTOMANAGEIMG ' : " /some/new/pool/dir/new " ,
' BLOCKVOL ' : ' /iscsi-pool/diskvol1 ' ,
' EXISTIMG1 ' : " /dev/default-pool/testvol1.img " ,
' EXISTIMG2 ' : " /dev/default-pool/testvol2.img " ,
' EXISTIMG3 ' : exist_images [ 0 ] ,
' EXISTIMG4 ' : exist_images [ 1 ] ,
' EXISTUPPER ' : " /dev/default-pool/UPPER " ,
' POOL ' : " default-pool " ,
' VOL ' : " testvol1.img " ,
' DIR ' : " /var " ,
' TREEDIR ' : treedir ,
' MANAGEDNEW1 ' : " /dev/default-pool/clonevol " ,
' MANAGEDDISKNEW1 ' : " /dev/disk-pool/newvol1.img " ,
' COLLIDE ' : " /dev/default-pool/collidevol1.img " ,
' SHARE ' : " /dev/default-pool/sharevol.img " ,
2013-03-18 01:06:52 +04:00
}
######################
# Test class helpers #
######################
class Command ( object ) :
"""
Instance of a single cli command to test
"""
def __init__ ( self , cmd ) :
self . cmdstr = cmd % test_files
self . check_success = True
self . compare_file = None
2014-01-26 03:16:16 +04:00
self . input_file = None
2013-03-18 01:06:52 +04:00
2014-01-30 17:50:52 +04:00
self . skip_check = None
self . compare_check = None
2013-03-18 01:06:52 +04:00
app , opts = self . cmdstr . split ( " " , 1 )
2014-01-19 02:01:43 +04:00
self . app = app
2013-03-18 01:06:52 +04:00
self . argv = [ os . path . abspath ( app ) ] + shlex . split ( opts )
2014-01-30 17:50:52 +04:00
def _launch_command ( self , conn ) :
2013-03-18 01:06:52 +04:00
logging . debug ( self . cmdstr )
app = self . argv [ 0 ]
oldstdout = sys . stdout
oldstderr = sys . stderr
2014-01-26 03:16:16 +04:00
oldstdin = sys . stdin
2013-03-18 01:06:52 +04:00
oldargv = sys . argv
try :
out = StringIO . StringIO ( )
sys . stdout = out
sys . stderr = out
sys . argv = self . argv
2014-01-26 03:16:16 +04:00
if self . input_file :
2017-05-05 21:19:54 +03:00
sys . stdin = open ( self . input_file )
2013-03-18 01:06:52 +04:00
2014-02-09 01:36:45 +04:00
exc = " "
2013-03-18 01:06:52 +04:00
try :
if app . count ( " virt-install " ) :
ret = virtinstall . main ( conn = conn )
elif app . count ( " virt-clone " ) :
ret = virtclone . main ( conn = conn )
elif app . count ( " virt-convert " ) :
2014-02-06 04:09:26 +04:00
ret = virtconvert . main ( conn = conn )
2014-01-19 19:37:14 +04:00
elif app . count ( " virt-xml " ) :
2014-02-06 04:09:26 +04:00
ret = virtxml . main ( conn = conn )
2017-05-05 19:47:21 +03:00
except SystemExit as sys_e :
2013-03-18 01:06:52 +04:00
ret = sys_e . code
2014-02-09 01:36:45 +04:00
except Exception :
ret = - 1
exc = " \n " + " " . join ( traceback . format_exc ( ) )
2013-03-18 01:06:52 +04:00
if ret != 0 :
ret = - 1
2014-02-09 01:36:45 +04:00
outt = out . getvalue ( ) + exc
2013-03-18 01:06:52 +04:00
if outt . endswith ( " \n " ) :
outt = outt [ : - 1 ]
return ( ret , outt )
finally :
sys . stdout = oldstdout
sys . stderr = oldstderr
2014-01-26 03:16:16 +04:00
sys . stdin = oldstdin
2013-03-18 01:06:52 +04:00
sys . argv = oldargv
2014-01-30 17:50:52 +04:00
def _get_output ( self , conn ) :
2013-03-18 01:06:52 +04:00
try :
for i in new_files :
2013-09-29 01:23:23 +04:00
if os . path . isdir ( i ) :
shutil . rmtree ( i )
elif os . path . exists ( i ) :
os . unlink ( i )
2013-03-18 01:06:52 +04:00
2014-01-30 17:50:52 +04:00
code , output = self . _launch_command ( conn )
2013-03-18 01:06:52 +04:00
logging . debug ( output + " \n " )
return code , output
2017-05-05 19:47:21 +03:00
except Exception as e :
2013-03-18 01:06:52 +04:00
return ( - 1 , " " . join ( traceback . format_exc ( ) ) + str ( e ) )
2016-01-27 04:00:38 +03:00
def _check_support ( self , tests , conn , check , skipmsg ) :
if check is None :
2013-08-17 21:50:36 +04:00
return
2013-08-18 16:59:19 +04:00
if conn is None :
2016-01-27 04:00:38 +03:00
raise RuntimeError ( " skip check is not None, but conn is None " )
if type ( check ) is str :
# pylint: disable=protected-access
if support . _check_version ( conn , check ) :
return
# pylint: enable=protected-access
else :
if conn . check_support ( check ) :
return
tests . skipTest ( skipmsg )
return True
2013-08-17 21:50:36 +04:00
2013-08-18 16:59:19 +04:00
def run ( self , tests ) :
2013-03-18 01:06:52 +04:00
err = None
try :
2014-01-30 17:50:52 +04:00
conn = None
for idx in reversed ( range ( len ( self . argv ) ) ) :
if self . argv [ idx ] == " --connect " :
conn = utils . openconn ( self . argv [ idx + 1 ] )
break
2014-02-06 04:09:26 +04:00
if not conn :
2014-01-30 17:50:52 +04:00
raise RuntimeError ( " couldn ' t parse URI from command %s " %
self . argv )
2016-01-27 04:00:38 +03:00
if self . _check_support ( tests , conn , self . skip_check , " skipped " ) :
2013-08-18 16:59:19 +04:00
return
2013-03-18 01:06:52 +04:00
2014-01-30 17:50:52 +04:00
code , output = self . _get_output ( conn )
2013-03-18 01:06:52 +04:00
if bool ( code ) == self . check_success :
raise AssertionError (
2013-09-20 04:18:12 +04:00
( " Expected command to %s , but it didn ' t. \n " %
2013-03-18 01:06:52 +04:00
( self . check_success and " pass " or " fail " ) ) +
2017-08-17 14:01:28 +03:00
( " Command was: %s \n " % self . cmdstr ) +
( " Error code : %d \n " % code ) +
( " Output was: \n %s " % output ) )
2013-03-18 01:06:52 +04:00
2014-02-26 00:05:58 +04:00
if self . compare_file :
2016-01-27 04:00:38 +03:00
if self . _check_support ( tests , conn , self . compare_check ,
" Skipping compare check due to lack of support " ) :
2014-02-26 00:05:58 +04:00
return
2013-03-18 01:06:52 +04:00
# Generate test files that don't exist yet
2014-02-26 00:05:58 +04:00
filename = self . compare_file
2014-01-31 22:44:50 +04:00
if utils . REGENERATE_OUTPUT or not os . path . exists ( filename ) :
2017-05-05 21:19:54 +03:00
open ( filename , " w " ) . write ( output )
2013-03-18 01:06:52 +04:00
2014-02-02 22:41:43 +04:00
if " --print-diff " in self . argv and output . count ( " \n " ) > 3 :
2014-12-07 00:32:10 +03:00
# 1) Strip header
# 2) Simplify context lines to reduce churn when
# libvirt or testdriver changes
newlines = [ ]
for line in output . splitlines ( ) [ 3 : ] :
if line . startswith ( " @@ " ) :
line = " @@ "
newlines . append ( line )
output = " \n " . join ( newlines )
2014-02-02 22:41:43 +04:00
2013-03-18 01:06:52 +04:00
utils . diff_compare ( output , filename )
2017-05-05 19:47:21 +03:00
except AssertionError as e :
2013-03-18 01:06:52 +04:00
err = self . cmdstr + " \n " + str ( e )
2013-08-18 16:59:19 +04:00
if err :
tests . fail ( err )
2013-03-18 01:06:52 +04:00
2013-08-17 17:44:11 +04:00
class _CategoryProxy ( object ) :
2014-01-30 17:50:52 +04:00
def __init__ ( self , app , name , default_args , skip_check , compare_check ) :
2013-08-17 17:44:11 +04:00
self . _app = app
self . _name = name
2014-01-30 17:50:52 +04:00
self . default_args = default_args
self . skip_check = skip_check
self . compare_check = compare_check
2013-08-17 17:44:11 +04:00
def add_valid ( self , * args , * * kwargs ) :
return self . _app . add_valid ( self . _name , * args , * * kwargs )
def add_invalid ( self , * args , * * kwargs ) :
return self . _app . add_invalid ( self . _name , * args , * * kwargs )
def add_compare ( self , * args , * * kwargs ) :
return self . _app . add_compare ( self . _name , * args , * * kwargs )
2013-04-24 00:16:30 +04:00
class App ( object ) :
def __init__ ( self , appname ) :
self . appname = appname
self . categories = { }
self . cmds = [ ]
2014-05-12 03:19:00 +04:00
def _default_args ( self , cli , iscompare , auto_printarg ) :
2013-04-24 00:16:30 +04:00
args = " "
if not iscompare :
args = " --debug "
2014-02-06 04:09:26 +04:00
if " --connect " not in cli :
2015-04-23 00:06:35 +03:00
args + = " --connect % (URI-TEST)s "
2013-04-24 00:16:30 +04:00
if self . appname in [ " virt-install " ] :
if " --name " not in cli :
args + = " --name foobar "
if " --ram " not in cli :
args + = " --ram 64 "
2014-05-12 03:19:00 +04:00
if iscompare and auto_printarg :
2013-04-24 00:16:30 +04:00
if self . appname == " virt-install " :
if ( not cli . count ( " --print-xml " ) and
not cli . count ( " --print-step " ) and
not cli . count ( " --quiet " ) ) :
args + = " --print-step all "
elif self . appname == " virt-clone " :
if not cli . count ( " --print-xml " ) :
args + = " --print-xml "
return args
2014-01-30 17:50:52 +04:00
def add_category ( self , catname , default_args ,
skip_check = None , compare_check = None ) :
obj = _CategoryProxy ( self , catname , default_args ,
skip_check , compare_check )
self . categories [ catname ] = obj
return obj
def _add ( self , catname , testargs , valid , compfile ,
2014-05-12 03:19:00 +04:00
skip_check = None , compare_check = None , input_file = None ,
auto_printarg = True ) :
2013-04-24 00:16:30 +04:00
2014-01-30 17:50:52 +04:00
category = self . categories [ catname ]
args = category . default_args + " " + testargs
2014-05-12 03:19:00 +04:00
args = ( self . _default_args ( args , bool ( compfile ) , auto_printarg ) +
" " + args )
2013-04-24 00:16:30 +04:00
cmdstr = " ./ %s %s " % ( self . appname , args )
cmd = Command ( cmdstr )
cmd . check_success = valid
if compfile :
2014-02-06 04:09:26 +04:00
compfile = os . path . basename ( self . appname ) + " - " + compfile
2013-04-24 00:16:30 +04:00
cmd . compare_file = " %s / %s .xml " % ( compare_xmldir , compfile )
2014-01-30 17:50:52 +04:00
cmd . skip_check = skip_check or category . skip_check
cmd . compare_check = compare_check or category . compare_check
2014-01-26 03:16:16 +04:00
cmd . input_file = input_file
2013-04-24 00:16:30 +04:00
self . cmds . append ( cmd )
2013-08-17 21:50:36 +04:00
def add_valid ( self , cat , args , * * kwargs ) :
self . _add ( cat , args , True , None , * * kwargs )
def add_invalid ( self , cat , args , * * kwargs ) :
self . _add ( cat , args , False , None , * * kwargs )
def add_compare ( self , cat , args , compfile , * * kwargs ) :
self . _add ( cat , args , not compfile . endswith ( " -fail " ) ,
compfile , * * kwargs )
2013-04-24 00:16:30 +04:00
#
# The test matrix
#
# add_valid: A test that should pass
# add_invalid: A test that should fail
# add_compare: Get the generated XML, and compare against the passed filename
# in tests/clitest-xml/compare/
#
2014-12-10 17:33:02 +03:00
######################
# virt-install tests #
######################
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
vinst = App ( " virt-install " )
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
#############################################
# virt-install verbose XML comparison tests #
#############################################
2015-04-23 00:06:35 +03:00
c = vinst . add_category ( " xml-comparsion " , " --connect % (URI-KVM)s --noautoconsole --os-variant fedora20 " )
2014-12-10 17:33:02 +03:00
# Singleton element test #1, for simpler strings
c . add_compare ( """ \
- - memory 1024 \
- - vcpus 4 - - cpuset = 1 , 3 - 5 \
- - cpu host \
- - description \" foobar & baz \" \
2015-02-18 23:16:48 +03:00
- - boot uefi \
2014-12-10 17:33:02 +03:00
- - security type = dynamic \
2015-05-04 01:08:10 +03:00
- - security type = none , model = dac \
2014-12-10 17:33:02 +03:00
- - numatune 1 , 2 , 3 , 5 - 7 , ^ 6 \
- - memorybacking hugepages = on \
- - features apic = off \
- - clock offset = localtime \
- - resource / virtualmachines / production \
- - events on_crash = restart \
\
- - disk none \
- - console none \
2015-01-09 18:52:59 +03:00
- - channel none \
2014-12-10 17:33:02 +03:00
- - network none \
- - controller usb2 \
- - graphics spice \
- - video vga \
- - sound none \
- - redirdev none \
- - memballoon none \
- - smartcard none \
- - watchdog default \
- - panic default \
- - tpm / dev / tpm0 \
- - rng / dev / random \
2015-05-20 20:59:48 +03:00
""" , " singleton-config-1 " , compare_check=support.SUPPORT_CONN_VMPORT)
2014-12-10 17:33:02 +03:00
# Singleton element test #2, for complex strings
c . add_compare ( """ --pxe \
- - memory 512 , maxmemory = 1024 \
- - vcpus 4 , cores = 2 , threads = 2 , sockets = 2 \
2016-06-15 01:19:09 +03:00
- - cpu foobar , + x2apic , + x2apicagain , - distest , forbid = foo , forbid = bar , disable = distest2 , optional = opttest , require = reqtest , match = strict , vendor = meee , cell . id = 0 , cell . cpus = 1 , 2 , 3 , cell . memory = 1024 , cell1 . id = 1 , cell1 . memory = 256 , cell1 . cpus = 5 - 8 \
2014-12-10 17:33:02 +03:00
- - metadata title = my - title , description = my - description , uuid = 00000000 - 1111 - 2222 - 3333 - 444444444444 \
- - boot cdrom , fd , hd , network , menu = off , loader = / foo / bar \
- - idmap uid_start = 0 , uid_target = 1000 , uid_count = 10 , gid_start = 0 , gid_target = 1000 , gid_count = 10 \
- - security type = static , label = ' system_u:object_r:svirt_image_t:s0:c100,c200 ' , relabel = yes \
- - numatune 1 - 3 , 4 , mode = strict \
- - memtune hard_limit = 10 , soft_limit = 20 , swap_hard_limit = 30 , min_guarantee = 40 \
- - blkiotune weight = 100 , device_path = / home / test / 1. img , device_weight = 200 \
- - memorybacking size = 1 , unit = ' G ' , nodeset = ' 1,2-5 ' , nosharepages = yes , locked = yes \
2017-03-30 21:17:15 +03:00
- - features acpi = off , eoi = on , privnet = on , hyperv_synic = on , hyperv_reset = on , hyperv_spinlocks = on , hyperv_spinlocks_retries = 1234 , vmport = off , pmu = off \
2014-12-10 17:33:02 +03:00
- - clock offset = utc , hpet_present = no , rtc_tickpolicy = merge \
2016-09-07 01:12:20 +03:00
- - sysinfo type = smbios , bios_vendor = " Acme LLC " , bios_version = 1.2 .3 , bios_date = 01 / 01 / 1970 , bios_release = 10.22 \
- - sysinfo type = smbios , system_manufacturer = " Acme Inc. " , system_product = Computer , system_version = 3.2 .1 , system_serial = 123456789 , system_uuid = 00000000 - 1111 - 2222 - 3333 - 444444444444 , system_sku = abc - 123 , system_family = Server \
- - sysinfo type = smbios , baseBoard_manufacturer = " Acme Corp. " , baseBoard_product = Motherboard , baseBoard_version = A01 , baseBoard_serial = 1234 - 5678 , baseBoard_asset = Tag , baseBoard_location = Chassis \
2014-12-10 17:33:02 +03:00
- - pm suspend_to_mem = yes , suspend_to_disk = no \
- - resource partition = / virtualmachines / production \
2015-10-07 13:50:13 +03:00
- - events on_poweroff = destroy , on_reboot = restart , on_crash = preserve , on_lockfailure = ignore \
2014-12-10 17:33:02 +03:00
\
- - controller usb3 \
- - controller virtio - scsi \
- - graphics vnc \
- - filesystem / foo / source , / bar / target \
- - memballoon virtio \
- - watchdog ib700 , action = pause \
- - tpm passthrough , model = tpm - tis , path = / dev / tpm0 \
- - rng egd , backend_host = 127.0 .0 .1 , backend_service = 8000 , backend_type = udp , backend_mode = bind , backend_connect_host = foo , backend_connect_service = 708 \
- - panic iobase = 0x506 \
""" , " singleton-config-2 " )
# Device testing #1
c . add_compare ( """ \
2015-11-18 22:54:36 +03:00
- - vcpus 4 , cores = 1 , placement = static \
2014-12-10 17:33:02 +03:00
- - cpu none \
\
2014-02-09 22:36:12 +04:00
- - disk % ( EXISTUPPER ) s , cache = writeback , io = threads , perms = sh , serial = WD - WMAP9A966149 , boot_order = 2 \
2017-07-15 20:38:39 +03:00
- - disk % ( NEWIMG1 ) s , sparse = false , size = .001 , perms = ro , error_policy = enospace , discard = unmap , detect_zeroes = yes \
2014-02-01 00:38:39 +04:00
- - disk device = cdrom , bus = sata , read_bytes_sec = 1 , read_iops_sec = 2 , total_bytes_sec = 10 , total_iops_sec = 20 , write_bytes_sec = 5 , write_iops_sec = 6 \
2014-02-11 03:47:58 +04:00
- - disk size = 1 \
2015-09-24 00:26:48 +03:00
- - disk % ( BLOCKVOL ) s \
2016-06-15 00:29:54 +03:00
- - disk / dev / default - pool / iso - vol , seclabel . model = dac , seclabel1 . model = selinux , seclabel1 . relabel = no , seclabel0 . label = foo , bar , baz \
2014-12-10 17:33:02 +03:00
- - disk / dev / default - pool / iso - vol , format = qcow2 \
2014-12-10 20:31:56 +03:00
- - disk source_pool = rbd - ceph , source_volume = some - rbd - vol , size = .1 \
2014-12-10 20:55:08 +03:00
- - disk pool = rbd - ceph , size = .1 \
2014-12-10 17:33:02 +03:00
- - disk source_protocol = http , source_host_name = example . com , source_host_port = 8000 , source_name = / path / to / my / file \
2017-06-16 20:27:38 +03:00
- - disk source_protocol = nbd , source_host_transport = unix , source_host_socket = / tmp / socket , bus = scsi , logical_block_size = 512 , physical_block_size = 512 \
2015-01-27 16:10:12 +03:00
- - disk gluster : / / 192.168 .1 .100 / test - volume / some / dir / test - gluster . qcow2 \
2014-12-10 17:33:02 +03:00
- - disk qemu + nbd : / / / var / foo / bar / socket , bus = usb , removable = on \
- - disk path = http : / / [ 1 : 2 : 3 : 4 : 1 : 2 : 3 : 4 ] : 5522 / my / path ? query = foo \
- - disk vol = gluster - pool / test - gluster . raw , startup_policy = optional \
2016-06-11 19:36:45 +03:00
- - disk % ( DIR ) s , device = floppy , address . type = ccw , address . cssid = 0xfe , address . ssid = 0 , address . devno = 01 \
2016-06-17 03:08:53 +03:00
- - disk % ( NEWIMG2 ) s , size = 1 , backing_store = / tmp / foo . img , backing_format = vmdk \
2016-06-17 03:36:30 +03:00
- - disk / tmp / brand - new . img , size = 1 , backing_store = / dev / default - pool / iso - vol \
2014-12-10 17:33:02 +03:00
\
2016-01-20 18:53:23 +03:00
- - network user , mac = 12 : 34 : 56 : 78 : 11 : 22 , portgroup = foo , link_state = down , rom_bar = on , rom_file = / tmp / foo \
2014-02-01 16:48:04 +04:00
- - network bridge = foobar , model = virtio , driver_name = qemu , driver_queues = 3 \
2015-11-18 21:59:15 +03:00
- - network bridge = ovsbr , virtualport_type = openvswitch , virtualport_profileid = demo , virtualport_interfaceid = 09 b11c53 - 8 b5c - 4 eeb - 8 f00 - d84eaa0aaa3b , link_state = yes \
2017-03-05 22:43:31 +03:00
- - network type = direct , source = eth5 , source_mode = vepa , target = mytap12 , virtualport_type = 802.1 Qbg , virtualport_managerid = 12 , virtualport_typeid = 1193046 , virtualport_typeidversion = 1 , virtualport_instanceid = 09 b11c53 - 8 b5c - 4 eeb - 8 f00 - d84eaa0aaa3b , boot_order = 1 , trustGuestRxFilters = yes \
2016-06-11 19:36:45 +03:00
- - network user , model = virtio , address . type = spapr - vio , address . reg = 0x500 \
2016-08-27 08:41:38 +03:00
- - network vhostuser , source_type = unix , source_path = / tmp / vhost1 . sock , source_mode = server , model = virtio \
2014-12-10 17:33:02 +03:00
\
- - graphics sdl \
- - graphics spice , keymap = none \
- - graphics vnc , port = 5950 , listen = 1.2 .3 .4 , keymap = ja , password = foo \
- - graphics spice , port = 5950 , tlsport = 5950 , listen = 1.2 .3 .4 , keymap = ja \
2015-04-11 23:56:27 +03:00
- - graphics spice , image_compression = foo , streaming_mode = bar , clipboard_copypaste = yes , mouse_mode = client , filetransfer_enable = on \
2016-06-11 23:51:33 +03:00
- - graphics spice , gl = yes , listen = socket \
2016-04-28 15:22:09 +03:00
- - graphics spice , gl = yes , listen = none \
2017-02-21 16:01:00 +03:00
- - graphics spice , gl = yes , listen = none , rendernode = / dev / dri / foo \
2014-12-10 17:33:02 +03:00
\
- - controller usb , model = ich9 - ehci1 , address = 0 : 0 : 4.7 , index = 0 \
- - controller usb , model = ich9 - uhci1 , address = 0 : 0 : 4.0 , index = 0 , master = 0 \
- - controller usb , model = ich9 - uhci2 , address = 0 : 0 : 4.1 , index = 0 , master = 2 \
- - controller usb , model = ich9 - uhci3 , address = 0 : 0 : 4.2 , index = 0 , master = 4 \
\
2015-11-22 04:26:50 +03:00
- - input type = keyboard , bus = usb \
- - input tablet \
2015-04-09 20:22:40 +03:00
\
2016-07-18 22:03:06 +03:00
- - serial tcp , host = : 2222 , mode = bind , protocol = telnet , log_file = / tmp / foo . log , log_append = yes \
2016-08-24 23:37:36 +03:00
- - serial nmdm , source . master = / dev / foo1 , source . slave = / dev / foo2 \
2014-12-10 17:33:02 +03:00
- - parallel udp , host = 0.0 .0 .0 : 1234 , bind_host = 127.0 .0 .1 : 1234 \
- - parallel unix , path = / tmp / foo - socket \
- - channel pty , target_type = guestfwd , target_address = 127.0 .0 .1 : 10000 \
- - channel pty , target_type = virtio , name = org . linux - kvm . port1 \
- - console pty , target_type = virtio \
2013-09-28 17:36:11 +04:00
- - channel spicevmc \
2014-12-10 17:33:02 +03:00
\
2014-09-20 22:29:34 +04:00
- - hostdev net_00_1c_25_10_b1_e4 , boot_order = 4 , rom_bar = off \
2014-12-10 17:33:02 +03:00
- - host - device usb_device_781_5151_2004453082054CA1BEEE \
- - host - device 001.003 \
- - hostdev 15 : 0.1 \
- - host - device 2 : 15 : 0.2 \
2016-06-11 19:36:45 +03:00
- - hostdev 0 : 15 : 0.3 , address . type = isa , address . iobase = 0x500 , address . irq = 5 \
2014-12-10 17:33:02 +03:00
- - host - device 0x0781 : 0x5151 , driver_name = vfio \
- - host - device 04 b3 : 4485 \
2015-04-11 22:52:42 +03:00
- - host - device pci_8086_2829_scsi_host_scsi_device_lun0 \
2015-08-10 22:01:03 +03:00
- - hostdev usb_5_20 - - hostdev usb_5_21 \
2014-12-10 17:33:02 +03:00
\
2013-08-17 17:44:11 +04:00
2015-09-21 03:33:46 +03:00
- - filesystem / source , / target \
2015-09-21 03:15:34 +03:00
- - filesystem template_name , / , type = template , mode = passthrough \
2015-09-21 03:33:46 +03:00
- - filesystem type = file , source = / tmp / somefile . img , target = / mount / point , accessmode = squash \
2014-12-10 17:33:02 +03:00
\
- - soundhw default \
- - sound ac97 \
\
- - video cirrus \
2017-03-05 22:51:25 +03:00
- - video model = qxl , vgamem = 1 , ram = 2 , vram = 3 , heads = 4 , accel3d = yes , vram64 = 65 \
2014-12-10 17:33:02 +03:00
\
- - smartcard passthrough , type = spicevmc \
- - smartcard type = host \
\
- - redirdev usb , type = spicevmc \
- - redirdev usb , type = tcp , server = localhost : 4000 \
- - redirdev usb , type = tcp , server = 127.0 .0 .1 : 4002 , boot_order = 3 \
\
- - rng egd , backend_host = 127.0 .0 .1 , backend_service = 8000 , backend_type = tcp \
\
- - panic iobase = 507 \
2017-03-06 04:45:33 +03:00
\
- - qemu - commandline env = DISPLAY = : 0.1 \
- - qemu - commandline = " -display gtk,gl=on " \
- - qemu - commandline = " -device vfio-pci,addr=05.0,sysfsdev=/sys/class/mdev_bus/0000:00:02.0/f321853c-c584-4a6b-b99a-3eee22a3919c " \
- - qemu - commandline = " -set device.video0.driver=virtio-vga " \
2016-06-15 13:05:11 +03:00
""" , " many-devices " , compare_check= " 2.0.0 " ) # compare_check=graphics listen=socket support
2013-08-17 17:44:11 +04:00
2016-06-11 23:44:54 +03:00
# Test the implied defaults for gl=yes setting virgl=on
2016-03-04 14:31:53 +03:00
c . add_compare ( """ \
- - memory 1024 \
- - disk none \
- - graphics spice , gl = yes \
""" , " spice-gl " , compare_check=support.SUPPORT_CONN_VMPORT)
2017-01-26 17:08:36 +03:00
############################
# Features install options #
############################
c = vinst . add_category ( " features " , " --nographics --noautoconsole --import --disk none --controller usb,model=none " )
c . add_compare ( " --features smm=on " , " features-smm " )
c . add_invalid ( " --features smm=on --machine pc " )
2017-01-26 18:11:31 +03:00
########################
# Boot install options #
########################
c = vinst . add_category ( " boot " , " --nographics --noautoconsole --import --disk none --controller usb,model=none " )
c . add_compare ( " --boot loader=/path/to/loader,loader_secure=yes " , " boot-loader-secure " )
2017-05-04 14:08:14 +03:00
######################################
# Memory hot(un)plug install options #
######################################
c = vinst . add_category ( " memory-hotplug " , " --nographics --noautoconsole --import --disk none " )
c . add_compare ( " --memory 1024,hotplugmemorymax=2048,hotplugmemoryslots=2 --cpu cell0.cpus=0,cell0.memory=1048576 " , " memory-hotplug " )
2017-05-05 12:50:06 +03:00
c . add_compare ( " --memory 1024,hotplugmemorymax=2048,hotplugmemoryslots=2 --cpu cell0.cpus=0,cell0.memory=1048576 --memdev dimm,access=private,target_size=512,target_node=0,source_pagesize=4,source_nodemask=1-2 " , " memory-device-dimm " )
c . add_compare ( " --memory 1024,hotplugmemorymax=2048,hotplugmemoryslots=2 --cpu cell0.cpus=0,cell0.memory=1048576 --memdev nvdimm,source_path=/path/to/nvdimm,target_size=512,target_node=0,target_label_size=128 " , " memory-device-nvdimm " )
2017-05-04 14:08:14 +03:00
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
####################################################
# CPU/RAM/numa and other singleton VM config tests #
####################################################
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
c = vinst . add_category ( " cpuram " , " --hvm --nographics --noautoconsole --nodisks --pxe " )
c . add_valid ( " --vcpus 4 --cpuset=1,3-5, " ) # Cpuset with trailing comma
2015-11-18 22:55:25 +03:00
c . add_valid ( " --connect % (URI-XEN)s --vcpus 4 --cpuset=auto " ) # cpuset=auto but xen doesn't support it
2014-12-10 17:33:02 +03:00
c . add_valid ( " --ram 4000000 " ) # Ram overcommit
c . add_valid ( " --vcpus sockets=2,threads=2 " ) # Topology only
c . add_valid ( " --cpu somemodel " ) # Simple --cpu
c . add_valid ( " --security label=foobar.label,relabel=yes " ) # --security implicit static
c . add_valid ( " --security label=foobar.label,a1,z2,b3,type=static,relabel=no " ) # static with commas 1
c . add_valid ( " --security label=foobar.label,a1,z2,b3 " ) # --security static with commas 2
2015-11-18 22:55:25 +03:00
c . add_compare ( " --cpuset auto --vcpus 2 " , " cpuset-auto " ) # --cpuset=auto actually works
2014-12-10 17:33:02 +03:00
c . add_invalid ( " --vcpus 32 --cpuset=969-1000 " ) # Bogus cpuset
c . add_invalid ( " --vcpus 32 --cpuset=autofoo " ) # Bogus cpuset
c . add_invalid ( " --clock foo_tickpolicy=merge " ) # Unknown timer
c . add_invalid ( " --security foobar " ) # Busted --security
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
########################
# Storage provisioning #
########################
2013-08-17 17:44:11 +04:00
c = vinst . add_category ( " storage " , " --pxe --nographics --noautoconsole --hvm " )
c . add_valid ( " --disk path= %(EXISTIMG1)s " ) # Existing disk, no extra options
c . add_valid ( " --disk pool= %(POOL)s ,size=.0001 --disk pool= %(POOL)s ,size=.0001 " ) # Create 2 volumes in a pool
c . add_valid ( " --disk vol= %(POOL)s / %(VOL)s " ) # Existing volume
c . add_valid ( " --disk path= %(EXISTIMG1)s --disk path= %(EXISTIMG1)s --disk path= %(EXISTIMG1)s --disk path= %(EXISTIMG1)s ,device=cdrom " ) # 3 IDE and CD
2014-12-10 17:33:02 +03:00
c . add_valid ( " --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi --disk path= %(EXISTIMG1)s ,bus=scsi " ) # > 16 scsi disks
2013-08-17 17:44:11 +04:00
c . add_valid ( " --disk path= %(NEWIMG1)s ,format=raw,size=.0000001 " ) # Unmanaged file using format 'raw'
c . add_valid ( " --disk path= %(MANAGEDNEW1)s ,format=raw,size=.0000001 " ) # Managed file using format raw
c . add_valid ( " --disk path= %(MANAGEDNEW1)s ,format=qcow2,size=.0000001 " ) # Managed file using format qcow2
c . add_valid ( " --disk %(EXISTIMG1)s " ) # Not specifying path=
c . add_valid ( " --disk %(NEWIMG1)s ,format=raw,size=.0000001 " ) # Not specifying path= but creating storage
2015-04-12 02:25:46 +03:00
c . add_valid ( " --disk %(COLLIDE)s --check path_in_use=off " ) # Colliding storage with --check
2013-08-17 17:44:11 +04:00
c . add_valid ( " --disk %(COLLIDE)s --force " ) # Colliding storage with --force
c . add_valid ( " --disk %(SHARE)s ,perms=sh " ) # Colliding shareable storage
c . add_valid ( " --disk path= %(EXISTIMG1)s ,device=cdrom --disk path= %(EXISTIMG1)s ,device=cdrom " ) # Two IDE cds
c . add_valid ( " --disk %(EXISTIMG1)s ,driver_name=qemu,driver_type=qcow2 " ) # Driver name and type options
2014-12-05 03:36:26 +03:00
c . add_valid ( " --disk /dev/zero " ) # Referencing a local unmanaged /dev node
2013-08-17 17:44:11 +04:00
c . add_valid ( " --disk pool=default,size=.00001 " ) # Building 'default' pool
2014-02-09 01:36:45 +04:00
c . add_valid ( " --disk %(AUTOMANAGEIMG)s ,size=.1 " ) # autocreate the pool
2015-04-12 02:25:46 +03:00
c . add_valid ( " --disk %(NEWIMG1)s ,sparse=true,size=100000000 --check disk_size=off " ) # Don't warn about fully allocated file exceeding disk space
2013-08-17 17:44:11 +04:00
c . add_invalid ( " --file %(NEWIMG1)s --file-size 100000 --nonsparse " ) # Nonexisting file, size too big
c . add_invalid ( " --file %(NEWIMG1)s --file-size 100000 " ) # Huge file, sparse, but no prompting
c . add_invalid ( " --file %(NEWIMG1)s " ) # Nonexisting file, no size
c . add_invalid ( " --file %(EXISTIMG1)s --file %(EXISTIMG1)s --file %(EXISTIMG1)s --file %(EXISTIMG1)s --file %(EXISTIMG1)s " ) # Too many IDE
c . add_invalid ( " --disk pool=foopool,size=.0001 " ) # Specify a nonexistent pool
c . add_invalid ( " --disk vol= %(POOL)s /foovol " ) # Specify a nonexistent volume
c . add_invalid ( " --disk pool= %(POOL)s " ) # Specify a pool with no size
c . add_invalid ( " --disk path= %(EXISTIMG1)s ,perms=ro,size=.0001,cache=FOOBAR " ) # Unknown cache type
2014-02-09 01:36:45 +04:00
c . add_invalid ( " --disk path=/dev/foo/bar/baz,format=qcow2,size=.0000001 " ) # Unmanaged file using non-raw format
2013-08-17 17:44:11 +04:00
c . add_invalid ( " --disk path= %(MANAGEDDISKNEW1)s ,format=raw,size=.0000001 " ) # Managed disk using any format
c . add_invalid ( " --disk %(NEWIMG1)s " ) # Not specifying path= and non existent storage w/ no size
2014-02-05 01:16:39 +04:00
c . add_invalid ( " --disk %(NEWIMG1)s ,sparse=true,size=100000000000 " ) # Fail if fully allocated file would exceed disk space
2013-08-17 17:44:11 +04:00
c . add_invalid ( " --disk %(COLLIDE)s " ) # Colliding storage without --force
2014-02-05 01:16:39 +04:00
c . add_invalid ( " --disk %(COLLIDE)s --prompt " ) # Colliding storage with --prompt should still fail
2014-01-15 02:44:14 +04:00
c . add_invalid ( " --disk /dev/default-pool/backingl3.img " ) # Colliding storage via backing store
2013-08-17 17:44:11 +04:00
c . add_invalid ( " --disk %(DIR)s ,device=cdrom " ) # Dir without floppy
c . add_invalid ( " --disk %(EXISTIMG1)s ,driver_name=foobar,driver_type=foobaz " ) # Unknown driver name and type options (as of 1.0.0)
2014-12-07 00:22:00 +03:00
c . add_invalid ( " --disk source_pool=rbd-ceph,source_volume=vol1 " ) # Collision with existing VM, via source pool/volume
2017-04-27 22:44:46 +03:00
c . add_invalid ( " --disk source_pool=default-pool,source_volume=idontexist " ) # trying to lookup non-existent volume, hit specific error code
2015-09-06 20:42:07 +03:00
c . add_invalid ( " --disk size=1 --security model=foo,type=bar " ) # Libvirt will error on the invalid security params, which should trigger the code path to clean up the disk images we created.
2013-08-17 17:44:11 +04:00
2017-09-04 19:40:34 +03:00
################
# Panic device #
################
c = vinst . add_category ( " panic " , " --connect % (URI-KVM)s --noautoconsole --import --disk none --graphics none --controller usb,model=none --network none " )
c . add_compare ( " --panic default " , " panic-default " )
c . add_compare ( " --panic isa " , " panic-isa " )
c . add_compare ( " --panic isa,iobase=0x505 " , " panic-isa-iobase " )
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
################################################
# Invalid devices that hit virtinst code paths #
################################################
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
c = vinst . add_category ( " invalid-devices " , " --noautoconsole --nodisks --pxe " )
2013-08-17 17:44:11 +04:00
c . add_invalid ( " --host-device 1d6b:2 " ) # multiple USB devices with identical vendorId and productId
c . add_invalid ( " --host-device pci_8086_2850_scsi_host_scsi_host " ) # Unsupported hostdev type
c . add_invalid ( " --host-device foobarhostdev " ) # Unknown hostdev
c . add_invalid ( " --host-device 300:400 " ) # Parseable hostdev, but unknown digits
2014-12-10 17:33:02 +03:00
c . add_invalid ( " --graphics vnc,keymap=ZZZ " ) # Invalid keymap
c . add_invalid ( " --graphics vnc,port=-50 " ) # Invalid port
c . add_invalid ( " --graphics spice,tlsport=5 " ) # Invalid port
c . add_invalid ( " --serial unix " ) # Unix with no path
c . add_invalid ( " --serial null,path=/tmp/foo " ) # Path where it doesn't belong
c . add_invalid ( " --channel pty,target_type=guestfwd " ) # --channel guestfwd without target_address
2015-02-18 23:16:48 +03:00
c . add_invalid ( " --boot uefi " ) # URI doesn't support UEFI bits
2015-04-23 00:06:35 +03:00
c . add_invalid ( " --connect % (URI-KVM)s --boot uefi,arch=ppc64 " ) # unsupported arch for UEFI
2013-08-17 17:44:11 +04:00
2014-12-10 17:33:02 +03:00
########################
# Install option tests #
########################
c = vinst . add_category ( " nodisk-install " , " --nographics --noautoconsole --nodisks " )
2013-08-17 17:44:11 +04:00
c . add_valid ( " --hvm --cdrom %(EXISTIMG1)s " ) # Simple cdrom install
2014-12-10 17:33:02 +03:00
c . add_valid ( " --wait 0 --os-variant winxp --cdrom %(EXISTIMG1)s " ) # Windows (2 stage) install
c . add_valid ( " --pxe --virt-type test " ) # Explicit virt-type
2013-08-17 17:44:11 +04:00
c . add_valid ( " --arch i686 --pxe " ) # Explicity fullvirt + arch
c . add_valid ( " --arch i486 --pxe " ) # Convert i*86 -> i686
2014-12-10 17:33:02 +03:00
c . add_valid ( " --location %(TREEDIR)s " ) # Directory tree URL install
c . add_valid ( " --location %(TREEDIR)s --initrd-inject virt-install --extra-args ks=file:/virt-install " ) # initrd-inject
2013-08-17 17:44:11 +04:00
c . add_valid ( " --hvm --location %(TREEDIR)s --extra-args console=ttyS0 " ) # Directory tree URL install with extra-args
c . add_valid ( " --hvm --cdrom %(TREEDIR)s " ) # Directory tree CDROM install
c . add_valid ( " --paravirt --location %(TREEDIR)s " ) # Paravirt location
c . add_valid ( " --paravirt --location %(TREEDIR)s --os-variant none " ) # Paravirt location with --os-variant none
2014-12-10 17:33:02 +03:00
c . add_valid ( " --location %(TREEDIR)s --os-variant fedora12 " ) # URL install with manual os-variant
c . add_valid ( " --cdrom %(EXISTIMG2)s --os-variant win2k3 --wait 0 " ) # HVM windows install with disk
virtinst: guest: drop 'continue_install' concept
continue_install is intended to facilitate windows XP style 3 stage
installs:
stage 1: initial dos style disk setup, reboot
stage 2: actual full installer, reboot
stage 3: OS is functional, virt-install is done
The code assumed that we needed to keep the cdrom as the primary
boot device for the second stage, so virt-install/virt-manager needed
to hang around through the second stage run, wait until the VM shutdown,
then encode the final XML to boot of the disk.
Windows is and always has been smart enough to handle that case though...
after the initial boot, if we set the hd as the primary boot device
for stage 2, the disk bits that windows already installed will make
use of the cdrom as necessary. So the entire premise of continue_install
is irrelevant. Maybe back when it was added, when xen didn't even have
working ACPI support, this served a purpose, but I'm pretty sure we
can safely drop it nowadays.
2016-06-16 23:13:54 +03:00
c . add_valid ( " --cdrom %(EXISTIMG2)s --os-variant win2k3 --wait 0 --print-step 2 " ) # HVM windows install, print 3rd stage XML
2014-12-10 17:33:02 +03:00
c . add_valid ( " --pxe --autostart " ) # --autostart flag
c . add_compare ( " --pxe --print-step all " , " simple-pxe " ) # Diskless PXE install
c . add_invalid ( " --pxe --virt-type bogus " ) # Bogus virt-type
c . add_invalid ( " --pxe --arch bogus " ) # Bogus arch
2013-08-17 17:44:11 +04:00
c . add_invalid ( " --paravirt --pxe " ) # PXE w/ paravirt
c . add_invalid ( " --import " ) # Import with no disks
c . add_invalid ( " --livecd " ) # LiveCD with no media
2014-12-10 17:33:02 +03:00
c . add_invalid ( " --pxe --os-variant farrrrrrrge " ) # Bogus --os-variant
c . add_invalid ( " --pxe --boot menu=foobar " )
c . add_invalid ( " --cdrom %(EXISTIMG1)s --extra-args console=ttyS0 " ) # cdrom fail w/ extra-args
2014-09-23 22:14:21 +04:00
c . add_invalid ( " --hvm --boot kernel= %(TREEDIR)s /pxeboot/vmlinuz,initrd= %(TREEDIR)s /pxeboot/initrd.img,kernel_args= ' foo bar ' --initrd-inject virt-install " ) # initrd-inject with manual kernel/initrd
2013-04-24 00:16:30 +04:00
2014-12-10 17:33:02 +03:00
c = vinst . add_category ( " single-disk-install " , " --nographics --noautoconsole --disk %(EXISTIMG1)s " )
c . add_valid ( " --hvm --import " ) # FV Import install
c . add_valid ( " --hvm --import --prompt --force " ) # Working scenario w/ prompt shouldn't ask anything
c . add_valid ( " --paravirt --import " ) # PV Import install
c . add_valid ( " --paravirt --print-xml " ) # print single XML, implied import install
c . add_compare ( " --cdrom %(EXISTIMG2)s --os-variant win2k3 --wait 0 --vcpus cores=4 --controller usb,model=none " , " w2k3-cdrom " ) # HVM windows install with disk
2015-04-05 00:10:45 +03:00
c . add_invalid ( " --paravirt --import --print-xml 2 " ) # PV Import install, no second XML step
2014-12-10 17:33:02 +03:00
c = vinst . add_category ( " misc-install " , " --nographics --noautoconsole " )
c . add_valid ( " --disk path= %(EXISTIMG1)s ,device=cdrom " ) # Implied cdrom install
c . add_compare ( " " , " noargs-fail " , auto_printarg = False ) # No arguments
c . add_valid ( " --panic help --disk=? " ) # Make sure introspection doesn't blow up
c . add_invalid ( " --hvm --nodisks --pxe foobar " ) # Positional arguments error
c . add_invalid ( " --nodisks --pxe --name test " ) # Colliding name
#############################
# Remote URI specific tests #
#############################
2015-04-23 00:06:35 +03:00
c = vinst . add_category ( " remote " , " --connect % (URI-TEST-REMOTE)s --nographics --noautoconsole " )
2014-12-10 17:33:02 +03:00
c . add_valid ( " --nodisks --pxe " ) # Simple pxe nodisks
c . add_valid ( " --pxe --disk /foo/bar/baz,size=.01 " ) # Creating any random path on the remote host
c . add_valid ( " --pxe --disk /dev/zde " ) # /dev file that we just pass through to the remote VM
c . add_invalid ( " --pxe --disk /foo/bar/baz " ) # File that doesn't exist after auto storage setup
c . add_invalid ( " --nodisks --location /tmp " ) # Use of --location
c . add_invalid ( " --file /foo/bar/baz --pxe " ) # Trying to use unmanaged storage without size argument
###########################
# QEMU/KVM specific tests #
###########################
2015-05-20 20:59:48 +03:00
c = vinst . add_category ( " kvm " , " --connect % (URI-KVM)s --noautoconsole " , compare_check = support . SUPPORT_CONN_VMPORT )
2015-04-04 22:03:39 +03:00
c . add_compare ( " --os-variant fedora-unknown --file %(EXISTIMG1)s --location %(TREEDIR)s --extra-args console=ttyS0 --cpu host --channel none --console none --sound none --redirdev none " , " kvm-f14-url " ) # Fedora Directory tree URL install with extra-args
2014-12-10 17:33:02 +03:00
c . add_compare ( " --test-media-detection %(TREEDIR)s " , " test-url-detection " ) # --test-media-detection
c . add_compare ( " --os-variant fedora20 --disk %(NEWIMG1)s ,size=.01,format=vmdk --location %(TREEDIR)s --extra-args console=ttyS0 --quiet " , " quiet-url " ) # Quiet URL install should make no noise
c . add_compare ( " --cdrom %(EXISTIMG2)s --file %(EXISTIMG1)s --os-variant win2k3 --wait 0 --sound --controller usb " , " kvm-win2k3-cdrom " ) # HVM windows install with disk
2017-02-22 22:38:32 +03:00
c . add_compare ( " --os-variant ubuntusaucy --nodisks --boot cdrom --virt-type qemu --cpu Penryn --input tablet " , " qemu-plain " ) # plain qemu
2014-12-10 17:33:02 +03:00
c . add_compare ( " --os-variant fedora20 --nodisks --boot network --nographics --arch i686 " , " qemu-32-on-64 " ) # 32 on 64
2015-04-23 02:27:27 +03:00
# armv7l tests
2015-05-20 20:59:48 +03:00
c . add_compare ( " --arch armv7l --machine vexpress-a9 --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,dtb=/f19-arm.dtb,extra_args= \" console=ttyAMA0 rw root=/dev/mmcblk0p3 \" --disk %(EXISTIMG1)s --nographics " , " arm-vexpress-plain " )
2016-06-14 21:37:21 +03:00
c . add_compare ( " --arch armv7l --machine vexpress-a15 --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,dtb=/f19-arm.dtb,kernel_args= \" console=ttyAMA0,1234 rw root=/dev/vda3 \" --disk %(EXISTIMG1)s --nographics --os-variant fedora19 " , " arm-vexpress-f19 " )
2017-07-11 02:40:19 +03:00
c . add_compare ( " --arch armv7l --machine virt --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args= \" console=ttyAMA0,1234 rw root=/dev/vda3 \" --disk %(EXISTIMG1)s --nographics --os-variant fedora20 " , " arm-virt-f20 " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
c . add_compare ( " --arch armv7l --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args= \" console=ttyAMA0,1234 rw root=/dev/vda3 \" ,extra_args=foo --disk %(EXISTIMG1)s --os-variant fedora20 " , " arm-defaultmach-f20 " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
c . add_compare ( " --connect % (URI-KVM-ARMV7L)s --disk %(EXISTIMG1)s --import --os-variant fedora20 " , " arm-kvm-import " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
2015-04-23 02:27:27 +03:00
# aarch64 tests
2017-07-11 02:40:19 +03:00
c . add_compare ( " --arch aarch64 --machine virt --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args= \" console=ttyAMA0,1234 rw root=/dev/vda3 \" --disk %(EXISTIMG1)s " , " aarch64-machvirt " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
c . add_compare ( " --arch aarch64 --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args= \" console=ttyAMA0,1234 rw root=/dev/vda3 \" --disk %(EXISTIMG1)s " , " aarch64-machdefault " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
c . add_compare ( " --arch aarch64 --cdrom %(EXISTIMG2)s --boot loader=CODE.fd,nvram_template=VARS.fd --disk %(EXISTIMG1)s --cpu none --events on_crash=preserve,on_reboot=destroy,on_poweroff=restart " , " aarch64-cdrom " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
c . add_compare ( " --connect % (URI-KVM-AARCH64)s --disk %(EXISTIMG1)s --import --os-variant fedora21 " , " aarch64-kvm-import " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
c . add_compare ( " --connect % (URI-KVM-AARCH64)s --disk size=1 --os-variant fedora22 --features gic_version=host --network network=default,address.type=pci --controller type=scsi,model=virtio-scsi,address.type=pci " , " aarch64-kvm-gic " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
c . add_compare ( " --connect % (URI-KVM-AARCH64)s --disk none --network none --os-variant fedora25 --graphics spice " , " aarch64-graphics " , compare_check = support . SUPPORT_CONN_QEMU_XHCI )
2015-04-23 02:27:27 +03:00
# ppc64 tests
2016-06-07 17:32:18 +03:00
c . add_compare ( " --arch ppc64 --machine pseries --boot network --disk %(EXISTIMG1)s --disk device=cdrom --os-variant fedora20 --network none " , " ppc64-pseries-f20 " )
2014-12-10 17:33:02 +03:00
c . add_compare ( " --arch ppc64 --boot network --disk %(EXISTIMG1)s --os-variant fedora20 --network none " , " ppc64-machdefault-f20 " )
2015-04-23 02:27:27 +03:00
c . add_compare ( " --connect % (URI-KVM-PPC64LE)s --import --disk %(EXISTIMG1)s --os-variant fedora20 " , " ppc64le-kvm-import " )
2015-07-13 14:35:24 +03:00
# s390x tests
c . add_compare ( " --arch s390x --machine s390-ccw-virtio --connect % (URI-KVM-S390X)s --boot kernel=/kernel.img,initrd=/initrd.img --disk %(EXISTIMG1)s --disk %(EXISTIMG3)s ,device=cdrom --os-variant fedora21 " , " s390x-cdrom " )
2015-11-09 05:57:29 +03:00
c . add_compare ( " --arch s390x --machine s390-ccw-virtio --connect % (URI-KVM-S390X-KVMIBM)s --boot kernel=/kernel.img,initrd=/initrd.img --disk %(EXISTIMG1)s --disk %(EXISTIMG3)s ,device=cdrom --os-variant fedora21 --watchdog diag288,action=reset " , " s390x-cdrom-KVMIBM " )
2015-07-13 14:35:24 +03:00
2015-08-10 19:46:47 +03:00
# qemu:///session tests
c . add_compare ( " --connect % (URI-KVM-SESSION)s --disk size=8 --os-variant fedora21 --cdrom %(EXISTIMG1)s " , " kvm-session-defaults " )
# misc KVM config tests
2015-04-23 00:48:40 +03:00
c . add_compare ( " --disk none --location %(EXISTIMG3)s --nonetworks " , " location-iso " ) # Using --location iso mounting
2014-12-10 17:33:02 +03:00
c . add_compare ( " --disk %(EXISTIMG1)s --pxe --os-variant rhel6.4 " , " kvm-rhel6 " ) # RHEL6 defaults
c . add_compare ( " --disk %(EXISTIMG1)s --pxe --os-variant rhel7.0 " , " kvm-rhel7 " ) # RHEL7 defaults
c . add_compare ( " --disk %(EXISTIMG1)s --pxe --os-variant centos7.0 " , " kvm-centos7 " ) # Centos 7 defaults
2015-04-23 02:27:27 +03:00
c . add_compare ( " --os-variant win7 --cdrom %(EXISTIMG2)s --boot loader_type=pflash,loader=CODE.fd,nvram_template=VARS.fd --disk %(EXISTIMG1)s " , " win7-uefi " ) # no HYPER-V with UEFI
c . add_compare ( " --machine q35 --cdrom %(EXISTIMG2)s --disk %(EXISTIMG1)s " , " q35-defaults " ) # proper q35 disk defaults
2015-11-03 19:15:26 +03:00
c . add_compare ( " --disk size=20 --os-variant solaris10 " , " solaris10-defaults " ) # test solaris OS defaults
2015-04-23 02:27:27 +03:00
c . add_compare ( " --connect % (URI-KVM-REMOTE)s --import --disk %(EXISTIMG1)s --os-variant fedora21 --pm suspend_to_disk=yes " , " f21-kvm-remote " )
2015-11-03 19:15:26 +03:00
2015-04-23 02:27:27 +03:00
c . add_valid ( " --connect % (URI-KVM-NODOMCAPS)s --arch aarch64 --nodisks --pxe " ) # attempt to default to aarch64 UEFI, but it fails, but should only print warnings
2014-12-10 17:33:02 +03:00
c . add_invalid ( " --disk none --boot network --machine foobar " ) # Unknown machine type
c . add_invalid ( " --nodisks --boot network --arch mips --virt-type kvm " ) # Invalid domain type for arch
c . add_invalid ( " --nodisks --boot network --paravirt --arch mips " ) # Invalid arch/virt combo
2017-02-06 15:46:06 +03:00
c = vinst . add_category ( " kvm-q35 " , " --connect % (URI-KVM-Q35)s --noautoconsole " , compare_check = support . SUPPORT_CONN_VMPORT )
c . add_compare ( " --boot uefi --disk none " , " boot-uefi " )
2014-12-10 17:33:02 +03:00
######################
# LXC specific tests #
######################
2015-04-23 00:06:35 +03:00
c = vinst . add_category ( " lxc " , " --connect % (URI-LXC)s --noautoconsole --name foolxc --memory 64 " )
2014-12-10 17:33:02 +03:00
c . add_compare ( " " , " default " )
c . add_compare ( " --filesystem /source,/ " , " fs-default " )
c . add_compare ( " --init /usr/bin/httpd " , " manual-init " )
######################
# Xen specific tests #
######################
2015-04-23 00:06:35 +03:00
c = vinst . add_category ( " xen " , " --connect % (URI-XEN)s --noautoconsole " )
2015-09-22 18:26:13 +03:00
c . add_valid ( " --disk %(EXISTIMG1)s --location %(TREEDIR)s --paravirt --graphics none " ) # Xen PV install headless
2014-12-10 17:33:02 +03:00
c . add_compare ( " --disk %(EXISTIMG1)s --import " , " xen-default " ) # Xen default
c . add_compare ( " --disk %(EXISTIMG1)s --location %(TREEDIR)s --paravirt " , " xen-pv " ) # Xen PV
2015-09-24 00:26:48 +03:00
c . add_compare ( " --disk %(BLOCKVOL)s --cdrom %(EXISTIMG1)s --livecd --hvm " , " xen-hvm " ) # Xen HVM
2014-12-10 17:33:02 +03:00
2013-04-24 00:16:30 +04:00
2017-02-21 17:28:00 +03:00
#####################
# VZ specific tests #
#####################
c = vinst . add_category ( " vz " , " --connect % (URI-VZ)s --noautoconsole " )
2017-04-27 20:11:13 +03:00
c . add_valid ( " --container " ) # validate the special define+start logic
c . add_invalid ( " --container --transient " ) # doesn't support --transient
2017-02-21 17:28:00 +03:00
c . add_compare ( """ \
- - container \
- - filesystem type = template , source = centos - 7 - x86_64 , target = " / " \
- - network network = " Bridged " \
""" , " vz-ct-template " )
2014-12-10 17:33:02 +03:00
#####################################
# Device option back compat testing #
#####################################
c = vinst . add_category ( " device-back-compat " , " --nodisks --pxe --noautoconsole " )
c . add_valid ( " --sdl " ) # SDL
c . add_valid ( " --vnc --keymap ja --vncport 5950 --vnclisten 1.2.3.4 " ) # VNC w/ lots of options
c . add_valid ( " --sound " ) # --sound with no option back compat
c . add_valid ( " --mac 22:22:33:44:55:AF " ) # Just a macaddr
c . add_valid ( " --bridge mybr0 --mac 22:22:33:44:55:AF " ) # Old bridge w/ mac
c . add_valid ( " --network bridge:mybr0,model=e1000 " ) # --network bridge:
c . add_valid ( " --network network:default --mac RANDOM " ) # VirtualNetwork with a random macaddr
c . add_valid ( " --vnc --keymap=local " ) # --keymap local
2017-09-04 19:40:34 +03:00
c . add_valid ( " --panic 0x505 " ) # ISA panic with iobase specified
2015-08-06 15:43:00 +03:00
c . add_invalid ( " --nonetworks " ) # no networks
2014-12-10 17:33:02 +03:00
c . add_invalid ( " --graphics vnc --vnclisten 1.2.3.4 " ) # mixing old and new
c . add_invalid ( " --network=FOO " ) # Nonexistent network
c . add_invalid ( " --mac 1234 " ) # Invalid mac
c . add_invalid ( " --network user --bridge foo0 " ) # Mixing bridge and network
c . add_invalid ( " --mac 22:22:33:12:34:AB " ) # Colliding macaddr
c = vinst . add_category ( " storage-back-compat " , " --pxe --noautoconsole " )
c . add_valid ( " --file %(EXISTIMG1)s --nonsparse --file-size 4 " ) # Existing file, other opts
c . add_valid ( " --file %(EXISTIMG1)s " ) # Existing file, no opts
2015-04-12 02:25:46 +03:00
c . add_valid ( " --file %(EXISTIMG1)s --file %(EXISTIMG1)s " ) # Multiple existing files
2014-12-10 17:33:02 +03:00
c . add_valid ( " --file %(NEWIMG1)s --file-size .00001 --nonsparse " ) # Nonexistent file
2016-06-17 15:57:30 +03:00
c = vinst . add_category ( " console-tests " , " --pxe --nodisks " )
c . add_valid ( " --nographics " ) # mock virsh console waiting
c . add_valid ( " --graphics vnc --noreboot " ) # mock virt-viewer waiting, with noreboot magic
2016-06-17 19:09:45 +03:00
c . add_invalid ( " --noautoconsole --wait 1 " ) # --wait 1 is converted to 1 second if we are in the test suite, so this should actually touch the wait machinery. however in this case it exits with failure
2016-06-01 16:32:56 +03:00
c . add_valid ( " --nographics --transient " ) # --transient handling
2014-12-10 17:33:02 +03:00
##################
# virt-xml tests #
##################
2013-04-24 00:16:30 +04:00
2014-01-19 19:37:14 +04:00
vixml = App ( " virt-xml " )
c = vixml . add_category ( " misc " , " " )
c . add_valid ( " --help " ) # basic --help test
2014-02-05 21:32:53 +04:00
c . add_valid ( " --sound=? --tpm=? " ) # basic introspection test
2014-01-26 03:16:16 +04:00
c . add_invalid ( " test --edit --hostdev driver_name=vfio " ) # Guest has no hostdev to edit
c . add_invalid ( " test --edit --cpu host-passthrough --boot hd,network " ) # Specified more than 1 option
c . add_invalid ( " test --edit " ) # specified no edit option
c . add_invalid ( " test --edit 2 --cpu host-passthrough " ) # specifing --edit number where it doesn't make sense
2015-04-22 02:37:01 +03:00
c . add_invalid ( " test-for-virtxml --edit 5 --tpm /dev/tpm " ) # device edit out of range
c . add_invalid ( " test-for-virtxml --add-device --host-device 0x0781:0x5151 --update " ) # test driver doesn't support attachdevice...
c . add_invalid ( " test-for-virtxml --remove-device --host-device 1 --update " ) # test driver doesn't support detachdevice...
c . add_invalid ( " test-for-virtxml --edit --graphics password=foo --update " ) # test driver doesn't support updatdevice...
2014-01-26 05:14:42 +04:00
c . add_invalid ( " --build-xml --memory 10,maxmemory=20 " ) # building XML for option that doesn't support it
2014-02-06 04:09:26 +04:00
c . add_compare ( " test --print-xml --edit --vcpus 7 " , " print-xml " ) # test --print-xml
c . add_compare ( " --edit --cpu host-passthrough " , " stdin-edit " , input_file = ( xmldir + " /virtxml-stdin-edit.xml " ) ) # stdin test
c . add_compare ( " --build-xml --cpu pentium3,+x2apic " , " build-cpu " )
c . add_compare ( " --build-xml --tpm /dev/tpm " , " build-tpm " )
c . add_compare ( " --build-xml --blkiotune weight=100,device_path=/dev/sdf,device_weight=200 " , " build-blkiotune " )
2014-02-09 19:25:25 +04:00
c . add_compare ( " --build-xml --idmap uid_start=0,uid_target=1000,uid_count=10,gid_start=0,gid_target=1000,gid_count=10 " , " build-idmap " )
2014-02-09 22:36:12 +04:00
c . add_compare ( " test --edit --boot network,cdrom " , " edit-bootorder " )
2015-04-23 00:35:39 +03:00
c . add_compare ( " --confirm test --edit --cpu host-passthrough " , " prompt-response " )
2017-03-06 04:45:33 +03:00
c . add_compare ( " --edit --print-diff --qemu-commandline clearxml=yes " , " edit-clearxml-qemu-commandline " , input_file = ( xmldir + " /virtxml-qemu-commandline-clear.xml " ) )
2014-01-26 03:16:16 +04:00
2016-04-09 16:24:08 +03:00
c = vixml . add_category ( " simple edit diff " , " test-for-virtxml --edit --print-diff --define " , compare_check = " 1.2.2 " ) # compare_check=input type=keyboard output
2014-01-25 05:03:30 +04:00
c . add_compare ( """ --metadata name=foo-my-new-name,uuid=12345678-12F4-1234-1234-123456789AFA,description= " hey this is my
new
2014-02-06 04:09:26 +04:00
very , very = new desc \\\' " ,title= " This is my,funky=new title " " " " , " edit-simple-metadata " )
2014-05-29 05:46:24 +04:00
c . add_compare ( " --events on_poweroff=destroy,on_reboot=restart,on_crash=preserve " , " edit-simple-events " )
2017-03-06 04:45:33 +03:00
c . add_compare ( " --qemu-commandline= ' -foo bar,baz= \" wib wob \" ' " , " edit-simple-qemu-commandline " )
2014-02-06 04:09:26 +04:00
c . add_compare ( " --memory 500,maxmemory=1000,hugepages=off " , " edit-simple-memory " )
c . add_compare ( " --vcpus 10,maxvcpus=20,cores=5,sockets=4,threads=1 " , " edit-simple-vcpus " )
c . add_compare ( " --cpu model=pentium2,+x2apic,forbid=pbe " , " edit-simple-cpu " )
c . add_compare ( " --numatune 1-5,7,mode=strict " , " edit-simple-numatune " )
c . add_compare ( " --blkiotune weight=500,device_path=/dev/sdf,device_weight=600 " , " edit-simple-blkiotune " )
2014-09-16 06:02:57 +04:00
c . add_compare ( " --idmap uid_start=0,uid_target=2000,uid_count=30,gid_start=0,gid_target=3000,gid_count=40 " , " edit-simple-idmap " , compare_check = support . SUPPORT_CONN_LOADER_ROM )
c . add_compare ( " --boot loader=foo.bar,useserial=on,init=/bin/bash " , " edit-simple-boot " , compare_check = support . SUPPORT_CONN_LOADER_ROM )
2014-02-06 04:09:26 +04:00
c . add_compare ( " --security label=foo,bar,baz,UNKNOWN=val,relabel=on " , " edit-simple-security " )
c . add_compare ( " --features eoi=on,hyperv_relaxed=off,acpi= " , " edit-simple-features " )
c . add_compare ( " --clock offset=localtime,hpet_present=yes,kvmclock_present=no,rtc_tickpolicy=merge " , " edit-simple-clock " )
c . add_compare ( " --pm suspend_to_mem=yes,suspend_to_disk=no " , " edit-simple-pm " )
c . add_compare ( " --disk /dev/zero,perms=ro,startup_policy=optional " , " edit-simple-disk " )
c . add_compare ( " --disk path= " , " edit-simple-disk-remove-path " )
c . add_compare ( " --network source=br0,type=bridge,model=virtio,mac= " , " edit-simple-network " )
2016-05-28 10:12:54 +03:00
c . add_compare ( " --graphics tlsport=5902,keymap=ja " , " edit-simple-graphics " , compare_check = " 1.3.5 " ) # compare_check=new graphics listen output
2016-06-15 13:05:11 +03:00
c . add_compare ( " --graphics listen=none " , " edit-graphics-listen-none " , compare_check = " 2.0.0 " ) # compare_check=graphics listen=none support
2016-06-11 23:44:54 +03:00
c . add_compare ( " --controller index=15,model=lsilogic " , " edit-simple-controller " )
2015-04-05 03:01:03 +03:00
c . add_compare ( " --controller index=15,model=lsilogic " , " edit-simple-controller " )
2014-02-06 04:09:26 +04:00
c . add_compare ( " --smartcard type=spicevmc " , " edit-simple-smartcard " )
c . add_compare ( " --redirdev type=spicevmc,server=example.com:12345 " , " edit-simple-redirdev " )
2016-05-28 10:12:54 +03:00
c . add_compare ( " --tpm path=/dev/tpm " , " edit-simple-tpm " , compare_check = " 1.3.5 " ) # compare_check=new graphics listen output
2014-02-06 04:09:26 +04:00
c . add_compare ( " --rng rate_bytes=3333,rate_period=4444 " , " edit-simple-rng " )
c . add_compare ( " --watchdog action=reset " , " edit-simple-watchdog " )
c . add_compare ( " --memballoon model=none " , " edit-simple-memballoon " )
c . add_compare ( " --serial pty " , " edit-simple-serial " )
c . add_compare ( " --parallel unix,path=/some/other/log " , " edit-simple-parallel " )
c . add_compare ( " --channel null " , " edit-simple-channel " )
2015-06-09 00:22:58 +03:00
c . add_compare ( " --console name=foo.bar.baz " , " edit-simple-console " )
2014-02-06 04:09:26 +04:00
c . add_compare ( " --filesystem /1/2/3,/4/5/6,mode=mapped " , " edit-simple-filesystem " )
2016-04-09 16:17:01 +03:00
c . add_compare ( " --video cirrus " , " edit-simple-video " , compare_check = " 1.3.3 " ) # compare_check=video primary= attribute
2016-05-28 10:12:54 +03:00
c . add_compare ( " --sound pcspk " , " edit-simple-soundhw " , compare_check = " 1.3.5 " ) # compare_check=new graphics listen output
2014-02-06 04:09:26 +04:00
c . add_compare ( " --host-device 0x0781:0x5151,driver_name=vfio " , " edit-simple-host-device " )
2014-01-19 19:37:14 +04:00
2016-04-09 16:24:08 +03:00
c = vixml . add_category ( " edit selection " , " test-for-virtxml --print-diff --define " , compare_check = " 1.2.2 " ) # compare_check=input type=keyboard output
2014-01-19 19:37:14 +04:00
c . add_invalid ( " --edit target=vvv --disk /dev/null " ) # no match found
2016-06-15 00:29:54 +03:00
c . add_invalid ( " --edit seclabel2.model=dac --disk /dev/null " ) # no match found
c . add_valid ( " --edit seclabel.model=dac --disk /dev/null " ) # match found
2016-05-28 10:12:54 +03:00
c . add_compare ( " --edit 3 --sound pcspk " , " edit-pos-num " , compare_check = " 1.3.5 " ) # compare_check=new graphics listen output
2016-04-09 16:24:08 +03:00
c . add_compare ( " --edit -1 --video qxl " , " edit-neg-num " , compare_check = " 1.2.11 " ) # compare_check=video ram output change
2014-02-06 04:09:26 +04:00
c . add_compare ( " --edit all --host-device driver_name=vfio " , " edit-all " )
2016-05-28 10:12:54 +03:00
c . add_compare ( " --edit ich6 --sound pcspk " , " edit-select-sound-model " , compare_check = " 1.3.5 " ) # compare_check=new graphics listen output
2014-02-06 04:09:26 +04:00
c . add_compare ( " --edit target=hda --disk /dev/null " , " edit-select-disk-target " )
c . add_compare ( " --edit /tmp/foobar2 --disk shareable=off,readonly=on " , " edit-select-disk-path " )
c . add_compare ( " --edit mac=00:11:7f:33:44:55 --network target=nic55 " , " edit-select-network-mac " )
2014-01-19 19:37:14 +04:00
2016-04-09 16:24:08 +03:00
c = vixml . add_category ( " edit clear " , " test-for-virtxml --print-diff --define " , compare_check = " 1.2.2 " ) # compare_check=input type=keyboard output
2014-01-26 05:20:55 +04:00
c . add_invalid ( " --edit --memory 200,clearxml=yes " ) # clear isn't wired up for memory
2017-01-17 19:47:46 +03:00
c . add_compare ( " --edit --disk path=/foo/bar,size=2,target=fda,bus=fdc,device=floppy,clearxml=yes " , " edit-clear-disk " )
2014-02-06 04:09:26 +04:00
c . add_compare ( " --edit --cpu host-passthrough,clearxml=yes " , " edit-clear-cpu " )
c . add_compare ( " --edit --clock offset=utc,clearxml=yes " , " edit-clear-clock " )
2016-05-20 21:45:24 +03:00
c . add_compare ( " --edit --video clearxml=yes,model=virtio,accel3d=yes " , " edit-video-virtio " )
2016-06-15 13:05:11 +03:00
c . add_compare ( " --edit --graphics clearxml=yes,type=spice,gl=on,listen=none " , " edit-graphics-spice-gl " , compare_check = " 2.0.0 " ) # compare_check=graphics listen=none support
2014-01-26 00:44:14 +04:00
2016-04-09 16:24:08 +03:00
c = vixml . add_category ( " add/rm devices " , " test-for-virtxml --print-diff --define " , compare_check = " 1.2.2 " ) # compare_check=input type=keyboard output
2015-05-04 01:08:10 +03:00
c . add_valid ( " --add-device --security model=dac " ) # --add-device works for seclabel
c . add_invalid ( " --add-device --pm suspend_to_disk=yes " ) # --add-device without a device
2014-01-26 02:06:31 +04:00
c . add_invalid ( " --remove-device --clock utc " ) # --remove-device without a dev
2014-02-06 04:09:26 +04:00
c . add_compare ( " --add-device --host-device net_00_1c_25_10_b1_e4 " , " add-host-device " )
c . add_compare ( " --add-device --sound pcspk " , " add-sound " )
c . add_compare ( " --add-device --disk %(EXISTIMG1)s ,bus=virtio,target=vdf " , " add-disk-basic " )
c . add_compare ( " --add-device --disk %(EXISTIMG1)s " , " add-disk-notarget " ) # filling in acceptable target
c . add_compare ( " --add-device --disk %(NEWIMG1)s ,size=.01 " , " add-disk-create-storage " )
2016-05-28 10:12:54 +03:00
c . add_compare ( " --remove-device --sound ich6 " , " remove-sound-model " , compare_check = " 1.3.5 " ) # compare_check=new graphics listen output
2015-04-22 02:37:01 +03:00
c . add_compare ( " --remove-device --disk 3 " , " remove-disk-index " )
2014-02-06 04:09:26 +04:00
c . add_compare ( " --remove-device --disk /dev/null " , " remove-disk-path " )
2016-04-09 16:17:01 +03:00
c . add_compare ( " --remove-device --video all " , " remove-video-all " , compare_check = " 1.3.3 " ) # compare_check=video primary= attribute
2016-04-09 16:24:08 +03:00
c . add_compare ( " --remove-device --host-device 0x04b3:0x4485 " , " remove-hostdev-name " , compare_check = " 1.2.11 " ) # compare_check=video ram output change
2014-01-26 00:44:14 +04:00
2014-01-19 19:37:14 +04:00
2013-04-24 00:16:30 +04:00
2014-12-10 17:33:02 +03:00
####################
# virt-clone tests #
####################
2013-04-24 00:16:30 +04:00
vclon = App ( " virt-clone " )
2015-04-23 00:06:35 +03:00
c = vclon . add_category ( " remote " , " --connect % (URI-TEST-REMOTE)s " )
2013-08-17 17:44:11 +04:00
c . add_valid ( " -o test --auto-clone " ) # Auto flag, no storage
2015-04-12 02:25:46 +03:00
c . add_valid ( " --original-xml %(CLONE_STORAGE_XML)s --auto-clone " ) # Auto flag w/ managed storage
c . add_invalid ( " --original-xml %(CLONE_DISK_XML)s --auto-clone " ) # Auto flag w/ local storage, which is invalid for remote connection
2013-08-17 17:44:11 +04:00
c = vclon . add_category ( " misc " , " " )
2017-03-06 23:35:02 +03:00
c . add_compare ( " --connect % (URI-KVM)s -o test-clone --auto-clone --clone-running " , " clone-auto1 " , compare_check = " 1.2.15 " )
2016-01-27 04:00:38 +03:00
c . add_compare ( " -o test-clone-simple --name newvm --auto-clone --clone-running " , " clone-auto2 " , compare_check = " 1.2.15 " )
2013-08-17 17:44:11 +04:00
c . add_valid ( " -o test --auto-clone " ) # Auto flag, no storage
2015-04-12 02:25:46 +03:00
c . add_valid ( " --original-xml %(CLONE_STORAGE_XML)s --auto-clone " ) # Auto flag w/ managed storage
c . add_valid ( " --original-xml %(CLONE_DISK_XML)s --auto-clone " ) # Auto flag w/ local storage
2017-03-06 23:35:02 +03:00
c . add_valid ( " -o test-clone --auto-clone --clone-running " ) # Auto flag, actual VM, skip state check
2017-03-06 23:46:39 +03:00
c . add_valid ( " -o test-clone-simple -n newvm --preserve-data --file %(EXISTIMG1)s " ) # Preserve data shouldn't complain about existing volume
2015-04-12 02:25:46 +03:00
c . add_valid ( " -n clonetest --original-xml %(CLONE_DISK_XML)s --file %(EXISTIMG3)s --file %(EXISTIMG4)s --check path_exists=off " ) # Skip existing file check
2014-12-10 17:33:02 +03:00
c . add_invalid ( " --auto-clone " ) # Just the auto flag
2017-03-06 23:46:39 +03:00
c . add_invalid ( " -o test-many-devices --auto-clone " ) # VM is running, but --clone-running isn't passed
2015-04-12 02:25:46 +03:00
c . add_invalid ( " -o test-clone-simple -n newvm --file %(EXISTIMG1)s --clone-running " ) # Should complain about overwriting existing file
2013-08-17 17:44:11 +04:00
c = vclon . add_category ( " general " , " -n clonetest " )
2016-08-19 10:53:43 +03:00
c . add_valid ( " -o test --auto-clone " ) # Auto flag, no storage
2014-02-09 01:36:45 +04:00
c . add_valid ( " -o test --file %(NEWCLONEIMG1)s --file %(NEWCLONEIMG2)s " ) # Nodisk, but with spurious files passed
c . add_valid ( " -o test --file %(NEWCLONEIMG1)s --file %(NEWCLONEIMG2)s --prompt " ) # Working scenario w/ prompt shouldn't ask anything
c . add_valid ( " --original-xml %(CLONE_DISK_XML)s --file %(NEWCLONEIMG1)s --file %(NEWCLONEIMG2)s " ) # XML File with 2 disks
2013-08-17 17:44:11 +04:00
c . add_valid ( " --original-xml %(CLONE_DISK_XML)s --file virt-install --file %(EXISTIMG1)s --preserve " ) # XML w/ disks, overwriting existing files with --preserve
2014-02-09 01:36:45 +04:00
c . add_valid ( " --original-xml %(CLONE_DISK_XML)s --file %(NEWCLONEIMG1)s --file %(NEWCLONEIMG2)s --file %(NEWCLONEIMG3)s --force-copy=hdc " ) # XML w/ disks, force copy a readonly target
c . add_valid ( " --original-xml %(CLONE_DISK_XML)s --file %(NEWCLONEIMG1)s --file %(NEWCLONEIMG2)s --force-copy=fda " ) # XML w/ disks, force copy a target with no media
2013-08-17 17:44:11 +04:00
c . add_valid ( " --original-xml %(CLONE_STORAGE_XML)s --file %(MANAGEDNEW1)s " ) # XML w/ managed storage, specify managed path
c . add_valid ( " --original-xml %(CLONE_NOEXIST_XML)s --file %(EXISTIMG1)s --preserve " ) # XML w/ managed storage, specify managed path across pools# Libvirt test driver doesn't support cloning across pools# XML w/ non-existent storage, with --preserve
2017-03-06 23:35:02 +03:00
c . add_valid ( " -o test -n test-clone --auto-clone --replace " ) # Overwriting existing VM
2013-08-17 17:44:11 +04:00
c . add_invalid ( " -o test foobar " ) # Positional arguments error
c . add_invalid ( " -o idontexist " ) # Non-existent vm name
c . add_invalid ( " -o idontexist --auto-clone " ) # Non-existent vm name with auto flag,
c . add_invalid ( " -o test -n test " ) # Colliding new name
c . add_invalid ( " --original-xml %(CLONE_DISK_XML)s " ) # XML file with several disks, but non specified
c . add_invalid ( " --original-xml %(CLONE_DISK_XML)s --file virt-install --file %(EXISTIMG1)s " ) # XML w/ disks, overwriting existing files with no --preserve
2014-02-09 01:36:45 +04:00
c . add_invalid ( " --original-xml %(CLONE_DISK_XML)s --file %(NEWCLONEIMG1)s --file %(NEWCLONEIMG2)s --force-copy=hdc " ) # XML w/ disks, force copy but not enough disks passed
2013-08-17 17:44:11 +04:00
c . add_invalid ( " --original-xml %(CLONE_STORAGE_XML)s --file /tmp/clonevol " ) # XML w/ managed storage, specify unmanaged path (should fail)
c . add_invalid ( " --original-xml %(CLONE_NOEXIST_XML)s --file %(EXISTIMG1)s " ) # XML w/ non-existent storage, WITHOUT --preserve
2013-04-24 00:16:30 +04:00
2014-12-10 17:33:02 +03:00
######################
# virt-convert tests #
######################
vconv = App ( " virt-convert " )
2015-05-20 20:59:48 +03:00
c = vconv . add_category ( " misc " , " --connect % (URI-KVM)s --dry " , compare_check = support . SUPPORT_CONN_VMPORT )
2014-12-10 17:33:02 +03:00
c . add_invalid ( " %(VMX_IMG1)s --input-format foo " ) # invalid input format
c . add_invalid ( " %(EXISTIMG1)s " ) # invalid input file
c . add_compare ( " %(VMX_IMG1)s --disk-format qcow2 --print-xml " , " vmx-compare " )
c . add_compare ( " %(OVF_IMG1)s --disk-format none --destination /tmp --print-xml " , " ovf-compare " )
2013-04-24 00:16:30 +04:00
2013-03-18 01:06:52 +04:00
#########################
# Test runner functions #
#########################
newidx = 0
curtest = 0
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def setup ( ) :
"""
Create initial test files / dirs
"""
for i in exist_files :
os . system ( " touch %s " % i )
def cleanup ( ) :
"""
Cleanup temporary files used for testing
"""
for i in clean_files :
os . system ( " chmod 777 %s > /dev/null 2>&1 " % i )
os . system ( " rm -rf %s > /dev/null 2>&1 " % i )
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
class CLITests ( unittest . TestCase ) :
def setUp ( self ) :
global curtest
curtest + = 1
# Only run this for first test
if curtest == 1 :
setup ( )
def tearDown ( self ) :
# Only run this on the last test
if curtest == newidx :
cleanup ( )
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def maketest ( cmd ) :
2013-08-17 21:50:36 +04:00
def cmdtemplate ( self , _cmdobj ) :
2013-08-18 16:59:19 +04:00
_cmdobj . run ( self )
2013-03-18 01:06:52 +04:00
return lambda s : cmdtemplate ( s , cmd )
2015-04-23 00:35:39 +03:00
_cmdlist = [ ]
2013-04-24 00:16:30 +04:00
_cmdlist + = vinst . cmds
_cmdlist + = vclon . cmds
_cmdlist + = vconv . cmds
2014-01-19 19:37:14 +04:00
_cmdlist + = vixml . cmds
2013-04-24 00:16:30 +04:00
2016-06-11 22:52:08 +03:00
# Generate numbered names like testCLI%d
2013-03-18 01:06:52 +04:00
for _cmd in _cmdlist :
newidx + = 1
2016-06-11 22:52:08 +03:00
_name = " testCLI %.4d " % newidx
if _cmd . compare_file :
_base = os . path . splitext ( os . path . basename ( _cmd . compare_file ) ) [ 0 ]
_name + = _base . replace ( " - " , " _ " )
else :
_name + = _cmd . app . replace ( " - " , " _ " )
2014-02-01 23:17:03 +04:00
setattr ( CLITests , _name , maketest ( _cmd ) )
2013-03-18 01:06:52 +04:00
atexit . register ( cleanup )