python.d.plugin: YAML output is ordered now
Ilya committed
Feb 7, 2017 at 10:31 UTC
e621007e591fb71bbec6c41fbd26caba61d58e6f
1 file changed
+25
-2
plugins.d/python.d.plugin
+25
-2
@@ -67,6 +67,26 @@ try:
67
except ImportError:
68
msg.fatal('Cannot find yaml library')
69
70
+try:
71
+ from collections import OrderedDict
72
+ ORDERED = True
73
+ DICT = OrderedDict
74
+ msg.info('YAML output is ordered')
75
+except ImportError:
76
+ ORDERED = False
77
+ DICT = dict
78
+ msg.info('YAML output is unordered')
79
+else:
80
+ def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict):
81
+ class OrderedLoader(Loader):
82
+ pass
83
+ def construct_mapping(loader, node):
84
+ loader.flatten_mapping(node)
85
+ return object_pairs_hook(loader.construct_pairs(node))
86
+ OrderedLoader.add_constructor(
87
+ yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
88
+ construct_mapping)
89
+ return yaml.load(stream, OrderedLoader)
90
91
class PythonCharts(object):
92
"""
@@ -235,7 +255,7 @@ class PythonCharts(object):
255
# check if there are dict in config dict
256
many_jobs = False
257
for name in config:
238
- if type(config[name]) is dict:
258
+ if isinstance(config[name], DICT):
259
many_jobs = True
260
break
261
@@ -420,7 +440,10 @@ def read_config(path):
440
"""
441
try:
442
with open(path, 'r') as stream:
423
- config = yaml.load(stream)
443
+ if ORDERED:
444
+ config = ordered_load(stream, yaml.SafeLoader)
445
+ else:
446
+ config = yaml.load(stream)
447
except (OSError, IOError):
448
msg.error(str(path), "is not a valid configuration file")
449
return None