Reviewed-by: Daniel Barboza <danielhb(a)linux.vnet.ibm.com>
On 11/11/2014 06:46 PM, Aline Manera wrote:
CapabilitiesModel depends on libvirt connection to properly run the
FeatureTests against the right connection.
Signed-off-by: Aline Manera <alinefm(a)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)