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(a)redhat.com>
Reviewed-on:
https://gerrit.ovirt.org/45664
Continuous-Integration: Jenkins CI
Reviewed-by: Francesco Romani <fromani(a)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(a)redhat.com>