diff options
Diffstat (limited to 'vnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py')
-rwxr-xr-x | vnfs/DAaaS/prometheus-operator/hack/sync_grafana_dashboards.py | 143 |
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() |