From ab3d122fd01c38c6b3f111788d6189d1703f4fde Mon Sep 17 00:00:00 2001 From: Simon Pasquier Date: Mon, 26 Jun 2017 15:18:19 +0200 Subject: [PATCH] Add script to format dashboards Change-Id: I1c34dad29ad5807603b547c504fcf81185ca2e55 --- contrib/format.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 contrib/format.py 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: {} + +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))