summaryrefslogtreecommitdiffstats
path: root/vnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py
diff options
context:
space:
mode:
Diffstat (limited to 'vnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py')
-rwxr-xr-xvnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/vnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py b/vnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py
new file mode 100755
index 00000000..f548d0b7
--- /dev/null
+++ b/vnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python3
+"""Fetch dashboards from provided urls into this chart."""
+import json
+import textwrap
+from os import makedirs, path
+
+import requests
+import yaml
+from yaml.representer import SafeRepresenter
+
+
+# https://stackoverflow.com/a/20863889/961092
+class LiteralStr(str):
+ pass
+
+
+def change_style(style, representer):
+ def new_representer(dumper, data):
+ scalar = representer(dumper, data)
+ scalar.style = style
+ return scalar
+
+ return new_representer
+
+
+# Source files list
+charts = [
+ {
+ 'source': 'https://raw.githubusercontent.com/coreos/prometheus-operator/master/contrib/kube-prometheus/manifests/grafana-dashboardDefinitions.yaml',
+ 'destination': '../templates/grafana/dashboards',
+ 'type': 'yaml',
+ },
+ {
+ 'source': 'https://raw.githubusercontent.com/etcd-io/etcd/master/Documentation/op-guide/grafana.json',
+ 'destination': '../templates/grafana/dashboards',
+ 'type': 'json',
+ },
+ {
+ 'source': 'https://raw.githubusercontent.com/helm/charts/master/stable/prometheus-operator/dashboards/grafana-coredns-k8s.json',
+ 'destination': '../templates/grafana/dashboards',
+ 'type': 'json',
+ },
+]
+
+# Additional conditions map
+condition_map = {
+ 'grafana-coredns-k8s': ' .Values.coreDns.enabled',
+ 'etcd': ' .Values.kubeEtcd.enabled',
+}
+
+# standard header
+header = '''# Generated from '%(name)s' from %(url)s
+{{- if and .Values.grafana.enabled .Values.grafana.defaultDashboardsEnabled%(condition)s }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ printf "%%s-%%s" (include "prometheus-operator.fullname" $) "%(name)s" | trunc 63 | trimSuffix "-" }}
+ labels:
+ {{- if $.Values.grafana.sidecar.dashboards.label }}
+ {{ $.Values.grafana.sidecar.dashboards.label }}: "1"
+ {{- end }}
+ app: {{ template "prometheus-operator.name" $ }}-grafana
+{{ include "prometheus-operator.labels" $ | indent 4 }}
+data:
+'''
+
+
+def init_yaml_styles():
+ represent_literal_str = change_style('|', SafeRepresenter.represent_str)
+ yaml.add_representer(LiteralStr, represent_literal_str)
+
+
+def escape(s):
+ return s.replace("{{", "{{`{{").replace("}}", "}}`}}")
+
+
+def yaml_str_repr(struct, indent=2):
+ """represent yaml as a string"""
+ text = yaml.dump(
+ struct,
+ width=1000, # to disable line wrapping
+ default_flow_style=False # to disable multiple items on single line
+ )
+ text = escape(text) # escape {{ and }} for helm
+ text = textwrap.indent(text, ' ' * indent)
+ return text
+
+
+def write_group_to_file(resource_name, content, url, destination):
+ # initialize header
+ lines = header % {
+ 'name': resource_name,
+ 'url': url,
+ 'condition': condition_map.get(resource_name, ''),
+ }
+
+ filename_struct = {resource_name + '.json': (LiteralStr(content))}
+ # rules themselves
+ lines += yaml_str_repr(filename_struct)
+
+ # footer
+ lines += '{{- end }}'
+
+ filename = resource_name + '.yaml'
+ new_filename = "%s/%s" % (destination, filename)
+
+ # make sure directories to store the file exist
+ makedirs(destination, exist_ok=True)
+
+ # recreate the file
+ with open(new_filename, 'w') as f:
+ f.write(lines)
+
+ print("Generated %s" % new_filename)
+
+
+def main():
+ init_yaml_styles()
+ # read the rules, create a new template file per group
+ for chart in charts:
+ print("Generating rules from %s" % chart['source'])
+ raw_text = requests.get(chart['source']).text
+ if chart['type'] == 'yaml':
+ yaml_text = yaml.load(raw_text)
+ groups = yaml_text['items']
+ for group in groups:
+ for resource, content in group['data'].items():
+ write_group_to_file(resource.replace('.json', ''), content, chart['source'], chart['destination'])
+ elif chart['type'] == 'json':
+ json_text = json.loads(raw_text)
+ # is it already a dashboard structure or is it nested (etcd case)?
+ flat_structure = bool(json_text.get('annotations'))
+ if flat_structure:
+ resource = path.basename(chart['source']).replace('.json', '')
+ write_group_to_file(resource, json.dumps(json_text, indent=4), chart['source'], chart['destination'])
+ else:
+ for resource, content in json_text.items():
+ write_group_to_file(resource.replace('.json', ''), json.dumps(content, indent=4), chart['source'], chart['destination'])
+ print("Finished")
+
+
+if __name__ == '__main__':
+ main()