diff options
-rw-r--r-- | tests/unit/test_libvirt_utils.py | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/tests/unit/test_libvirt_utils.py b/tests/unit/test_libvirt_utils.py new file mode 100644 index 00000000..1944d749 --- /dev/null +++ b/tests/unit/test_libvirt_utils.py @@ -0,0 +1,157 @@ +############################################################################## +# Copyright (c) 2017 ZTE Corp and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import os +import sys +import pytest +import xml.etree.ElementTree as ET +from deploy.utils import WORKSPACE +import mock +sys.modules['libvirt'] = mock.Mock() + +from deploy import libvirt_utils # noqa: ignore=E402 +from deploy.libvirt_utils import ( + get_nets_name, + modify_vm_boot_order, + create_virtual_disk, + modify_vm_name, + modify_vm_disk_file, + modify_vm_bridge, + create_vm, + reboot_vm, + get_disk_file, +# delete_vm_and_disk, + create_virtual_network, +# delete_virtual_network, +# get_vm_mac_addresses +) # noqa: ignore=E402 + + +@pytest.mark.parametrize('template_name, exp', [ + ('templates/physical_environment/vms/daisy.xml', []), + ('templates/virtual_environment/vms/daisy.xml', ['daisy1'])]) +def test_get_nets_name(template_name, exp): + template = os.path.join(WORKSPACE, template_name) + tree = ET.ElementTree(file=template) + root = tree.getroot() + ret = get_nets_name(root) + assert ret == exp + + +def test_modify_vm_boot_order(): + template = os.path.join(WORKSPACE, 'templates/virtual_environment/vms/daisy.xml') + tree = ET.ElementTree(file=template) + root = tree.getroot() + boot_devs = ['hd_test1', 'hd_test2'] + modify_vm_boot_order(root, boot_devs) + os_elem = root.find('os') + boots = os_elem.findall('boot') + assert len(boots) == len(boot_devs) + for i in range(len(boots)): + assert boots[i].attrib['dev'] == boot_devs[i] + + +def test_modify_vm_name(): + template = os.path.join(WORKSPACE, 'templates/physical_environment/vms/daisy.xml') + tree = ET.ElementTree(file=template) + root = tree.getroot() + vm_name = 'test_vm' + modify_vm_name(root, vm_name) + name_elem = root.find('./name') + assert name_elem.text == vm_name + + +def test_modify_vm_disk_file(): + template = os.path.join(WORKSPACE, 'templates/physical_environment/vms/daisy.xml') + tree = ET.ElementTree(file=template) + root = tree.getroot() + disk_path1 = os.path.join('/home/qemu/vms', 'daisy_test1.qcow2') + disk_path2 = os.path.join('/home/qemu/vms', 'daisy_test2.qcow2') + disks_path = [disk_path1, disk_path2] + modify_vm_disk_file(root, disks_path) + devices = root.find('./devices') + disks = [disk for disk in devices.findall('disk') if disk.attrib['device'] == 'disk'] + assert len(disks) == len(disks_path) + for i in range(len(disks)): + assert disks[i].attrib['type'] == 'file' + driver = disks[i].find('driver') + assert driver.attrib['name'] == 'qemu' and driver.attrib['type'] == 'qcow2' + target = disks[i].find('target') + assert target.attrib['bus'] == 'ide' + source = disks[i].find('source') + assert source.attrib['file'] == disks_path[i] + + +def test_modify_vm_bridge(): + template = os.path.join(WORKSPACE, 'templates/virtual_environment/vms/daisy.xml') + tree = ET.ElementTree(file=template) + root = tree.getroot() + bridge = 'daisy_test' + modify_vm_bridge(root, bridge) + devices = root.find('./devices') + is_match = False + for interface in devices.findall('interface'): + source = interface.find('source') + if interface.attrib.get('type', None) == 'bridge' \ + and source is not None \ + and source.attrib.get('bridge', None) == bridge: + is_match = True + break + assert is_match + + +@pytest.mark.parametrize('status', [ + (0), + (1)]) +@mock.patch('deploy.libvirt_utils.commands.getstatusoutput') +@mock.patch('deploy.libvirt_utils.err_exit') +def test_create_virtual_disk(mock_err_exit, mock_getstatusoutput, status): + mock_getstatusoutput.return_value = (status, 'command_output') + disk_file = '/tmp/vms/daisy.qcow2' + size = 110 + create_virtual_disk(disk_file, size) + mock_getstatusoutput.assert_called_once() + if status: + mock_err_exit.assert_called_once() + else: + mock_err_exit.assert_not_called() + + +@pytest.mark.parametrize('name, disk_name, physical_bridge', [ + ('dasiy_test_vm', 'daisy_test.qcow2', 'daisy_test_br'), + (None, None, None)]) +def test_create_vm(name, disk_name, physical_bridge): + template = os.path.join(WORKSPACE, 'templates/physical_environment/vms/daisy.xml') + if disk_name: + disk_path = os.path.join('/home/qemu/vms', 'daisy_test.qcow2') + disks_path = [disk_path] + else: + disks_path = None + ret = create_vm(template, name=name, disks=disks_path, physical_bridge=physical_bridge) + assert ret is not None + + +@pytest.mark.parametrize('vm_name, boot_devs', [ + ('dasiy_test_vm', None)]) +def test_reboot_vm(vm_name, boot_devs): + reboot_vm(vm_name, boot_devs=boot_devs) + + +def test_get_disk_file(): + template = os.path.join(WORKSPACE, 'templates/physical_environment/vms/daisy.xml') + tree = ET.ElementTree(file=template) + root = tree.getroot() + exp_disks = ['/tmp/workdir/daisy/centos7.qcow2'] + ret = get_disk_file(root) + assert ret == exp_disks + + +def test_create_virtual_network(): + template = os.path.join(WORKSPACE, 'templates/physical_environment/networks/daisy.xml') + ret = create_virtual_network(template) + assert ret is not None |