diff --git a/ghost/canonical-ini-converter.py b/ghost/canonical-ini-converter.py new file mode 100644 index 0000000..361ce43 --- /dev/null +++ b/ghost/canonical-ini-converter.py @@ -0,0 +1,38 @@ +import os +import configparser +import yaml +import io + +ORIGIN_CONFIGMAP_FILE_PATH = "mariadb/configmap-mariadb-origin.yaml" +NEW_CONFIGMAP_FILE_PATH = "mariadb/configmap-mariadb.yaml" +INI_FILE_NAME = "my.ini" + +def readConfigMap(): + with open(ORIGIN_CONFIGMAP_FILE_PATH, 'r') as stream: + try: + return yaml.safe_load(stream) + except yaml.YAMLError as exc: + print(exc) + exit(1) + + +def writeConfigMap(configMap): + with io.open(NEW_CONFIGMAP_FILE_PATH, 'w', encoding='utf8') as outfile: + yaml.dump(configMap, outfile, default_flow_style=False, allow_unicode=True) + + +def convertINIToMap(iniContent): + config = configparser.ConfigParser() + config.read_string(iniContent) + newMap = {} + for section in config.sections(): + keyPrefix = 'cm' + '.' +section # Ues prefix "cm." to distinguish configMap type. + for key, value in config[section].items(): + newMap[keyPrefix + '.' + key] = config[section][key] + return newMap + +if __name__ == "__main__": + configMap = readConfigMap() + newMap = convertINIToMap(configMap["data"][INI_FILE_NAME]) + configMap["data"] = newMap + writeConfigMap(configMap) diff --git a/ghost/configmap-formatter/Dockerfile b/ghost/configmap-formatter/Dockerfile new file mode 100644 index 0000000..49dd33c --- /dev/null +++ b/ghost/configmap-formatter/Dockerfile @@ -0,0 +1,17 @@ +FROM ubuntu:20.04 + +RUN apt-get update -y +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y \ + python3 \ + python3-pip \ + python3-virtualenv \ + && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 + +WORKDIR /app + +RUN mkdir -p /src/code +RUN mkdir -p /app + +COPY env-to-ini.py /src/code + +CMD [ "python3", "/src/code/env-to-ini.py"] diff --git a/ghost/configmap-formatter/env-to-ini.py b/ghost/configmap-formatter/env-to-ini.py new file mode 100644 index 0000000..049d448 --- /dev/null +++ b/ghost/configmap-formatter/env-to-ini.py @@ -0,0 +1,39 @@ +import os +import collections +import configparser +from os.path import exists + +CM_PREFIX = "cm." +DELIMITER = "." +INI_FILE_NAME_ENV = "CM_INI_FILE_NAME" +DEFAULT_INI_FILE = "my.cnf" + +def iniFileNameFromEnv(): + iniFromEnv = os.environ[INI_FILE_NAME_ENV] + return iniFromEnv if iniFromEnv else DEFAULT_INI_FILE + +def run(): + config = configparser.ConfigParser() + + iniContent = readFromEnv() + config.read_dict(iniContent) + + with open(iniFileNameFromEnv(), 'w') as iniFile: + config.write(iniFile) + + +def readFromEnv(): + iniContent = collections.defaultdict(dict) + for envKey, value in os.environ.items(): + if envKey.startswith(CM_PREFIX): + _, section, key = envKey.split(DELIMITER) + iniContent[section][key] = value + return iniContent + + +if __name__ == "__main__": + run() + iniFile = os.path.abspath(iniFileNameFromEnv()) + if not exists(iniFile): + os.exit(1) + print(f"Successfully write to {iniFile}.") \ No newline at end of file diff --git a/ghost/mariadb/configmap-mariadb-origin.yaml b/ghost/mariadb/configmap-mariadb-origin.yaml new file mode 100644 index 0000000..36f6d58 --- /dev/null +++ b/ghost/mariadb/configmap-mariadb-origin.yaml @@ -0,0 +1,35 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: mariadb + namespace: example + labels: + app.kubernetes.io/name: mariadb +data: + my.ini: |- + [mysqld] + skip-name-resolve="ON" + explicit_defaults_for_timestamp="" + basedir=/opt/bitnami/mariadb + plugin_dir=/opt/bitnami/mariadb/plugin + port=3306 + socket=/opt/bitnami/mariadb/tmp/mysql.sock + tmpdir=/opt/bitnami/mariadb/tmp + max_allowed_packet=16M + bind-address=* + pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid + log-error=/opt/bitnami/mariadb/logs/mysqld.log + character-set-server=UTF8 + collation-server=utf8_general_ci + slow_query_log=0 + slow_query_log_file=/opt/bitnami/mariadb/logs/mysqld.log + long_query_time=10.0 + [client] + port=3306 + socket=/opt/bitnami/mariadb/tmp/mysql.sock + default-character-set=UTF8 + plugin_dir=/opt/bitnami/mariadb/plugin + [manager] + port=3306 + socket=/opt/bitnami/mariadb/tmp/mysql.sock + pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid \ No newline at end of file diff --git a/ghost/mariadb/configmap-mariadb.yaml b/ghost/mariadb/configmap-mariadb.yaml index 2fe9c07..c4bfc9e 100644 --- a/ghost/mariadb/configmap-mariadb.yaml +++ b/ghost/mariadb/configmap-mariadb.yaml @@ -1,38 +1,31 @@ -# Source: ghost/charts/mariadb/templates/primary/configmap.yaml apiVersion: v1 +data: + cm.client.default-character-set: UTF8 + cm.client.plugin_dir: /opt/bitnami/mariadb/plugin + cm.client.port: '3306' + cm.client.socket: /opt/bitnami/mariadb/tmp/mysql.sock + cm.manager.pid-file: /opt/bitnami/mariadb/tmp/mysqld.pid + cm.manager.port: '3306' + cm.manager.socket: /opt/bitnami/mariadb/tmp/mysql.sock + cm.mysqld.basedir: /opt/bitnami/mariadb + cm.mysqld.bind-address: '*' + cm.mysqld.character-set-server: UTF8 + cm.mysqld.collation-server: utf8_general_ci + cm.mysqld.explicit_defaults_for_timestamp: '""' + cm.mysqld.log-error: /opt/bitnami/mariadb/logs/mysqld.log + cm.mysqld.long_query_time: '10.0' + cm.mysqld.max_allowed_packet: 16M + cm.mysqld.pid-file: /opt/bitnami/mariadb/tmp/mysqld.pid + cm.mysqld.plugin_dir: /opt/bitnami/mariadb/plugin + cm.mysqld.port: '3306' + cm.mysqld.skip-name-resolve: '"ON"' + cm.mysqld.slow_query_log: '0' + cm.mysqld.slow_query_log_file: /opt/bitnami/mariadb/logs/mysqld.log + cm.mysqld.socket: /opt/bitnami/mariadb/tmp/mysql.sock + cm.mysqld.tmpdir: /opt/bitnami/mariadb/tmp kind: ConfigMap metadata: - name: mariadb - namespace: example labels: app.kubernetes.io/name: mariadb -data: - my.ini: |- - [mysqld] - skip-name-resolve - explicit_defaults_for_timestamp - basedir=/opt/bitnami/mariadb - plugin_dir=/opt/bitnami/mariadb/plugin - port=3306 - socket=/opt/bitnami/mariadb/tmp/mysql.sock - tmpdir=/opt/bitnami/mariadb/tmp - max_allowed_packet=16M - bind-address=* - pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid - log-error=/opt/bitnami/mariadb/logs/mysqld.log - character-set-server=UTF8 - collation-server=utf8_general_ci - slow_query_log=0 - slow_query_log_file=/opt/bitnami/mariadb/logs/mysqld.log - long_query_time=10.0 - - [client] - port=3306 - socket=/opt/bitnami/mariadb/tmp/mysql.sock - default-character-set=UTF8 - plugin_dir=/opt/bitnami/mariadb/plugin - - [manager] - port=3306 - socket=/opt/bitnami/mariadb/tmp/mysql.sock - pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid + name: mariadb + namespace: example diff --git a/ghost/mariadb/statefulset-mariadb.yaml b/ghost/mariadb/statefulset-mariadb.yaml index c97e518..fa43a9b 100644 --- a/ghost/mariadb/statefulset-mariadb.yaml +++ b/ghost/mariadb/statefulset-mariadb.yaml @@ -16,6 +16,28 @@ spec: spec: securityContext: fsGroup: 1001 + initContainers: + - name: configmap-map-to-file + image: gcr.io/kpt-fn-demo/yuwenma-cm-env-to-ini:v0.12 + env: + - name: CM_INI_FILE_NAME + value: my.cnf + envFrom: + - configMapRef: + name: mariadb + volumeMounts: + - name: ini-config + # the env-to-ini.py cannot be placed in the same mount dir. + # Because it will be overridden. + mountPath: /app + - name: verify + image: ubuntu + command: ["/bin/sh","-c"] + args: ["ls /tmp; cat /tmp/my.cnf"] + volumeMounts: + - name: ini-config + mountPath: /tmp/my.cnf + subPath: my.cnf containers: - name: mariadb image: docker.io/bitnami/mariadb:10.6.7-debian-10-r62 @@ -24,44 +46,43 @@ spec: runAsNonRoot: true runAsUser: 1001 env: - - name: BITNAMI_DEBUG - value: "true" - - name: MARIADB_USER - value: bn_ghost - - name: MARIADB_DATABASE - value: bitnami_ghost - - name: ALLOW_EMPTY_PASSWORD - value: "true" + - name: BITNAMI_DEBUG + value: "true" + - name: MARIADB_USER + value: bn_ghost + - name: MARIADB_DATABASE + value: bitnami_ghost + - name: ALLOW_EMPTY_PASSWORD + value: "true" ports: - - name: mysql - containerPort: 3306 + - name: mysql + containerPort: 3307 resources: limits: {} requests: {} volumeMounts: - - name: data - mountPath: /bitnami/mariadb - - name: config - mountPath: /opt/bitnami/mariadb/conf/my.ini - subPath: my.ini + - name: data + mountPath: /bitnami/mariadb + - name: ini-config + mountPath: /opt/bitnami/mariadb/conf/my.cnf + subPath: my.cnf volumes: - - name: config - configMap: - name: mariadb + - name: ini-config + emptyDir: {} metadata: labels: app.kubernetes.io/name: mariadb volumeClaimTemplates: - - metadata: - name: data - labels: - app.kubernetes.io/name: mariadb - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 8Gi + - metadata: + name: data + labels: + app.kubernetes.io/name: mariadb + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi selector: matchLabels: app.kubernetes.io/name: mariadb