summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBala.FA <barumuga@redhat.com>2014-03-13 15:23:17 +0530
committerBala.FA <barumuga@redhat.com>2014-04-28 16:20:46 +0530
commit576d7248699f8017f2909f548ef80df7217b57a4 (patch)
tree94f49c58cf64d6e144b86f93e64b3ed0ece6c482
parent3ddcde1155b6c278d7775f52e9197bff47ff37d1 (diff)
utils: add xml2dict()
The method coverts xml object as elementTree to dictionary. Change-Id: Ia7eca3eb52a79979d7d1ee9d4ce1c842cc86e8ed Signed-off-by: Bala.FA <barumuga@redhat.com> Reviewed-on: https://cuckoo.blr.redhat.com:8443/22
-rw-r--r--glusternagios/utils.py24
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/utilsTests.py70
-rw-r--r--tests/xml2dictSuccess.xml10
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>