[Kimchi-devel] [PATCH 5/6] Pass libvirt connection as CapabilitiesModel parameter

Aline Manera alinefm at linux.vnet.ibm.com
Tue Nov 11 20:46:27 UTC 2014


CapabilitiesModel depends on libvirt connection to properly run the
FeatureTests against the right connection.

Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
---
 src/kimchi/model/host.py           |  3 ++-
 src/kimchi/model/storagepools.py   |  2 +-
 src/kimchi/model/storagetargets.py |  2 +-
 src/kimchi/model/utils.py          | 15 +++++++--------
 src/kimchi/model/vmhostdevs.py     |  3 ++-
 src/kimchi/model/vmifaces.py       |  5 ++++-
 src/kimchi/model/vms.py            | 23 ++++++++++++++---------
 src/kimchi/model/vmstorages.py     | 16 +++++++++++-----
 8 files changed, 42 insertions(+), 27 deletions(-)

diff --git a/src/kimchi/model/host.py b/src/kimchi/model/host.py
index 8cddcdc..3b43b95 100644
--- a/src/kimchi/model/host.py
+++ b/src/kimchi/model/host.py
@@ -282,6 +282,7 @@ class PartitionModel(object):
 class DevicesModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
+        self.caps = CapabilitiesModel(**kargs)
         self.cap_map = \
             {'net': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_NET,
              'pci': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV,
@@ -343,7 +344,7 @@ class DevicesModel(object):
     def _get_devices_fc_host(self):
         conn = self.conn.get()
         # Libvirt < 1.0.5 does not support fc_host capability
-        if not CapabilitiesModel().fc_host_support:
+        if not self.caps.fc_host_support:
             ret = []
             scsi_hosts = self._get_devices_with_capability('scsi_host')
             for host in scsi_hosts:
diff --git a/src/kimchi/model/storagepools.py b/src/kimchi/model/storagepools.py
index d44e079..20c9e5a 100644
--- a/src/kimchi/model/storagepools.py
+++ b/src/kimchi/model/storagepools.py
@@ -54,7 +54,7 @@ class StoragePoolsModel(object):
         self.objstore = kargs['objstore']
         self.scanner = Scanner(self._clean_scan)
         self.scanner.delete()
-        self.caps = CapabilitiesModel()
+        self.caps = CapabilitiesModel(**kargs)
         self.device = DeviceModel(**kargs)
 
     def get_list(self):
diff --git a/src/kimchi/model/storagetargets.py b/src/kimchi/model/storagetargets.py
index 30717fd..159f987 100644
--- a/src/kimchi/model/storagetargets.py
+++ b/src/kimchi/model/storagetargets.py
@@ -30,7 +30,7 @@ from kimchi.utils import kimchi_log, patch_find_nfs_target
 class StorageTargetsModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
-        self.caps = CapabilitiesModel()
+        self.caps = CapabilitiesModel(**kargs)
 
     def get_list(self, storage_server, _target_type=None, _server_port=None):
         target_list = list()
diff --git a/src/kimchi/model/utils.py b/src/kimchi/model/utils.py
index d084f74..dc911a9 100644
--- a/src/kimchi/model/utils.py
+++ b/src/kimchi/model/utils.py
@@ -24,7 +24,6 @@ from lxml import etree, objectify
 from lxml.builder import E, ElementMaker
 
 from kimchi.exception import OperationFailed
-from kimchi.model.config import CapabilitiesModel
 from kimchi.model.featuretests import FeatureTests
 
 KIMCHI_META_URL = "https://github.com/kimchi-project/kimchi"
@@ -41,9 +40,9 @@ def get_vm_name(vm_name, t_name, name_list):
     raise OperationFailed("KCHUTILS0003E")
 
 
-def check_remote_disk_path(path):
+def check_remote_disk_path(path, qemu_stream_dns):
     hostname = urlparse.urlparse(path).hostname
-    if hostname is not None and not CapabilitiesModel().qemu_stream_dns:
+    if hostname is not None and not qemu_stream_dns:
         ip = socket.gethostbyname(hostname)
         return path.replace(hostname, ip)
 
@@ -107,10 +106,10 @@ def libvirt_get_kimchi_metadata_node(dom, mode="current"):
         FeatureTests.enable_libvirt_error_logging()
 
 
-def set_metadata_node(dom, node, mode="all"):
-    if CapabilitiesModel().metadata_support:
+def set_metadata_node(dom, node, metadata_support, mode="all"):
+    if metadata_support:
         kimchi = libvirt_get_kimchi_metadata_node(dom, mode)
-        kimchi = E.kimchi() if kimchi is None else kimchi
+        kimchi = E.metadata(E.kimchi()) if kimchi is None else kimchi
 
         update_node(kimchi, node)
         kimchi_xml = etree.tostring(kimchi)
@@ -148,8 +147,8 @@ def _kimchi_get_metadata_node(dom, tag):
     return None
 
 
-def get_metadata_node(dom, tag, mode="current"):
-    if CapabilitiesModel().metadata_support:
+def get_metadata_node(dom, tag, metadata_support, mode="current"):
+    if metadata_support:
         kimchi = libvirt_get_kimchi_metadata_node(dom, mode)
     else:
         # FIXME remove this code when all distro libvirt supports metadata
diff --git a/src/kimchi/model/vmhostdevs.py b/src/kimchi/model/vmhostdevs.py
index 1098f88..964ec49 100644
--- a/src/kimchi/model/vmhostdevs.py
+++ b/src/kimchi/model/vmhostdevs.py
@@ -36,6 +36,7 @@ from kimchi.utils import kimchi_log, run_command
 class VMHostDevsModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
+        self.caps = CapabilitiesModel(**kargs)
 
     def get_list(self, vmid):
         dom = VMModel.get_vm(vmid, self.conn)
@@ -161,7 +162,7 @@ class VMHostDevsModel(object):
         # Due to libvirt limitation, we don't support live assigne device to
         # vfio driver.
         driver = ('vfio' if DOM_STATE_MAP[dom.info()[0]] == "shutoff" and
-                  CapabilitiesModel().kernel_vfio else 'kvm')
+                  self.caps.kernel_vfio else 'kvm')
 
         # Attach all PCI devices in the same IOMMU group
         dev_model = DeviceModel(conn=self.conn)
diff --git a/src/kimchi/model/vmifaces.py b/src/kimchi/model/vmifaces.py
index 87ada6d..1206cde 100644
--- a/src/kimchi/model/vmifaces.py
+++ b/src/kimchi/model/vmifaces.py
@@ -23,6 +23,7 @@ import libvirt
 from lxml import etree, objectify
 
 from kimchi.exception import InvalidOperation, InvalidParameter, NotFoundError
+from kimchi.model.config import CapabilitiesModel
 from kimchi.model.vms import DOM_STATE_MAP, VMModel
 from kimchi.xmlutils.interface import get_iface_xml
 
@@ -30,6 +31,7 @@ from kimchi.xmlutils.interface import get_iface_xml
 class VMIfacesModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
+        self.caps = CapabilitiesModel(**kargs)
 
     def get_list(self, vm):
         macs = []
@@ -57,7 +59,8 @@ class VMIfacesModel(object):
             if params['mac'] not in macs:
                 break
 
-        os_distro, os_version = VMModel.vm_get_os_metadata(dom)
+        os_data = VMModel.vm_get_os_metadata(dom, self.caps.metadata_support)
+        os_distro, os_version = os_data
         xml = get_iface_xml(params, conn.getInfo()[0], os_distro, os_version)
         dom.attachDeviceFlags(xml, libvirt.VIR_DOMAIN_AFFECT_CURRENT)
 
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 8c10618..7ea948f 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -79,7 +79,7 @@ class VMsModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
         self.objstore = kargs['objstore']
-        self.caps = CapabilitiesModel()
+        self.caps = CapabilitiesModel(**kargs)
         self.guests_stats_thread = BackgroundTask(GUESTS_STATS_INTERVAL,
                                                   self._update_guests_stats)
         self.guests_stats_thread.start()
@@ -242,7 +242,8 @@ class VMsModel(object):
             raise OperationFailed("KCHVM0007E", {'name': name,
                                                  'err': e.get_error_message()})
 
-        VMModel.vm_update_os_metadata(VMModel.get_vm(name, self.conn), t.info)
+        VMModel.vm_update_os_metadata(VMModel.get_vm(name, self.conn), t.info,
+                                      self.caps.metadata_support)
 
         return name
 
@@ -260,6 +261,7 @@ class VMModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
         self.objstore = kargs['objstore']
+        self.caps = CapabilitiesModel(**kargs)
         self.vmscreenshot = VMScreenshotModel(**kargs)
         self.users = import_class('kimchi.model.host.UsersModel')(**kargs)
         self.groups = import_class('kimchi.model.host.GroupsModel')(**kargs)
@@ -562,7 +564,8 @@ class VMModel(object):
         if users is None and groups is None:
             return
 
-        access_xml = (get_metadata_node(dom, "access") or
+        access_xml = (get_metadata_node(dom, "access",
+                                        self.caps.metadata_support) or
                       """<access></access>""")
         old_users = xpath_get_text(access_xml, "/access/user")
         old_groups = xpath_get_text(access_xml, "/access/group")
@@ -570,22 +573,23 @@ class VMModel(object):
         groups = old_groups if groups is None else groups
 
         node = self._build_access_elem(users, groups)
-        set_metadata_node(dom, node)
+        set_metadata_node(dom, node, self.caps.metadata_support)
 
     @staticmethod
-    def vm_get_os_metadata(dom):
-        os_xml = get_metadata_node(dom, "os") or """<os></os>"""
+    def vm_get_os_metadata(dom, metadata_support):
+        os_xml = (get_metadata_node(dom, "os", metadata_support) or
+                  """<os></os>""")
         os_elem = ET.fromstring(os_xml)
         return (os_elem.attrib.get("version"), os_elem.attrib.get("distro"))
 
     @staticmethod
-    def vm_update_os_metadata(dom, params):
+    def vm_update_os_metadata(dom, params, metadata_support):
         distro = params.get("os_distro")
         version = params.get("os_version")
         if distro is None:
             return
         os_elem = E.os({"distro": distro, "version": version})
-        set_metadata_node(dom, os_elem)
+        set_metadata_node(dom, os_elem, metadata_support)
 
     def _update_graphics(self, dom, xml, params):
         root = objectify.fromstring(xml)
@@ -701,7 +705,8 @@ class VMModel(object):
         res['io_throughput'] = vm_stats.get('disk_io', 0)
         res['io_throughput_peak'] = vm_stats.get('max_disk_io', 100)
 
-        access_xml = (get_metadata_node(dom, "access") or
+        access_xml = (get_metadata_node(dom, "access",
+                                        self.caps.metadata_support) or
                       """<access></access>""")
         users = xpath_get_text(access_xml, "/access/user")
         groups = xpath_get_text(access_xml, "/access/group")
diff --git a/src/kimchi/model/vmstorages.py b/src/kimchi/model/vmstorages.py
index 790766c..95ca6e6 100644
--- a/src/kimchi/model/vmstorages.py
+++ b/src/kimchi/model/vmstorages.py
@@ -23,6 +23,7 @@ from lxml import etree
 
 from kimchi.exception import InvalidOperation, InvalidParameter, NotFoundError
 from kimchi.exception import OperationFailed
+from kimchi.model.config import CapabilitiesModel
 from kimchi.model.vms import DOM_STATE_MAP, VMModel
 from kimchi.model.storagevolumes import StorageVolumeModel
 from kimchi.model.utils import check_remote_disk_path, get_vm_config_flag
@@ -33,9 +34,9 @@ from kimchi.xmlutils.disk import get_vm_disk_info, get_vm_disks
 HOTPLUG_TYPE = ['scsi', 'virtio']
 
 
-def _get_device_bus(dev_type, dom):
+def _get_device_bus(dev_type, dom, metadata_support):
     try:
-        version, distro = VMModel.vm_get_os_metadata(dom)
+        version, distro = VMModel.vm_get_os_metadata(dom, metadata_support)
     except:
         version, distro = ('unknown', 'unknown')
     return lookup(distro, version)[dev_type+'_bus']
@@ -45,6 +46,7 @@ class VMStoragesModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
         self.objstore = kargs['objstore']
+        self.caps = CapabilitiesModel(**kargs)
 
     def _get_available_bus_address(self, bus_type, vm_name):
         if bus_type not in ['ide']:
@@ -79,7 +81,8 @@ class VMStoragesModel(object):
             raise InvalidParameter("KCHVMSTOR0017E")
 
         dom = VMModel.get_vm(vm_name, self.conn)
-        params['bus'] = _get_device_bus(params['type'], dom)
+        params['bus'] = _get_device_bus(params['type'], dom,
+                                        self.caps.metadata_support)
         params['format'] = 'raw'
 
         dev_list = [dev for dev, bus in get_vm_disks(dom).iteritems()
@@ -125,7 +128,8 @@ class VMStoragesModel(object):
             params['disk'] = vol_info['type']
 
         params.update(self._get_available_bus_address(params['bus'], vm_name))
-        params['path'] = check_remote_disk_path(params['path'])
+        params['path'] = check_remote_disk_path(params['path'],
+                                                self.caps.qemu_stream_dns)
 
         # Add device to VM
         dev, xml = get_disk_xml(params)
@@ -145,6 +149,7 @@ class VMStoragesModel(object):
 class VMStorageModel(object):
     def __init__(self, **kargs):
         self.conn = kargs['conn']
+        self.caps = CapabilitiesModel(**kargs)
 
     def lookup(self, vm_name, dev_name):
         # Retrieve disk xml and format return dict
@@ -180,7 +185,8 @@ class VMStorageModel(object):
         if dev_info['type'] != 'cdrom':
             raise InvalidOperation("KCHVMSTOR0006E")
 
-        params['path'] = check_remote_disk_path(params.get('path', ''))
+        params['path'] = check_remote_disk_path(params.get('path', ''),
+                                                self.caps.qemu_stream_dns)
         dev_info.update(params)
         dev, xml = get_disk_xml(dev_info)
 
-- 
1.9.3




More information about the Kimchi-devel mailing list