Merge "flatting prestera statistics output"
diff --git a/presterastats/prestera_periodic.py b/presterastats/prestera_periodic.py
index 91f146e..82f56e6 100755
--- a/presterastats/prestera_periodic.py
+++ b/presterastats/prestera_periodic.py
@@ -18,6 +18,7 @@
__author__ = 'poist@google.com (Gregory Poist)'
import errno
+import json
import os
import subprocess
import sys
@@ -44,6 +45,38 @@
self.interval = interval
self.ports_output_file = os.path.join(self.OUTPUT_DIR, 'ports.json')
+ def _FlatObject(self, base, obj, out):
+ """Open json object to a list of strings.
+
+ Args:
+ base: is a string that has a base name for a key.
+ obj: is a JSON object that will be flatten.
+ out: is an output where strings will be appended.
+
+ Example:
+ data = {"a": 1, "b": { "c": 2, "d": 3}}
+ out = []
+ _FlatObject('', data, out)
+
+ out will be equal to
+ [u'/a=1', u'/b/c=2', u'/b/d=3']
+ """
+ for k, v in obj.items():
+ name = base + '/' + k
+ if isinstance(v, dict):
+ self._FlatObject(name, v, out)
+ else:
+ val = '%s=' % name
+ out.append(val + str(v))
+
+ def _PrintStats(self, port_stats):
+ json_data = json.loads(port_stats)
+ flat_data = []
+ self._FlatObject('', json_data, flat_data)
+ for s in flat_data:
+ sys.stderr.write('%s\n' % s)
+ sys.stderr.flush()
+
def WriteToStderr(self, msg):
"""Write a message to stderr."""
@@ -62,10 +95,14 @@
ports_stats = ''
try:
ports_stats = self.RunPresteraStats()
+ if ports_stats:
+ self._PrintStats(ports_stats)
except OSError as ex:
self.WriteToStderr('Failed to run presterastats: %s\n' % ex)
except subprocess.CalledProcessError as ex:
self.WriteToStderr('presterastats exited non-zero: %s\n' % ex)
+ except ValueError as ex:
+ self.WriteToStderr('Failed to parse presterastats output: %s\n' % ex)
if not ports_stats:
self.WriteToStderr('Failed to get data from presterastats\n')
diff --git a/presterastats/prestera_periodic_test.py b/presterastats/prestera_periodic_test.py
index 10be8e4..c31f9b5 100644
--- a/presterastats/prestera_periodic_test.py
+++ b/presterastats/prestera_periodic_test.py
@@ -124,6 +124,13 @@
output = ''.join(line for line in f)
self.assertEqual('', output)
+ def testFlatObject(self):
+ obj = {'key1': 1, 'key2': {'key3': 3, 'key4': 4}}
+ got = []
+ self.periodic._FlatObject('base', obj, got)
+ want = ['base/key1=1', 'base/key2/key3=3', 'base/key2/key4=4']
+ self.assertEqual(got.sort(), want.sort())
+
if __name__ == '__main__':
unittest.main()