[PATCH] [Kimchi 0/8] Run test_model with regular user

Lucio Correia (8): Do not hardcode default directories Always use /var/tmp to store test files Mock default storage pools and networks for testing Use "qemu:///session" as test_model libvirt uri Remove 'run as root' requirement from some tests Skip tests that need to run as root Make test_use_test_host architecture independent Mock user probe functions model/storagepools.py | 5 +- osinfo.py | 12 +- tests/test_model.py | 407 +++++++++++++++++++++++++++++++++++++------------- 3 files changed, 321 insertions(+), 103 deletions(-) -- 2.7.4

Do not hardcode default directories in storagepools and osinfo code and at the same time make those directories overwritable by tests. Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- model/storagepools.py | 5 +++-- osinfo.py | 12 +++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/model/storagepools.py b/model/storagepools.py index e6f5e58..3bd7086 100644 --- a/model/storagepools.py +++ b/model/storagepools.py @@ -31,6 +31,7 @@ from wok.plugins.kimchi.config import config, get_kimchi_version, kimchiPaths from wok.plugins.kimchi.model.config import CapabilitiesModel from wok.plugins.kimchi.model.host import DeviceModel from wok.plugins.kimchi.model.libvirtstoragepool import StoragePoolDef +from wok.plugins.kimchi.osinfo import get_default_pools from wok.plugins.kimchi.osinfo import defaults as tmpl_defaults from wok.plugins.kimchi.scan import Scanner from wok.plugins.kimchi.utils import pool_name_from_uri, is_s390x @@ -83,10 +84,10 @@ class StoragePoolsModel(object): pools[default_pool] = {} if default_pool == 'default': - pools[default_pool] = {'path': '/var/lib/libvirt/images'} + pools[default_pool] = {'path': get_default_pools()[default_pool]} if config.get('kimchi', {}).get('create_iso_pool', False): - pools['ISO'] = {'path': '/var/lib/kimchi/isos'} + pools['ISO'] = {'path': get_default_pools()['ISO']} conn = self.conn.get() for pool_name in pools: diff --git a/osinfo.py b/osinfo.py index 8de917f..60a454f 100644 --- a/osinfo.py +++ b/osinfo.py @@ -31,6 +31,11 @@ from wok.utils import wok_log from wok.exception import InvalidParameter from wok.plugins.kimchi.config import kimchiPaths + +DEFAULT_POOLS = { + 'default': '/var/lib/libvirt/images', + 'ISO': '/var/lib/kimchi/isos', +} SUPPORTED_ARCHS = {'x86': ('i386', 'i686', 'x86_64'), 'power': ('ppc', 'ppc64'), 'ppc64le': ('ppc64le'), @@ -108,6 +113,10 @@ icon_available_distros = [icon[5:-4] for icon in glob.glob1('%s/images/' % PluginPaths('kimchi').ui_dir, 'icon-*.png')] +def get_default_pools(): + return DEFAULT_POOLS + + def _get_arch(): for arch, sub_archs in SUPPORTED_ARCHS.iteritems(): if os.uname()[4] in sub_archs: @@ -167,7 +176,8 @@ def _get_tmpl_defaults(): is_on_s390x = True if _get_arch() == 's390x' else False if is_on_s390x: - tmpl_defaults['storage']['disk.0']['path'] = '/var/lib/libvirt/images/' + tmpl_defaults['storage']['disk.0']['path'] = \ + get_default_pools()['default'] del tmpl_defaults['storage']['disk.0']['pool'] tmpl_defaults['processor']['vcpus'] = 1 -- 2.7.4

Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- tests/test_model.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/tests/test_model.py b/tests/test_model.py index 95c9e08..e1b957c 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -31,6 +31,7 @@ import platform import pwd import re import shutil +import tempfile import time import unittest @@ -65,8 +66,12 @@ invalid_repository_urls = ['www.fedora.org', # missing protocol 'http://www.fedora', # invalid domain name 'file:///home/foobar'] # invalid path -TMP_DIR = '/var/lib/kimchi/tests/' +BASE_DIR = tempfile.mkdtemp(dir='/var/tmp') +DEFAULT_DIR = os.path.join(BASE_DIR, 'libvirt/images') +ISO_DIR = os.path.join(BASE_DIR, 'kimchi/isos') +TMP_DIR = os.path.join(BASE_DIR, 'kimchi/tests') UBUNTU_ISO = TMP_DIR + 'ubuntu14.04.iso' + NON_NUMA_XML = """ <domain type='kvm'> <name>non-numa-kimchi-test</name> @@ -83,8 +88,10 @@ NON_NUMA_XML = """ def setUpModule(): - if not os.path.exists(TMP_DIR): - os.makedirs(TMP_DIR) + print __file__, "creating pools at", BASE_DIR + os.makedirs(DEFAULT_DIR) + os.makedirs(ISO_DIR) + os.makedirs(TMP_DIR) iso_gen.construct_fake_iso(UBUNTU_ISO, True, '14.04', 'ubuntu') @@ -98,7 +105,21 @@ def setUpModule(): def tearDownModule(): - shutil.rmtree(TMP_DIR) + # Model will create default and ISO storagepools at /var/tmp: delete them. + conn = libvirt.open('qemu:///session') + + pool = conn.storagePoolLookupByName('default') + pool and pool.isActive() and pool.destroy() + pool and pool.undefine() + + pool = conn.storagePoolLookupByName('ISO') + pool and pool.isActive() and pool.destroy() + pool and pool.undefine() + + conn.close() + + # delete temporary directory contents + shutil.rmtree(BASE_DIR) def get_remote_iso_path(): -- 2.7.4

Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- tests/test_model.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/test_model.py b/tests/test_model.py index e1b957c..64085a0 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -86,8 +86,28 @@ NON_NUMA_XML = """ </features> </domain>""" +net_validate_patch = None +net_validate = None + def setUpModule(): + global net_validate_patch + global net_validate + + # mock default networks + config = {'method.return_value': True} + net_validate_patch = mock.patch('wok.plugins.kimchi.model.templates.' + 'LibvirtVMTemplate._network_validate', + **config) + net_validate = net_validate_patch.start() + + # mock osinfo defaults + osinfo.defaults['networks'] = [] + osinfo.DEFAULT_POOLS = { + 'default': DEFAULT_DIR, + 'ISO': ISO_DIR, + } + print __file__, "creating pools at", BASE_DIR os.makedirs(DEFAULT_DIR) os.makedirs(ISO_DIR) @@ -105,6 +125,9 @@ def setUpModule(): def tearDownModule(): + global net_validate_patch + net_validate_patch.stop() + # Model will create default and ISO storagepools at /var/tmp: delete them. conn = libvirt.open('qemu:///session') -- 2.7.4

Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- tests/test_model.py | 59 +++++++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/tests/test_model.py b/tests/test_model.py index 64085a0..78c291e 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -164,16 +164,6 @@ def get_remote_iso_path(): return remote_path -def _setDiskPoolDefault(): - osinfo.defaults['disks'][0]['pool'] = { - 'name': '/plugins/kimchi/storagepools/default'} - - -def _setDiskPoolDefaultTest(): - osinfo.defaults['disks'][0]['pool'] = { - 'name': '/plugins/kimchi/storagepools/default-pool'} - - class ModelTests(unittest.TestCase): def setUp(self): self.tmp_store = '/tmp/kimchi-store-test' @@ -181,7 +171,7 @@ class ModelTests(unittest.TestCase): def tearDown(self): # FIXME: Tests using 'test:///default' URI should be moved to # test_rest or test_mockmodel to avoid overriding problems - LibvirtConnection._connections['test:///default'] = {} + LibvirtConnection._connections['qemu:///session'] = {} if os.path.isfile(self.tmp_store): os.unlink(self.tmp_store) @@ -1120,7 +1110,7 @@ class ModelTests(unittest.TestCase): def test_vm_memory_hotplug(self): config.set("authentication", "method", "pam") - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) orig_params = {'name': 'test', 'memory': {'current': 1024, 'maxmemory': 4096 @@ -1226,7 +1216,7 @@ class ModelTests(unittest.TestCase): @unittest.skipUnless(('ppc64' in os.uname()[4]), msg) def test_non_numa_vm_memory_hotplug(self): config.set("authentication", "method", "pam") - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) conn = inst.conn.get() vm = 'non-numa-kimchi-test' @@ -1471,21 +1461,21 @@ class ModelTests(unittest.TestCase): xml = """<domain type='kvm'>\ <cpu><topology sockets='3' cores='2' threads='8'/></cpu>\ </domain>""" - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual('2', inst.vm_get_vm_cpu_cores(xml)) def test_get_vm_cpu_sockets(self): xml = """<domain type='kvm'>\ <cpu><topology sockets='3' cores='2' threads='8'/></cpu>\ </domain>""" - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual('3', inst.vm_get_vm_cpu_sockets(xml)) def test_get_vm_cpu_threads(self): xml = """<domain type='kvm'>\ <cpu><topology sockets='3' cores='2' threads='8'/></cpu>\ </domain>""" - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual('8', inst.vm_get_vm_cpu_threads(xml)) @mock.patch('wok.plugins.kimchi.model.vms.VMModel.has_topology') @@ -1502,7 +1492,7 @@ class ModelTests(unittest.TestCase): mock_has_topology.return_value = True expected_topology = {'sockets': 3, 'cores': 2, 'threads': 8} - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual(expected_topology, inst.vm_get_vm_cpu_topology(FakeDom())) @@ -1518,12 +1508,12 @@ class ModelTests(unittest.TestCase): mock_has_topology.return_value = False expected_topology = {} - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual(expected_topology, inst.vm_get_vm_cpu_topology(FakeDom())) def test_vm_cpu_hotplug_invalidparam_fail(self): - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) with self.assertRaisesRegexp(InvalidParameter, 'KCHCPUHOTP0001E'): params = {"cpu_info": {"vcpus": 1, 'maxvcpus': 4}} @@ -1541,7 +1531,7 @@ class ModelTests(unittest.TestCase): return 'fakedom' mock_has_topology.return_value = False - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) with self.assertRaisesRegexp(InvalidParameter, 'KCHCPUINF0001E'): params = {"cpu_info": {"vcpus": 16}} @@ -1563,7 +1553,7 @@ class ModelTests(unittest.TestCase): mock_has_topology.return_value = True mock_topology.return_value = {'sockets': 3, 'cores': 2, 'threads': 8} - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) with self.assertRaisesRegexp(InvalidParameter, 'KCHCPUINF0005E'): params = {"cpu_info": {"vcpus": 10}} @@ -1574,13 +1564,12 @@ class ModelTests(unittest.TestCase): def setVcpusFlags(self, vcpu, flags): raise libvirt.libvirtError('') - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) with self.assertRaisesRegexp(OperationFailed, 'KCHCPUHOTP0002E'): inst.vm_update_cpu_live(FakeDom(), '') def test_get_interfaces(self): - inst = model.Model('test:///default', - objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) expected_ifaces = netinfo.all_favored_interfaces() ifaces = inst.interfaces_get_list() self.assertEquals(len(expected_ifaces), len(ifaces)) @@ -1616,8 +1605,7 @@ class ModelTests(unittest.TestCase): time.sleep(2) cb("step 3 OK", params.get('result', True)) - inst = model.Model('test:///default', - objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) taskid = AsyncTask('', quick_op, 'Hello').id inst.task_wait(taskid) self.assertEquals('finished', inst.task_lookup(taskid)['status']) @@ -1742,21 +1730,17 @@ class ModelTests(unittest.TestCase): self.assertEquals(original_vm, clone_vm) def test_use_test_host(self): - inst = model.Model('test:///default', - objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: params = { 'name': 'test', 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}, - 'domain': 'test', + 'domain': 'kvm', 'arch': 'i686', 'disks': [] } - _setDiskPoolDefaultTest() - rollback.prependDefer(_setDiskPoolDefault) - inst.templates_create(params) rollback.prependDefer(inst.template_delete, 'test') @@ -1771,8 +1755,7 @@ class ModelTests(unittest.TestCase): self.assertTrue('kimchi-vm' in vms) def test_get_distros(self): - inst = model.Model('test:///default', - objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) distros = inst.distros_get_list() for d in distros: distro = inst.distro_lookup(d) @@ -1814,7 +1797,7 @@ class ModelTests(unittest.TestCase): @unittest.skipUnless(_host_is_power(), 'Only required for Power hosts') def test_pci_hotplug_requires_usb_controller(self): config.set("authentication", "method", "pam") - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) tpl_params = {'name': 'test', 'memory': 1024, 'cdrom': UBUNTU_ISO} inst.templates_create(tpl_params) @@ -1913,7 +1896,7 @@ multifunction='on'/> """ def test_vmhostdev_is_hostdev_multifunction(self): - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) hostdev_multi_elem = objectify.fromstring( self.get_hostdev_multifunction_xml() @@ -1930,7 +1913,7 @@ multifunction='on'/> ) def test_vmhostdev_get_devices_same_addr(self): - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) root = objectify.fromstring(self.get_hostdevs_xml()) hostdevs = root.devices.hostdev @@ -1971,7 +1954,7 @@ multifunction='on'/> mock_conf_flag.return_value = '' - inst = model.Model(None, objstore_loc=self.tmp_store) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) root = objectify.fromstring(self.get_hostdevs_xml()) hostdevs = root.devices.hostdev -- 2.7.4

Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- tests/test_model.py | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/tests/test_model.py b/tests/test_model.py index 78c291e..8595862 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -381,11 +381,10 @@ class ModelTests(unittest.TestCase): info = inst.vm_lookup('kimchi-vm') self.assertEquals('running', info['state']) - @unittest.skipUnless(utils.running_as_root() and - os.uname()[4] != "s390x", 'Must be run as root') + @unittest.skipUnless(os.uname()[4] != "s390x", 'Not applicable to s390x') def test_vm_graphics(self): - inst = model.Model(objstore_loc=self.tmp_store) - params = {'name': 'test', + inst = model.Model('qemu:///session', self.tmp_store) + params = {'name': 'test', 'domain': 'kvm', 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} inst.templates_create(params) with RollbackContext() as rollback: @@ -409,10 +408,9 @@ class ModelTests(unittest.TestCase): inst.template_delete('test') - @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_vm_virtviewerfile_vmnotrunning(self): - inst = model.Model(objstore_loc=self.tmp_store) - params = {'name': 'test', + inst = model.Model('qemu:///session', self.tmp_store) + params = {'name': 'test', 'domain': 'kvm', 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} inst.templates_create(params) @@ -972,14 +970,14 @@ class ModelTests(unittest.TestCase): cur_cdrom_path = re.sub(":80/", '/', cdrom_info['path']) self.assertEquals(valid_remote_iso_path, cur_cdrom_path) - @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_vm_storage_provisioning(self): - inst = model.Model(objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: params = {'name': 'test', 'disks': [{'size': 1, 'pool': { 'name': '/plugins/kimchi/storagepools/default'}}], - 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} + 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}, + 'domain': 'kvm'} inst.templates_create(params) rollback.prependDefer(inst.template_delete, 'test') @@ -1029,9 +1027,8 @@ class ModelTests(unittest.TestCase): xpath = "/domain/devices/disk[@device='disk']/driver/@type" return xpath_get_text(xml, xpath)[0] - @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_template_get_default_vol_format_from_conf(self): - inst = model.Model(objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: self._create_template_conf_with_disk_format('vmdk') @@ -1039,7 +1036,8 @@ class ModelTests(unittest.TestCase): params = {'name': 'test', 'disks': [{'size': 1, 'pool': { 'name': '/plugins/kimchi/storagepools/default'}}], - 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} + 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}, + 'domain': 'kvm'} inst.templates_create(params) rollback.prependDefer(inst.template_delete, 'test') @@ -1054,9 +1052,8 @@ class ModelTests(unittest.TestCase): ) self.assertEqual(created_disk_format, 'vmdk') - @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_template_creates_user_defined_vol_format_instead_default(self): - inst = model.Model(objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) default_vol = 'vmdk' user_vol = 'raw' @@ -1064,7 +1061,7 @@ class ModelTests(unittest.TestCase): self._create_template_conf_with_disk_format(default_vol) rollback.prependDefer(self._restore_template_conf_file) - params = {'name': 'test', 'disks': [{ + params = {'name': 'test', 'domain': 'kvm', 'disks': [{ 'size': 1, 'format': user_vol, 'pool': {'name': '/plugins/kimchi/storagepools/default'}}], 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} @@ -1083,9 +1080,8 @@ class ModelTests(unittest.TestCase): ) self.assertEqual(created_disk_format, user_vol) - @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_template_uses_qcow2_format_if_no_user_or_default_defined(self): - inst = model.Model(objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: self._create_template_conf_with_disk_format(None) @@ -1093,7 +1089,8 @@ class ModelTests(unittest.TestCase): params = {'name': 'test', 'disks': [{'size': 1, 'pool': { 'name': '/plugins/kimchi/storagepools/default'}}], - 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} + 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}, + 'domain': 'kvm'} inst.templates_create(params) rollback.prependDefer(inst.template_delete, 'test') @@ -1659,12 +1656,11 @@ class ModelTests(unittest.TestCase): vms = inst.vms_get_list() self.assertFalse(u'kīмсhī-∨м' in vms) - @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_vm_list_sorted(self): - inst = model.Model(objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: - params = {'name': 'test', 'disks': [], + params = {'name': 'test', 'disks': [], 'domain': 'kvm', 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} inst.templates_create(params) rollback.prependDefer(inst.template_delete, 'test') @@ -1765,10 +1761,9 @@ class ModelTests(unittest.TestCase): self.assertIn('os_arch', distro) self.assertIn('path', distro) - @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_deep_scan(self): - inst = model.Model(None, - objstore_loc=self.tmp_store) + inst = model.Model('qemu:///session', self.tmp_store) + with RollbackContext() as rollback: deep_path = os.path.join(TMP_DIR, 'deep-scan') subdir_path = os.path.join(deep_path, 'isos') -- 2.7.4

Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- tests/test_model.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tests/test_model.py b/tests/test_model.py index 8595862..8f7f147 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -512,6 +512,7 @@ class ModelTests(unittest.TestCase): mock_handleVMOff.assert_called_once_with('kimchi-vm') mock_add_port.assert_called_once_with('kimchi-vm', '6660') + @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') @mock.patch('wok.plugins.kimchi.model.virtviewerfile.run_command') def test_firewall_provider_firewallcmd(self, mock_run_cmd): mock_run_cmd.side_effect = [ @@ -530,6 +531,7 @@ class ModelTests(unittest.TestCase): mock.call(['firewall-cmd', '--add-port=5905/tcp']), mock.call(['firewall-cmd', '--remove-port=5905/tcp'])]) + @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') @mock.patch('wok.plugins.kimchi.model.virtviewerfile.run_command') def test_firewall_provider_ufw(self, mock_run_cmd): mock_run_cmd.side_effect = [ @@ -549,6 +551,7 @@ class ModelTests(unittest.TestCase): mock.call(['ufw', 'allow', '5905/tcp']), mock.call(['ufw', 'deny', '5905/tcp'])]) + @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') @mock.patch('wok.plugins.kimchi.model.virtviewerfile.run_command') def test_firewall_provider_iptables(self, mock_run_cmd): mock_run_cmd.side_effect = [ @@ -1105,6 +1108,7 @@ class ModelTests(unittest.TestCase): ) self.assertEqual(created_disk_format, 'qcow2') + @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_vm_memory_hotplug(self): config.set("authentication", "method", "pam") inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) @@ -1208,9 +1212,12 @@ class ModelTests(unittest.TestCase): self.assertRaises(InvalidOperation, inst.vm_update, 'kimchi-vm1', params) + def _host_is_power(): + return platform.machine().startswith('ppc') + msg = "Memory hotplug in non-numa guests only for PowerPC arch." - @unittest.skipUnless(('ppc64' in os.uname()[4]), msg) + @unittest.skipUnless(utils.running_as_root() and _host_is_power(), msg) def test_non_numa_vm_memory_hotplug(self): config.set("authentication", "method", "pam") inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) @@ -1254,6 +1261,7 @@ class ModelTests(unittest.TestCase): self.assertEquals(params['memory']['current'], inst.vm_lookup(vm)['memory']['current']) + @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_vm_edit(self): config.set("authentication", "method", "pam") inst = model.Model(None, @@ -1786,10 +1794,8 @@ class ModelTests(unittest.TestCase): volumes = inst.storagevolumes_get_list(args['name']) self.assertEquals(len(volumes), 2) - def _host_is_power(): - return platform.machine().startswith('ppc') - - @unittest.skipUnless(_host_is_power(), 'Only required for Power hosts') + @unittest.skipUnless(utils.running_as_root() and _host_is_power(), + 'Only required for Power hosts') def test_pci_hotplug_requires_usb_controller(self): config.set("authentication", "method", "pam") inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) -- 2.7.4

Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- tests/test_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_model.py b/tests/test_model.py index 8f7f147..4579ded 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -1741,7 +1741,7 @@ class ModelTests(unittest.TestCase): 'name': 'test', 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}, 'domain': 'kvm', - 'arch': 'i686', + 'arch': os.uname()[4], 'disks': [] } -- 2.7.4

Signed-off-by: Lucio Correia <luciojhc@linux.vnet.ibm.com> --- tests/test_model.py | 237 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 208 insertions(+), 29 deletions(-) diff --git a/tests/test_model.py b/tests/test_model.py index 4579ded..11c6fab 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -176,7 +176,13 @@ class ModelTests(unittest.TestCase): if os.path.isfile(self.tmp_store): os.unlink(self.tmp_store) - def test_vm_info(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vm_info(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('test:///default', self.tmp_store) vms = inst.vms_get_list() self.assertEquals(1, len(vms)) @@ -381,8 +387,14 @@ class ModelTests(unittest.TestCase): info = inst.vm_lookup('kimchi-vm') self.assertEquals('running', info['state']) - @unittest.skipUnless(os.uname()[4] != "s390x", 'Not applicable to s390x') - def test_vm_graphics(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + @unittest.skipUnless(os.uname()[4] != 's390x', "Not applicable to s390x") + def test_vm_graphics(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) params = {'name': 'test', 'domain': 'kvm', 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} @@ -408,7 +420,14 @@ class ModelTests(unittest.TestCase): inst.template_delete('test') - def test_vm_virtviewerfile_vmnotrunning(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vm_virtviewerfile_vmnotrunning(self, mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) params = {'name': 'test', 'domain': 'kvm', 'source_media': {'type': 'disk', 'path': UBUNTU_ISO}} @@ -973,7 +992,14 @@ class ModelTests(unittest.TestCase): cur_cdrom_path = re.sub(":80/", '/', cdrom_info['path']) self.assertEquals(valid_remote_iso_path, cur_cdrom_path) - def test_vm_storage_provisioning(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vm_storage_provisioning(self, mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: @@ -1030,7 +1056,15 @@ class ModelTests(unittest.TestCase): xpath = "/domain/devices/disk[@device='disk']/driver/@type" return xpath_get_text(xml, xpath)[0] - def test_template_get_default_vol_format_from_conf(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_template_get_default_vol_format_from_conf(self, + mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: @@ -1055,7 +1089,14 @@ class ModelTests(unittest.TestCase): ) self.assertEqual(created_disk_format, 'vmdk') - def test_template_creates_user_defined_vol_format_instead_default(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_template_creates_user_defined_vol_format_instead_default( + self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) default_vol = 'vmdk' @@ -1083,7 +1124,14 @@ class ModelTests(unittest.TestCase): ) self.assertEqual(created_disk_format, user_vol) - def test_template_uses_qcow2_format_if_no_user_or_default_defined(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_template_uses_qcow2_format_if_no_user_or_default_defined( + self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: @@ -1218,7 +1266,14 @@ class ModelTests(unittest.TestCase): msg = "Memory hotplug in non-numa guests only for PowerPC arch." @unittest.skipUnless(utils.running_as_root() and _host_is_power(), msg) - def test_non_numa_vm_memory_hotplug(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_non_numa_vm_memory_hotplug(self, mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + config.set("authentication", "method", "pam") inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) conn = inst.conn.get() @@ -1462,29 +1517,51 @@ class ModelTests(unittest.TestCase): inst.vm_update(u'пeω-∨м', {"bootmenu": False}) self.assertEquals("no", inst.vm_lookup(u'пeω-∨м')['bootmenu']) - def test_get_vm_cpu_cores(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_get_vm_cpu_cores(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + xml = """<domain type='kvm'>\ <cpu><topology sockets='3' cores='2' threads='8'/></cpu>\ </domain>""" inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual('2', inst.vm_get_vm_cpu_cores(xml)) - def test_get_vm_cpu_sockets(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_get_vm_cpu_sockets(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + xml = """<domain type='kvm'>\ <cpu><topology sockets='3' cores='2' threads='8'/></cpu>\ </domain>""" inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual('3', inst.vm_get_vm_cpu_sockets(xml)) - def test_get_vm_cpu_threads(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_get_vm_cpu_threads(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + xml = """<domain type='kvm'>\ <cpu><topology sockets='3' cores='2' threads='8'/></cpu>\ </domain>""" inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) self.assertEqual('8', inst.vm_get_vm_cpu_threads(xml)) + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') @mock.patch('wok.plugins.kimchi.model.vms.VMModel.has_topology') - def test_get_vm_cpu_topology(self, mock_has_topology): + def test_get_vm_cpu_topology(self, mock_has_topology, mock_probe_file_perm, + mock_probe_user): class FakeDom(): def XMLDesc(self, flag): return """<domain type='kvm'>\ @@ -1494,6 +1571,8 @@ class ModelTests(unittest.TestCase): def name(self): return 'fakedom' + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) mock_has_topology.return_value = True expected_topology = {'sockets': 3, 'cores': 2, 'threads': 8} @@ -1501,8 +1580,12 @@ class ModelTests(unittest.TestCase): self.assertEqual(expected_topology, inst.vm_get_vm_cpu_topology(FakeDom())) + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') @mock.patch('wok.plugins.kimchi.model.vms.VMModel.has_topology') - def test_get_vm_cpu_topology_blank(self, mock_has_topology): + def test_get_vm_cpu_topology_blank(self, mock_has_topology, + mock_probe_file_perm, mock_probe_user): class FakeDom(): def XMLDesc(self, flag): return """<domain type='kvm'></domain>""" @@ -1510,6 +1593,8 @@ class ModelTests(unittest.TestCase): def name(self): return 'fakedom' + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) mock_has_topology.return_value = False expected_topology = {} @@ -1517,15 +1602,27 @@ class ModelTests(unittest.TestCase): self.assertEqual(expected_topology, inst.vm_get_vm_cpu_topology(FakeDom())) - def test_vm_cpu_hotplug_invalidparam_fail(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vm_cpu_hotplug_invalidparam_fail(self, mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) with self.assertRaisesRegexp(InvalidParameter, 'KCHCPUHOTP0001E'): params = {"cpu_info": {"vcpus": 1, 'maxvcpus': 4}} inst.vm_cpu_hotplug_precheck('', params) + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') @mock.patch('wok.plugins.kimchi.model.vms.VMModel.has_topology') - def test_vm_cpu_hotplug_abovemax_fail(self, mock_has_topology): + def test_vm_cpu_hotplug_abovemax_fail(self, mock_has_topology, + mock_probe_file_perm, + mock_probe_user): class FakeDom(): def XMLDesc(self, flag): return """<domain type='kvm'>\ @@ -1535,6 +1632,8 @@ class ModelTests(unittest.TestCase): def name(self): return 'fakedom' + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) mock_has_topology.return_value = False inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) @@ -1542,10 +1641,15 @@ class ModelTests(unittest.TestCase): params = {"cpu_info": {"vcpus": 16}} inst.vm_cpu_hotplug_precheck(FakeDom(), params) + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') @mock.patch('wok.plugins.kimchi.model.vms.VMModel.has_topology') @mock.patch('wok.plugins.kimchi.model.vms.VMModel.get_vm_cpu_topology') def test_vm_cpu_hotplug_topology_mismatch_fail(self, mock_topology, - mock_has_topology): + mock_has_topology, + mock_probe_file_perm, + mock_probe_user): class FakeDom(): def XMLDesc(self, flag): return """<domain type='kvm'>\ @@ -1555,6 +1659,8 @@ class ModelTests(unittest.TestCase): def name(self): return 'fakedom' + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) mock_has_topology.return_value = True mock_topology.return_value = {'sockets': 3, 'cores': 2, 'threads': 8} @@ -1564,16 +1670,28 @@ class ModelTests(unittest.TestCase): params = {"cpu_info": {"vcpus": 10}} inst.vm_cpu_hotplug_precheck(FakeDom(), params) - def test_vm_cpu_hotplug_error(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vm_cpu_hotplug_error(self, mock_probe_file_perm, mock_probe_user): class FakeDom(): def setVcpusFlags(self, vcpu, flags): raise libvirt.libvirtError('') + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) with self.assertRaisesRegexp(OperationFailed, 'KCHCPUHOTP0002E'): inst.vm_update_cpu_live(FakeDom(), '') - def test_get_interfaces(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_get_interfaces(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) expected_ifaces = netinfo.all_favored_interfaces() ifaces = inst.interfaces_get_list() @@ -1586,7 +1704,10 @@ class ModelTests(unittest.TestCase): self.assertIn('ipaddr', iface) self.assertIn('netmask', iface) - def test_async_tasks(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_async_tasks(self, mock_probe_file_perm, mock_probe_user): class task_except(Exception): pass @@ -1610,6 +1731,9 @@ class ModelTests(unittest.TestCase): time.sleep(2) cb("step 3 OK", params.get('result', True)) + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) taskid = AsyncTask('', quick_op, 'Hello').id inst.task_wait(taskid) @@ -1664,7 +1788,13 @@ class ModelTests(unittest.TestCase): vms = inst.vms_get_list() self.assertFalse(u'kīмсhī-∨м' in vms) - def test_vm_list_sorted(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vm_list_sorted(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: @@ -1683,7 +1813,13 @@ class ModelTests(unittest.TestCase): self.assertEquals(vms, sorted(vms, key=unicode.lower)) - def test_vm_clone(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vm_clone(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('test:///default', objstore_loc=self.tmp_store) all_vm_names = inst.vms_get_list() @@ -1733,7 +1869,13 @@ class ModelTests(unittest.TestCase): # (and removed) above (i.e. 'name' and 'uuid') self.assertEquals(original_vm, clone_vm) - def test_use_test_host(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_use_test_host(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: @@ -1758,7 +1900,13 @@ class ModelTests(unittest.TestCase): self.assertTrue('kimchi-vm' in vms) - def test_get_distros(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_get_distros(self, mock_probe_file_perm, mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model('qemu:///session', self.tmp_store) distros = inst.distros_get_list() for d in distros: @@ -1769,7 +1917,10 @@ class ModelTests(unittest.TestCase): self.assertIn('os_arch', distro) self.assertIn('path', distro) - def test_deep_scan(self): + @mock.patch('wok.plugins.kimchi.model.storagevolumes.UserTests.probe_user') + def test_deep_scan(self, mock_probe_user): + mock_probe_user.return_value = '' + inst = model.Model('qemu:///session', self.tmp_store) with RollbackContext() as rollback: @@ -1796,7 +1947,14 @@ class ModelTests(unittest.TestCase): @unittest.skipUnless(utils.running_as_root() and _host_is_power(), 'Only required for Power hosts') - def test_pci_hotplug_requires_usb_controller(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_pci_hotplug_requires_usb_controller(self, mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + config.set("authentication", "method", "pam") inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) tpl_params = {'name': 'test', 'memory': 1024, 'cdrom': UBUNTU_ISO} @@ -1896,7 +2054,14 @@ multifunction='on'/> </hostdev> """ - def test_vmhostdev_is_hostdev_multifunction(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vmhostdev_is_hostdev_multifunction(self, mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) hostdev_multi_elem = objectify.fromstring( @@ -1913,7 +2078,14 @@ multifunction='on'/> inst.vmhostdev_is_hostdev_multifunction(hostdev_nomulti_elem) ) - def test_vmhostdev_get_devices_same_addr(self): + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') + def test_vmhostdev_get_devices_same_addr(self, mock_probe_file_perm, + mock_probe_user): + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) + inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) root = objectify.fromstring(self.get_hostdevs_xml()) @@ -1947,12 +2119,19 @@ multifunction='on'/> [ET.tostring(nomatch_elem)] ) + @mock.patch('wok.plugins.kimchi.model.templates.UserTests.probe_user') + @mock.patch('wok.plugins.kimchi.model.templates.' + 'probe_file_permission_as_user') @mock.patch('wok.plugins.kimchi.model.vmhostdevs.get_vm_config_flag') - def test_vmhostdev_unplug_multifunction_pci(self, mock_conf_flag): + def test_vmhostdev_unplug_multifunction_pci(self, mock_conf_flag, + mock_probe_file_perm, + mock_probe_user): class FakeDom(): def detachDeviceFlags(self, xml, config_flag): pass + mock_probe_user.return_value = '' + mock_probe_file_perm.return_value = (True, None) mock_conf_flag.return_value = '' inst = model.Model("qemu:///session", objstore_loc=self.tmp_store) -- 2.7.4
participants (1)
-
Lucio Correia