Change in vdsm[master]: Refactor updateVmPolicy to use DOM manipulation

msivak at redhat.com msivak at redhat.com
Wed Jun 18 12:05:36 UTC 2014


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

Change subject: Refactor updateVmPolicy to use DOM manipulation
......................................................................

Refactor updateVmPolicy to use DOM manipulation

Change-Id: I475a70269c1f32e10f379b0743cfeefe642d4afd
Signed-off-by: Martin Sivak <msivak at redhat.com>
---
M vdsm/virt/vm.py
1 file changed, 52 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/95/28895/1

diff --git a/vdsm/virt/vm.py b/vdsm/virt/vm.py
index ed4ac47..fb4f5f7 100644
--- a/vdsm/virt/vm.py
+++ b/vdsm/virt/vm.py
@@ -3700,24 +3700,25 @@
                                      msg="updateVmPolicy got an empty policy.")
 
         #
+        # Get the current QoS block
+        qos = self._getVmPolicy()
+        metadata_modified = False
+
+        #
         # Process provided properties, remove property after it is processed
 
         if 'vcpuLimit' in params:
-            try:
-                self._dom.setMetadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT,
-                                      '<qos><vcpulimit>' +
-                                      params['vcpuLimit'] +
-                                      '</vcpulimit></qos>', 'ovirt',
-                                      METADATA_VM_TUNE_URI, 0)
-            except libvirt.libvirtError as e:
-                self.log.exception("updateVmPolicy failed")
-                if e.get_error_code() == libvirt.VIR_ERR_NO_DOMAIN:
-                    return errCode['noVM']
-                else:
-                    return self._reportError(key='updateVmPolicyErr',
-                                             msg=e.message)
-            else:
-                del params['vcpuLimit']
+            # Remove old value
+            vcpuLimit = qos.getElementsByTagName("vcpuLimit")
+            if vcpuLimit:
+                qos.removeChild(vcpuLimit[0])
+
+            vcpuLimit = XMLElement("vcpuLimit")
+            vcpuLimit.appendTextNode(str(params["vcpuLimit"]))
+            qos.appendChild(vcpuLimit)
+
+            metadata_modified = True
+            del params['vcpuLimit']
 
         # Check remaining fields in params and report the list of unsupported
         # params to the log
@@ -3726,8 +3727,44 @@
             self.log.warn("updateVmPolicy got unknown parameters: %s",
                           ", ".join(params.iterkeys()))
 
+        #
+        # Save modified metadata
+
+        if metadata_modified:
+            metadata_xml = qos.toprettyxml()
+
+            try:
+                self._dom.setMetadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT,
+                                      metadata_xml, 'ovirt',
+                                      METADATA_VM_TUNE_URI, 0)
+            except libvirt.libvirtError as e:
+                self.log.exception("updateVmPolicy failed")
+                if e.get_error_code() == libvirt.VIR_ERR_NO_DOMAIN:
+                    return errCode['noVM']
+                else:
+                    return self._reportError(key='updateVmPolicyErr',
+                                             msg=e.message)
+
         return {'status': doneCode}
 
+    def _getVmPolicy(self):
+        #
+        # Get the current QoS block
+        metadata_xml = "<qos></qos>"
+
+        try:
+            metadata_xml = self._dom.metadata(
+                libvirt.VIR_DOMAIN_METADATA_ELEMENT,
+                METADATA_VM_TUNE_URI, 0)
+        except libvirt.libvirtError as e:
+            if e.get_error_code() != libvirt.VIR_ERR_NO_DOMAIN_METADATA:
+                return self._reportException(key='updateVmPolicyErr',
+                                             msg=e.message)
+
+        metadata = xml.dom.minidom.parseString(metadata_xml)
+        qos = metadata.getElementsByTagName("qos")[0]
+        return qos
+
     def setIoTune(self, tunables):
         for io_tune_change in tunables:
             device_name = io_tune_change.get('name', None)


-- 
To view, visit http://gerrit.ovirt.org/28895
To unsubscribe, visit http://gerrit.ovirt.org/settings

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


More information about the vdsm-patches mailing list