Add script to format dashboards
Change-Id: I1c34dad29ad5807603b547c504fcf81185ca2e55
diff --git a/contrib/format.py b/contrib/format.py
new file mode 100755
index 0000000..97d14f9
--- /dev/null
+++ b/contrib/format.py
@@ -0,0 +1,88 @@
+#!/usr/bin/python3
+# Copyright 2016 Mirantis, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+import sys
+import glob
+import os
+import json
+
+
+def usage():
+ h = """
+Format and sanitize Grafana dashboards
+
+Usage: {} <DIRECTORY|FILE>
+
+The program will:
+* Sort keys alphabetically.
+* Remove sections:
+ templating.list[].current
+ templating.list[].options
+* Override the time entry to {{"from": "now-1h","to": "now"}}
+* Enable the sharedCrosshair tooltip
+* Increment the version number
+
+WARNING: this script modifies directly the given file(s).
+
+If a DIRECTORY is provided, all files with suffix '.json' are modified.
+ """
+ print(h.format(sys.argv[0]))
+
+if len(sys.argv) != 2:
+ usage()
+ sys.exit(1)
+
+arg = sys.argv[1]
+
+if os.path.isdir(arg):
+ path = "{}/*.json".format(arg)
+elif os.path.isfile(arg):
+ path = arg
+else:
+ print("'{}' no such file or directory".format(arg))
+ usage()
+ sys.exit(1)
+
+for f in glob.glob(path):
+ data = None
+ absf = os.path.abspath(f)
+ with open(absf) as out:
+ data = json.load(out)
+ for k, v in data.items():
+ if k == 'annotations':
+ for anno in v.get('list', []):
+ anno['datasource'] = 'lma'
+
+ if k == 'templating':
+ variables = v.get('list', [])
+ for o in variables:
+ if o['type'] == 'query':
+ o['options'] = []
+ o['current'] = {}
+ o['refresh_on_load'] = True
+
+ data['time'] = {'from': 'now-1h', 'to': 'now'}
+ data['sharedCrosshair'] = True
+ data['refresh'] = '1m'
+ data['id'] = None
+
+ if data.get('version', None):
+ data['version'] = data['version'] + 1
+ else:
+ data['version'] = 1
+
+ with open(absf, 'w') as out:
+ out.write(json.dumps(data, indent=2, sort_keys=True))