diff options
-rw-r--r-- | glusternagios/utils.py | 24 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/utilsTests.py | 70 | ||||
-rw-r--r-- | tests/xml2dictSuccess.xml | 10 |
4 files changed, 105 insertions, 0 deletions
diff --git a/glusternagios/utils.py b/glusternagios/utils.py index b1bfe10..44c4727 100644 --- a/glusternagios/utils.py +++ b/glusternagios/utils.py @@ -32,6 +32,7 @@ import time import os import errno import signal +from collections import defaultdict class HostStatus: @@ -462,3 +463,26 @@ def retry(func, expectedException=Exception, tries=None, raise time.sleep(sleep) + + +def xml2dict(tree): + d = {tree.tag: {} if tree.attrib else None} + children = list(tree) + if children: + dd = defaultdict(list) + for dc in map(xml2dict, children): + for k, v in dc.iteritems(): + dd[k].append(v) + d = {tree.tag: {}} + for k, v in dd.iteritems(): + d[tree.tag][k] = v[0] if len(v) == 1 else v + if tree.attrib: + d[tree.tag].update((k, v) for k, v in tree.attrib.iteritems()) + if tree.text: + text = tree.text.strip() + if children or tree.attrib: + if text: + d[tree.tag]['#text'] = text + else: + d[tree.tag] = text + return d diff --git a/tests/Makefile.am b/tests/Makefile.am index a4fc465..faecae3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -23,6 +23,7 @@ test_modules = \ $(NULL) dist_glusternagioscommontests_DATA = \ + xml2dictSuccess.xml \ $(NULL) dist_glusternagioscommontests_PYTHON = \ diff --git a/tests/utilsTests.py b/tests/utilsTests.py index a608dd9..69da659 100644 --- a/tests/utilsTests.py +++ b/tests/utilsTests.py @@ -19,6 +19,7 @@ # import errno +import xml.etree.cElementTree as etree from testrunner import GlusterNagiosTestCase as TestCaseBase from glusternagios import utils @@ -76,3 +77,72 @@ class ExecCmdTests(TestCaseBase): (rc, out, err) = utils.execCmd(["unknown"]) self.assertRaises(OSError, _runUnknown) + + +class xml2dictTests(TestCaseBase): + def testSuccess(self): + expectedDict = {'timestamp': + {'date': '2014-03-18', + 'interval': '60', + 'network': {'net-dev': [{'iface': 'wlp3s0', + 'rxcmp': '0.00', + 'rxkB': '0.00', + 'rxmcst': '0.00', + 'rxpck': '0.00', + 'txcmp': '0.00', + 'txkB': '0.00', + 'txpck': '0.00'}, + {'iface': 'lo', + 'rxcmp': '0.00', + 'rxkB': '0.00', + 'rxmcst': '0.00', + 'rxpck': '0.00', + 'txcmp': '0.00', + 'txkB': '0.00', + 'txpck': '0.00'}, + {'iface': 'virbr0-nic', + 'rxcmp': '0.00', + 'rxkB': '0.00', + 'rxmcst': '0.00', + 'rxpck': '0.00', + 'txcmp': '0.00', + 'txkB': '0.00', + 'txpck': '0.00'}, + {'iface': 'virbr0', + 'rxcmp': '0.00', + 'rxkB': '0.00', + 'rxmcst': '0.00', + 'rxpck': '0.00', + 'txcmp': '0.00', + 'txkB': '0.00', + 'txpck': '0.00'}, + {'iface': 'enp0s26u1u2', + 'rxcmp': '0.00', + 'rxkB': '0.01', + 'rxmcst': '0.00', + 'rxpck': '0.13', + 'txcmp': '0.00', + 'txkB': '0.03', + 'txpck': '0.25'}, + {'iface': 'em1', + 'rxcmp': '0.00', + 'rxkB': '0.00', + 'rxmcst': '0.00', + 'rxpck': '0.00', + 'txcmp': '0.00', + 'txkB': '0.00', + 'txpck': '0.00'}], + 'per': 'second'}, + 'time': '13:53:01', + 'utc': '1'}} + with open("xml2dictSuccess.xml") as f: + out = f.read() + tree = etree.fromstring(out) + outDict = utils.xml2dict(tree) + self.assertEquals(expectedDict, outDict) + + def testAttributeError(self): + def _xml2dict(): + utils.xml2dict("not an etree object") + + self.assertRaises(AttributeError, _xml2dict) diff --git a/tests/xml2dictSuccess.xml b/tests/xml2dictSuccess.xml new file mode 100644 index 0000000..fb35904 --- /dev/null +++ b/tests/xml2dictSuccess.xml @@ -0,0 +1,10 @@ + <timestamp date="2014-03-18" time="13:53:01" utc="1" interval="60"> + <network per="second"> + <net-dev iface="wlp3s0" rxpck="0.00" txpck="0.00" rxkB="0.00" txkB="0.00" rxcmp="0.00" txcmp="0.00" rxmcst="0.00"/> + <net-dev iface="lo" rxpck="0.00" txpck="0.00" rxkB="0.00" txkB="0.00" rxcmp="0.00" txcmp="0.00" rxmcst="0.00"/> + <net-dev iface="virbr0-nic" rxpck="0.00" txpck="0.00" rxkB="0.00" txkB="0.00" rxcmp="0.00" txcmp="0.00" rxmcst="0.00"/> + <net-dev iface="virbr0" rxpck="0.00" txpck="0.00" rxkB="0.00" txkB="0.00" rxcmp="0.00" txcmp="0.00" rxmcst="0.00"/> + <net-dev iface="enp0s26u1u2" rxpck="0.13" txpck="0.25" rxkB="0.01" txkB="0.03" rxcmp="0.00" txcmp="0.00" rxmcst="0.00"/> + <net-dev iface="em1" rxpck="0.00" txpck="0.00" rxkB="0.00" txkB="0.00" rxcmp="0.00" txcmp="0.00" rxmcst="0.00"/> + </network> + </timestamp> |