#!/usr/bin/env python3 import sys import os import json import yaml import requests import textwrap config_file = sys.argv[1] configmap_folder = sys.argv[2] # read config file with open(config_file, 'r') as yaml_contents: config = yaml.safe_load(yaml_contents.read()) def base_rule(config): rule = '' if 'condition' in config: # use index function to make go template happy if '-' in names if '-' in config['condition'] and "index" not in config['condition']: tokens = config['condition'].split('.') rule = '''{{- if index .Values %(condition)s }} ''' % {'condition': ' '.join(f'"{w}"' for w in tokens[2:])} else: rule = '''{{- if %(condition)s }} ''' % config # Base rule for KubeZero rule += '''apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: {{ printf "%%s-%%s" (include "kubezero-lib.fullname" $) "%(name)s" | trunc 63 | trimSuffix "-" }} namespace: {{ .Release.Namespace }} labels: {{- include "kubezero-lib.labels" . | nindent 4 }} ''' % config return rule for r in config['rules']: if not r['url'].startswith('file://'): response = requests.get(r['url']) if response.status_code != 200: print('Skipping the file, response code %s not equals 200' % response.status_code) continue raw_text = response.text else: with open(r['url'].replace('file://', ''), 'r') as file_contents: raw_text = file_contents.read() obj = json.loads(raw_text) rule = base_rule(r) text = yaml.dump(obj['spec'], default_flow_style=False, width=1000, indent=2) # Encode {{ }} for helm text = text.replace("{{", "{{`{{").replace("}}", "}}`}}").replace("{{`{{", "{{`{{`}}").replace("}}`}}", "{{`}}`}}") rule += '''spec:\n''' rule += textwrap.indent(text, ' '*2)+'\n' if 'condition' in r: rule += '{{- end }}'+'\n' # Write Configmap configmap_file = os.path.join(configmap_folder, r['name'] + '.yaml') with open(configmap_file, 'w') as f: f.write(rule)