[Kimchi-devel] [PATCH V2 1/2] bug fix: get user and group metadata by libvirt virDomain.metadata API

shaohef at linux.vnet.ibm.com shaohef at linux.vnet.ibm.com
Mon Apr 21 09:15:37 UTC 2014


From: ShaoHe Feng <shaohef at linux.vnet.ibm.com>

define domain just edit the persistent xml.
So we should get user and group from persistent xml instead of live xml
when domain is living.

Now use livirt API to get metadata.
Info:
http://libvirt.org/formatdomain.html#elementsMetadata

Signed-off-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
---
 src/kimchi/i18n.py      |  1 +
 src/kimchi/model/vms.py | 24 +++++++++++++++++++++---
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
index 3fc3013..28b1c4d 100644
--- a/src/kimchi/i18n.py
+++ b/src/kimchi/i18n.py
@@ -86,6 +86,7 @@ messages = {
     "KCHVM0026E": _("Group name must be a string"),
     "KCHVM0027E": _("User %(user)s does not exist"),
     "KCHVM0028E": _("Group %(group)s does not exist"),
+    "KCHVM0029E": _("Unable to get access metadata of virtual machine %(name)s. Details: %(err)s"),
 
     "KCHVMIF0001E": _("Interface %(iface)s does not exist in virtual machine %(name)s"),
     "KCHVMIF0002E": _("Network %(network)s specified for virtual machine %(name)s does not exist"),
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 90e9537..4997478 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -56,6 +56,8 @@ VM_LIVE_UPDATE_PARAMS = {}
 
 stats = {}
 
+KIMCHI_META_URL = "https://github.com/kimchi-project/kimchi/metadata/"
+
 
 class VMsModel(object):
     def __init__(self, **kargs):
@@ -253,6 +255,21 @@ class VMModel(object):
 
         return E.metadata(E.kimchi(access))
 
+    def _get_metadata_element(self, dom, element, mode="persistent"):
+        flag = {"live": libvirt.VIR_DOMAIN_AFFECT_LIVE,
+                "persistent": libvirt.VIR_DOMAIN_AFFECT_CONFIG,
+                "current": libvirt.VIR_DOMAIN_AFFECT_CURRENT}
+        try:
+            return dom.metadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT,
+                                KIMCHI_META_URL + element, flags=flag[mode])
+        except libvirt.libvirtError as e:
+            if e.get_error_code() == libvirt.VIR_DOMAIN_METADATA_ELEMENT:
+                kimchi_log.error('Error to get access metadata: %s', e.message)
+                return ""
+            else:
+                raise OperationFailed("KCHVM0029E", {'name': dom.name(),
+                                                     'err': e.message})
+
     def _static_vm_update(self, dom, params):
         state = DOM_STATE_MAP[dom.info()[0]]
 
@@ -346,9 +363,10 @@ class VMModel(object):
         res['io_throughput'] = vm_stats.get('disk_io', 0)
         res['io_throughput_peak'] = vm_stats.get('max_disk_io', 100)
 
-        xml = dom.XMLDesc(0)
-        users = xpath_get_text(xml, "/domain/metadata/kimchi/access/user")
-        groups = xpath_get_text(xml, "/domain/metadata/kimchi/access/group")
+        access_xml = (self._get_metadata_element(dom, "access") or
+                      """<access></access>""")
+        users = xpath_get_text(access_xml, "/access/user")
+        groups = xpath_get_text(access_xml, "/access/group")
 
         return {'state': state,
                 'stats': res,
-- 
1.9.0




More information about the Kimchi-devel mailing list