Change in vdsm[ovirt-3.6]: Add an empty metadata qos element to the created domain

msivak at redhat.com msivak at redhat.com
Mon Sep 7 12:41:56 UTC 2015


Martin Sivák has uploaded a new change for review.

Change subject: Add an empty metadata qos element to the created domain
......................................................................

Add an empty metadata qos element to the created domain

Libvirt reports an error every time VDSM queries for the metadata
element when there is none. This patch adds an empty default
element to get rid of those errors.

Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1219903
Change-Id: Ibc5db925b55ea8e583a11d548a27dc3fd0886fee
Signed-off-by: Martin Sivak <msivak at redhat.com>
Reviewed-on: https://gerrit.ovirt.org/45664
Continuous-Integration: Jenkins CI
Reviewed-by: Francesco Romani <fromani at redhat.com>
(cherry picked from commit deadb606de96fc84d8d912d56bbc042974074f54)
---
M tests/vmTests.py
M tests/vmTestsData.py
M vdsm/virt/vm.py
M vdsm/virt/vmxml.py
4 files changed, 55 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/99/45799/1

diff --git a/tests/vmTests.py b/tests/vmTests.py
index 1ac1ea7..d48526b 100644
--- a/tests/vmTests.py
+++ b/tests/vmTests.py
@@ -113,13 +113,16 @@
 
     def testDomXML(self):
         expectedXML = """
-           <domain type="kvm">
+           <domain xmlns:ns0="http://ovirt.org/vm/tune/1.0" type="kvm">
               <name>testVm</name>
               <uuid>9ffe28b6-6134-4b1e-8804-1185f49c436f</uuid>
               <memory>1048576</memory>
               <currentMemory>1048576</currentMemory>
               <vcpu current="8">160</vcpu>
               <devices/>
+              <metadata>
+                 <ns0:qos/>
+              </metadata>
            </domain>"""
 
         domxml = vmxml.Domain(self.conf, self.log, caps.Architecture.X86_64)
diff --git a/tests/vmTestsData.py b/tests/vmTestsData.py
index 9f17976..e1f53f3 100644
--- a/tests/vmTestsData.py
+++ b/tests/vmTestsData.py
@@ -32,7 +32,8 @@
     'guestNumaNodes': []},
 
     """<?xml version="1.0" encoding="utf-8"?>
-        <domain type="kvm">
+        <domain type="kvm"
+        xmlns:ovirt="http://ovirt.org/vm/tune/1.0">
             <name>testVm</name>
             <uuid>%(vmId)s</uuid>
             <memory>1048576</memory>
@@ -51,6 +52,9 @@
                 </channel>
                 <input bus="ps2" type="mouse"/>
                 </devices>
+                <metadata>
+                    <ovirt:qos/>
+                </metadata>
                 <os>
                     <type arch="x86_64" machine="pc">hvm</type>
                     <smbios mode="sysinfo"/>
@@ -97,6 +101,7 @@
 
     """<?xml version="1.0" encoding="utf-8"?>
         <domain type="kvm"
+        xmlns:ovirt="http://ovirt.org/vm/tune/1.0"
         xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">
             <name>testVm</name>
             <uuid>%(vmId)s</uuid>
@@ -117,6 +122,9 @@
                 <input bus="usb" type="mouse"/>
                 <emulator>/usr/bin/qemu-system-ppc64</emulator>
                 </devices>
+                <metadata>
+                    <ovirt:qos/>
+                </metadata>
                 <os>
                     <type arch="ppc64" machine="pc">hvm</type>
                 </os>
diff --git a/vdsm/virt/vm.py b/vdsm/virt/vm.py
index a398fe6..7b6dcfb 100644
--- a/vdsm/virt/vm.py
+++ b/vdsm/virt/vm.py
@@ -73,6 +73,8 @@
 from .vmtune import update_io_tune_dom, collect_inner_elements
 from .vmtune import io_tune_values_to_dom, io_tune_dom_to_values
 from . import vmxml
+from .vmxml import METADATA_VM_TUNE_URI, METADATA_VM_TUNE_ELEMENT
+from .vmxml import METADATA_VM_TUNE_PREFIX
 
 from .utils import isVdsmImage, cleanup_guest_socket
 from vmpowerdown import VmShutdown, VmReboot
@@ -84,8 +86,6 @@
 _AGENT_CHANNEL_DEVICES = (_VMCHANNEL_DEVICE_NAME, _QEMU_GA_DEVICE_NAME)
 
 DEFAULT_BRIDGE = config.get("vars", "default_bridge")
-
-METADATA_VM_TUNE_URI = 'http://ovirt.org/vm/tune/1.0'
 
 # A libvirt constant for undefined cpu quota
 _NO_CPU_QUOTA = 0
@@ -2368,7 +2368,7 @@
 
             try:
                 self._dom.setMetadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT,
-                                      metadata_xml, 'ovirt',
+                                      metadata_xml, METADATA_VM_TUNE_PREFIX,
                                       METADATA_VM_TUNE_URI, 0)
             except libvirt.libvirtError as e:
                 self.log.exception("updateVmPolicy failed")
@@ -2389,7 +2389,8 @@
         :return: XML DOM object representing the root qos element
         """
 
-        metadata_xml = "<qos></qos>"
+        metadata_xml = "<%s></%s>" % (METADATA_VM_TUNE_ELEMENT,
+                                      METADATA_VM_TUNE_ELEMENT)
 
         try:
             metadata_xml = self._dom.metadata(
@@ -2401,7 +2402,7 @@
                 return None
 
         metadata = _domParseStr(metadata_xml)
-        return metadata.getElementsByTagName("qos")[0]
+        return metadata.getElementsByTagName(METADATA_VM_TUNE_ELEMENT)[0]
 
     def _findDeviceByNameOrPath(self, device_name, device_path):
         for device in self._devices[hwclass.DISK]:
diff --git a/vdsm/virt/vmxml.py b/vdsm/virt/vmxml.py
index 2c51272..60e3357 100644
--- a/vdsm/virt/vmxml.py
+++ b/vdsm/virt/vmxml.py
@@ -28,6 +28,10 @@
 
 import caps
 
+METADATA_VM_TUNE_URI = 'http://ovirt.org/vm/tune/1.0'
+METADATA_VM_TUNE_ELEMENT = 'qos'
+METADATA_VM_TUNE_PREFIX = 'ovirt'
+
 
 def has_channel(domXML, name):
     domObj = etree.fromstring(domXML)
@@ -91,8 +95,12 @@
 
 class Element(object):
 
-    def __init__(self, tagName, text=None, **attrs):
-        self._elem = xml.dom.minidom.Document().createElement(tagName)
+    def __init__(self, tagName, text=None, namespaceUri=None, **attrs):
+        if namespaceUri is not None:
+            self._elem = xml.dom.minidom.Document().createElementNS(
+                namespaceUri, tagName)
+        else:
+            self._elem = xml.dom.minidom.Document().createElement(tagName)
         self.setAttrs(**attrs)
         if text is not None:
             self.appendTextNode(text)
@@ -103,6 +111,9 @@
     def setAttrs(self, **attrs):
         for attrName, attrValue in attrs.iteritems():
             self._elem.setAttribute(attrName, attrValue)
+
+    def setAttr(self, attrName, attrValue):
+        self._elem.setAttribute(attrName, attrValue)
 
     def appendTextNode(self, text):
         textNode = xml.dom.minidom.Document().createTextNode(text)
@@ -178,6 +189,8 @@
         self._devices = Element('devices')
         self.dom.appendChild(self._devices)
 
+        self.appendMetadata()
+
     def appendClock(self):
         """
         Add <clock> element to domain:
@@ -205,6 +218,27 @@
 
         self.dom.appendChild(m)
 
+    def appendMetadata(self):
+        """
+        Add the namespaced qos metadata element to the domain
+
+        <domain xmlns:ovirt="http://ovirt.org/vm/tune/1.0">
+        ...
+           <metadata>
+              <ovirt:qos xmlns:ovirt=>
+           </metadata>
+        ...
+        </domain>
+        """
+
+        self._metadata = Element('metadata')
+        self._metadata.appendChild(Element(METADATA_VM_TUNE_PREFIX + ':' +
+                                           METADATA_VM_TUNE_ELEMENT,
+                                           namespaceUri=METADATA_VM_TUNE_URI))
+        self.dom.setAttr('xmlns:' + METADATA_VM_TUNE_PREFIX,
+                         METADATA_VM_TUNE_URI)
+        self.dom.appendChild(self._metadata)
+
     def appendOs(self):
         """
         Add <os> element to domain:


-- 
To view, visit https://gerrit.ovirt.org/45799
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibc5db925b55ea8e583a11d548a27dc3fd0886fee
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: ovirt-3.6
Gerrit-Owner: Martin Sivák <msivak at redhat.com>


More information about the vdsm-patches mailing list