Signed-off-by: Jose Ricardo Ziviani <joserz(a)linux.vnet.ibm.com>
---
mockmodel.py | 164 +++++++++++++++++++++++++++++++++++++++++++++++-
tests/test_mockmodel.py | 33 ++++++++++
2 files changed, 196 insertions(+), 1 deletion(-)
diff --git a/mockmodel.py b/mockmodel.py
index d010df7..a765770 100644
--- a/mockmodel.py
+++ b/mockmodel.py
@@ -35,7 +35,9 @@ from wok.plugins.kimchi import imageinfo
from wok.plugins.kimchi import osinfo
from wok.plugins.kimchi.model import cpuinfo
from wok.plugins.kimchi.model import vmifaces
+from wok.plugins.kimchi.model.groups import PAMGroupsModel
from wok.plugins.kimchi.model.host import DeviceModel
+from wok.plugins.kimchi.model.host import DevicesModel
from wok.plugins.kimchi.model.libvirtstoragepool import IscsiPoolDef
from wok.plugins.kimchi.model.libvirtstoragepool import NetfsPoolDef
from wok.plugins.kimchi.model.libvirtstoragepool import StoragePoolDef
@@ -47,7 +49,7 @@ from wok.plugins.kimchi.model.storagevolumes import StorageVolumesModel
from wok.plugins.kimchi.model import storagevolumes
from wok.plugins.kimchi.model.templates import LibvirtVMTemplate
from wok.plugins.kimchi.model.users import PAMUsersModel
-from wok.plugins.kimchi.model.groups import PAMGroupsModel
+from wok.plugins.kimchi.model.vmhostdevs import VMHostDevsModel
from wok.plugins.kimchi.utils import pool_name_from_uri
from wok.plugins.kimchi.vmtemplate import VMTemplate
@@ -118,6 +120,10 @@ class MockModel(Model):
setattr(self, m, mock_method)
DeviceModel.lookup = self._mock_device_lookup
+ DeviceModel.get_iommu_groups = self._mock_device_get_iommu_groups
+ DeviceModel.is_device_3D_controller = \
+ self._mock_device_is_device_3D_controller
+ DevicesModel.get_list = self._mock_devices_get_list
StoragePoolsModel._check_lvm = self._check_lvm
StoragePoolModel._update_lvm_disks = self._update_lvm_disks
StorageVolumesModel.get_list = self._mock_storagevolumes_get_list
@@ -125,6 +131,8 @@ class MockModel(Model):
LibvirtVMTemplate._get_volume_path = self._get_volume_path
VMTemplate.get_iso_info = self._probe_image
imageinfo.probe_image = self._probe_image
+ VMHostDevsModel._get_pci_device_xml = self._get_pci_device_xml
+ VMHostDevsModel._validate_pci_passthrough_env = self._validate_pci
def reset(self):
MockModel._mock_vms = defaultdict(list)
@@ -326,6 +334,16 @@ class MockModel(Model):
return [dev['name'] for dev in self._mock_devices.devices.values()
if dev['device_type'] == _cap]
+ def _mock_device_get_iommu_groups(self):
+ return [dev['iommuGroup'] for dev in
+ self._mock_devices.devices.values()
+ if 'iommuGroup' in dev]
+
+ def _mock_device_is_device_3D_controller(self, info):
+ if 'driver' in info and 'name' in info['driver']:
+ return info['driver']['name'] == 'nvidia'
+ return False
+
def _mock_device_lookup(self, dev_name):
return self._mock_devices.devices[dev_name]
@@ -405,6 +423,46 @@ class MockModel(Model):
if sn.name == name:
sn.current = True
+ def _attach_device(self, vm_name, xmlstr):
+ MockModel._mock_vms[vm_name].append(xmlstr)
+
+ def _validate_pci(self):
+ pass
+
+ def _get_pci_device_xml(self, dev_info, slot, is_multifunction):
+ if 'detach_driver' not in dev_info:
+ dev_info['detach_driver'] = 'kvm'
+
+ source = E.source(E.address(domain=str(dev_info['domain']),
+ bus=str(dev_info['bus']),
+ slot=str(dev_info['slot']),
+ function=str(dev_info['function'])))
+ driver = E.driver(name=dev_info['detach_driver'])
+
+ if is_multifunction:
+ multi = E.address(type='pci',
+ domain='0',
+ bus='0',
+ slot=str(slot),
+ function=str(dev_info['function']))
+
+ if dev_info['function'] == 0:
+ multi = E.address(type='pci',
+ domain='0',
+ bus='0',
+ slot=str(slot),
+ function=str(dev_info['function']),
+ multifunction='on')
+
+ host_dev = E.hostdev(source, driver, multi,
+ mode='subsystem', type='pci',
managed='yes')
+
+ else:
+ host_dev = E.hostdev(source, driver,
+ mode='subsystem', type='pci',
managed='yes')
+
+ return ET.tostring(host_dev)
+
class MockStorageVolumes(object):
def __init__(self):
@@ -481,6 +539,7 @@ class MockDevices(object):
'Centrino Advanced-N 6205 [Taylor Peak]',
'id': '0x0085'},
'slot': 0,
+ 'vga3d': False,
'vendor': {'description': 'Intel
Corporation',
'id': '0x8086'}},
'pci_0000_0d_00_0': {'bus': 13,
@@ -497,8 +556,111 @@ class MockDevices(object):
'PCIe SDXC/MMC Host Controller',
'id': '0xe823'},
'slot': 0,
+ 'vga3d': False,
'vendor': {'description': 'Ricoh Co
Ltd',
'id': '0x1180'}},
+ 'pci_0000_09_01_0': {'bus': 9,
+ 'device_type': 'pci',
+ 'domain': 0,
+ 'driver': {'name': 'tg3'},
+ 'function': 0,
+ 'iommuGroup': 8,
+ 'name': 'pci_0000_09_01_0',
+ 'parent': 'computer',
+ 'path':
+ '/sys/devices/pci0000:00/0000:09:01.0',
+ 'product': {'description':
+ 'NetXtreme BCM5719',
+ 'id': '0x1657'},
+ 'slot': 1,
+ 'vga3d': False,
+ 'vendor': {'description': 'Broadcom
Corp',
+ 'id': '0x14e4'}},
+ 'pci_0000_09_01_1': {'bus': 9,
+ 'device_type': 'pci',
+ 'domain': 0,
+ 'driver': {'name': 'tg3'},
+ 'function': 1,
+ 'iommuGroup': 8,
+ 'name': 'pci_0000_09_01_1',
+ 'parent': 'computer',
+ 'path':
+ '/sys/devices/pci0000:00/0000:09:01.1',
+ 'product': {'description':
+ 'NetXtreme BCM5719',
+ 'id': '0x1657'},
+ 'slot': 1,
+ 'vga3d': False,
+ 'vendor': {'description': 'Broadcom
Corp',
+ 'id': '0x14e4'}},
+ 'pci_0000_09_01_2': {'bus': 9,
+ 'device_type': 'pci',
+ 'domain': 0,
+ 'driver': {'name': 'tg3'},
+ 'function': 2,
+ 'iommuGroup': 8,
+ 'name': 'pci_0000_09_01_2',
+ 'parent': 'computer',
+ 'path':
+ '/sys/devices/pci0000:00/0000:09:01.2',
+ 'product': {'description':
+ 'NetXtreme BCM5719',
+ 'id': '0x1657'},
+ 'slot': 1,
+ 'vga3d': False,
+ 'vendor': {'description': 'Broadcom
Corp',
+ 'id': '0x14e4'}},
+ 'pci_0000_1a_00_0': {'bus': 26,
+ 'device_type': 'pci',
+ 'domain': 0,
+ 'driver': {'name': 'nvidia'},
+ 'function': 0,
+ 'iommuGroup': 9,
+ 'name': 'pci_0000_1a_00_0',
+ 'parent': 'computer',
+ 'path':
+ '/sys/devices/pci0000:00/0000:1a:00.0',
+ 'product': {'description':
+ 'GK210GL [Tesla K80]',
+ 'id': '0x0302'},
+ 'slot': 0,
+ 'vga3d': True,
+ 'vendor': {'description': 'NVIDIA
Corp',
+ 'id': '0x10de'}},
+ 'pci_0001_1b_00_0': {'bus': 27,
+ 'device_type': 'pci',
+ 'domain': 1,
+ 'driver': {'name': 'nvidia'},
+ 'function': 0,
+ 'iommuGroup': 7,
+ 'name': 'pci_0001_1b_00_0',
+ 'parent': 'computer',
+ 'path':
+ '/sys/devices/pci0000:00/0001:1b:00.0',
+ 'product': {'description':
+ 'GK210GL [Tesla K80]',
+ 'id': '0x0302'},
+ 'slot': 0,
+ 'vga3d': True,
+ 'vendor': {'description': 'NVIDIA
Corp',
+ 'id': '0x10de'}},
+ 'pci_0000_1c_00_0': {'bus': 28,
+ 'device_type': 'pci',
+ 'domain': 0,
+ 'driver': {'name': 'nvidia'},
+ 'function': 0,
+ 'iommuGroup': 7,
+ 'name': 'pci_0000_1c_00_0',
+ 'parent': 'computer',
+ 'path':
+ '/sys/devices/pci0000:00/0000:0d:00.0',
+ 'product': {'description':
+ 'GK210GL [Tesla K80]',
+ 'id': '0x0302'},
+ 'slot': 0,
+ 'vga3d': True,
+ 'vendor': {'description': 'NVIDIA
Corp',
+ 'id': '0x10de'}},
'scsi_host0': {'adapter': {'fabric_wwn':
'37df6c1efa1b4388',
'type': 'fc_host',
'wwnn': 'efb6563f06434a98',
diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py
index 5c9fad4..0668191 100644
--- a/tests/test_mockmodel.py
+++ b/tests/test_mockmodel.py
@@ -26,6 +26,7 @@ import unittest
from tests.utils import get_free_port, patch_auth, request, run_server
from tests.utils import wait_task
+from wok.exception import InvalidOperation
from wok.plugins.kimchi import mockmodel
from wok.plugins.kimchi.osinfo import get_template_default
@@ -112,6 +113,38 @@ class MockModelTests(unittest.TestCase):
vms.append(u'test')
self.assertEqual(model.vms_get_list(), sorted(vms))
+ def test_memory_window_changes(self):
+ model.templates_create({'name': u'test',
+ 'cdrom': fake_iso})
+ task = model.vms_create({'name': u'test-vm',
+ 'template':
'/plugins/kimchi/templates/test'})
+ wait_task(model.task_lookup, task['id'])
+
+ info = model.device_lookup('pci_0000_1a_00_0')
+ model.vmhostdevs_update_mmio_guest(u'test-vm', True)
+ model._attach_device(u'test-vm',
+ model._get_pci_device_xml(info, 0, False))
+
+ def test_hotplug_3D_card(self):
+ model.templates_create({'name': u'test',
+ 'cdrom': fake_iso})
+ task = model.vms_create({'name': u'test-vm',
+ 'template':
'/plugins/kimchi/templates/test'})
+ wait_task(model.task_lookup, task['id'])
+ model.vm_start(u'test-vm')
+
+ # attach the 3D cards found to a running guest
+ all_devices = model.devices_get_list()
+ for device in all_devices:
+ device_info = model.device_lookup(device)
+ if model.device_is_device_3D_controller(device_info):
+ try:
+ model.vmhostdevs_create(u'test-vm', {'name':
device})
+
+ # expect the error: KCHVMHDEV0006E
+ except InvalidOperation as e:
+ self.assertEqual(e.message[:14], u'KCHVMHDEV0006E')
+
def test_vm_info(self):
model.templates_create({'name': u'test',
'cdrom': fake_iso})
--
1.9.1