2015-04-01 15:07:51 +02:00
# Copyright (C) 2013, 2015 Red Hat, Inc.
2013-03-17 17: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-27 21:59:47 +01:00
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
2013-03-17 17: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 unittest
import os
import logging
2013-04-10 19:48:07 -04:00
from tests import utils
2013-03-17 17:06:52 -04:00
2013-07-02 18:30:46 -04:00
from virtinst import Cloner
2013-03-17 17:06:52 -04:00
ORIG_NAME = " clone-orig "
CLONE_NAME = " clone-new "
# Create some files to use as test images
FILE1 = " /tmp/virtinst-test1.img "
FILE2 = " /tmp/virtinst-test2.img "
2013-07-26 04:06:28 +02:00
P1_VOL1 = " /dev/default-pool/testvol1.img "
P1_VOL2 = " /dev/default-pool/testvol2.img "
P2_VOL1 = " /dev/cross-pool/testvol1.img "
P2_VOL2 = " /dev/cross-pool/testvol2.img "
2013-03-17 17:06:52 -04:00
2013-07-26 04:06:28 +02:00
POOL1 = " /dev/default-pool "
POOL2 = " /dev/cross-pool "
DISKPOOL = " /dev/disk-pool "
2013-03-17 17:06:52 -04:00
2013-04-13 14:34:52 -04:00
local_files = [ FILE1 , FILE2 ]
2013-03-17 17:06:52 -04:00
clonexml_dir = os . path . join ( os . getcwd ( ) , " tests/clone-xml " )
2013-04-13 14:34:52 -04:00
2013-03-17 17:06:52 -04:00
class TestClone ( unittest . TestCase ) :
def setUp ( self ) :
for f in local_files :
os . system ( " touch %s " % f )
def tearDown ( self ) :
for f in local_files :
os . unlink ( f )
def _clone_helper ( self , filebase , disks = None , force_list = None ,
2017-07-18 17:00:01 -04:00
skip_list = None , compare = True , conn = None ,
2015-04-01 15:07:51 +02:00
clone_disks_file = None ) :
2013-03-17 17:06:52 -04:00
""" Helper for comparing clone input/output from 2 xml files """
infile = os . path . join ( clonexml_dir , filebase + " -in.xml " )
in_content = utils . read_file ( infile )
2017-07-18 17:00:01 -04:00
if not conn :
conn = utils . open_testdriver ( )
cloneobj = Cloner ( conn )
2013-03-17 17:06:52 -04:00
cloneobj . original_xml = in_content
for force in force_list or [ ] :
cloneobj . force_target = force
for skip in skip_list or [ ] :
cloneobj . skip_target = skip
cloneobj = self . _default_clone_values ( cloneobj , disks )
if compare :
2015-04-01 15:07:51 +02:00
self . _clone_compare ( cloneobj , filebase ,
clone_disks_file = clone_disks_file )
2013-03-17 17:06:52 -04:00
self . _clone_define ( filebase )
else :
2017-07-20 17:18:14 -04:00
cloneobj . setup_original ( )
cloneobj . setup_clone ( )
2013-03-17 17:06:52 -04:00
def _default_clone_values ( self , cloneobj , disks = None ) :
""" Sets default values for the cloned VM. """
cloneobj . clone_name = " clone-new "
cloneobj . clone_uuid = " 12345678-1234-1234-1234-123456789012 "
2013-07-02 18:30:46 -04:00
cloneobj . clone_macs = [ " 22:23:45:67:89:00 " , " 22:23:45:67:89:01 " ]
2013-03-17 17:06:52 -04:00
2013-07-02 18:30:46 -04:00
if disks is None :
2013-07-26 04:06:28 +02:00
disks = [ " /dev/disk-pool/disk-vol1 " , " /tmp/clone2.img " ,
2015-06-05 16:55:39 +02:00
" /clone3 " , " /tmp/clone4.img " ,
2013-07-02 18:30:46 -04:00
" /tmp/clone5.img " , None ]
2013-03-17 17:06:52 -04:00
2013-07-02 18:30:46 -04:00
cloneobj . clone_paths = disks
2013-03-17 17:06:52 -04:00
return cloneobj
2015-04-01 15:07:51 +02:00
def _clone_compare ( self , cloneobj , outbase , clone_disks_file = None ) :
2013-03-17 17:06:52 -04:00
""" Helps compare output from passed clone instance with an xml file """
outfile = os . path . join ( clonexml_dir , outbase + " -out.xml " )
2017-07-20 17:18:14 -04:00
cloneobj . setup_original ( )
cloneobj . setup_clone ( )
2013-03-17 17:06:52 -04:00
utils . diff_compare ( cloneobj . clone_xml , outfile )
2015-04-01 15:07:51 +02:00
if clone_disks_file :
xml_clone_disks = " "
for i in cloneobj . get_clone_disks ( ) :
xml_clone_disks + = i . get_vol_install ( ) . get_xml_config ( )
utils . diff_compare ( xml_clone_disks , clone_disks_file )
2013-03-17 17:06:52 -04:00
def _clone_define ( self , filebase ) :
""" Take the valid output xml and attempt to define it on the
connection to ensure we don ' t get any errors " " "
outfile = os . path . join ( clonexml_dir , filebase + " -out.xml " )
outxml = utils . read_file ( outfile )
2017-07-18 17:00:01 -04:00
conn = utils . open_testdriver ( )
2013-03-17 17:06:52 -04:00
utils . test_create ( conn , outxml )
def testRemoteNoStorage ( self ) :
""" Test remote clone where VM has no storage that needs cloning """
2017-07-18 17:00:01 -04:00
conn = utils . open_test_remote ( )
2017-08-05 14:39:32 +08:00
for base in [ " nostorage " , " noclone-storage " ] :
2017-07-18 17:00:01 -04:00
self . _clone_helper ( base , disks = [ ] , conn = conn )
2013-03-17 17:06:52 -04:00
def testRemoteWithStorage ( self ) :
"""
Test remote clone with storage needing cloning . Should fail ,
since libvirt has no storage clone api .
"""
2017-07-18 17:00:01 -04:00
conn = utils . open_test_remote ( )
2017-08-05 14:39:32 +08:00
for base in [ " general-cfg " ] :
2013-03-17 17:06:52 -04:00
try :
self . _clone_helper ( base ,
disks = [ " %s /1.img " % POOL1 ,
" %s /2.img " % POOL1 ] ,
2017-07-18 17:00:01 -04:00
conn = conn )
2013-03-17 17:06:52 -04:00
# We shouldn't succeed, so test fails
raise AssertionError ( " Remote clone with storage passed "
" when it shouldn ' t. " )
2017-05-05 12:47:21 -04:00
except ( ValueError , RuntimeError ) as e :
2013-03-17 17:06:52 -04:00
# Exception expected
logging . debug ( " Received expected exception: %s " , str ( e ) )
2013-07-13 10:09:00 -04:00
def testCloneStorageManaged ( self ) :
2013-03-17 17:06:52 -04:00
base = " managed-storage "
self . _clone_helper ( base , [ " %s /new1.img " % POOL1 ,
" %s /new2.img " % DISKPOOL ] )
def testCloneStorageCrossPool ( self ) :
base = " cross-pool "
2017-07-18 17:00:01 -04:00
conn = utils . open_test_remote ( )
2015-04-01 15:07:51 +02:00
clone_disks_file = os . path . join ( clonexml_dir , base + " -disks-out.xml " )
2013-03-17 17:06:52 -04:00
self . _clone_helper ( base , [ " %s /new1.img " % POOL2 ,
2015-04-01 15:07:51 +02:00
" %s /new2.img " % POOL1 ] ,
clone_disks_file = clone_disks_file ,
2017-07-18 17:00:01 -04:00
conn = conn )
2013-03-17 17:06:52 -04:00
def testCloneStorageForce ( self ) :
base = " force "
self . _clone_helper ( base ,
2013-07-26 04:06:28 +02:00
disks = [ " /dev/default-pool/1234.img " ,
2015-06-05 16:55:39 +02:00
None , " /clone2.img " ] ,
2013-03-17 17:06:52 -04:00
force_list = [ " hda " , " fdb " , " sdb " ] )
def testCloneStorageSkip ( self ) :
base = " skip "
self . _clone_helper ( base ,
2013-07-26 04:06:28 +02:00
disks = [ " /dev/default-pool/1234.img " ,
2013-07-13 10:09:00 -04:00
None , " /tmp/clone2.img " ] ,
2013-03-17 17:06:52 -04:00
skip_list = [ " hda " , " fdb " ] )
def testCloneFullPool ( self ) :
base = " fullpool "
try :
self . _clone_helper ( base , disks = [ " /full-pool/test.img " ] ,
compare = False )
except Exception :
return
raise AssertionError ( " Expected exception, but none raised. " )
2017-03-06 09:43:10 +01:00
def testCloneNvramAuto ( self ) :
base = " nvram-auto "
self . _clone_helper ( base )
2017-07-18 15:42:11 -04:00
def testCloneNvramNewpool ( self ) :
base = " nvram-newpool "
self . _clone_helper ( base )
2017-09-15 18:34:58 +02:00
def testCloneGraphicsPassword ( self ) :
base = " graphics-password "
self . _clone_helper ( base )