deploy-templates/scripts/update-env-config.py (152 lines of code) (raw):

import urllib.request import re def upper_repl(match): return match.group(1).upper() vars = [] # Add some undocumented/operational values vars.append( { "name": "secretKey", "env": "REDASH_SECRET_KEY", "desc": "Secret key used for data encryption", "default": "", "secret": True, "required": True, } ) # Can remove once documented: https://github.com/getredash/website/issues/528 vars.append( { "name": "samlSchemeOverride", "env": "REDASH_SAML_SCHEME_OVERRIDE", "desc": "This setting will allow you to override the SAML Auth URL scheme that gets constructed by Flask. This is a useful feature if, for example, you're behind a Proxy Protocol enabled TCP load balancer (AWS ELB that terminates SSL) and your Nginx proxy or similar adds a X-Forwarded-Proto of HTTP even though your Redash URL for SAML auth is HTTPS.", "default": "", "secret": False, "required": False, } ) # Parse the docs and build a list of environment variables with urllib.request.urlopen( "https://raw.githubusercontent.com/getredash/website/master/src/pages/kb/open-source/admin-guide/env-vars-settings.md" ) as response: data = response.read().decode("utf-8") for line in data.splitlines(): m = re.match(r"^\s*[|]\s*[`](REDASH_.+)[`]\s*[|]\s([^|]*)\s*[|]\s([^|]*)", line) if m: name = env = m.group(1).strip() desc = m.group(2).strip() default = m.group(3).strip() if env in ["REDASH_REDIS_URL", "REDASH_DATABASE_URL"]: continue secret = False if env in [ "REDASH_LDAP_BIND_DN_PASSWORD", "REDASH_MAIL_PASSWORD", "REDASH_GOOGLE_CLIENT_SECRET", "REDASH_COOKIE_SECRET", "REDASH_SECRET_KEY", ]: secret = True required = False if env in ["REDASH_COOKIE_SECRET", "REDASH_SECRET_KEY"]: required = True # Unset default to make this clear default = "" name = re.sub(r"REDASH_", "", name).lower() name = re.sub(r"_([a-z])", upper_repl, name) vars.append( { "name": name, "env": env, "desc": desc, "default": default, "secret": secret, "required": required, } ) # Replace lines between markers with config based on the docs start_token = "## Start primary Redash configuration" end_token = "## End primary Redash configuration" print("values.yaml snippet") print() config = [start_token] config.append( " ## Note that we document the Redash defaults, but don't explicitly set them." ) config.append( " ## This allows multiple versions of Redash (which may have different defaults) to be more easily used" ) for var in vars: required = "" if var["required"]: required = "REQUIRED " comment = " # -- %s`%s` value." % ( required, var["env"], ) if len(var["desc"]) > 0: comment += " %s." % (var["desc"].capitalize()) if var["secret"]: comment += " Stored as a Secret value." if len(var["default"]) > 0: comment += "\n # @default -- %s" % (var["default"]) config.append(comment) config.append(' %s: ""' % (var["name"])) config.append(" ## End primary Redash configuration") values = open("values.yaml", "r+") content = re.sub( start_token + ".*" + end_token, "\n".join(config), values.read(), flags=re.DOTALL ) values.seek(0) values.truncate() values.write(content) values.close() print("secrets.yaml snippet") print() config = [start_token] for var in vars: required = 'default "" ' if var["required"]: config.append( ' {{ $null := required "A value for one of the following variables is required: redash.%s (secure random value), redash.existingSecret (secret name)" (or .Values.redash.%s .Values.redash.existingSecret) }}' % (var["name"], var["name"]) ) if var["secret"]: config.append( ' %s: {{ default "" .Values.redash.%s | b64enc | quote }}' % (var["name"], var["name"]) ) config.append(" ## End primary Redash configuration") secrets = open("templates/secrets.yaml", "r+") content = re.sub( start_token + ".*" + end_token, "\n".join(config), secrets.read(), flags=re.DOTALL ) secrets.seek(0) secrets.truncate() secrets.write(content) secrets.close() print("_helpers.tpl snippet") print() config = [start_token] for var in vars: if var["secret"]: config.append( "{{- if or .Values.redash.%s .Values.redash.existingSecret }}" % (var["name"]) ) config.append("- name: %s" % (var["env"])) config.append(" valueFrom:") config.append(" secretKeyRef:") config.append(' name: {{ include "redash.secretName" . }}') config.append(" key: %s" % (var["name"])) else: config.append("{{- if .Values.redash.%s }}" % (var["name"])) config.append("- name: %s" % (var["env"])) config.append( " value: {{ default " " .Values.redash.%s | quote }}" % (var["name"]) ) config.append("{{- end }}") config.append("## End primary Redash configuration") secrets = open("templates/_helpers.tpl", "r+") content = re.sub( start_token + ".*" + end_token, "\n".join(config), secrets.read(), flags=re.DOTALL ) secrets.seek(0) secrets.truncate() secrets.write(content) secrets.close()