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 difflib
import os
import logging
import libvirt
import virtinst
import virtinst . cli
2014-02-04 00:53:54 +04:00
# DON'T EDIT THIS. Use 'setup.py test --regenerate-output'
REGENERATE_OUTPUT = False
2014-01-31 22:44:50 +04:00
2014-04-03 02:39:43 +04:00
# pylint: disable=protected-access
2013-04-12 00:32:00 +04:00
# Access to protected member, needed to unittest stuff
2013-08-18 16:19:58 +04:00
_capsprefix = " ,caps= %s /tests/capabilities-xml/ " % os . getcwd ( )
2015-02-18 22:49:53 +03:00
_domcapsprefix = " ,domcaps= %s /tests/capabilities-xml/ " % os . getcwd ( )
2015-04-23 00:06:35 +03:00
uri_test_default = " __virtinst_test__test:///default,predictable "
uri_test = " __virtinst_test__test:/// %s /tests/testdriver.xml,predictable " % os . getcwd ( )
uri_test_remote = uri_test + " ,remote "
_uri_qemu = " %s ,qemu " % uri_test
2015-04-23 02:27:27 +03:00
_uri_kvm_domcaps = ( _uri_qemu + _domcapsprefix + " kvm-x86_64-domcaps.xml " )
2015-04-23 00:06:35 +03:00
uri_kvm_nodomcaps = ( _uri_qemu + _capsprefix + " kvm-x86_64.xml " )
2015-04-23 02:27:27 +03:00
uri_kvm_rhel = ( _uri_kvm_domcaps + _capsprefix + " kvm-x86_64-rhel7.xml " )
uri_kvm = ( _uri_kvm_domcaps + _capsprefix + " kvm-x86_64.xml " )
uri_kvm_armv7l = ( _uri_kvm_domcaps + _capsprefix + " kvm-armv7l.xml " )
uri_kvm_aarch64 = ( _uri_kvm_domcaps + _capsprefix + " kvm-aarch64.xml " )
uri_kvm_ppc64le = ( _uri_kvm_domcaps + _capsprefix + " kvm-ppc64le.xml " )
2015-04-23 00:06:35 +03:00
uri_xen = uri_test + _capsprefix + " xen-rhel5.4.xml,xen "
uri_lxc = uri_test + _capsprefix + " lxc.xml,lxc "
2013-03-18 01:06:52 +04:00
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def get_debug ( ) :
return ( " DEBUG_TESTS " in os . environ and
os . environ [ " DEBUG_TESTS " ] == " 1 " )
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def _make_uri ( base , connver = None , libver = None ) :
if connver :
base + = " ,connver= %s " % connver
if libver :
base + = " ,libver= %s " % libver
return base
2013-04-13 22:34:52 +04:00
2013-09-29 05:03:03 +04:00
_conn_cache = { }
def openconn ( uri ) :
"""
Extra super caching to speed up the test suite . We basically
cache the first guest / pool / vol poll attempt for each URI , and save it
across multiple reopenings of that connection . We aren ' t caching
libvirt objects , just parsed XML objects . This works fine since
generally every test uses a fresh virConnect , or undoes the
persistent changes it makes .
"""
2014-09-20 19:37:23 +04:00
virtinst . util . register_libvirt_error_handler ( )
2013-09-29 05:03:03 +04:00
conn = virtinst . cli . getConnection ( uri )
if uri not in _conn_cache :
_conn_cache [ uri ] = { }
2014-02-09 01:36:45 +04:00
_conn_cache [ uri ] [ " vms " ] = conn . _fetch_all_guests_cached ( )
_conn_cache [ uri ] [ " pools " ] = conn . _fetch_all_pools_cached ( )
_conn_cache [ uri ] [ " vols " ] = conn . _fetch_all_vols_cached ( )
2014-09-20 19:30:24 +04:00
_conn_cache [ uri ] [ " nodedevs " ] = conn . _fetch_all_nodedevs_cached ( )
2014-02-09 01:36:45 +04:00
cache = _conn_cache [ uri ] . copy ( )
2013-09-29 05:03:03 +04:00
def cb_fetch_all_guests ( ) :
return cache [ " vms " ]
2014-09-20 19:30:24 +04:00
def cb_fetch_all_nodedevs ( ) :
return cache [ " nodedevs " ]
2013-09-29 05:03:03 +04:00
def cb_fetch_all_pools ( ) :
if " pools " not in cache :
cache [ " pools " ] = conn . _fetch_all_pools_cached ( )
return cache [ " pools " ]
def cb_fetch_all_vols ( ) :
if " vols " not in cache :
cache [ " vols " ] = conn . _fetch_all_vols_cached ( )
return cache [ " vols " ]
2014-01-18 23:57:39 +04:00
def cb_clear_cache ( pools = False ) :
if pools :
cache . pop ( " pools " , None )
2014-02-09 01:36:45 +04:00
cache . pop ( " vols " , None )
2013-09-29 05:03:03 +04:00
conn . cb_fetch_all_guests = cb_fetch_all_guests
conn . cb_fetch_all_pools = cb_fetch_all_pools
conn . cb_fetch_all_vols = cb_fetch_all_vols
2014-09-20 19:30:24 +04:00
conn . cb_fetch_all_nodedevs = cb_fetch_all_nodedevs
2014-01-18 23:57:39 +04:00
conn . cb_clear_cache = cb_clear_cache
2013-09-29 05:03:03 +04:00
return conn
2013-07-05 16:59:58 +04:00
def open_testdefault ( ) :
2015-04-23 00:06:35 +03:00
return openconn ( uri_test_default )
2013-07-05 16:59:58 +04:00
2013-03-18 01:06:52 +04:00
def open_testdriver ( ) :
2015-04-23 00:06:35 +03:00
return openconn ( uri_test )
2013-04-13 22:34:52 +04:00
2015-04-23 00:06:35 +03:00
def open_kvm ( connver = None , libver = None ) :
return openconn ( _make_uri ( uri_kvm , connver , libver ) )
2015-03-23 23:48:43 +03:00
2015-04-23 00:06:35 +03:00
def open_kvm_rhel ( connver = None ) :
return openconn ( _make_uri ( uri_kvm_rhel , connver ) )
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def open_test_remote ( ) :
2015-04-23 00:06:35 +03:00
return openconn ( uri_test_remote )
2013-03-18 01:06:52 +04:00
2013-04-13 22:34:52 +04:00
2014-12-09 19:33:43 +03:00
def _libvirt_callback ( ignore , err ) :
2013-03-18 01:06:52 +04:00
logging . warn ( " libvirt errmsg: %s " , err [ 2 ] )
2014-12-09 19:33:43 +03:00
libvirt . registerErrorHandler ( f = _libvirt_callback , ctx = None )
2013-03-18 01:06:52 +04:00
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def sanitize_xml_for_define ( xml ) :
# Libvirt throws errors since we are defining domain
# type='xen', when test driver can only handle type='test'
# Sanitize the XML so we can define
if not xml :
return xml
xml = xml . replace ( " >linux< " , " >xen< " )
2013-07-12 22:19:54 +04:00
for t in [ " xen " , " qemu " , " kvm " ] :
xml = xml . replace ( " <domain type= \" %s \" > " % t ,
" <domain type= \" test \" > " )
xml = xml . replace ( " <domain type= ' %s ' > " % t ,
" <domain type= ' test ' > " )
2013-03-18 01:06:52 +04:00
return xml
2013-04-13 22:34:52 +04:00
2013-09-10 01:14:16 +04:00
def test_create ( testconn , xml , define_func = " defineXML " ) :
2013-03-18 01:06:52 +04:00
xml = sanitize_xml_for_define ( xml )
2013-06-14 22:58:52 +04:00
try :
2013-09-10 01:14:16 +04:00
func = getattr ( testconn , define_func )
obj = func ( xml )
2013-06-14 22:58:52 +04:00
except Exception , e :
raise RuntimeError ( str ( e ) + " \n " + xml )
2013-03-18 01:06:52 +04:00
try :
2013-09-10 01:14:16 +04:00
obj . create ( )
obj . destroy ( )
obj . undefine ( )
2013-03-18 01:06:52 +04:00
except :
try :
2013-09-10 01:14:16 +04:00
obj . destroy ( )
2013-03-18 01:06:52 +04:00
except :
pass
try :
2013-09-10 01:14:16 +04:00
obj . undefine ( )
2013-03-18 01:06:52 +04:00
except :
pass
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def read_file ( filename ) :
""" Helper function to read a files contents and return them """
f = open ( filename , " r " )
out = f . read ( )
f . close ( )
return out
2013-04-13 22:34:52 +04:00
2013-03-18 01:06:52 +04:00
def diff_compare ( actual_out , filename = None , expect_out = None ) :
""" Compare passed string output to contents of filename """
if not expect_out :
2014-01-31 22:44:50 +04:00
if not os . path . exists ( filename ) or REGENERATE_OUTPUT :
file ( filename , " w " ) . write ( actual_out )
2013-03-18 01:06:52 +04:00
expect_out = read_file ( filename )
diff = " " . join ( difflib . unified_diff ( expect_out . splitlines ( 1 ) ,
actual_out . splitlines ( 1 ) ,
fromfile = filename ,
tofile = " Generated Output " ) )
if diff :
raise AssertionError ( " Conversion outputs did not match. \n %s " % diff )