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
