#!/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)