Marcin Mirecki has uploaded a new change for review.

Change subject: Replacing minidom with ElementTree in caps.py
......................................................................

Replacing minidom with ElementTree in caps.py

minidom is replaced by ElementTree.py in caps.py. This is because ET is
faster, and we want to elinate using two similar libs in the code

Change-Id: I8c1ca58807515922347e2255c77b4f950decd619
Signed-off-by: mmirecki <[email protected]>
---
M tests/capsTests.py
M vdsm/caps.py
2 files changed, 71 insertions(+), 47 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/78/41078/1

diff --git a/tests/capsTests.py b/tests/capsTests.py
index bbbb386..d2bbc40 100644
--- a/tests/capsTests.py
+++ b/tests/capsTests.py
@@ -21,6 +21,7 @@
 
 import os
 import platform
+import xml.etree.ElementTree as ET
 from testlib import VdsmTestCase as TestCaseBase
 from monkeypatch import MonkeyPatch
 
@@ -195,6 +196,29 @@
                                                capsData)
         self.assertEqual(support, False)
 
+    def testFindLiveSnapshotSupport(self):
+        capsFile = self._readCaps("caps_libvirt_intel_i73770_nosnap.out")
+        capsData = ET.fromstring(capsFile)
+
+        guests = capsData.iter(tag='guest')
+
+        result = caps._findLiveSnapshotSupport(guests.next())
+        self.assertEqual(result, None)
+
+        result = caps._findLiveSnapshotSupport(guests.next())
+        self.assertEqual(result, False)
+
+        capsFile = self._readCaps("caps_libvirt_intel_i73770.out")
+        capsData = ET.fromstring(capsFile)
+
+        guests = capsData.iter(tag='guest')
+
+        result = caps._findLiveSnapshotSupport(guests.next())
+        self.assertEqual(result, None)
+
+        result = caps._findLiveSnapshotSupport(guests.next())
+        self.assertEqual(result, True)
+
     def testGetLiveSnapshotSupport(self):
         capsData = self._readCaps("caps_libvirt_intel_i73770_nosnap.out")
 
@@ -257,4 +281,4 @@
         result = caps._getCpuTopology(capsData)
         expected = {'cores': 4, 'threads': 8, 'sockets': 1,
                     'onlineCpus': ['0', '1', '2', '3', '4', '5', '6', '7']}
-        self.assertEqual(expected, result)
+        self.assertEqual(expected, result)
\ No newline at end of file
diff --git a/vdsm/caps.py b/vdsm/caps.py
index 578b3fd..e01ca45 100644
--- a/vdsm/caps.py
+++ b/vdsm/caps.py
@@ -24,12 +24,12 @@
 import os
 import platform
 from collections import defaultdict
-from xml.dom import minidom
 import logging
 import time
 import linecache
 import glob
 import re
+import xml.etree.ElementTree as ET
 from distutils.version import LooseVersion
 
 import libvirt
@@ -207,19 +207,20 @@
     if capabilities is None:
         capabilities = _getFreshCapsXMLStr()
 
-    caps = minidom.parseString(capabilities)
-    host = caps.getElementsByTagName('host')[0]
-    cells = host.getElementsByTagName('cells')[0]
+    caps = ET.fromstring(capabilities)
+    host = caps.iter(tag='host').next()
+    cells = host.iter(tag='cells').next()
 
     sockets = set()
     siblings = set()
     onlineCpus = []
 
-    for cpu in cells.getElementsByTagName('cpu'):
-        if cpu.hasAttribute('socket_id') and cpu.hasAttribute('siblings'):
-            onlineCpus.append(cpu.getAttribute('id'))
-            sockets.add(cpu.getAttribute('socket_id'))
-            siblings.add(cpu.getAttribute('siblings'))
+    for cpu in cells.iter(tag='cpu'):
+        if cpu.get('socket_id') is not None and \
+           cpu.get('siblings') is not None:
+            onlineCpus.append(cpu.get('id'))
+            sockets.add(cpu.get('socket_id'))
+            siblings.add(cpu.get('siblings'))
 
     topology = {'sockets': len(sockets),
                 'cores': len(siblings),
@@ -241,13 +242,13 @@
     None if libvirt does not report the live
     snapshot support (as in version <= 1.2.2),
     '''
-    features = guest.getElementsByTagName('features')
+    features = guest.iter(tag='features')
     if not features:
         return None
 
-    for feature in features[0].childNodes:
-        if feature.nodeName == 'disksnapshot':
-            value = feature.getAttribute('default')
+    for feature in features.next():
+        if feature.tag == 'disksnapshot':
+            value = feature.get('default')
             if value.lower() == 'on':
                 return True
             else:
@@ -260,11 +261,11 @@
 def _getLiveSnapshotSupport(arch, capabilities=None):
     if capabilities is None:
         capabilities = _getCapsXMLStr()
-    caps = minidom.parseString(capabilities)
+    caps = ET.fromstring(capabilities)
 
-    for guestTag in caps.getElementsByTagName('guest'):
-        archTag = guestTag.getElementsByTagName('arch')[0]
-        if archTag.getAttribute('name') == arch:
+    for guestTag in caps.iter(tag='guest'):
+        archTag = guestTag.iter(tag='arch').next()
+        if archTag.get('name') == arch:
             return _findLiveSnapshotSupport(guestTag)
 
     if not config.getboolean('vars', 'fake_kvm_support'):
@@ -301,19 +302,19 @@
 def getNumaTopology(capabilities=None):
     if capabilities is None:
         capabilities = _getCapsXMLStr()
-    caps = minidom.parseString(capabilities)
-    host = caps.getElementsByTagName('host')[0]
-    cells = host.getElementsByTagName('cells')[0]
+    caps = ET.fromstring(capabilities)
+    host = caps.iter(tag='host').next()
+    cells = host.iter(tag='cells').next()
     cellsInfo = {}
-    cellSets = cells.getElementsByTagName('cell')
+    cellSets = cells.findall('cell')
     for cell in cellSets:
         cellInfo = {}
         cpus = []
-        for cpu in cell.getElementsByTagName('cpu'):
-            cpus.append(int(cpu.getAttribute('id')))
+        for cpu in cell.iter(tag='cpu'):
+            cpus.append(int(cpu.get('id')))
         cellInfo['cpus'] = cpus
-        cellIndex = cell.getAttribute('id')
-        if cellSets.length < 2:
+        cellIndex = cell.get('id')
+        if len(cellSets) < 2:
             memInfo = getUMAHostMemoryStats()
         else:
             memInfo = getMemoryStatsByNumaCell(int(cellIndex))
@@ -383,18 +384,18 @@
 def _getEmulatedMachines(arch, capabilities=None):
     if capabilities is None:
         capabilities = _getCapsXMLStr()
-    caps = minidom.parseString(capabilities)
+    caps = ET.fromstring(capabilities)
 
-    for archTag in caps.getElementsByTagName('arch'):
-        if archTag.getAttribute('name') == arch:
-            return [m.firstChild.data for m in archTag.childNodes
-                    if m.nodeName == 'machine']
+    for archTag in caps.iter(tag='arch'):
+        if archTag.get('name') == arch:
+            return [m.text for m in archTag.iterfind('machine')]
+
     return []
 
 
 def _getAllCpuModels(capfile='/usr/share/libvirt/cpu_map.xml', arch=None):
     with open(capfile) as xml:
-        cpu_map = minidom.parseString(xml.read())
+        cpu_map = ET.fromstring(xml.read())
 
     if arch is None:
         arch = platform.machine()
@@ -408,11 +409,11 @@
 
     architectureElement = None
 
-    architectureElements = cpu_map.getElementsByTagName('arch')
+    architectureElements = cpu_map.iter(tag='arch')
 
     if architectureElements:
         for a in architectureElements:
-            if a.getAttribute('name') == arch:
+            if a.get('name') == arch:
                 architectureElement = a
 
     if architectureElement is None:
@@ -421,24 +422,23 @@
         return {}
 
     allModels = dict()
-
-    for m in architectureElement.childNodes:
-        if m.nodeName != 'model':
+    for m in list(architectureElement):
+        if m.tag != 'model':
             continue
-        element = m.getElementsByTagName('vendor')
-        if element:
-            vendor = element[0].getAttribute('name')
-        else:
+        element = m.iter(tag='vendor')
+        try:
+            vendor = element.next().get('name')
+        except StopIteration:
             # If current model doesn't have a vendor, check if it has a model
             # that it is based on. The models in the cpu_map.xml file are
             # sorted in a way that the base model is always defined before.
-            element = m.getElementsByTagName('model')
-            if element:
-                vendor = allModels.get(element[0].getAttribute('name'), None)
-            else:
+            element = m.iterfind('model')
+            try:
+                elementName = element.next().get('name')
+                vendor = allModels.get(elementName, None)
+            except StopIteration:
                 vendor = None
-        allModels[m.getAttribute('name')] = vendor
-
+        allModels[m.get('name')] = vendor
     return allModels
 
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8c1ca58807515922347e2255c77b4f950decd619
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Marcin Mirecki <[email protected]>
_______________________________________________
vdsm-patches mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to