From 3fa0c974b4b1f70fe7dbd4c6016065b87ef9aa80 Mon Sep 17 00:00:00 2001 From: manojsaikumar Date: Sat, 15 Jul 2023 01:27:28 +0530 Subject: [PATCH 01/69] change swagger ingress --- helm/dashboard-backend/Chart.yaml | 2 +- helm/dashboard-backend/templates/ingress.yaml | 4 ++-- .../templates/swagger-ui-custom-html.yaml | 19 ++++++++++--------- .../templates/swagger-ui.yaml | 19 ++++++++++--------- .../templates/swagger-v3.yaml | 19 ++++++++++--------- 5 files changed, 33 insertions(+), 30 deletions(-) diff --git a/helm/dashboard-backend/Chart.yaml b/helm/dashboard-backend/Chart.yaml index da57e48f..18a6fd09 100644 --- a/helm/dashboard-backend/Chart.yaml +++ b/helm/dashboard-backend/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.26.0-alpha.3 +version: v0.26.0-alpha.4 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/dashboard-backend/templates/ingress.yaml b/helm/dashboard-backend/templates/ingress.yaml index af8f59ce..6106ae1b 100644 --- a/helm/dashboard-backend/templates/ingress.yaml +++ b/helm/dashboard-backend/templates/ingress.yaml @@ -44,7 +44,7 @@ spec: {{- range .paths }} - path: {{ .path }} {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} + pathType: ImplementationSpecific {{- end }} backend: {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} @@ -58,4 +58,4 @@ spec: {{- end }} {{- end }} {{- end }} -{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dashboard-backend/templates/swagger-ui-custom-html.yaml b/helm/dashboard-backend/templates/swagger-ui-custom-html.yaml index 2b8cb985..6db95b95 100644 --- a/helm/dashboard-backend/templates/swagger-ui-custom-html.yaml +++ b/helm/dashboard-backend/templates/swagger-ui-custom-html.yaml @@ -42,18 +42,19 @@ spec: http: paths: - path: /swagger-ui-custom.html(/|$)(.*) - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} pathType: ImplementationSpecific + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} backend: {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $fullName }} - port: - number: {{ $svcPort }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} {{- end }} {{- end }} - {{- end }} -{{- end }} \ No newline at end of file + {{- end }} \ No newline at end of file diff --git a/helm/dashboard-backend/templates/swagger-ui.yaml b/helm/dashboard-backend/templates/swagger-ui.yaml index 42e60d48..c70be868 100644 --- a/helm/dashboard-backend/templates/swagger-ui.yaml +++ b/helm/dashboard-backend/templates/swagger-ui.yaml @@ -42,18 +42,19 @@ spec: http: paths: - path: /swagger-ui(/|$)(.*) - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} pathType: ImplementationSpecific + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} backend: {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $fullName }} - port: - number: {{ $svcPort }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} {{- end }} {{- end }} - {{- end }} -{{- end }} \ No newline at end of file + {{- end }} \ No newline at end of file diff --git a/helm/dashboard-backend/templates/swagger-v3.yaml b/helm/dashboard-backend/templates/swagger-v3.yaml index ca4d1189..a354ed50 100644 --- a/helm/dashboard-backend/templates/swagger-v3.yaml +++ b/helm/dashboard-backend/templates/swagger-v3.yaml @@ -42,18 +42,19 @@ spec: http: paths: - path: /v3(/|$)(.*) - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} pathType: ImplementationSpecific + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} backend: {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $fullName }} - port: - number: {{ $svcPort }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} {{- end }} {{- end }} - {{- end }} -{{- end }} \ No newline at end of file + {{- end }} \ No newline at end of file From a6613cc1ea223032b418ccd9c221767a19d073bd Mon Sep 17 00:00:00 2001 From: manojsaikumar Date: Wed, 19 Jul 2023 14:23:04 +0530 Subject: [PATCH 02/69] added pyathena_sql version --- helm/superset/Chart.yaml | 2 +- helm/superset/values.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/helm/superset/Chart.yaml b/helm/superset/Chart.yaml index 4628ba83..53c3a886 100644 --- a/helm/superset/Chart.yaml +++ b/helm/superset/Chart.yaml @@ -22,7 +22,7 @@ maintainers: - name: craig-rueda email: craig@craigrueda.com url: https://github.com/craig-rueda -version: 0.24.1 +version: 0.24.1-alpha.1 # dependencies: # - name: postgresql # version: 12.1.8 diff --git a/helm/superset/values.yaml b/helm/superset/values.yaml index eb124cbe..574a445b 100644 --- a/helm/superset/values.yaml +++ b/helm/superset/values.yaml @@ -38,6 +38,7 @@ bootstrapScript: | pip install \ psycopg2-binary==2.9.1 \ redis==3.5.3 \ + PyAthena[SQLAlchemy]>1.2.0, <2.0.0 \ PyAthena==1.11.5 \ PyAthenaJDBC==1.0.9 && \ if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi From 12dced7a66796be507765c16fb1a0cff21f7e897 Mon Sep 17 00:00:00 2001 From: manojsaikumar Date: Wed, 19 Jul 2023 15:39:07 +0530 Subject: [PATCH 03/69] removed pyathena_sql version --- helm/superset/Chart.yaml | 2 +- helm/superset/values.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/helm/superset/Chart.yaml b/helm/superset/Chart.yaml index 53c3a886..4628ba83 100644 --- a/helm/superset/Chart.yaml +++ b/helm/superset/Chart.yaml @@ -22,7 +22,7 @@ maintainers: - name: craig-rueda email: craig@craigrueda.com url: https://github.com/craig-rueda -version: 0.24.1-alpha.1 +version: 0.24.1 # dependencies: # - name: postgresql # version: 12.1.8 diff --git a/helm/superset/values.yaml b/helm/superset/values.yaml index 574a445b..eb124cbe 100644 --- a/helm/superset/values.yaml +++ b/helm/superset/values.yaml @@ -38,7 +38,6 @@ bootstrapScript: | pip install \ psycopg2-binary==2.9.1 \ redis==3.5.3 \ - PyAthena[SQLAlchemy]>1.2.0, <2.0.0 \ PyAthena==1.11.5 \ PyAthenaJDBC==1.0.9 && \ if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi From a1bd0133154bdabfe33cb4bad71fd829d66de2b0 Mon Sep 17 00:00:00 2001 From: manojsaikumar Date: Mon, 20 May 2024 18:38:23 +0530 Subject: [PATCH 04/69] updated autoscalling for v2 --- helm/backend-sdk/Chart.yaml | 2 +- helm/backend-sdk/templates/hpa.yaml | 2 +- helm/dashboard-backend/Chart.yaml | 2 +- helm/dashboard-backend/templates/hpa.yaml | 2 +- helm/dashboard-frontend/Chart.yaml | 2 +- helm/dashboard-frontend/templates/hpa.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/helm/backend-sdk/Chart.yaml b/helm/backend-sdk/Chart.yaml index 0cc2e75d..889e2d26 100644 --- a/helm/backend-sdk/Chart.yaml +++ b/helm/backend-sdk/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.26.0-alpha.4 +version: v0.27.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/backend-sdk/templates/hpa.yaml b/helm/backend-sdk/templates/hpa.yaml index dc44c178..7361a4cc 100644 --- a/helm/backend-sdk/templates/hpa.yaml +++ b/helm/backend-sdk/templates/hpa.yaml @@ -1,5 +1,5 @@ {{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2beta2 +apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: {{ include "backend-sdk.fullname" . }} diff --git a/helm/dashboard-backend/Chart.yaml b/helm/dashboard-backend/Chart.yaml index 18a6fd09..dfc7596a 100644 --- a/helm/dashboard-backend/Chart.yaml +++ b/helm/dashboard-backend/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.26.0-alpha.4 +version: v0.27.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/dashboard-backend/templates/hpa.yaml b/helm/dashboard-backend/templates/hpa.yaml index 36959440..d4bc6c1f 100644 --- a/helm/dashboard-backend/templates/hpa.yaml +++ b/helm/dashboard-backend/templates/hpa.yaml @@ -1,5 +1,5 @@ {{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2beta2 +apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: {{ include "dashboard-backend.fullname" . }} diff --git a/helm/dashboard-frontend/Chart.yaml b/helm/dashboard-frontend/Chart.yaml index f3e43223..c70c98a3 100644 --- a/helm/dashboard-frontend/Chart.yaml +++ b/helm/dashboard-frontend/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.26.0-alpha.3 +version: v0.27.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/dashboard-frontend/templates/hpa.yaml b/helm/dashboard-frontend/templates/hpa.yaml index 4aa998c7..2c60d8a0 100644 --- a/helm/dashboard-frontend/templates/hpa.yaml +++ b/helm/dashboard-frontend/templates/hpa.yaml @@ -1,5 +1,5 @@ {{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2beta2 +apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: {{ include "dashboard-frontend.fullname" . }} From 934ecdd810a07b347d94785da2f561f683940423 Mon Sep 17 00:00:00 2001 From: manojsaikumar Date: Tue, 2 Jul 2024 11:22:19 +0530 Subject: [PATCH 05/69] change in permsize --- helm/dashboard-backend/Chart.yaml | 2 +- helm/dashboard-backend/templates/deployment.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/helm/dashboard-backend/Chart.yaml b/helm/dashboard-backend/Chart.yaml index dfc7596a..1bcc42dc 100644 --- a/helm/dashboard-backend/Chart.yaml +++ b/helm/dashboard-backend/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.27.0 +version: v0.27.1 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/dashboard-backend/templates/deployment.yaml b/helm/dashboard-backend/templates/deployment.yaml index 810750e1..bab6a604 100644 --- a/helm/dashboard-backend/templates/deployment.yaml +++ b/helm/dashboard-backend/templates/deployment.yaml @@ -38,11 +38,11 @@ spec: args: - -Xms512m - -Xmx3024m - - -XX:PermSize=64m - - -XX:MaxPermSize=500m + - -XX:MetaspaceSize=64m + - -XX:MaxMetaspaceSize=500m - -Xss1024k - -jar - - blotout-0.0.1.jar + - dashboard-backend-0.0.1.jar env: {{- range $conf, $value := .Values.env }} - name: {{ $conf | quote }} From 67a0972742654075ae49e875a10cd7aad80321b1 Mon Sep 17 00:00:00 2001 From: manojsaikumar Date: Tue, 2 Jul 2024 12:08:51 +0530 Subject: [PATCH 06/69] added blotout jar --- helm/dashboard-backend/Chart.yaml | 2 +- helm/dashboard-backend/templates/deployment.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/dashboard-backend/Chart.yaml b/helm/dashboard-backend/Chart.yaml index 1bcc42dc..04297a60 100644 --- a/helm/dashboard-backend/Chart.yaml +++ b/helm/dashboard-backend/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.27.1 +version: v0.27.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/helm/dashboard-backend/templates/deployment.yaml b/helm/dashboard-backend/templates/deployment.yaml index bab6a604..5512c91d 100644 --- a/helm/dashboard-backend/templates/deployment.yaml +++ b/helm/dashboard-backend/templates/deployment.yaml @@ -42,7 +42,7 @@ spec: - -XX:MaxMetaspaceSize=500m - -Xss1024k - -jar - - dashboard-backend-0.0.1.jar + - blotout-0.0.1.jar env: {{- range $conf, $value := .Values.env }} - name: {{ $conf | quote }} From 816680330bf99438d3c45a2c9d071d344af2ac42 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Thu, 5 Dec 2024 16:43:59 +0100 Subject: [PATCH 07/69] Create airbyte-v1 helm chart --- helm/airbyte-v1/.helmignore | 26 + helm/airbyte-v1/Chart.lock | 51 + helm/airbyte-v1/Chart.yaml | 72 + .../charts/airbyte-bootloader/.gitignore | 2 + .../charts/airbyte-bootloader/Chart.lock | 6 + .../charts/airbyte-bootloader/Chart.yaml | 12 + .../charts/airbyte-bootloader/README.md | 47 + .../airbyte-bootloader/templates/_helpers.tpl | 51 + .../airbyte-bootloader/templates/_images.tpl | 17 + .../templates/bootloader-secrets.yaml | 18 + .../airbyte-bootloader/templates/pod.yaml | 130 + .../charts/airbyte-bootloader/values.yaml | 189 ++ helm/airbyte-v1/charts/common/.helmignore | 22 + helm/airbyte-v1/charts/common/Chart.yaml | 23 + helm/airbyte-v1/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + helm/airbyte-v1/charts/common/values.yaml | 5 + .../connector-builder-server/.gitignore | 2 + .../connector-builder-server/Chart.lock | 6 + .../connector-builder-server/Chart.yaml | 12 + .../charts/connector-builder-server/README.md | 64 + .../templates/_helpers.tpl | 59 + .../templates/_images.tpl | 17 + .../templates/deployment.yaml | 179 ++ .../templates/secrets.yaml | 17 + .../templates/service.yaml | 20 + .../connector-builder-server/values.yaml | 192 ++ .../connector-rollout-worker/Chart.lock | 6 + .../connector-rollout-worker/Chart.yaml | 12 + .../charts/connector-rollout-worker/README.md | 60 + .../charts/common/.helmignore | 22 + .../charts/common/Chart.yaml | 23 + .../charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/common/values.yaml | 5 + .../templates/_helpers.tpl | 51 + .../templates/_images.tpl | 17 + .../templates/deployment.yaml | 216 ++ .../templates/secrets.yaml | 17 + .../connector-rollout-worker/values.yaml | 273 ++ helm/airbyte-v1/charts/cron/Chart.lock | 6 + helm/airbyte-v1/charts/cron/Chart.yaml | 12 + helm/airbyte-v1/charts/cron/README.md | 62 + .../charts/cron/charts/common/.helmignore | 22 + .../charts/cron/charts/common/Chart.yaml | 23 + .../charts/cron/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../cron/charts/common/templates/_errors.tpl | 23 + .../cron/charts/common/templates/_images.tpl | 75 + .../cron/charts/common/templates/_ingress.tpl | 68 + .../cron/charts/common/templates/_labels.tpl | 18 + .../cron/charts/common/templates/_names.tpl | 70 + .../cron/charts/common/templates/_secrets.tpl | 140 + .../cron/charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../cron/charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/cron/charts/common/values.yaml | 5 + .../charts/cron/templates/_helpers.tpl | 59 + .../charts/cron/templates/_images.tpl | 17 + .../charts/cron/templates/cron-secrets.yaml | 18 + .../charts/cron/templates/deployment.yaml | 187 ++ helm/airbyte-v1/charts/cron/values.yaml | 233 ++ .../charts/keycloak-setup/.gitignore | 2 + .../charts/keycloak-setup/Chart.lock | 6 + .../charts/keycloak-setup/Chart.yaml | 12 + .../charts/keycloak-setup/README.md | 48 + .../keycloak-setup/templates/_helpers.tpl | 51 + .../keycloak-setup/templates/_images.tpl | 17 + .../charts/keycloak-setup/templates/job.yaml | 143 + .../charts/keycloak-setup/values.yaml | 190 ++ helm/airbyte-v1/charts/keycloak/.gitignore | 2 + helm/airbyte-v1/charts/keycloak/Chart.lock | 6 + helm/airbyte-v1/charts/keycloak/Chart.yaml | 12 + helm/airbyte-v1/charts/keycloak/README.md | 71 + .../charts/keycloak/templates/_helpers.tpl | 51 + .../charts/keycloak/templates/_images.tpl | 17 + .../charts/keycloak/templates/service.yaml | 60 + .../keycloak/templates/statefulset.yaml | 193 ++ helm/airbyte-v1/charts/keycloak/values.yaml | 245 ++ helm/airbyte-v1/charts/metrics/.helmignore | 25 + helm/airbyte-v1/charts/metrics/Chart.lock | 6 + helm/airbyte-v1/charts/metrics/Chart.yaml | 12 + helm/airbyte-v1/charts/metrics/README.md | 40 + .../charts/metrics/charts/common/.helmignore | 22 + .../charts/metrics/charts/common/Chart.yaml | 23 + .../charts/metrics/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/metrics/charts/common/values.yaml | 5 + .../charts/metrics/templates/_helpers.tpl | 39 + .../charts/metrics/templates/_images.tpl | 17 + .../charts/metrics/templates/deployment.yaml | 124 + helm/airbyte-v1/charts/metrics/values.yaml | 110 + helm/airbyte-v1/charts/pod-sweeper/.gitignore | 2 + helm/airbyte-v1/charts/pod-sweeper/Chart.lock | 6 + helm/airbyte-v1/charts/pod-sweeper/Chart.yaml | 12 + helm/airbyte-v1/charts/pod-sweeper/README.md | 71 + .../charts/pod-sweeper/templates/_helpers.tpl | 59 + .../charts/pod-sweeper/templates/_images.tpl | 17 + .../pod-sweeper/templates/configmap.yaml | 73 + .../pod-sweeper/templates/deployment.yaml | 105 + .../airbyte-v1/charts/pod-sweeper/values.yaml | 120 + helm/airbyte-v1/charts/server/.gitignore | 2 + helm/airbyte-v1/charts/server/Chart.lock | 6 + helm/airbyte-v1/charts/server/Chart.yaml | 12 + helm/airbyte-v1/charts/server/README.md | 68 + .../charts/server/templates/_helpers.tpl | 242 ++ .../charts/server/templates/_images.tpl | 17 + .../charts/server/templates/deployment.yaml | 453 ++++ .../charts/server/templates/secrets.yaml | 17 + .../charts/server/templates/service.yaml | 23 + helm/airbyte-v1/charts/server/values.yaml | 220 ++ helm/airbyte-v1/charts/temporal-ui/Chart.lock | 6 + helm/airbyte-v1/charts/temporal-ui/Chart.yaml | 12 + .../temporal-ui/charts/common/.helmignore | 22 + .../temporal-ui/charts/common/Chart.yaml | 23 + .../temporal-ui/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../temporal-ui/charts/common/values.yaml | 5 + .../charts/temporal-ui/templates/_helpers.tpl | 51 + .../charts/temporal-ui/templates/_images.tpl | 17 + .../temporal-ui/templates/deployment.yaml | 124 + .../charts/temporal-ui/templates/service.yaml | 20 + .../airbyte-v1/charts/temporal-ui/values.yaml | 194 ++ helm/airbyte-v1/charts/temporal/.gitignore | 2 + helm/airbyte-v1/charts/temporal/Chart.lock | 6 + helm/airbyte-v1/charts/temporal/Chart.yaml | 12 + helm/airbyte-v1/charts/temporal/README.md | 62 + .../charts/temporal/templates/_helpers.tpl | 59 + .../charts/temporal/templates/_images.tpl | 17 + .../charts/temporal/templates/configmap.yaml | 54 + .../charts/temporal/templates/deployment.yaml | 162 ++ .../charts/temporal/templates/secrets.yaml | 17 + .../charts/temporal/templates/service.yaml | 18 + helm/airbyte-v1/charts/temporal/values.yaml | 193 ++ helm/airbyte-v1/charts/webapp/.gitignore | 2 + helm/airbyte-v1/charts/webapp/Chart.lock | 6 + helm/airbyte-v1/charts/webapp/Chart.yaml | 12 + helm/airbyte-v1/charts/webapp/README.md | 69 + .../charts/webapp/templates/_helpers.tpl | 60 + .../charts/webapp/templates/_images.tpl | 17 + .../charts/webapp/templates/deployment.yaml | 172 ++ .../charts/webapp/templates/ingress.yaml | 62 + .../charts/webapp/templates/secrets.yaml | 17 + .../charts/webapp/templates/service.yaml | 29 + helm/airbyte-v1/charts/webapp/values.yaml | 261 ++ helm/airbyte-v1/charts/worker/.gitignore | 2 + helm/airbyte-v1/charts/worker/Chart.lock | 6 + helm/airbyte-v1/charts/worker/Chart.yaml | 12 + helm/airbyte-v1/charts/worker/README.md | 72 + .../charts/worker/templates/_helpers.tpl | 242 ++ .../charts/worker/templates/_images.tpl | 17 + .../charts/worker/templates/deployment.yaml | 500 ++++ .../charts/worker/templates/secrets.yaml | 17 + helm/airbyte-v1/charts/worker/values.yaml | 294 ++ .../charts/workload-api-server/.gitignore | 2 + .../charts/workload-api-server/Chart.lock | 6 + .../charts/workload-api-server/Chart.yaml | 12 + .../charts/workload-api-server/README.md | 85 + .../templates/_helpers.tpl | 59 + .../workload-api-server/templates/_images.tpl | 17 + .../templates/deployment.yaml | 208 ++ .../templates/secrets.yaml | 17 + .../templates/service.yaml | 22 + .../charts/workload-api-server/values.yaml | 281 ++ .../charts/workload-launcher/.helmignore | 23 + .../charts/workload-launcher/Chart.lock | 6 + .../charts/workload-launcher/Chart.yaml | 12 + .../charts/workload-launcher/README.md | 71 + .../charts/common/.helmignore | 22 + .../charts/common/Chart.yaml | 23 + .../workload-launcher/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/common/values.yaml | 5 + .../workload-launcher/templates/_helpers.tpl | 258 ++ .../workload-launcher/templates/_images.tpl | 17 + .../templates/deployment.yaml | 557 ++++ .../templates/jobs-secrets.yaml | 18 + .../workload-launcher/templates/secrets.yaml | 17 + .../charts/workload-launcher/values.yaml | 294 ++ helm/airbyte-v1/templates/NOTES.txt | 22 + helm/airbyte-v1/templates/_database.tpl | 234 ++ helm/airbyte-v1/templates/_enterprise.tpl | 83 + helm/airbyte-v1/templates/_helpers.tpl | 350 +++ helm/airbyte-v1/templates/_images.tpl | 17 + helm/airbyte-v1/templates/_keycloak.tpl | 44 + helm/airbyte-v1/templates/_logging.tpl | 10 + helm/airbyte-v1/templates/_storage.tpl | 243 ++ helm/airbyte-v1/templates/_temporal.tpl | 58 + helm/airbyte-v1/templates/airbyte-db.yaml | 85 + .../templates/airbyte-yml-secret.yaml | 19 + helm/airbyte-v1/templates/env-configmap.yaml | 160 ++ .../templates/gcs-log-creds-secret.yaml | 18 + helm/airbyte-v1/templates/minio.yaml | 185 ++ helm/airbyte-v1/templates/secret.yaml | 18 + helm/airbyte-v1/templates/serviceaccount.yaml | 77 + .../templates/tests/test-webapp.yaml | 29 + helm/airbyte-v1/values.yaml | 2379 +++++++++++++++++ 296 files changed, 25161 insertions(+) create mode 100644 helm/airbyte-v1/.helmignore create mode 100644 helm/airbyte-v1/Chart.lock create mode 100644 helm/airbyte-v1/Chart.yaml create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/.gitignore create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/README.md create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/templates/bootloader-secrets.yaml create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/templates/pod.yaml create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/values.yaml create mode 100644 helm/airbyte-v1/charts/common/.helmignore create mode 100644 helm/airbyte-v1/charts/common/Chart.yaml create mode 100644 helm/airbyte-v1/charts/common/README.md create mode 100644 helm/airbyte-v1/charts/common/templates/_affinities.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_capabilities.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_errors.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_ingress.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_labels.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_names.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_secrets.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_storage.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_tplvalues.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_utils.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/_warnings.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/validations/_cassandra.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/validations/_mariadb.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/validations/_mongodb.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/validations/_mysql.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/validations/_postgresql.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/validations/_redis.tpl create mode 100644 helm/airbyte-v1/charts/common/templates/validations/_validations.tpl create mode 100644 helm/airbyte-v1/charts/common/values.yaml create mode 100644 helm/airbyte-v1/charts/connector-builder-server/.gitignore create mode 100644 helm/airbyte-v1/charts/connector-builder-server/Chart.lock create mode 100644 helm/airbyte-v1/charts/connector-builder-server/Chart.yaml create mode 100644 helm/airbyte-v1/charts/connector-builder-server/README.md create mode 100644 helm/airbyte-v1/charts/connector-builder-server/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/connector-builder-server/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/connector-builder-server/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/connector-builder-server/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/connector-builder-server/templates/service.yaml create mode 100644 helm/airbyte-v1/charts/connector-builder-server/values.yaml create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/README.md create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/.helmignore create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/Chart.yaml create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/README.md create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_errors.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_labels.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_names.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_storage.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_utils.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/charts/common/values.yaml create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/values.yaml create mode 100644 helm/airbyte-v1/charts/cron/Chart.lock create mode 100644 helm/airbyte-v1/charts/cron/Chart.yaml create mode 100644 helm/airbyte-v1/charts/cron/README.md create mode 100644 helm/airbyte-v1/charts/cron/charts/common/.helmignore create mode 100644 helm/airbyte-v1/charts/cron/charts/common/Chart.yaml create mode 100644 helm/airbyte-v1/charts/cron/charts/common/README.md create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_affinities.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_capabilities.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_errors.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_ingress.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_labels.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_names.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_secrets.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_storage.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_tplvalues.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_utils.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/_warnings.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/validations/_cassandra.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mariadb.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mongodb.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mysql.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/validations/_postgresql.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/validations/_redis.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/templates/validations/_validations.tpl create mode 100644 helm/airbyte-v1/charts/cron/charts/common/values.yaml create mode 100644 helm/airbyte-v1/charts/cron/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/cron/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/cron/templates/cron-secrets.yaml create mode 100644 helm/airbyte-v1/charts/cron/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/cron/values.yaml create mode 100644 helm/airbyte-v1/charts/keycloak-setup/.gitignore create mode 100644 helm/airbyte-v1/charts/keycloak-setup/Chart.lock create mode 100644 helm/airbyte-v1/charts/keycloak-setup/Chart.yaml create mode 100644 helm/airbyte-v1/charts/keycloak-setup/README.md create mode 100644 helm/airbyte-v1/charts/keycloak-setup/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/keycloak-setup/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/keycloak-setup/templates/job.yaml create mode 100644 helm/airbyte-v1/charts/keycloak-setup/values.yaml create mode 100644 helm/airbyte-v1/charts/keycloak/.gitignore create mode 100644 helm/airbyte-v1/charts/keycloak/Chart.lock create mode 100644 helm/airbyte-v1/charts/keycloak/Chart.yaml create mode 100644 helm/airbyte-v1/charts/keycloak/README.md create mode 100644 helm/airbyte-v1/charts/keycloak/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/keycloak/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/keycloak/templates/service.yaml create mode 100644 helm/airbyte-v1/charts/keycloak/templates/statefulset.yaml create mode 100644 helm/airbyte-v1/charts/keycloak/values.yaml create mode 100644 helm/airbyte-v1/charts/metrics/.helmignore create mode 100644 helm/airbyte-v1/charts/metrics/Chart.lock create mode 100644 helm/airbyte-v1/charts/metrics/Chart.yaml create mode 100644 helm/airbyte-v1/charts/metrics/README.md create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/.helmignore create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/Chart.yaml create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/README.md create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_affinities.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_capabilities.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_errors.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_ingress.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_labels.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_names.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_secrets.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_storage.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_tplvalues.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_utils.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/_warnings.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_cassandra.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mariadb.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mongodb.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mysql.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_postgresql.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_redis.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_validations.tpl create mode 100644 helm/airbyte-v1/charts/metrics/charts/common/values.yaml create mode 100644 helm/airbyte-v1/charts/metrics/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/metrics/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/metrics/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/metrics/values.yaml create mode 100644 helm/airbyte-v1/charts/pod-sweeper/.gitignore create mode 100644 helm/airbyte-v1/charts/pod-sweeper/Chart.lock create mode 100644 helm/airbyte-v1/charts/pod-sweeper/Chart.yaml create mode 100644 helm/airbyte-v1/charts/pod-sweeper/README.md create mode 100644 helm/airbyte-v1/charts/pod-sweeper/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/pod-sweeper/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/pod-sweeper/templates/configmap.yaml create mode 100644 helm/airbyte-v1/charts/pod-sweeper/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/pod-sweeper/values.yaml create mode 100644 helm/airbyte-v1/charts/server/.gitignore create mode 100644 helm/airbyte-v1/charts/server/Chart.lock create mode 100644 helm/airbyte-v1/charts/server/Chart.yaml create mode 100644 helm/airbyte-v1/charts/server/README.md create mode 100644 helm/airbyte-v1/charts/server/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/server/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/server/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/server/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/server/templates/service.yaml create mode 100644 helm/airbyte-v1/charts/server/values.yaml create mode 100644 helm/airbyte-v1/charts/temporal-ui/Chart.lock create mode 100644 helm/airbyte-v1/charts/temporal-ui/Chart.yaml create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/.helmignore create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/Chart.yaml create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/README.md create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_affinities.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_capabilities.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_errors.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_ingress.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_labels.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_names.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_secrets.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_storage.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_tplvalues.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_utils.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_warnings.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_redis.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_validations.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/charts/common/values.yaml create mode 100644 helm/airbyte-v1/charts/temporal-ui/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/temporal-ui/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/temporal-ui/templates/service.yaml create mode 100644 helm/airbyte-v1/charts/temporal-ui/values.yaml create mode 100644 helm/airbyte-v1/charts/temporal/.gitignore create mode 100644 helm/airbyte-v1/charts/temporal/Chart.lock create mode 100644 helm/airbyte-v1/charts/temporal/Chart.yaml create mode 100644 helm/airbyte-v1/charts/temporal/README.md create mode 100644 helm/airbyte-v1/charts/temporal/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/temporal/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/temporal/templates/configmap.yaml create mode 100644 helm/airbyte-v1/charts/temporal/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/temporal/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/temporal/templates/service.yaml create mode 100644 helm/airbyte-v1/charts/temporal/values.yaml create mode 100644 helm/airbyte-v1/charts/webapp/.gitignore create mode 100644 helm/airbyte-v1/charts/webapp/Chart.lock create mode 100644 helm/airbyte-v1/charts/webapp/Chart.yaml create mode 100644 helm/airbyte-v1/charts/webapp/README.md create mode 100644 helm/airbyte-v1/charts/webapp/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/webapp/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/webapp/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/webapp/templates/ingress.yaml create mode 100644 helm/airbyte-v1/charts/webapp/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/webapp/templates/service.yaml create mode 100644 helm/airbyte-v1/charts/webapp/values.yaml create mode 100644 helm/airbyte-v1/charts/worker/.gitignore create mode 100644 helm/airbyte-v1/charts/worker/Chart.lock create mode 100644 helm/airbyte-v1/charts/worker/Chart.yaml create mode 100644 helm/airbyte-v1/charts/worker/README.md create mode 100644 helm/airbyte-v1/charts/worker/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/worker/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/worker/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/worker/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/worker/values.yaml create mode 100644 helm/airbyte-v1/charts/workload-api-server/.gitignore create mode 100644 helm/airbyte-v1/charts/workload-api-server/Chart.lock create mode 100644 helm/airbyte-v1/charts/workload-api-server/Chart.yaml create mode 100644 helm/airbyte-v1/charts/workload-api-server/README.md create mode 100644 helm/airbyte-v1/charts/workload-api-server/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/workload-api-server/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/workload-api-server/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/workload-api-server/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/workload-api-server/templates/service.yaml create mode 100644 helm/airbyte-v1/charts/workload-api-server/values.yaml create mode 100644 helm/airbyte-v1/charts/workload-launcher/.helmignore create mode 100644 helm/airbyte-v1/charts/workload-launcher/Chart.lock create mode 100644 helm/airbyte-v1/charts/workload-launcher/Chart.yaml create mode 100644 helm/airbyte-v1/charts/workload-launcher/README.md create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/.helmignore create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/Chart.yaml create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/README.md create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_affinities.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_capabilities.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_errors.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_ingress.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_labels.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_names.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_secrets.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_storage.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_tplvalues.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_utils.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_warnings.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_redis.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_validations.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/charts/common/values.yaml create mode 100644 helm/airbyte-v1/charts/workload-launcher/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/templates/_images.tpl create mode 100644 helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml create mode 100644 helm/airbyte-v1/charts/workload-launcher/templates/jobs-secrets.yaml create mode 100644 helm/airbyte-v1/charts/workload-launcher/templates/secrets.yaml create mode 100644 helm/airbyte-v1/charts/workload-launcher/values.yaml create mode 100644 helm/airbyte-v1/templates/NOTES.txt create mode 100644 helm/airbyte-v1/templates/_database.tpl create mode 100644 helm/airbyte-v1/templates/_enterprise.tpl create mode 100644 helm/airbyte-v1/templates/_helpers.tpl create mode 100644 helm/airbyte-v1/templates/_images.tpl create mode 100644 helm/airbyte-v1/templates/_keycloak.tpl create mode 100644 helm/airbyte-v1/templates/_logging.tpl create mode 100644 helm/airbyte-v1/templates/_storage.tpl create mode 100644 helm/airbyte-v1/templates/_temporal.tpl create mode 100644 helm/airbyte-v1/templates/airbyte-db.yaml create mode 100644 helm/airbyte-v1/templates/airbyte-yml-secret.yaml create mode 100644 helm/airbyte-v1/templates/env-configmap.yaml create mode 100644 helm/airbyte-v1/templates/gcs-log-creds-secret.yaml create mode 100644 helm/airbyte-v1/templates/minio.yaml create mode 100644 helm/airbyte-v1/templates/secret.yaml create mode 100644 helm/airbyte-v1/templates/serviceaccount.yaml create mode 100644 helm/airbyte-v1/templates/tests/test-webapp.yaml create mode 100644 helm/airbyte-v1/values.yaml diff --git a/helm/airbyte-v1/.helmignore b/helm/airbyte-v1/.helmignore new file mode 100644 index 00000000..2b1b66e6 --- /dev/null +++ b/helm/airbyte-v1/.helmignore @@ -0,0 +1,26 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ + +ci.sh +.cache/ diff --git a/helm/airbyte-v1/Chart.lock b/helm/airbyte-v1/Chart.lock new file mode 100644 index 00000000..1eb0e17d --- /dev/null +++ b/helm/airbyte-v1/Chart.lock @@ -0,0 +1,51 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +- name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 +generated: "2024-11-07T16:46:04.022416291Z" diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml new file mode 100644 index 00000000..70966181 --- /dev/null +++ b/helm/airbyte-v1/Chart.yaml @@ -0,0 +1,72 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +- condition: airbyte-bootloader.enabled + name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal.enabled + name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal-ui.enabled + name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: webapp.enabled + name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: server.enabled + name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: worker.enabled + name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-api-server.enabled + name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-launcher.enabled + name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: pod-sweeper.enabled + name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: metrics.enabled + name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: cron.enabled + name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-builder-server.enabled + name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-rollout-worker.enabled + name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak.enabled + name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak-setup.enabled + name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +description: Helm chart to deploy airbyte +name: airbyte +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/.gitignore b/helm/airbyte-v1/charts/airbyte-bootloader/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock new file mode 100644 index 00000000..fb39f2dc --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:11.238826963Z" diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml new file mode 100644 index 00000000..93644670 --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-bootloader +name: airbyte-bootloader +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/README.md b/helm/airbyte-v1/charts/airbyte-bootloader/README.md new file mode 100644 index 00000000..ceaa5352 --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/README.md @@ -0,0 +1,47 @@ +# airbyte-bootloader + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-bootloader + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.env_vars | object | `{}` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/bootloader"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/templates/_helpers.tpl b/helm/airbyte-v1/charts/airbyte-bootloader/templates/_helpers.tpl new file mode 100644 index 00000000..2b326d75 --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/templates/_images.tpl b/helm/airbyte-v1/charts/airbyte-bootloader/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/templates/bootloader-secrets.yaml b/helm/airbyte-v1/charts/airbyte-bootloader/templates/bootloader-secrets.yaml new file mode 100644 index 00000000..202def0e --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/templates/bootloader-secrets.yaml @@ -0,0 +1,18 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: bootloader-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/templates/pod.yaml b/helm/airbyte-v1/charts/airbyte-bootloader/templates/pod.yaml new file mode 100644 index 00000000..8a72fa90 --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/templates/pod.yaml @@ -0,0 +1,130 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 4 }} + {{- end }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "0" + {{- if .Values.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 4 }} + {{- end }} +spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 2 }} + {{- end }} + {{- end }} + restartPolicy: Never + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 4 }} + {{- end }} + containers: + - name: airbyte-bootloader-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: AIRBYTE_VERSION + - name: RUN_DATABASE_MIGRATION_ON_STARTUP + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: RUN_DATABASE_MIGRATION_ON_STARTUP + + # Airbyte auth secret keys and values + {{- if and (eq .Values.global.edition "community") .Values.global.auth.enabled }} + - name: AB_AUTH_SECRET_CREATION_ENABLED + value: "true" + - name: AB_KUBERNETES_SECRET_NAME + value: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + - name: AB_INSTANCE_ADMIN_PASSWORD_SECRET_KEY + value: {{ .Values.global.auth.instanceAdmin.passwordSecretKey | default "instance-admin-password" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_ID_SECRET_KEY + value: {{ .Values.global.auth.instanceAdmin.clientIdSecretKey | default "instance-admin-client-id" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_SECRET_SECRET_KEY + value: {{ .Values.global.auth.instanceAdmin.clientSecretSecretKey | default "instance-admin-client-secret" | quote }} + - name: AB_JWT_SIGNATURE_SECRET_KEY + value: {{ .Values.global.auth.jwtSignatureSecretKey | default "jwt-signature-secret" | quote }} + - name: AB_INSTANCE_ADMIN_PASSWORD + value: {{ .Values.global.auth.instanceAdmin.password | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_ID + value: {{ .Values.global.auth.instanceAdmin.clientId | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_SECRET + value: {{ .Values.global.auth.instanceAdmin.clientSecret | quote }} + - name: AB_JWT_SIGNATURE_SECRET + value: {{ .Values.global.auth.jwtSignatureSecret | quote }} + {{- end }} + + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: bootloader-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 8 }} + {{- end }} + {{- if .Values.extraVolumeMounts }} + volumeMounts: + {{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 4 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 4 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 6 }} + {{- if .Values.extraVolumes }} + volumes: + {{- toYaml .Values.extraVolumes | nindent 4 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/values.yaml b/helm/airbyte-v1/charts/airbyte-bootloader/values.yaml new file mode 100644 index 00000000..ee3bc615 --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/values.yaml @@ -0,0 +1,189 @@ +## global.serviceAccountName Name of service account to be associated with service +## deploymentMode Determines deployment mode of airbyte +## secretName Overrides the secret name with credentials to S3 Bucket and logging +## database.secretName Name of database secret +## database.secretValue Value of database password key stored in secret +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + secretName: "" + database: + secretName: "" + secretValue: "" + secrets: {} + env_vars: {} + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + +# Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + +enabled: true +## image.repository The repository to use for the airbyte bootloader image. +## image.pullPolicy the pull policy to use for the airbyte bootloader image +## image.tag The airbyte bootloader image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/bootloader + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the bootloader pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the bootloader pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## Bootloader resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## bootloader.resources.limits [object] The resources limits for the airbyte bootloader image +## bootloader.resources.requests [object] The requested resources for the airbyte bootloader image +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## affinity [object] Affinity and anti-affinity for bootloader pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +## extraEnv: +## - name: AIRBYTE_VERSION +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: AIRBYTE_VERSION +## - name: DATABASE_HOST +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_HOST +## - name: DATABASE_PORT +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_PORT +## - name: DATABASE_PASSWORD +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_PASSWORD +## - name: DATABASE_URL +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_URL +## - name: DATABASE_USER +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_USER +## +extraEnv: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# DATABASE_PASSWORD: 12345 +# DATABASE_USER: airbyte +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/common/.helmignore b/helm/airbyte-v1/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/helm/airbyte-v1/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/airbyte-v1/charts/common/Chart.yaml b/helm/airbyte-v1/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/helm/airbyte-v1/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/helm/airbyte-v1/charts/common/README.md b/helm/airbyte-v1/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/helm/airbyte-v1/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/helm/airbyte-v1/charts/common/templates/_affinities.tpl b/helm/airbyte-v1/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_capabilities.tpl b/helm/airbyte-v1/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_errors.tpl b/helm/airbyte-v1/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_images.tpl b/helm/airbyte-v1/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_ingress.tpl b/helm/airbyte-v1/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_labels.tpl b/helm/airbyte-v1/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_names.tpl b/helm/airbyte-v1/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_secrets.tpl b/helm/airbyte-v1/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_storage.tpl b/helm/airbyte-v1/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_tplvalues.tpl b/helm/airbyte-v1/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_utils.tpl b/helm/airbyte-v1/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/_warnings.tpl b/helm/airbyte-v1/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/validations/_cassandra.tpl b/helm/airbyte-v1/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/validations/_mariadb.tpl b/helm/airbyte-v1/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/validations/_mongodb.tpl b/helm/airbyte-v1/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/validations/_mysql.tpl b/helm/airbyte-v1/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/validations/_postgresql.tpl b/helm/airbyte-v1/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/validations/_redis.tpl b/helm/airbyte-v1/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/templates/validations/_validations.tpl b/helm/airbyte-v1/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/helm/airbyte-v1/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/common/values.yaml b/helm/airbyte-v1/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/helm/airbyte-v1/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/helm/airbyte-v1/charts/connector-builder-server/.gitignore b/helm/airbyte-v1/charts/connector-builder-server/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/connector-builder-server/Chart.lock b/helm/airbyte-v1/charts/connector-builder-server/Chart.lock new file mode 100644 index 00000000..746fb41b --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:15.123937677Z" diff --git a/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml b/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml new file mode 100644 index 00000000..2491fe2c --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-connector-builder-server +name: connector-builder-server +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/connector-builder-server/README.md b/helm/airbyte-v1/charts/connector-builder-server/README.md new file mode 100644 index 00000000..9b49f69a --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/README.md @@ -0,0 +1,64 @@ +# connector-builder-server + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-connector-builder-server + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.deploymentStrategyType | string | `"RollingUpdate"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/connector-builder-server"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `80` | | +| service.type | string | `"NodePort"` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/connector-builder-server/templates/_helpers.tpl b/helm/airbyte-v1/charts/connector-builder-server/templates/_helpers.tpl new file mode 100644 index 00000000..174aebfe --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/connector-builder-server/templates/_images.tpl b/helm/airbyte-v1/charts/connector-builder-server/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/connector-builder-server/templates/deployment.yaml b/helm/airbyte-v1/charts/connector-builder-server/templates/deployment.yaml new file mode 100644 index 00000000..4eef212e --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/templates/deployment.yaml @@ -0,0 +1,179 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: {{ .Values.deploymentStrategyType }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-connector-builder-server + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: server-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + + ports: + - name: http + containerPort: 8080 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} +{{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/connector-builder-server/templates/secrets.yaml b/helm/airbyte-v1/charts/connector-builder-server/templates/secrets.yaml new file mode 100644 index 00000000..e00ae6ba --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: connector-builder-server-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/connector-builder-server/templates/service.yaml b/helm/airbyte-v1/charts/connector-builder-server/templates/service.yaml new file mode 100644 index 00000000..6f1cb26e --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/templates/service.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-connector-builder-server-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} diff --git a/helm/airbyte-v1/charts/connector-builder-server/values.yaml b/helm/airbyte-v1/charts/connector-builder-server/values.yaml new file mode 100644 index 00000000..64326ab9 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/values.yaml @@ -0,0 +1,192 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + deploymentStrategyType: RollingUpdate + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte server image. +## image.pullPolicy the pull policy to use for the airbyte server image +## image.tag The airbyte server image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/connector-builder-server + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: NodePort + port: 80 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 +env_vars: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock new file mode 100644 index 00000000..97cc9396 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-11-07T16:44:04.182471666Z" diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml new file mode 100644 index 00000000..48c0f251 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-connector-rollout-worker +name: connector-rollout-worker +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/README.md b/helm/airbyte-v1/charts/connector-rollout-worker/README.md new file mode 100644 index 00000000..ad3e11f2 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/README.md @@ -0,0 +1,60 @@ +# connector-rollout-worker + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-connector-rollout-worker + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|---------------------------------------------------|------|--------------------------------------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/connector-rollout-worker"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `50` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/.helmignore b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/Chart.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/README.md b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_errors.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_images.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_labels.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_names.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_storage.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_utils.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/values.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/templates/_helpers.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/templates/_images.tpl b/helm/airbyte-v1/charts/connector-rollout-worker/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/templates/deployment.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/templates/deployment.yaml new file mode 100644 index 00000000..f1094295 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/templates/deployment.yaml @@ -0,0 +1,216 @@ +{{- if or (eq .Values.global.edition "community") (eq .Values.global.enterprise.connectorRolloutOptIn true)}} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: Recreate + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-connector-rollout-worker-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: TEMPORAL_WORKER_PORTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_WORKER_PORTS + - name: LOG_LEVEL + value: "{{ .Values.log.level }}" + {{- end }} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just + # splitting into two separate blocks for readability. + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: connector-rollout-worker-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /health/liveness + port: heartbeat + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /health/readiness + port: heartbeat + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + - name: heartbeat + containerPort: 8016 # for heartbeat server + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/templates/secrets.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/templates/secrets.yaml new file mode 100644 index 00000000..24e141b1 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: connector-rollout-worker-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/values.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/values.yaml new file mode 100644 index 00000000..85d6bf18 --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/values.yaml @@ -0,0 +1,273 @@ +global: + + serviceAccountName: &service-account-name "airbyte-admin" + edition: community + credVolumeOverride: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + enterprise: + connectorRolloutOptIn: false + + jobs: + ## Jobs resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## jobs.resources.limits [object] The resources limits for jobs + ## jobs.resources.requests [object] The requested resources for jobs + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + + kube: + ## JOB_KUBE_ANNOTATIONS + ## pod annotations of the sync job and the default pod annotations fallback for others jobs + ## jobs.kube.annotations [object] key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + ## jobs.kube.labels [object] key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## any boolean values should be quoted to ensure the value is passed through as a string, eg: + ## - key: airbyte-server + ## operator: Equal + ## value: "true" + ## effect: NoSchedule + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + ## image pull secret to use for job pod + ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod + main_container_image_pull_secret: "" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + ## busybox image used by the job pod + ## jobs.kube.images.busybox [string] busybox image used by the job pod + busybox: "" + ## JOB_KUBE_SOCAT_IMAGE + ## socat image used by the job pod + ## jobs.kube.images.socat [string] socat image used by the job pod + socat: "" + ## JOB_KUBE_CURL_IMAGE + ## curl image used by the job pod + ## jobs.kube.images.curl [string] curl image used by the job pod + curl: "" + +enabled: true +## connector-rollout-worker.replicaCount Number of connector-rollout-worker replicas +replicaCount: 1 + +## connector-rollout-worker.image.repository The repository to use for the airbyte connector-rollout-worker image. +## connector-rollout-worker.image.pullPolicy the pull policy to use for the airbyte connector-rollout-worker image +## connector-rollout-worker.image.tag The airbyte connector-rollout-worker image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/connector-rollout-worker + pullPolicy: IfNotPresent + +## connector-rollout-worker.podAnnotations [object] Add extra annotations to the connector-rollout-worker pod(s) +## +podAnnotations: {} + +## connector-rollout-worker.podLabels [object] Add extra labels to the connector-rollout-worker pod(s) +## +podLabels: {} + +## connector-rollout-worker.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the connector-rollout-worker containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## connector-rollout-worker.livenessProbe.enabled Enable livenessProbe on the connector-rollout-worker +## connector-rollout-worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## connector-rollout-worker.livenessProbe.periodSeconds Period seconds for livenessProbe +## connector-rollout-worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## connector-rollout-worker.livenessProbe.failureThreshold Failure threshold for livenessProbe +## connector-rollout-worker.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 50 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## connector-rollout-worker.readinessProbe.enabled Enable readinessProbe on the connector-rollout-worker +## connector-rollout-worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## connector-rollout-worker.readinessProbe.periodSeconds Period seconds for readinessProbe +## connector-rollout-worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## connector-rollout-worker.readinessProbe.failureThreshold Failure threshold for readinessProbe +## connector-rollout-worker.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## connector-rollout-worker resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## connector-rollout-worker.resources.limits [object] The resources limits for the connector-rollout-worker container +## connector-rollout-worker.resources.requests [object] The requested resources for the connector-rollout-worker container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## connector-rollout-worker.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## connector-rollout-worker.tolerations [array] Tolerations for connector-rollout-worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## connector-rollout-worker.affinity [object] Affinity and anti-affinity for connector-rollout-worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## connector-rollout-worker.log.level The log level to log at. +log: + level: "INFO" + + + +## connector-rollout-worker.extraVolumeMounts [array] Additional volumeMounts for connector-rollout-worker container(s). +## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## connector-rollout-worker.extraVolumes [array] Additional volumes for connector-rollout-worker pod(s). +## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default values for connector-rollout-worker: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Workspace storage for running jobs (logs, etc) +# WORKSPACE_ROOT: /workspace +# WORKSPACE_DOCKER_MOUNT: airbyte_workspace + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# WEBAPP_URL: airbyte-webapp-svc:80 +# INTERNAL_API_HOST: http://airbyte-server-svc:8001 +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + +debug: + enabled: true + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/cron/Chart.lock b/helm/airbyte-v1/charts/cron/Chart.lock new file mode 100644 index 00000000..435017d8 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-25T16:47:38.253767-04:00" diff --git a/helm/airbyte-v1/charts/cron/Chart.yaml b/helm/airbyte-v1/charts/cron/Chart.yaml new file mode 100644 index 00000000..5fbd9dbd --- /dev/null +++ b/helm/airbyte-v1/charts/cron/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-cron +name: cron +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/cron/README.md b/helm/airbyte-v1/charts/cron/README.md new file mode 100644 index 00000000..9f628a60 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/README.md @@ -0,0 +1,62 @@ +# cron + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-cron + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/cron"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.containerSecurityContext | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/helm/airbyte-v1/charts/cron/charts/common/.helmignore b/helm/airbyte-v1/charts/cron/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/airbyte-v1/charts/cron/charts/common/Chart.yaml b/helm/airbyte-v1/charts/cron/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/helm/airbyte-v1/charts/cron/charts/common/README.md b/helm/airbyte-v1/charts/cron/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_affinities.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_capabilities.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_errors.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_images.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_ingress.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_labels.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_names.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_secrets.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_storage.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_tplvalues.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_utils.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/_warnings.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_cassandra.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mariadb.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mongodb.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mysql.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_postgresql.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_redis.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_validations.tpl b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/cron/charts/common/values.yaml b/helm/airbyte-v1/charts/cron/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/helm/airbyte-v1/charts/cron/templates/_helpers.tpl b/helm/airbyte-v1/charts/cron/templates/_helpers.tpl new file mode 100644 index 00000000..174aebfe --- /dev/null +++ b/helm/airbyte-v1/charts/cron/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/cron/templates/_images.tpl b/helm/airbyte-v1/charts/cron/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/cron/templates/cron-secrets.yaml b/helm/airbyte-v1/charts/cron/templates/cron-secrets.yaml new file mode 100644 index 00000000..1d22b17e --- /dev/null +++ b/helm/airbyte-v1/charts/cron/templates/cron-secrets.yaml @@ -0,0 +1,18 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: cron-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/helm/airbyte-v1/charts/cron/templates/deployment.yaml b/helm/airbyte-v1/charts/cron/templates/deployment.yaml new file mode 100644 index 00000000..f64fb6a6 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/templates/deployment.yaml @@ -0,0 +1,187 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-cron + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CRON_MICRONAUT_ENVIRONMENTS + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: WORKLOAD_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_API_HOST + - name: WORKSPACE_DOCKER_MOUNT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_DOCKER_MOUNT + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + + # Database + {{- include "airbyte.database.envs" . | nindent 10 }} + + {{- end }} + + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: cron-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 10 }} + {{- end }} + + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} + {{- end }} + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + + {{- if .Values.extraVolumeMounts }} + volumeMounts: {{ toYaml .Values.extraVolumeMounts | nindent 10 }} + {{- end }} + + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} + {{- if .Values.extraVolumes }} + volumes: {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/cron/values.yaml b/helm/airbyte-v1/charts/cron/values.yaml new file mode 100644 index 00000000..1bbace43 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/values.yaml @@ -0,0 +1,233 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + configMapName: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + secrets: {} + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## cron.replicaCount Number of cron replicas +replicaCount: 1 + +## cron.image.repository The repository to use for the airbyte cron image. +## cron.image.pullPolicy the pull policy to use for the airbyte cron image +## cron.image.tag The airbyte cron image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/cron + pullPolicy: IfNotPresent + +## cron.podAnnotations [object] Add extra annotations to the cron pod(s) +## +podAnnotations: {} + +## cron.podLabels [object] Add extra labels to the cron pod(s) +## +podLabels: {} + +## cron.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the cron containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## cron.livenessProbe.enabled Enable livenessProbe on the cron +## cron.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## cron.livenessProbe.periodSeconds Period seconds for livenessProbe +## cron.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## cron.livenessProbe.failureThreshold Failure threshold for livenessProbe +## cron.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## cron.readinessProbe.enabled Enable readinessProbe on the cron +## cron.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## cron.readinessProbe.periodSeconds Period seconds for readinessProbe +## cron.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## cron.readinessProbe.failureThreshold Failure threshold for readinessProbe +## cron.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + + ## server.containerSecurityContext Security context for the container + ## Examples: + ## containerSecurityContext: + ## runAsNonRoot: true + ## runAsUser: 1000 + ## readOnlyRootFilesystem: true + containerSecurityContext: {} + +## Web app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## cron.resources.limits [object] The resources limits for the Web container +## cron.resources.requests [object] The requested resources for the Web container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## cron.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## cron.tolerations [array] Tolerations for cron pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## cron.affinity [object] Affinity and anti-affinity for cron pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## cron.extraVolumeMounts [array] Additional volumeMounts for cron container(s). +## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: var-run +## mountPath: /var/run/ +## - name: var-cache-nginx +## mountPath: /var/cache/nginx +## - mountPath: /etc/nginx/conf.d +## name: nginx-conf-d +## +extraVolumeMounts: [] + +## cron.extraVolumes [array] Additional volumes for cron pod(s). +## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: var-run +## emptyDir: {} +## - name: var-cache-nginx +## emptyDir: {} +## - name: nginx-conf-d +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: POSTGRES_USER +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_USER +# - name: POSTGRES_PWD +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_PASSWORD +# - name: DYNAMIC_CONFIG_FILE_PATH +# value: "config/dynamicconfig/development.yaml" +# - name: DB +# value: "postgresql" +# - name: DB_PORT +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_PORT +# - name: POSTGRES_SEEDS +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default vars for cron: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# API_URL: /api/v1/ +# INTERNAL_API_HOST: http://airbyte-server-svc:8001 + +env_vars: {} + + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/keycloak-setup/.gitignore b/helm/airbyte-v1/charts/keycloak-setup/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/keycloak-setup/Chart.lock b/helm/airbyte-v1/charts/keycloak-setup/Chart.lock new file mode 100644 index 00000000..5974e298 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-11-07T16:44:17.163672506Z" diff --git a/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml b/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml new file mode 100644 index 00000000..b46bc335 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-keycloak-setup +name: keycloak-setup +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/keycloak-setup/README.md b/helm/airbyte-v1/charts/keycloak-setup/README.md new file mode 100644 index 00000000..724dc7c8 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/README.md @@ -0,0 +1,48 @@ +# keycloak-setup + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-keycloak-setup + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.edition | string | `"community"` | | +| global.env_vars | object | `{}` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/keycloak-setup"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/keycloak-setup/templates/_helpers.tpl b/helm/airbyte-v1/charts/keycloak-setup/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/keycloak-setup/templates/_images.tpl b/helm/airbyte-v1/charts/keycloak-setup/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/keycloak-setup/templates/job.yaml b/helm/airbyte-v1/charts/keycloak-setup/templates/job.yaml new file mode 100644 index 00000000..41e534df --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/templates/job.yaml @@ -0,0 +1,143 @@ +{{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} +{{- if eq .Values.global.deploymentMode "oss" }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": "post-install, post-upgrade" + "helm.sh/hook-delete-policy": "before-hook-creation" +spec: + completions: 1 + template: + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + restartPolicy: Never + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 12 }} + {{- end }} + initContainers: + - name: keycloak-readiness-check + image: {{ include "imageUrl" (list .Values.initContainers.keycloakReadinessCheck.image $) }} + command: [ "sh", "-c", "until curl --output /dev/null --head --fail http://${KEYCLOAK_INTERNAL_HOST}/auth/health/ready; do sleep 1; done;" ] + env: + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: KEYCLOAK_INTERNAL_HOST + securityContext: + {{- toYaml .Values.initContainerSecurityContext | nindent 14 }} + {{- if .Values.extraInitContainers }} + {{- toYaml .Values.extraInitContainers | nindent 8 }} + {{- end }} + containers: + - name: airbyte-keycloak-setup-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + - name: AIRBYTE_URL + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: AIRBYTE_URL + - name: KEYCLOAK_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_USER + - name: KEYCLOAK_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_PASSWORD + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: KEYCLOAK_INTERNAL_HOST + + {{- include "airbyte.database.envs" . | nindent 12 }} + {{- include "airbyte.enterprise.instanceAdmin" . | nindent 12 }} + {{- include "airbyte.enterprise.identityProvider" . | nindent 12 }} + {{- include "airbyte.keycloak.database.envs" . | nindent 12 }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: keycloak-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if .Values.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 12 }} + {{- end }} + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + mountPath: /app/configs/airbyte.yml + subPath: fileContents + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} + {{- toYaml .Values.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} + volumes: + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + secret: + secretName: {{ .Release.Name }}-airbyte-yml + {{- end }} + {{- if .Values.extraVolumes }} + {{- toYaml .Values.extraVolumes | nindent 8 }} + {{- end }} +{{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/keycloak-setup/values.yaml b/helm/airbyte-v1/charts/keycloak-setup/values.yaml new file mode 100644 index 00000000..f134b437 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/values.yaml @@ -0,0 +1,190 @@ +## global.serviceAccountName Name of service account to be associated with service +## deploymentMode Determines deployment mode of airbyte +## secretName Overrides the secrate name with with credentials to S3 Bucket and logging +## database.secretName Name of database secret +## database.secretValue Value of database password key stored in secret +global: + serviceAccountName: placeholderServiceAccount + edition: community + deploymentMode: oss + secretName: "" + database: + secretName: "" + secretValue: "" + secrets: {} + env_vars: {} + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + +enabled: true +## image.repository The repository to use for the airbyte keycloak-setup image. +## image.pullPolicy the pull policy to use for the airbyte keycloak-setup image +## image.tag The airbyte keycloak-setup image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/keycloak-setup + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the keycloak-setup pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the keycloak-setup pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## Keycloak Setup resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## keycloak-setup.resources.limits [object] The resources limits for the airbyte keycloak-setup image +## keycloak-setup.resources.requests [object] The requested resources for the airbyte keycloak-setup image +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## affinity [object] Affinity and anti-affinity for keycloak-setup pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +## extraEnv: +## - name: AIRBYTE_VERSION +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: AIRBYTE_VERSION +## - name: DATABASE_HOST +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_HOST +## - name: DATABASE_PORT +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_PORT +## - name: DATABASE_PASSWORD +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_PASSWORD +## - name: DATABASE_URL +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_URL +## - name: DATABASE_USER +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_USER +## +extraEnv: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## extraContainer [array] Additional container for keycloak pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# DATABASE_PASSWORD: 12345 +# DATABASE_USER: airbyte +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/keycloak/.gitignore b/helm/airbyte-v1/charts/keycloak/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/keycloak/Chart.lock b/helm/airbyte-v1/charts/keycloak/Chart.lock new file mode 100644 index 00000000..0813d16b --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-11-07T16:44:10.502425544Z" diff --git a/helm/airbyte-v1/charts/keycloak/Chart.yaml b/helm/airbyte-v1/charts/keycloak/Chart.yaml new file mode 100644 index 00000000..5641e569 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-keycloak +name: keycloak +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/keycloak/README.md b/helm/airbyte-v1/charts/keycloak/README.md new file mode 100644 index 00000000..5b86476d --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/README.md @@ -0,0 +1,71 @@ +# keycloak + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-keycloak + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| bypassInit | bool | `false` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | airbyte deployment mode | +| global.edition | string | `"community"` | | +| global.env_vars | object | `{}` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| headlessService.annotations | object | `{}` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/keycloak"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `30` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `8180` | | +| service.type | string | `"ClusterIP"` | | +| startupProbe.enabled | bool | `true` | | +| startupProbe.failureThreshold | int | `60` | | +| startupProbe.initialDelaySeconds | int | `30` | | +| startupProbe.periodSeconds | int | `5` | | +| startupProbe.successThreshold | int | `1` | | +| startupProbe.timeoutSeconds | int | `1` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/keycloak/templates/_helpers.tpl b/helm/airbyte-v1/charts/keycloak/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/keycloak/templates/_images.tpl b/helm/airbyte-v1/charts/keycloak/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/keycloak/templates/service.yaml b/helm/airbyte-v1/charts/keycloak/templates/service.yaml new file mode 100644 index 00000000..3e7b5fea --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/templates/service.yaml @@ -0,0 +1,60 @@ +# If Cloud or Pro/Enterprise, render the keycloak service template. +{{- if or (eq .Values.global.deploymentMode "cloud") (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-keycloak-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + {{ if and (eq .Values.service.type "NodePort") (.Values.service.nodePort) }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} +--- +# This headless service sets ClusterIp: None so that it can be +# used for internal DNS resolution of all individual keycloak +# pods. Port 7800 is the default jgroups port that Keycloak +# expects to be open to enable Infinispan cache synchronization. +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-keycloak-headless-svc + {{- with .Values.headlessService.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: ClusterIP + clusterIP: None + ports: + - name: jgroups + port: 7800 + targetPort: 7800 + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/keycloak/templates/statefulset.yaml b/helm/airbyte-v1/charts/keycloak/templates/statefulset.yaml new file mode 100644 index 00000000..89769cff --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/templates/statefulset.yaml @@ -0,0 +1,193 @@ +# if Cloud or Pro/Enterprise, render the keycloak StatefulSet template. +{{- if or (eq .Values.global.deploymentMode "cloud") (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + serviceName: {{.Release.Name }}-airbyte-keycloak-headless-svc + podManagementPolicy: OrderedReady # embedded infinispan does not handle parallel joins well, src https://github.com/keycloak/keycloak/issues/21108#issuecomment-1599010602 + updateStrategy: + type: RollingUpdate + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + initContainers: + {{- if and (eq .Values.global.deploymentMode "oss") (ne .Values.bypassInit true)}} + # This init container will only executed if the deployment mode is "oss" and the bypassInit is not true. + - name: init-db + image: {{ include "imageUrl" (list .Values.initContainers.initDb.image $) }} + command: [ "sh", "-c" ] + args: + - > + PGPASSWORD=$DATABASE_PASSWORD psql -h $DATABASE_HOST -p $DATABASE_PORT -U $DATABASE_USER -d $DATABASE_DB -c "CREATE SCHEMA IF NOT EXISTS keycloak"; + env: + {{- include "airbyte.database.envs" . | nindent 12 }} + + securityContext: + {{- toYaml .Values.initContainerSecurityContext | nindent 14 }} + {{- end }} + {{- if .Values.extraInitContainers }} + {{- toYaml .Values.extraInitContainers | nindent 8 }} + {{- end }} + containers: + - name: airbyte-keycloak + image: {{ include "imageUrl" (list .Values.image $)}} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: KEYCLOAK_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_USER + - name: KEYCLOAK_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_PASSWORD + - name: KEYCLOAK_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_PORT + - name: JAVA_OPTS_APPEND + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_JAVA_OPTS_APPEND + {{- include "airbyte.keycloak.database.envs" . | nindent 12 }} + {{- end }} # end if oss + + {{- if .Values.extraEnv }} + {{ .Values.extraEnv | toYaml | nindent 12 }} + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: keycloak-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if .Values.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + - containerPort: 7800 + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} + {{- end }} + volumeMounts: + - name: keycloak-storage + mountPath: /opt/keycloak/data/infinispan + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 10 }} + {{- end }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /auth/health/live + port: {{ .Values.service.port }} + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /auth/health/ready + port: {{ .Values.service.port }} + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.startupProbe.enabled }} + startupProbe: + httpGet: + path: /auth/health/started + port: {{ .Values.service.port }} + initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.startupProbe.periodSeconds }} + timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }} + successThreshold: {{ .Values.startupProbe.successThreshold }} + failureThreshold: {{ .Values.startupProbe.failureThreshold }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 8 }} + {{- end }} + volumeClaimTemplates: + - metadata: + name: keycloak-storage + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi +{{- end }} diff --git a/helm/airbyte-v1/charts/keycloak/values.yaml b/helm/airbyte-v1/charts/keycloak/values.yaml new file mode 100644 index 00000000..30de3c4b --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/values.yaml @@ -0,0 +1,245 @@ +## global.serviceAccountName Name of service account to be associated with service +## deploymentMode Determines deployment mode of airbyte +## secretName Overrides the secrate name with with credentials to S3 Bucket and logging +## database.secretName Name of database secret +## database.secretValue Value of database password key stored in secret +global: + # serviceAccountName -- Service Account name override + serviceAccountName: placeholderServiceAccount + edition: community + # -- airbyte deployment mode + deploymentMode: oss + secretName: "" + database: + secretName: "" + secretValue: "" + secrets: {} + env_vars: {} + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + +enabled: true + +bypassInit: false +## image.repository The repository to use for the airbyte keycloak image. +## image.pullPolicy the pull policy to use for the airbyte keycloak image +## image.tag The airbyte keycloak image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/keycloak + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the keycloak pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the keycloak pod +## +podLabels: {} + +## Configure extra options for the keycloak containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on keycloak +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on keycloak +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +startupProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 1 + failureThreshold: 60 + successThreshold: 1 + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: ClusterIP + port: 8180 + annotations: {} + +headlessService: + annotations: {} + +## Keycloak resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## keycloak.resources.limits [object] The resources limits for the keycloak image +## keycloak.resources.requests [object] The requested resources for the keycloak image +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## affinity [object] Affinity and anti-affinity for keycloak pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +## extraEnv: +## - name: AIRBYTE_VERSION +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: AIRBYTE_VERSION +## - name: DATABASE_HOST +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_HOST +## - name: DATABASE_PORT +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_PORT +## - name: DATABASE_PASSWORD +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_PASSWORD +## - name: DATABASE_URL +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_URL +## - name: DATABASE_USER +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_USER +## +extraEnv: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## extraContainer [array] Additional container for keycloak pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# DATABASE_PASSWORD: 12345 +# DATABASE_USER: airbyte +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + diff --git a/helm/airbyte-v1/charts/metrics/.helmignore b/helm/airbyte-v1/charts/metrics/.helmignore new file mode 100644 index 00000000..f885da3f --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/.helmignore @@ -0,0 +1,25 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ + +ci.sh diff --git a/helm/airbyte-v1/charts/metrics/Chart.lock b/helm/airbyte-v1/charts/metrics/Chart.lock new file mode 100644 index 00000000..017faffa --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-08-31T12:09:18.473209+01:00" diff --git a/helm/airbyte-v1/charts/metrics/Chart.yaml b/helm/airbyte-v1/charts/metrics/Chart.yaml new file mode 100644 index 00000000..9513bfd1 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-metrics +name: metrics +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/metrics/README.md b/helm/airbyte-v1/charts/metrics/README.md new file mode 100644 index 00000000..51fd055b --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/README.md @@ -0,0 +1,40 @@ +# metrics + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-metrics + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/metrics-reporter"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/metrics/charts/common/.helmignore b/helm/airbyte-v1/charts/metrics/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/airbyte-v1/charts/metrics/charts/common/Chart.yaml b/helm/airbyte-v1/charts/metrics/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/helm/airbyte-v1/charts/metrics/charts/common/README.md b/helm/airbyte-v1/charts/metrics/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_affinities.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_capabilities.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_errors.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_images.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_ingress.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_labels.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_names.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_secrets.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_storage.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_tplvalues.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_utils.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/_warnings.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_cassandra.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mariadb.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mongodb.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mysql.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_postgresql.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_redis.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_validations.tpl b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/metrics/charts/common/values.yaml b/helm/airbyte-v1/charts/metrics/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/helm/airbyte-v1/charts/metrics/templates/_helpers.tpl b/helm/airbyte-v1/charts/metrics/templates/_helpers.tpl new file mode 100644 index 00000000..9f3ccdc6 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/templates/_helpers.tpl @@ -0,0 +1,39 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/metrics/templates/_images.tpl b/helm/airbyte-v1/charts/metrics/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/metrics/templates/deployment.yaml b/helm/airbyte-v1/charts/metrics/templates/deployment.yaml new file mode 100644 index 00000000..d9bf336c --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/templates/deployment.yaml @@ -0,0 +1,124 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "airbyte.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + helm.sh/chart: {{ include "airbyte.chart" . }} + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.airbyte.io/fullname: {{ include "airbyte.fullname" . }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + airbyte: metrics + strategy: + type: Recreate # Needed due to volume claims + template: + metadata: + labels: + airbyte: metrics + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + containers: + - name: airbyte-metrics-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: METRIC_CLIENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: METRIC_CLIENT + - name: OTEL_COLLECTOR_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OTEL_COLLECTOR_ENDPOINT + + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: metrics-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.resources }} + resources: + {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: + {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + {{- if .Values.extraVolumeMounts }} + volumeMounts: + {{ toYaml .Values.extraVolumeMounts | nindent 10 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/metrics/values.yaml b/helm/airbyte-v1/charts/metrics/values.yaml new file mode 100644 index 00000000..6ccaa691 --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/values.yaml @@ -0,0 +1,110 @@ + +global: + # imagePullSecrets: + # - name: "" + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + extraContainers: [] + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## metrics.replicaCount Number of metrics-reporter replicas +replicaCount: 1 + +## metrics.image.repository The repository to use for the airbyte metrics-reporter image. +## metrics.image.pullPolicy the pull policy to use for the airbyte metrics-reporter image +## metrics.image.tag The airbyte metrics-reporter image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/metrics-reporter + pullPolicy: IfNotPresent + +## metrics.podAnnotations [object] Add extra annotations to the metrics-reporter pod +## +podAnnotations: {} + +## metrics.podLabels [object] Add extra labels to the metrics-reporter pod +## +podLabels: {} + +## metrics.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## metrics-reporter app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## metrics.resources.limits [object] The resources limits for the metrics-reporter container +## metrics.resources.requests [object] The requested resources for the metrics-reporter container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## metrics.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## metrics.tolerations [array] Tolerations for metrics-reporter pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## metrics.affinity [object] Affinity and anti-affinity for metrics-reporter pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## metrics.extraEnv [array] Additional env vars for metrics-reporter pod(s). +## Example: +## +## extraEnv: +## - name: SAMPLE_ENV_VAR +## value: "key=sample-value" +extraEnv: [] + +## metrics.extraVolumeMounts [array] Additional volumeMounts for metrics-reporter container(s). +## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## metrics.extraVolumes [array] Additional volumes for metrics-reporter pod(s). +## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +extraContainers: [] + +secrets: {} + +env_vars: {} diff --git a/helm/airbyte-v1/charts/pod-sweeper/.gitignore b/helm/airbyte-v1/charts/pod-sweeper/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/pod-sweeper/Chart.lock b/helm/airbyte-v1/charts/pod-sweeper/Chart.lock new file mode 100644 index 00000000..5fdb23f1 --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:27.057672332Z" diff --git a/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml b/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml new file mode 100644 index 00000000..3fdc79dc --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-pod-sweeper +name: pod-sweeper +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/pod-sweeper/README.md b/helm/airbyte-v1/charts/pod-sweeper/README.md new file mode 100644 index 00000000..cc34eedd --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/README.md @@ -0,0 +1,71 @@ +# pod-sweeper + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-pod-sweeper + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.jobs.kube.annotations | object | `{}` | | +| global.jobs.kube.main_container_image_pull_secret | string | `""` | | +| global.jobs.kube.nodeSelector | object | `{}` | | +| global.jobs.kube.tolerations | list | `[]` | | +| global.jobs.resources.limits | object | `{}` | | +| global.jobs.resources.requests | object | `{}` | | +| global.logs.accessKey.existingSecret | string | `""` | | +| global.logs.accessKey.existingSecretKey | string | `""` | | +| global.logs.accessKey.password | string | `"minio"` | | +| global.logs.gcs.bucket | string | `""` | | +| global.logs.gcs.credentials | string | `""` | | +| global.logs.gcs.credentialsJson | string | `""` | | +| global.logs.minio.enabled | bool | `true` | | +| global.logs.s3.bucket | string | `"airbyte-dev-logs"` | | +| global.logs.s3.bucketRegion | string | `""` | | +| global.logs.s3.enabled | bool | `false` | | +| global.logs.secretKey.existingSecret | string | `""` | | +| global.logs.secretKey.existingSecretKey | string | `""` | | +| global.logs.secretKey.password | string | `"minio123"` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"bitnami/kubectl"` | | +| image.tag | string | `"latest"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `5` | | +| livenessProbe.periodSeconds | int | `30` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| namespace | string | `""` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `5` | | +| readinessProbe.periodSeconds | int | `30` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| timeToDeletePods.running | string | `""` | | +| timeToDeletePods.succeeded | int | `120` | | +| timeToDeletePods.unsuccessful | int | `1440` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/pod-sweeper/templates/_helpers.tpl b/helm/airbyte-v1/charts/pod-sweeper/templates/_helpers.tpl new file mode 100644 index 00000000..847ec7b4 --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} diff --git a/helm/airbyte-v1/charts/pod-sweeper/templates/_images.tpl b/helm/airbyte-v1/charts/pod-sweeper/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/pod-sweeper/templates/configmap.yaml b/helm/airbyte-v1/charts/pod-sweeper/templates/configmap.yaml new file mode 100644 index 00000000..96ce9350 --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/templates/configmap.yaml @@ -0,0 +1,73 @@ +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }}-sweep-pod-script + namespace: {{ .Values.namespace | default .Release.Namespace }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + +data: + sweep-pod.sh: | + #!/bin/bash + get_job_pods () { + kubectl -n ${KUBE_NAMESPACE} -L airbyte -l airbyte=job-pod \ + get pods \ + -o=jsonpath='{range .items[*]} {.metadata.name} {.status.phase} {.status.conditions[0].lastTransitionTime} {.status.startTime}{"\n"}{end}' + } + delete_pod() { + printf "From status '%s' since '%s', " $2 $3 + echo "$1" | grep -v "STATUS" | awk '{print $1}' | xargs --no-run-if-empty kubectl -n ${KUBE_NAMESPACE} delete pod + } + while : + do + echo "Starting pod sweeper cycle:" + + if [ -n "${RUNNING_TTL_MINUTES}" ]; then + # Time window for running pods + RUNNING_DATE_STR=`date -d "now - ${RUNNING_TTL_MINUTES} minutes" --utc -Ins` + RUNNING_DATE=`date -d $RUNNING_DATE_STR +%s` + echo "Will sweep running pods from before ${RUNNING_DATE_STR}" + fi + + if [ -n "${SUCCEEDED_TTL_MINUTES}" ]; then + # Shorter time window for succeeded pods + SUCCESS_DATE_STR=`date -d "now - ${SUCCEEDED_TTL_MINUTES} minutes" --utc -Ins` + SUCCESS_DATE=`date -d $SUCCESS_DATE_STR +%s` + echo "Will sweep succeeded pods from before ${SUCCESS_DATE_STR}" + fi + + if [ -n "${UNSUCCESSFUL_TTL_MINUTES}" ]; then + # Longer time window for unsuccessful pods (to debug) + NON_SUCCESS_DATE_STR=`date -d "now - ${UNSUCCESSFUL_TTL_MINUTES} minutes" --utc -Ins` + NON_SUCCESS_DATE=`date -d $NON_SUCCESS_DATE_STR +%s` + echo "Will sweep unsuccessful pods from before ${NON_SUCCESS_DATE_STR}" + fi + ( + IFS=$'\n' + for POD in `get_job_pods`; do + IFS=' ' + POD_NAME=`echo $POD | cut -d " " -f 1` + POD_STATUS=`echo $POD | cut -d " " -f 2` + POD_DATE_STR=`echo $POD | cut -d " " -f 3` + POD_START_DATE_STR=`echo $POD | cut -d " " -f 4` + POD_DATE=`date -d ${POD_DATE_STR:-$POD_START_DATE_STR} '+%s'` + if [ -n "${RUNNING_TTL_MINUTES}" ] && [ "$POD_STATUS" = "Running" ]; then + if [ "$POD_DATE" -lt "$RUNNING_DATE" ]; then + delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" + fi + elif [ -n "${SUCCEEDED_TTL_MINUTES}" ] && [ "$POD_STATUS" = "Succeeded" ]; then + if [ "$POD_DATE" -lt "$SUCCESS_DATE" ]; then + delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" + fi + elif [ -n "${UNSUCCESSFUL_TTL_MINUTES}" ] && [ "$POD_STATUS" != "Running" ] && [ "$POD_STATUS" != "Succeeded" ]; then + if [ "$POD_DATE" -lt "$NON_SUCCESS_DATE" ]; then + delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" + fi + fi + done + ) + echo "Completed pod sweeper cycle. Sleeping for 60 seconds..." + sleep 60 + done diff --git a/helm/airbyte-v1/charts/pod-sweeper/templates/deployment.yaml b/helm/airbyte-v1/charts/pod-sweeper/templates/deployment.yaml new file mode 100644 index 00000000..374b9a4f --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/templates/deployment.yaml @@ -0,0 +1,105 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + namespace: {{ .Values.namespace | default .Release.Namespace }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + namespace: {{ .Values.namespace | default .Release.Namespace }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + annotations: + checksum/sweep-pod-script: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + {{- if .Values.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: airbyte-pod-sweeper + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + - name: KUBE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: RUNNING_TTL_MINUTES + value: "{{ .Values.timeToDeletePods.running }}" + - name: SUCCEEDED_TTL_MINUTES + value: "{{ .Values.timeToDeletePods.succeeded }}" + - name: UNSUCCESSFUL_TTL_MINUTES + value: "{{ .Values.timeToDeletePods.unsuccessful }}" + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + - mountPath: /script/sweep-pod.sh + subPath: sweep-pod.sh + name: sweep-pod-script + - mountPath: /.kube + name: kube-config + command: ["/bin/bash", "-c", /script/sweep-pod.sh] + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + exec: + command: + - /bin/sh + - -ec + - grep -aq sweep-pod.sh /proc/1/cmdline + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + exec: + command: + - /bin/sh + - -ec + - grep -aq sweep-pod.sh /proc/1/cmdline + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + - name: kube-config + emptyDir: {} + - name: sweep-pod-script + configMap: + name: {{ include "common.names.fullname" . }}-sweep-pod-script + defaultMode: 0755 diff --git a/helm/airbyte-v1/charts/pod-sweeper/values.yaml b/helm/airbyte-v1/charts/pod-sweeper/values.yaml new file mode 100644 index 00000000..fa4bb8a6 --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/values.yaml @@ -0,0 +1,120 @@ +## global.serviceAccountName Name of service account to be associated with service +global: + serviceAccountName: &service-account-name "airbyte-admin" + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## podSweeper.image.repository The image repository to use for the pod sweeper +## podSweeper.image.pullPolicy The pull policy for the pod sweeper image +## podSweeper.image.tag The pod sweeper image tag to use +image: + repository: bitnami/kubectl + pullPolicy: IfNotPresent + tag: latest + +## podSweeper.podAnnotations [object] Add extra annotations to the podSweeper pod +## +podAnnotations: {} + +## podSweeper.podLabels [object] Add extra labels to the podSweeper pod +## +podLabels: {} + +## podSweeper.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the podSweeper containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## podSweeper.livenessProbe.enabled Enable livenessProbe on the podSweeper +## podSweeper.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## podSweeper.livenessProbe.periodSeconds Period seconds for livenessProbe +## podSweeper.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## podSweeper.livenessProbe.failureThreshold Failure threshold for livenessProbe +## podSweeper.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## podSweeper.readinessProbe.enabled Enable readinessProbe on the podSweeper +## podSweeper.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## podSweeper.readinessProbe.periodSeconds Period seconds for readinessProbe +## podSweeper.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## podSweeper.readinessProbe.failureThreshold Failure threshold for readinessProbe +## podSweeper.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Pod Sweeper app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## podSweeper.resources.limits [object] The resources limits for the podSweeper container +## podSweeper.resources.requests [object] The requested resources for the podSweeper container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## podSweeper.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## podSweeper.tolerations [array] Tolerations for podSweeper pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## podSweeper.affinity [object] Affinity and anti-affinity for podSweeper pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## Pod TTLs in minutes +## pod-sweeper will skip over pods with any status types with no TTL set (empty string) +## Pod Status docs: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase +## +## podSweeper.timeToDeletePods.running Time to remove pods on running status (minutes). +## podSweeper.timeToDeletePods.succeeded Time to remove pods on succeeded status (minutes). +## podSweeper.timeToDeletePods.unsuccessful Time to remove pods on neither running nor succeeded status (minutes). +timeToDeletePods: + running: "" + succeeded: 10 + ## 2 hours - generally long enough for someone trying to reproduce an error to debug. + unsuccessful: 120 + +replicaCount: 1 + +## namespace [string] namespace to deploy pod-sweeper at +namespace: "" diff --git a/helm/airbyte-v1/charts/server/.gitignore b/helm/airbyte-v1/charts/server/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/server/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/server/Chart.lock b/helm/airbyte-v1/charts/server/Chart.lock new file mode 100644 index 00000000..746fb41b --- /dev/null +++ b/helm/airbyte-v1/charts/server/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:15.123937677Z" diff --git a/helm/airbyte-v1/charts/server/Chart.yaml b/helm/airbyte-v1/charts/server/Chart.yaml new file mode 100644 index 00000000..60038f60 --- /dev/null +++ b/helm/airbyte-v1/charts/server/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-server +name: server +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/server/README.md b/helm/airbyte-v1/charts/server/README.md new file mode 100644 index 00000000..b31933fb --- /dev/null +++ b/helm/airbyte-v1/charts/server/README.md @@ -0,0 +1,68 @@ +# server + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-server + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| deploymentStrategyType | string | `"Recreate"` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.edition | string | `"community"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/server"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `60` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `30` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `8001` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/server/templates/_helpers.tpl b/helm/airbyte-v1/charts/server/templates/_helpers.tpl new file mode 100644 index 00000000..b8ac92f8 --- /dev/null +++ b/helm/airbyte-v1/charts/server/templates/_helpers.tpl @@ -0,0 +1,242 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/server/templates/_images.tpl b/helm/airbyte-v1/charts/server/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/server/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/server/templates/deployment.yaml b/helm/airbyte-v1/charts/server/templates/deployment.yaml new file mode 100644 index 00000000..186082d6 --- /dev/null +++ b/helm/airbyte-v1/charts/server/templates/deployment.yaml @@ -0,0 +1,453 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + minReadySeconds: 30 + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: {{ .Values.deploymentStrategyType }} # Needed due to volume claims + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-server-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: API_AUTHORIZATION_ENABLED + value: "true" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise should always have API_AUTHORIZATION_ENABLED set to true, even + # if global.auth.enabled is not set to true. This can be simplified in the future, once + # globa.auth.enabled is changed to always default to true across all editions of Airbyte. + - name: API_AUTHORIZATION_ENABLED + value: "true" + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + {{- include "airbyte.logging.envs" . | nindent 8 }} + - name: AIRBYTE_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_API_HOST + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: AIRBYTE_EDITION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_EDITION + - name: AIRBYTE_URL + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: AIRBYTE_URL + - name: CONFIG_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIG_ROOT + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SERVER_MICRONAUT_ENVIRONMENTS + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKER_ENVIRONMENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKER_ENVIRONMENT + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: JOB_MAIN_CONTAINER_CPU_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_REQUEST + - name: JOB_MAIN_CONTAINER_CPU_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_LIMIT + - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_REQUEST + - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_LIMIT + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_INTERNAL_HOST + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: KEYCLOAK_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_USER + - name: KEYCLOAK_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_PASSWORD + {{- end }} + - name: CONNECTOR_BUILDER_SERVER_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_BUILDER_SERVER_API_HOST + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal server" + - name: ENTERPRISE_SOURCE_STUBS_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ENTERPRISE_SOURCE_STUBS_URL + + {{- if and (eq .Values.global.edition "community") .Values.global.auth.enabled }} + # Values for Airbyte auth configurations, secrets, and credentials in Community edition + - name: AB_INSTANCE_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.instanceAdmin.passwordSecretKey | default "instance-admin-password" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.instanceAdmin.clientIdSecretKey | default "instance-admin-client-id" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.instanceAdmin.clientSecretSecretKey | default "instance-admin-client-secret" | quote }} + - name: AB_JWT_SIGNATURE_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.jwtSignatureSecretKey | default "jwt-signature-secret" | quote }} + - name: AB_COOKIE_SECURE + value: {{ .Values.global.auth.cookieSecureSetting | default "true" | quote }} + - name: AB_COOKIE_SAME_SITE + value: {{ .Values.global.auth.cookieSameSiteSetting | default "Strict" | quote }} + {{- end }} + + # Secrets Manager + - name: SECRET_PERSISTENCE + value: {{ include "airbyte.secretPersistence" . }} + # Values for AwsSecretsManager + {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} + - name: AWS_SECRET_MANAGER_REGION + value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} + - name: AWS_SECRET_MANAGER_SECRET_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} + - name: AWS_KMS_KEY_ARN + value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} + {{- end }} + + # Values for Azure Key Vault + {{- if (((.Values.global).secretsManager).azureKeyVault) }} + + - name: AB_AZURE_KEY_VAULT_VAULT_URL + value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} + + - name: AB_AZURE_KEY_VAULT_TENANT_ID + value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + {{- end }} + + {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} + - name: AB_AZURE_KEY_VAULT_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} + {{- end }} + + # Values for googleSecretManager secrets + {{- if (((.Values.global).secretsManager).googleSecretManager) }} + - name: SECRET_STORE_GCP_PROJECT_ID + value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} + - name: SECRET_STORE_GCP_CREDENTIALS + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + {{- end }} + + # Values for vault secrets + {{- if (((.Values.global).secretsManager).vault) }} + - name: VAULT_ADDRESS + value: {{ (((.Values.global).secretsManager).vault).address }} + - name: VAULT_PREFIX + value: {{ (((.Values.global).secretsManager).vault).prefix }} + - name: VAULT_AUTH_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + {{- end }} + + # Storage + {{- include "airbyte.storage.envs" . | nindent 8 }} + + {{- include "airbyte.database.envs" . | nindent 8 }} + {{- include "airbyte.enterprise.instanceAdmin" . | nindent 8 }} + {{- include "airbyte.enterprise.identityProvider" . | nindent 8 }} + {{- include "airbyte.enterprise.license" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: server-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /api/v1/health + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /api/v1/health + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + - name: http + containerPort: 8001 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + mountPath: /storage + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + mountPath: /app/configs/airbyte.yml + subPath: fileContents + readOnly: true + {{- end }} + {{- end }} + + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + persistentVolumeClaim: + claimName: airbyte-storage-pvc + {{- end }} + + {{- if eq .Values.global.deploymentMode "oss" }} + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + secret: + secretName: {{ .Release.Name }}-airbyte-yml + {{- end }} + {{- end }} + {{- if .Values.extraVolumes }} +{{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/server/templates/secrets.yaml b/helm/airbyte-v1/charts/server/templates/secrets.yaml new file mode 100644 index 00000000..f0101d7a --- /dev/null +++ b/helm/airbyte-v1/charts/server/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: server-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/server/templates/service.yaml b/helm/airbyte-v1/charts/server/templates/service.yaml new file mode 100644 index 00000000..d2d8d9b9 --- /dev/null +++ b/helm/airbyte-v1/charts/server/templates/service.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-server-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/server/values.yaml b/helm/airbyte-v1/charts/server/values.yaml new file mode 100644 index 00000000..390f80a4 --- /dev/null +++ b/helm/airbyte-v1/charts/server/values.yaml @@ -0,0 +1,220 @@ + +global: + serviceAccountName: placeholderServiceAccount + edition: community + deploymentMode: oss + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + storage: + type: minio + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte server image. +## image.pullPolicy the pull policy to use for the airbyte server image +## image.tag The airbyte server image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/server + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the server pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: ClusterIP + port: 8001 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# DATABASE_DB: airbyte +# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 +# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 +env_vars: {} + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + + +## deploymentStrategyType [string] - deployment strategy type for airbyte-server deployment. +## Defaults to Recreate since the pod is using pvc +deploymentStrategyType: Recreate + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/temporal-ui/Chart.lock b/helm/airbyte-v1/charts/temporal-ui/Chart.lock new file mode 100644 index 00000000..fb50c706 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-11-07T16:44:37.102389418Z" diff --git a/helm/airbyte-v1/charts/temporal-ui/Chart.yaml b/helm/airbyte-v1/charts/temporal-ui/Chart.yaml new file mode 100644 index 00000000..b6769df7 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-temporal-ui +name: temporal-ui +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/.helmignore b/helm/airbyte-v1/charts/temporal-ui/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/Chart.yaml b/helm/airbyte-v1/charts/temporal-ui/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/README.md b/helm/airbyte-v1/charts/temporal-ui/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_affinities.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_capabilities.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_errors.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_images.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_ingress.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_labels.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_names.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_secrets.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_storage.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_tplvalues.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_utils.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_warnings.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_redis.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_validations.tpl b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/temporal-ui/charts/common/values.yaml b/helm/airbyte-v1/charts/temporal-ui/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/helm/airbyte-v1/charts/temporal-ui/templates/_helpers.tpl b/helm/airbyte-v1/charts/temporal-ui/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/temporal-ui/templates/_images.tpl b/helm/airbyte-v1/charts/temporal-ui/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/temporal-ui/templates/deployment.yaml b/helm/airbyte-v1/charts/temporal-ui/templates/deployment.yaml new file mode 100644 index 00000000..06a07ea5 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/templates/deployment.yaml @@ -0,0 +1,124 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-temporal-ui + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + + ports: + - name: http + containerPort: 8080 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/temporal-ui/templates/service.yaml b/helm/airbyte-v1/charts/temporal-ui/templates/service.yaml new file mode 100644 index 00000000..93d2c3eb --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/templates/service.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-temporal-ui-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} diff --git a/helm/airbyte-v1/charts/temporal-ui/values.yaml b/helm/airbyte-v1/charts/temporal-ui/values.yaml new file mode 100644 index 00000000..9430941d --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/values.yaml @@ -0,0 +1,194 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + deploymentStrategyType: RollingUpdate + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: false +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte server image. +## image.pullPolicy the pull policy to use for the airbyte server image +## image.tag The airbyte server image tag. Defaults to the chart's AppVersion +image: + repository: temporalio/ui + pullPolicy: IfNotPresent + tag: 2.30.1 + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: NodePort + port: 80 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 +env_vars: + TEMPORAL_ADDRESS: ab-temporal:7233 + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/temporal/.gitignore b/helm/airbyte-v1/charts/temporal/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/temporal/Chart.lock b/helm/airbyte-v1/charts/temporal/Chart.lock new file mode 100644 index 00000000..4deb970e --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:19.234598793Z" diff --git a/helm/airbyte-v1/charts/temporal/Chart.yaml b/helm/airbyte-v1/charts/temporal/Chart.yaml new file mode 100644 index 00000000..20a9d427 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-temporal +name: temporal +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/temporal/README.md b/helm/airbyte-v1/charts/temporal/README.md new file mode 100644 index 00000000..036ddee1 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/README.md @@ -0,0 +1,62 @@ +# temporal + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-temporal + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"temporalio/auto-setup"` | | +| image.tag | string | `"1.23.0"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `5` | | +| livenessProbe.periodSeconds | int | `30` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `5` | | +| readinessProbe.periodSeconds | int | `30` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.port | int | `7233` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/temporal/templates/_helpers.tpl b/helm/airbyte-v1/charts/temporal/templates/_helpers.tpl new file mode 100644 index 00000000..847ec7b4 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} diff --git a/helm/airbyte-v1/charts/temporal/templates/_images.tpl b/helm/airbyte-v1/charts/temporal/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/temporal/templates/configmap.yaml b/helm/airbyte-v1/charts/temporal/templates/configmap.yaml new file mode 100644 index 00000000..5f4b89fe --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/templates/configmap.yaml @@ -0,0 +1,54 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }}-dynamicconfig + labels: + {{- include "airbyte.labels" . | nindent 4 }} +data: + "development.yaml": | + # when modifying, remember to update the docker-compose version of this file in temporal/dynamicconfig/development.yaml + frontend.enableClientVersionCheck: + - value: true + constraints: {} + history.persistenceMaxQPS: + - value: 3000 + constraints: {} + frontend.persistenceMaxQPS: + - value: 3000 + constraints: {} + frontend.historyMgrNumConns: + - value: 30 + constraints: {} + frontend.throttledLogRPS: + - value: 20 + constraints: {} + frontend.enableUpdateWorkflowExecution: + - value: true + frontend.enableUpdateWorkflowExecutionAsyncAccepted: + - value: true + history.historyMgrNumConns: + - value: 50 + constraints: {} + system.advancedVisibilityWritingMode: + - value: "off" + constraints: {} + history.defaultActivityRetryPolicy: + - value: + InitialIntervalInSeconds: 1 + MaximumIntervalCoefficient: 100.0 + BackoffCoefficient: 2.0 + MaximumAttempts: 0 + history.defaultWorkflowRetryPolicy: + - value: + InitialIntervalInSeconds: 1 + MaximumIntervalCoefficient: 100.0 + BackoffCoefficient: 2.0 + MaximumAttempts: 0 + # Limit for responses. This mostly impacts discovery jobs since they have the largest responses. + limit.blobSize.error: + - value: 15728640 # 15MB + constraints: {} + limit.blobSize.warn: + - value: 10485760 # 10MB + constraints: {} diff --git a/helm/airbyte-v1/charts/temporal/templates/deployment.yaml b/helm/airbyte-v1/charts/temporal/templates/deployment.yaml new file mode 100644 index 00000000..83643ecd --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/templates/deployment.yaml @@ -0,0 +1,162 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} +{{- if .Values.extraInitContainers }} + initContainers: +{{- toYaml .Values.extraInitContainers | nindent 6 }} +{{- end }} + containers: + - name: airbyte-temporal + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- if eq .Values.global.deploymentMode "oss"}} + - name: AUTO_SETUP + value: "true" + - name: DB # The DB engine to use + value: "postgresql" + - name: DYNAMIC_CONFIG_FILE_PATH + value: "config/dynamicconfig/development.yaml" + + {{- include "airbyte.temporal.database.envs" . | nindent 10 }} + + {{- end }} + + {{- if eq .Values.global.database.type "external" }} + # Assume an external database requires SSL. + - name: POSTGRES_TLS_ENABLED + value: "false" + - name: POSTGRES_TLS_DISABLE_HOST_VERIFICATION + value: "false" + - name: SQL_TLS_ENABLED + value: "false" + - name: SQL_TLS_DISABLE_HOST_VERIFICATION + value: "false" + - name: SQL_SSL_MODE + value: "disable" + {{- end }} + + {{- if .Values.extraEnv }} + {{ .Values.extraEnv | toYaml | nindent 10 }} + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: temporal-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + ports: + - containerPort: 7233 + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + - name: airbyte-temporal-dynamicconfig + mountPath: "/etc/temporal/config/dynamicconfig/" + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + exec: + command: + - /bin/sh + - -ec + - 'test $(ps -ef | grep -v grep | grep temporal-server | wc -l) -eq 1' + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + exec: + command: + - /bin/sh + - -ec + - 'test $(ps -ef | grep -v grep | grep temporal-server | wc -l) -eq 1' + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + - name: airbyte-temporal-dynamicconfig + configMap: + name: {{ include "common.names.fullname" . }}-dynamicconfig + items: + - key: development.yaml + path: development.yaml + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/temporal/templates/secrets.yaml b/helm/airbyte-v1/charts/temporal/templates/secrets.yaml new file mode 100644 index 00000000..f77d1ff1 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: temporal-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/temporal/templates/service.yaml b/helm/airbyte-v1/charts/temporal/templates/service.yaml new file mode 100644 index 00000000..39f13632 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/templates/service.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-temporal + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + protocol: TCP + targetPort: 7233 + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/temporal/values.yaml b/helm/airbyte-v1/charts/temporal/values.yaml new file mode 100644 index 00000000..64f90af2 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/values.yaml @@ -0,0 +1,193 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + configMapName: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + type: internal + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## temporal.replicaCount The number of temporal replicas to deploy +replicaCount: 1 + +## temporal.image.repository The temporal image repository to use +## temporal.image.pullPolicy The pull policy for the temporal image +## temporal.image.tag The temporal image tag to use +image: + repository: temporalio/auto-setup + pullPolicy: IfNotPresent + tag: "1.23.0" + +## temporal.service.type The Kubernetes Service Type +## temporal.service.port The temporal port and exposed kubernetes port +service: + type: ClusterIP + port: 7233 + +## temporal.podAnnotations [object] Add extra annotations to the temporal pod +## +podAnnotations: {} + +## temporal.podLabels [object] Add extra labels to the temporal pod +## +podLabels: {} + +## temporal.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## temporal.extraInitContainers Additional InitContainers to initialize the pod +## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraInitContainers: +## - name: config-loader +## image: temporalio/auto-setup:1.23 +## command: +## - /bin/sh +## - -c +## - >- +## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; +## volumeMounts: +## - name: config +## mountPath: /config +extraInitContainers: [] + +## Configure extra options for the temporal containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## temporal.livenessProbe.enabled Enable livenessProbe on the temporal +## temporal.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## temporal.livenessProbe.periodSeconds Period seconds for livenessProbe +## temporal.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## temporal.livenessProbe.failureThreshold Failure threshold for livenessProbe +## temporal.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## temporal.readinessProbe.enabled Enable readinessProbe on the temporal +## temporal.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## temporal.readinessProbe.periodSeconds Period seconds for readinessProbe +## temporal.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## temporal.readinessProbe.failureThreshold Failure threshold for readinessProbe +## temporal.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## temporal.nodeSelector [object] Node labels for temporal pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## temporal.tolerations [array] Tolerations for temporal pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## temporal.affinity [object] Affinity and anti-affinity for temporal pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## temporal.extraEnv [array] Additional env vars for temporal pod(s). +## Example: +## +## extraEnv: +## - name: SAMPLE_ENV_VAR +## value: "key=sample-value" +extraEnv: [] + +## temporal.extraVolumeMounts [array] Additional volumeMounts for temporal container(s). +## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## - name: config +## mountPath: /etc/temporal/config +## +extraVolumeMounts: [] + +## temporal.extraVolumes [array] Additional volumes for temporal pod(s). +## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## - name: config +## emptyDir: {} +## +extraVolumes: [] + +## Temporal resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## temporal.resources.limits [object] The resources limits for temporal pod(s) +## temporal.resources.requests [object] The requested resources for temporal pod(s) +resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + +extraContainers: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default vars for webapp: +# env_vars: + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DB: airbyte-db-svc +# DB_PORT: 5432 +# DATABASE_DB: airbyte +# POSTGRES_USER: airbyte +# POSTGRES_PWD: 12345 + +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/webapp/.gitignore b/helm/airbyte-v1/charts/webapp/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/webapp/Chart.lock b/helm/airbyte-v1/charts/webapp/Chart.lock new file mode 100644 index 00000000..6d8b135d --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:23.164183749Z" diff --git a/helm/airbyte-v1/charts/webapp/Chart.yaml b/helm/airbyte-v1/charts/webapp/Chart.yaml new file mode 100644 index 00000000..811476e0 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-webapp +name: webapp +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/webapp/README.md b/helm/airbyte-v1/charts/webapp/README.md new file mode 100644 index 00000000..8becc7c3 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/README.md @@ -0,0 +1,69 @@ +# webapp + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-webapp + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| api.url | string | `"/api/v1/"` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| fullstory.enabled | bool | `false` | | +| global.configMapName | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/webapp"` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts | list | `[]` | | +| ingress.tls | list | `[]` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `80` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | + diff --git a/helm/airbyte-v1/charts/webapp/templates/_helpers.tpl b/helm/airbyte-v1/charts/webapp/templates/_helpers.tpl new file mode 100644 index 00000000..e3f0d38f --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/templates/_helpers.tpl @@ -0,0 +1,60 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/webapp/templates/_images.tpl b/helm/airbyte-v1/charts/webapp/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/webapp/templates/deployment.yaml b/helm/airbyte-v1/charts/webapp/templates/deployment.yaml new file mode 100644 index 00000000..9fc93770 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/templates/deployment.yaml @@ -0,0 +1,172 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-webapp-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: AIRBYTE_SERVER_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_SERVER_HOST + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_INTERNAL_HOST + - name: CONNECTOR_BUILDER_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_BUILDER_API_HOST + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: API_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: API_URL + - name: CONNECTOR_BUILDER_API_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_BUILDER_API_URL + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: webapp-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + tcpSocket: + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /index.html + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + - name: http + containerPort: 8080 + protocol: TCP + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} +{{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} +{{ toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/webapp/templates/ingress.yaml b/helm/airbyte-v1/charts/webapp/templates/ingress.yaml new file mode 100644 index 00000000..5fef4e02 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/templates/ingress.yaml @@ -0,0 +1,62 @@ +--- +{{ if .Values.ingress.enabled -}} +{{- $fullName := include "airbyte.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $.Release.Name }}-airbyte-webapp-svc + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }}-svc + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/webapp/templates/secrets.yaml b/helm/airbyte-v1/charts/webapp/templates/secrets.yaml new file mode 100644 index 00000000..8ac24955 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: webapp-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/webapp/templates/service.yaml b/helm/airbyte-v1/charts/webapp/templates/service.yaml new file mode 100644 index 00000000..a4ccded3 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/templates/service.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-airbyte-webapp-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + {{ if and (eq .Values.service.type "NodePort") (.Values.service.nodePort) }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} + {{- if .Values.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.service.loadBalancerIP }} + {{- end }} diff --git a/helm/airbyte-v1/charts/webapp/values.yaml b/helm/airbyte-v1/charts/webapp/values.yaml new file mode 100644 index 00000000..aedb5076 --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/values.yaml @@ -0,0 +1,261 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + configMapName: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## webapp.replicaCount Number of webapp replicas +replicaCount: 1 + +## webapp.image.repository The repository to use for the airbyte webapp image. +## webapp.image.pullPolicy the pull policy to use for the airbyte webapp image +## webapp.image.tag The airbyte webapp image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/webapp + pullPolicy: IfNotPresent + +## webapp.podAnnotations [object] Add extra annotations to the webapp pod(s) +## +podAnnotations: {} + +## webapp.podLabels [object] Add extra labels to the webapp pod(s) +## +podLabels: {} + +## webapp.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the webapp containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## webapp.livenessProbe.enabled Enable livenessProbe on the webapp +## webapp.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## webapp.livenessProbe.periodSeconds Period seconds for livenessProbe +## webapp.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## webapp.livenessProbe.failureThreshold Failure threshold for livenessProbe +## webapp.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## webapp.readinessProbe.enabled Enable readinessProbe on the webapp +## webapp.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## webapp.readinessProbe.periodSeconds Period seconds for readinessProbe +## webapp.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## webapp.readinessProbe.failureThreshold Failure threshold for readinessProbe +## webapp.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## webapp.service.type The service type to use for the webapp service +## webapp.service.port The service port to expose the webapp on +## webapp.service.annotations Annotations for the webapp service resource +service: + type: ClusterIP + port: 80 + annotations: {} + +## Web app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## webapp.resources.limits [object] The resources limits for the Web container +## webapp.resources.requests [object] The requested resources for the Web container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## webapp.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## webapp.tolerations [array] Tolerations for webapp pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## webapp.affinity [object] Affinity and anti-affinity for webapp pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## Configure the ingress resource that allows you to access the Airbyte installation. +## ref: http://kubernetes.io/docs/user-guide/ingress/ +## webapp.ingress.enabled Set to true to enable ingress record generation +## webapp.ingress.className Specifies ingressClassName for clusters >= 1.18+ +## webapp.ingress.annotations [object] Ingress annotations done as key:value pairs +## webapp.ingress.hosts The list of hostnames to be covered with this ingress record. +## webapp.ingress.tls [array] Custom ingress TLS configuration +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: [] + # - host: chart-example.local + # paths: + # - path: / + # pathType: ImplementationSpecific + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +## webapp.api.url The webapp API url. +api: + url: /api/v1/ + +## webapp.fullstory.enabled Whether or not to enable fullstory +fullstory: + enabled: false + + +## webapp.extraVolumeMounts [array] Additional volumeMounts for webapp container(s). +## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: var-run +## mountPath: /var/run/ +## - name: var-cache-nginx +## mountPath: /var/cache/nginx +## - mountPath: /etc/nginx/conf.d +## name: nginx-conf-d +## +extraVolumeMounts: [] + +## webapp.extraVolumes [array] Additional volumes for webapp pod(s). +## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: var-run +## emptyDir: {} +## - name: var-cache-nginx +## emptyDir: {} +## - name: nginx-conf-d +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: POSTGRES_USER +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_USER +# - name: POSTGRES_PWD +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_PASSWORD +# - name: DYNAMIC_CONFIG_FILE_PATH +# value: "config/dynamicconfig/development.yaml" +# - name: DB +# value: "postgresql" +# - name: DB_PORT +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_PORT +# - name: POSTGRES_SEEDS +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default vars for webapp: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# API_URL: /api/v1/ +# AIRBYTE_SERVER_HOST: airbyte-server-svc:8001 + +env_vars: {} + + + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/worker/.gitignore b/helm/airbyte-v1/charts/worker/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/worker/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/worker/Chart.lock b/helm/airbyte-v1/charts/worker/Chart.lock new file mode 100644 index 00000000..7000cfe2 --- /dev/null +++ b/helm/airbyte-v1/charts/worker/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:31.130386898Z" diff --git a/helm/airbyte-v1/charts/worker/Chart.yaml b/helm/airbyte-v1/charts/worker/Chart.yaml new file mode 100644 index 00000000..4e1892a2 --- /dev/null +++ b/helm/airbyte-v1/charts/worker/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-worker +name: worker +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/worker/README.md b/helm/airbyte-v1/charts/worker/README.md new file mode 100644 index 00000000..a9d1b210 --- /dev/null +++ b/helm/airbyte-v1/charts/worker/README.md @@ -0,0 +1,72 @@ +# worker + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-worker + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `true` | | +| env_vars.CONTAINER_ORCHESTRATOR_ENABLED | bool | `true` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.edition | string | `"community"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.jobs.kube.annotations | object | `{}` | | +| global.jobs.kube.images.busybox | string | `""` | | +| global.jobs.kube.images.curl | string | `""` | | +| global.jobs.kube.labels | object | `{}` | | +| global.jobs.kube.main_container_image_pull_secret | string | `""` | | +| global.jobs.kube.nodeSelector | object | `{}` | | +| global.jobs.kube.tolerations | list | `[]` | | +| global.jobs.resources.limits | object | `{}` | | +| global.jobs.resources.requests | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/worker"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `50` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/helm/airbyte-v1/charts/worker/templates/_helpers.tpl b/helm/airbyte-v1/charts/worker/templates/_helpers.tpl new file mode 100644 index 00000000..b8ac92f8 --- /dev/null +++ b/helm/airbyte-v1/charts/worker/templates/_helpers.tpl @@ -0,0 +1,242 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/worker/templates/_images.tpl b/helm/airbyte-v1/charts/worker/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/worker/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/worker/templates/deployment.yaml b/helm/airbyte-v1/charts/worker/templates/deployment.yaml new file mode 100644 index 00000000..ad46daeb --- /dev/null +++ b/helm/airbyte-v1/charts/worker/templates/deployment.yaml @@ -0,0 +1,500 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-worker-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: CONFIG_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIG_ROOT + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: CONTAINER_ORCHESTRATOR_SECRET_MOUNT_PATH + value: "/secrets/gcs-log-creds" + - name: CONTAINER_ORCHESTRATOR_SECRET_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + {{- end }} + {{- include "airbyte.logging.envs" . | nindent 8 }} + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKSPACE_DOCKER_MOUNT + value: workspace + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: TEMPORAL_WORKER_PORTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_WORKER_PORTS + - name: JOB_KUBE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: JOB_KUBE_SERVICEACCOUNT + value: {{ .Values.global.serviceAccountName }} + {{- if $.Values.global.jobs.kube.annotations }} + - name: JOB_KUBE_ANNOTATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_ANNOTATIONS + {{- end }} + {{- if $.Values.global.jobs.kube.labels }} + - name: JOB_KUBE_LABELS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_LABELS + {{- end }} + {{- if $.Values.global.jobs.kube.nodeSelector }} + - name: JOB_KUBE_NODE_SELECTORS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_NODE_SELECTORS + {{- end }} + {{- if $.Values.global.jobs.kube.tolerations }} + - name: JOB_KUBE_TOLERATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_TOLERATIONS + {{- end }} + - name: JOB_KUBE_BUSYBOX_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_BUSYBOX_IMAGE + - name: JOB_KUBE_CURL_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_CURL_IMAGE + {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} + - name: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + {{- end }} + - name: JOB_MAIN_CONTAINER_CPU_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_REQUEST + - name: JOB_MAIN_CONTAINER_CPU_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_LIMIT + - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_REQUEST + - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_LIMIT + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: WORKLOAD_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_API_HOST + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: METRIC_CLIENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: METRIC_CLIENT + - name: OTEL_COLLECTOR_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OTEL_COLLECTOR_ENDPOINT + - name: ACTIVITY_MAX_ATTEMPT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_ATTEMPT + - name: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + - name: SHOULD_RUN_NOTIFY_WORKFLOWS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SHOULD_RUN_NOTIFY_WORKFLOWS + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKERS_MICRONAUT_ENVIRONMENTS + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just + # splitting into two separate blocks for readability. + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- end }} + # SECRETS MANAGER + - name: SECRET_PERSISTENCE + value: {{ include "airbyte.secretPersistence" . }} + # Values for awsSecretManager + {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} + - name: AWS_SECRET_MANAGER_REGION + value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} + {{- end }} + + {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} + - name: AWS_SECRET_MANAGER_SECRET_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} + - name: AWS_KMS_KEY_ARN + value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} + {{- end }} + + # Values for Azure Key Vault + {{- if (((.Values.global).secretsManager).azureKeyVault) }} + + - name: AB_AZURE_KEY_VAULT_VAULT_URL + value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} + + - name: AB_AZURE_KEY_VAULT_TENANT_ID + value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + {{- end }} + + {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} + - name: AB_AZURE_KEY_VAULT_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} + {{- end }} + + # Values for googleSecretManager secrets + {{- if (((.Values.global).secretsManager).googleSecretManager) }} + - name: SECRET_STORE_GCP_PROJECT_ID + value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} + - name: SECRET_STORE_GCP_CREDENTIALS + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + {{- end }} + + # Values for vault secrets + {{- if (((.Values.global).secretsManager).vault) }} + - name: VAULT_ADDRESS + value: {{ (((.Values.global).secretsManager).vault).address }} + - name: VAULT_PREFIX + value: {{ (((.Values.global).secretsManager).vault).prefix }} + - name: VAULT_AUTH_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + {{- end }} + + # Storage + {{- include "airbyte.storage.envs" . | nindent 8 }} + + # Database + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: worker-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compatibility (if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: / + port: heartbeat + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: / + port: heartbeat + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + - name: heartbeat + containerPort: 9000 # for heartbeat server + - containerPort: 9001 # start temporal worker port pool + - containerPort: 9002 + - containerPort: 9003 + - containerPort: 9004 + - containerPort: 9005 + - containerPort: 9006 + - containerPort: 9007 + - containerPort: 9008 + - containerPort: 9009 + - containerPort: 9010 + - containerPort: 9011 + - containerPort: 9012 + - containerPort: 9013 + - containerPort: 9014 + - containerPort: 9015 + - containerPort: 9016 + - containerPort: 9017 + - containerPort: 9018 + - containerPort: 9019 + - containerPort: 9020 + - containerPort: 9021 + - containerPort: 9022 + - containerPort: 9023 + - containerPort: 9024 + - containerPort: 9025 + - containerPort: 9026 + - containerPort: 9027 + - containerPort: 9028 + - containerPort: 9029 + - containerPort: 9030 # end temporal worker port pool + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + mountPath: /storage + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} +{{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} +{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + persistentVolumeClaim: + claimName: airbyte-storage-pvc + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + {{- if .Values.extraVolumes }} +{{- toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} +{{- toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/worker/templates/secrets.yaml b/helm/airbyte-v1/charts/worker/templates/secrets.yaml new file mode 100644 index 00000000..93bb0c63 --- /dev/null +++ b/helm/airbyte-v1/charts/worker/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: worker-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/worker/values.yaml b/helm/airbyte-v1/charts/worker/values.yaml new file mode 100644 index 00000000..b05d279e --- /dev/null +++ b/helm/airbyte-v1/charts/worker/values.yaml @@ -0,0 +1,294 @@ +global: + serviceAccountName: &service-account-name "airbyte-admin" + edition: community + credVolumeOverride: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + storage: + type: minio + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + jobs: + ## Jobs resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## jobs.resources.limits [object] The resources limits for jobs + ## jobs.resources.requests [object] The requested resources for jobs + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + + kube: + ## JOB_KUBE_ANNOTATIONS + ## pod annotations of the sync job and the default pod annotations fallback for others jobs + ## jobs.kube.annotations [object] key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + ## jobs.kube.labels [object] key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## any boolean values should be quoted to ensure the value is passed through as a string, eg: + ## - key: airbyte-server + ## operator: Equal + ## value: "true" + ## effect: NoSchedule + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + ## image pull secret to use for job pod + ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod + main_container_image_pull_secret: "" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + ## busybox image used by the job pod + ## jobs.kube.images.busybox [string] busybox image used by the job pod + busybox: "" + ## JOB_KUBE_CURL_IMAGE + ## curl image used by the job pod + ## jobs.kube.images.curl [string] curl image used by the job pod + curl: "" + +enabled: true +## worker.replicaCount Number of worker replicas +replicaCount: 1 + +## worker.image.repository The repository to use for the airbyte worker image. +## worker.image.pullPolicy the pull policy to use for the airbyte worker image +## worker.image.tag The airbyte worker image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/worker + pullPolicy: IfNotPresent + +## worker.podAnnotations [object] Add extra annotations to the worker pod(s) +## +podAnnotations: {} + +## worker.podLabels [object] Add extra labels to the worker pod(s) +## +podLabels: {} + +## worker.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the worker containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## worker.livenessProbe.enabled Enable livenessProbe on the worker +## worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## worker.livenessProbe.periodSeconds Period seconds for livenessProbe +## worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## worker.livenessProbe.failureThreshold Failure threshold for livenessProbe +## worker.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 50 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## worker.readinessProbe.enabled Enable readinessProbe on the worker +## worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## worker.readinessProbe.periodSeconds Period seconds for readinessProbe +## worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## worker.readinessProbe.failureThreshold Failure threshold for readinessProbe +## worker.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## worker resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## worker.resources.limits [object] The resources limits for the worker container +## worker.resources.requests [object] The requested resources for the worker container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## worker.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## worker.tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## worker.affinity [object] Affinity and anti-affinity for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## worker.log.level The log level to log at. +log: + level: "INFO" + + + +## worker.extraVolumeMounts [array] Additional volumeMounts for worker container(s). +## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## worker.extraVolumes [array] Additional volumes for worker pod(s). +## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +# - name: API_URL +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: API_URL +# - name: TRACKING_STRATEGY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: TRACKING_STRATEGY +# - name: FULLSTORY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: FULLSTORY +# - name: INTERNAL_API_HOST +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: INTERNAL_API_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default values for worker: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# DATABASE_DB: airbyte +# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 +# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 +env_vars: + CONTAINER_ORCHESTRATOR_ENABLED: true + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/workload-api-server/.gitignore b/helm/airbyte-v1/charts/workload-api-server/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/helm/airbyte-v1/charts/workload-api-server/Chart.lock b/helm/airbyte-v1/charts/workload-api-server/Chart.lock new file mode 100644 index 00000000..d174ec61 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2023-11-02T09:27:52.217541-07:00" diff --git a/helm/airbyte-v1/charts/workload-api-server/Chart.yaml b/helm/airbyte-v1/charts/workload-api-server/Chart.yaml new file mode 100644 index 00000000..3c5cbd86 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy the workload-api service +name: workload-api-server +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/workload-api-server/README.md b/helm/airbyte-v1/charts/workload-api-server/README.md new file mode 100644 index 00000000..7c1e72e6 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/README.md @@ -0,0 +1,85 @@ +# workload-api-server + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy the workload-api service + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `false` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.logs.accessKey.existingSecret | string | `""` | | +| global.logs.accessKey.existingSecretKey | string | `""` | | +| global.logs.accessKey.password | string | `"minio"` | | +| global.logs.gcs.bucket | string | `""` | | +| global.logs.gcs.credentials | string | `""` | | +| global.logs.gcs.credentialsJson | string | `""` | | +| global.logs.minio.enabled | bool | `true` | | +| global.logs.s3.bucket | string | `"airbyte-dev-logs"` | | +| global.logs.s3.bucketRegion | string | `""` | | +| global.logs.s3.enabled | bool | `false` | | +| global.logs.secretKey.existingSecret | string | `""` | | +| global.logs.secretKey.existingSecretKey | string | `""` | | +| global.logs.secretKey.password | string | `"minio123"` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/workload-api-server"` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts | list | `[]` | | +| ingress.tls | list | `[]` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `60` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `30` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `8007` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/helm/airbyte-v1/charts/workload-api-server/templates/_helpers.tpl b/helm/airbyte-v1/charts/workload-api-server/templates/_helpers.tpl new file mode 100644 index 00000000..847ec7b4 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} diff --git a/helm/airbyte-v1/charts/workload-api-server/templates/_images.tpl b/helm/airbyte-v1/charts/workload-api-server/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/workload-api-server/templates/deployment.yaml b/helm/airbyte-v1/charts/workload-api-server/templates/deployment.yaml new file mode 100644 index 00000000..9eb4fcdd --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/templates/deployment.yaml @@ -0,0 +1,208 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + minReadySeconds: 30 + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 0 + maxSurge: 100% + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-workload-api-server-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: AIRBYTE_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_API_HOST + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + # Database + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: workload-api-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /health/liveness + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /health/liveness + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + + ports: + - name: http + containerPort: 8007 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} +{{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} +{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + {{- if .Values.extraVolumes }} + {{- toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} + {{- toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/workload-api-server/templates/secrets.yaml b/helm/airbyte-v1/charts/workload-api-server/templates/secrets.yaml new file mode 100644 index 00000000..03e6f309 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment + {{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: workload-api-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/helm/airbyte-v1/charts/workload-api-server/templates/service.yaml b/helm/airbyte-v1/charts/workload-api-server/templates/service.yaml new file mode 100644 index 00000000..7319b2e2 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/templates/service.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-workload-api-server-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/workload-api-server/values.yaml b/helm/airbyte-v1/charts/workload-api-server/values.yaml new file mode 100644 index 00000000..2c378abc --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/values.yaml @@ -0,0 +1,281 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + edition: community + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + logs: + ## logs.accessKey.password Logs Access Key + ## logs.accessKey.existingSecret + ## logs.accessKey.existingSecretKey + accessKey: + password: minio + existingSecret: "" + existingSecretKey: "" + ## logs.secretKey.password Logs Secret Key + ## logs.secretKey.existingSecret + ## logs.secretKey.existingSecretKey + secretKey: + password: minio123 + existingSecret: "" + existingSecretKey: "" + + ## logs.minio.enabled Switch to enable or disable the Minio helm chart + minio: + enabled: true + + ## logs.s3.enabled Switch to enable or disable custom S3 Log location + ## logs.s3.bucket Bucket name where logs should be stored + ## logs.s3.bucketRegion Region of the bucket (must be empty if using minio) + s3: + enabled: false + bucket: airbyte-dev-logs + bucketRegion: "" + + ## Google Cloud Storage (GCS) Log Location Configuration + ## logs.gcs.bucket GCS bucket name + ## logs.gcs.credentials The path the GCS creds are written to + ## logs.gcs.credentialsJson Base64 encoded json GCP credentials file contents + gcs: + bucket: "" + # If you are mounting an existing secret to extraVolumes on scheduler, server and worker + # deployments, then set credentials to the path of the mounted JSON file + credentials: "" + # If credentialsJson is set then credentials auto resolves (to /secrets/gcs-log-creds/gcp.json) + credentialsJson: "" + +enabled: true +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte workload api server image. +## image.pullPolicy the pull policy to use for the airbyte workload api server image +## image.tag The airbyte workload api server image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/workload-api-server + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the server pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: ClusterIP + port: 8007 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## Configure the ingress resource that allows you to access the Airbyte API. +## ref: http://kubernetes.io/docs/user-guide/ingress/ +## webapp.ingress.enabled Set to true to enable ingress record generation +## webapp.ingress.className Specifies ingressClassName for clusters >= 1.18+ +## webapp.ingress.annotations [object] Ingress annotations done as key:value pairs +## webapp.ingress.hosts The list of hostnames to be covered with this ingress record. +## webapp.ingress.tls [array] Custom ingress TLS configuration +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: [] + # - host: chart-example.local + # paths: + # - path: / + # pathType: ImplementationSpecific + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# DATABASE_DB: airbyte +# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 +# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 +env_vars: {} + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/workload-launcher/.helmignore b/helm/airbyte-v1/charts/workload-launcher/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/airbyte-v1/charts/workload-launcher/Chart.lock b/helm/airbyte-v1/charts/workload-launcher/Chart.lock new file mode 100644 index 00000000..19ec138f --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-11-07T16:44:30.742568346Z" diff --git a/helm/airbyte-v1/charts/workload-launcher/Chart.yaml b/helm/airbyte-v1/charts/workload-launcher/Chart.yaml new file mode 100644 index 00000000..64d70b66 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-workload-launcher +name: workload-launcher +type: application +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/workload-launcher/README.md b/helm/airbyte-v1/charts/workload-launcher/README.md new file mode 100644 index 00000000..d636166f --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/README.md @@ -0,0 +1,71 @@ +# workload-launcher + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-workload-launcher + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `false` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.jobs.kube.annotations | object | `{}` | | +| global.jobs.kube.images.busybox | string | `""` | | +| global.jobs.kube.images.curl | string | `""` | | +| global.jobs.kube.labels | object | `{}` | | +| global.jobs.kube.main_container_image_pull_secret | string | `""` | | +| global.jobs.kube.nodeSelector | object | `{}` | | +| global.jobs.kube.tolerations | list | `[]` | | +| global.jobs.resources.limits | object | `{}` | | +| global.jobs.resources.requests | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/workload-launcher"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `50` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/.helmignore b/helm/airbyte-v1/charts/workload-launcher/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/Chart.yaml b/helm/airbyte-v1/charts/workload-launcher/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/README.md b/helm/airbyte-v1/charts/workload-launcher/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_affinities.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_capabilities.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_errors.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_images.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_ingress.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_labels.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_names.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_secrets.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_storage.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_tplvalues.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_utils.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_warnings.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_redis.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_validations.tpl b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/charts/common/values.yaml b/helm/airbyte-v1/charts/workload-launcher/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/helm/airbyte-v1/charts/workload-launcher/templates/_helpers.tpl b/helm/airbyte-v1/charts/workload-launcher/templates/_helpers.tpl new file mode 100644 index 00000000..933c125b --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/templates/_helpers.tpl @@ -0,0 +1,258 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get azureKeyVault clientId or default +*/}} +{{- define "airbyte.azureKeyVaultClientIdSecretKey" -}} +{{- $azureKeyVaultClientIdSecretKey := . -}} +{{- if $azureKeyVaultClientIdSecretKey -}} + {{- printf "%s" $azureKeyVaultClientIdSecretKey -}} +{{- else -}} + {{- printf "azure-key-vault-client-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get azureKeyVault clientSecret or default +*/}} +{{- define "airbyte.azureKeyVaultClientSecretSecretKey" -}} +{{- $azureKeyVaultClientSecretSecretKey := . -}} +{{- if $azureKeyVaultClientSecretSecretKey -}} + {{- printf "%s" $azureKeyVaultClientSecretSecretKey -}} +{{- else -}} + {{- printf "azure-key-vault-client-secret" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} diff --git a/helm/airbyte-v1/charts/workload-launcher/templates/_images.tpl b/helm/airbyte-v1/charts/workload-launcher/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml b/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml new file mode 100644 index 00000000..ce0dfa93 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml @@ -0,0 +1,557 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: Recreate + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-workload-launcher-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: DATA_PLANE_ID + value: "local" + - name: PUB_SUB_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: PUB_SUB_ENABLED + - name: PUB_SUB_TOPIC_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: PUB_SUB_TOPIC_NAME + - name: CONFIG_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIG_ROOT + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: CONTAINER_ORCHESTRATOR_SECRET_MOUNT_PATH + value: "/secrets/gcs-log-creds" + - name: CONTAINER_ORCHESTRATOR_SECRET_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + {{- end }} + + {{- include "airbyte.database.envs" . | nindent 8 }} + {{- include "airbyte.logging.envs" . | nindent 8 }} + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKSPACE_DOCKER_MOUNT + value: workspace + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: WORKLOAD_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_API_HOST + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: TEMPORAL_WORKER_PORTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_WORKER_PORTS + - name: JOB_KUBE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: JOB_KUBE_SERVICEACCOUNT + value: {{ .Values.global.serviceAccountName }} + {{- if $.Values.global.jobs.kube.annotations }} + - name: JOB_KUBE_ANNOTATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_ANNOTATIONS + {{- end }} + {{- if $.Values.global.jobs.kube.labels }} + - name: JOB_KUBE_LABELS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_LABELS + {{- end }} + {{- if $.Values.global.jobs.kube.nodeSelector }} + - name: JOB_KUBE_NODE_SELECTORS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_NODE_SELECTORS + {{- end }} + {{- if $.Values.global.jobs.kube.tolerations }} + - name: JOB_KUBE_TOLERATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_TOLERATIONS + {{- end }} + - name: CONNECTOR_SIDECAR_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_SIDECAR_IMAGE + - name: WORKLOAD_INIT_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_INIT_IMAGE + - name: CONTAINER_ORCHESTRATOR_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONTAINER_ORCHESTRATOR_IMAGE + - name: JOB_KUBE_BUSYBOX_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_BUSYBOX_IMAGE + - name: JOB_KUBE_CURL_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_CURL_IMAGE + {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} + - name: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + {{- end }} + - name: JOB_MAIN_CONTAINER_CPU_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_REQUEST + - name: JOB_MAIN_CONTAINER_CPU_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_LIMIT + - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_REQUEST + - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_LIMIT + - name: JOB_KUBE_LOCAL_VOLUME_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_LOCAL_VOLUME_ENABLED + - name: KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: WORKLOAD_API_BEARER_TOKEN_SECRET_NAME + value: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + - name: WORKLOAD_API_BEARER_TOKEN_SECRET_KEY + value: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: METRIC_CLIENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: METRIC_CLIENT + - name: OTEL_COLLECTOR_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OTEL_COLLECTOR_ENDPOINT + - name: ACTIVITY_MAX_ATTEMPT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_ATTEMPT + - name: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + - name: SHOULD_RUN_NOTIFY_WORKFLOWS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SHOULD_RUN_NOTIFY_WORKFLOWS + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: LAUNCHER_MICRONAUT_ENVIRONMENTS + - name: WORKLOAD_LAUNCHER_PARALLELISM + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_LAUNCHER_PARALLELISM + - name: FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT + - name: FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just + # splitting into two separate blocks for readability. + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- end }} + + # SECRETS MANAGER + - name: SECRET_PERSISTENCE + value: {{ include "airbyte.secretPersistence" . }} + # Values for AwsSecretsManager + {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID_REF_KEY + value: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY_REF_KEY + value: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} + - name: AWS_SECRET_MANAGER_REGION + value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} + {{- end }} + + {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} + - name: AWS_SECRET_MANAGER_SECRET_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} + - name: AWS_KMS_KEY_ARN + value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} + {{- end }} + + # Values for Azure Key Vault + {{- if (((.Values.global).secretsManager).azureKeyVault) }} + + - name: AB_AZURE_KEY_VAULT_VAULT_URL + value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} + + - name: AB_AZURE_KEY_VAULT_TENANT_ID + value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AB_AZURE_KEY_VAULT_CLIENT_ID_REF_REF_KEY + value: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET_REF_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET_REF_REF_KEY + value: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + {{- end }} + + {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} + - name: AB_AZURE_KEY_VAULT_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} + {{- end }} + + # Values for googleSecretManager secrets + {{- if (((.Values.global).secretsManager).googleSecretManager) }} + - name: SECRET_STORE_GCP_PROJECT_ID + value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} + - name: SECRET_STORE_GCP_CREDENTIALS + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + - name: SECRET_STORE_GCP_SECRET_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: SECRET_STORE_GCP_SECRET_KEY + value: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + {{- end }} + + # Values for vault secrets + {{- if (((.Values.global).secretsManager).vault) }} + - name: VAULT_ADDRESS + value: {{ (((.Values.global).secretsManager).vault).address }} + - name: VAULT_PREFIX + value: {{ (((.Values.global).secretsManager).vault).prefix }} + - name: VAULT_AUTH_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + - name: VAULT_AUTH_TOKEN_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: VAULT_AUTH_TOKEN_REF_KEY + value: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + {{- end }} + + # Storage + {{- include "airbyte.storage.envs" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: workload-launcher-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /health/liveness + port: heartbeat + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /health/readiness + port: heartbeat + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + - name: heartbeat + containerPort: 8016 # for heartbeat server + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + mountPath: /storage + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} +{{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} +{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + persistentVolumeClaim: + claimName: airbyte-storage-pvc + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + {{- if .Values.extraVolumes }} +{{- toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} +{{- toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/helm/airbyte-v1/charts/workload-launcher/templates/jobs-secrets.yaml b/helm/airbyte-v1/charts/workload-launcher/templates/jobs-secrets.yaml new file mode 100644 index 00000000..c49cec64 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/templates/jobs-secrets.yaml @@ -0,0 +1,18 @@ +# Create dataplane secrets only for the local deployment + {{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: workload-launcher-secrets + namespace: {{ .Values.jobs_namespace }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/helm/airbyte-v1/charts/workload-launcher/templates/secrets.yaml b/helm/airbyte-v1/charts/workload-launcher/templates/secrets.yaml new file mode 100644 index 00000000..c72f6bfe --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: workload-launcher-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/helm/airbyte-v1/charts/workload-launcher/values.yaml b/helm/airbyte-v1/charts/workload-launcher/values.yaml new file mode 100644 index 00000000..486760a5 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/values.yaml @@ -0,0 +1,294 @@ +global: + + serviceAccountName: &service-account-name "airbyte-admin" + edition: community + credVolumeOverride: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + storage: + type: minio + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + jobs: + ## Jobs resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## jobs.resources.limits [object] The resources limits for jobs + ## jobs.resources.requests [object] The requested resources for jobs + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + + kube: + ## JOB_KUBE_ANNOTATIONS + ## pod annotations of the sync job and the default pod annotations fallback for others jobs + ## jobs.kube.annotations [object] key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + ## jobs.kube.labels [object] key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## any boolean values should be quoted to ensure the value is passed through as a string, eg: + ## - key: airbyte-server + ## operator: Equal + ## value: "true" + ## effect: NoSchedule + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + ## image pull secret to use for job pod + ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod + main_container_image_pull_secret: "" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + ## busybox image used by the job pod + ## jobs.kube.images.busybox [string] busybox image used by the job pod + busybox: "" + ## JOB_KUBE_CURL_IMAGE + ## curl image used by the job pod + ## jobs.kube.images.curl [string] curl image used by the job pod + curl: "" + +enabled: true +## workload-launcher.replicaCount Number of workload launcher replicas +replicaCount: 1 + +## workload-launcher.image.repository The repository to use for the airbyte workload launcher image. +## workload-launcher.image.pullPolicy the pull policy to use for the airbyte workload launcher image +## workload-launcher.image.tag The airbyte workload launcher image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/workload-launcher + pullPolicy: IfNotPresent + +## workload-launcher.podAnnotations [object] Add extra annotations to the workload launcher pod(s) +## +podAnnotations: {} + +## workload-launcher.podLabels [object] Add extra labels to the workload launcher pod(s) +## +podLabels: {} + +## workload-launcher.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the workload launcher containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## workload-launcher.livenessProbe.enabled Enable livenessProbe on the workload launcher +## workload-launcher.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## workload-launcher.livenessProbe.periodSeconds Period seconds for livenessProbe +## workload-launcher.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## workload-launcher.livenessProbe.failureThreshold Failure threshold for livenessProbe +## workload-launcher.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 50 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## workload-launcher.readinessProbe.enabled Enable readinessProbe on the workload launcher +## workload-launcher.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## workload-launcher.readinessProbe.periodSeconds Period seconds for readinessProbe +## workload-launcher.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## workload-launcher.readinessProbe.failureThreshold Failure threshold for readinessProbe +## workload-launcher.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## workload launcher resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## workload-launcher.resources.limits [object] The resources limits for the workload launcher container +## workload-launcher.resources.requests [object] The requested resources for the workload launcher container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## workload-launcher.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## workload-launcher.tolerations [array] Tolerations for workload launcher pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## workload-launcher.affinity [object] Affinity and anti-affinity for workload launcher pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## workload-launcher.log.level The log level to log at. +log: + level: "INFO" + + + +## workload-launcher.extraVolumeMounts [array] Additional volumeMounts for workload launcher container(s). +## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## workload-launcher.extraVolumes [array] Additional volumes for workload launcher pod(s). +## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +# - name: API_URL +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: API_URL +# - name: TRACKING_STRATEGY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: TRACKING_STRATEGY +# - name: FULLSTORY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: FULLSTORY +# - name: INTERNAL_API_HOST +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: INTERNAL_API_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default values for workload launcher: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Workspace storage for running jobs (logs, etc) +# WORKSPACE_ROOT: /workspace +# WORKSPACE_DOCKER_MOUNT: airbyte_workspace + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# WEBAPP_URL: airbyte-webapp-svc:80 +# INTERNAL_API_HOST: http://airbyte-server-svc:8001 +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/templates/NOTES.txt b/helm/airbyte-v1/templates/NOTES.txt new file mode 100644 index 00000000..6487ae65 --- /dev/null +++ b/helm/airbyte-v1/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.webapp.ingress.enabled }} +{{- range $host := .Values.webapp.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.webapp.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.webapp.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "airbyte.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.webapp.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "airbyte.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "airbyte.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.webapp.service.port }} +{{- else if contains "ClusterIP" .Values.webapp.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name=webapp" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/helm/airbyte-v1/templates/_database.tpl b/helm/airbyte-v1/templates/_database.tpl new file mode 100644 index 00000000..fd0e5ef8 --- /dev/null +++ b/helm/airbyte-v1/templates/_database.tpl @@ -0,0 +1,234 @@ +{{/* +Database Configuration +*/}} + +{{/* +Renders the database host +*/}} +{{- define "airbyte.database.host" }} + {{- if .Values.postgresql.enabled }} + {{- printf "%s" "airbyte-db-svc" }} + {{- else if .Values.global.database.host }} + {{- .Values.global.database.host }} + {{- else }} + {{ $host := .Values.global.database.host | required "You must set `global.database.host` when using an external database" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database host +*/}} +{{- define "airbyte.database.host.env" }} +- name: DATABASE_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_HOST +{{- end }} + +{{/* +Renders the database port +*/}} +{{- define "airbyte.database.port" }} + {{- if .Values.postgresql.enabled }} + {{- printf "%s" "5432" }} + {{- else if .Values.global.database.port }} + {{- .Values.global.database.port }} + {{- else }} + {{ $port := .Values.global.database.port | required "You must set `global.database.port` when using an external database" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database port +*/}} +{{- define "airbyte.database.port.env" }} +- name: DATABASE_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_PORT +{{- end }} + +{{/* +Renders the database name +*/}} +{{- define "airbyte.database.name" }} + {{- if .Values.postgresql.enabled }} + {{- .Values.postgresql.postgresqlDatabase }} + {{- else if .Values.global.database.database }} + {{- .Values.global.database.database }} + {{- else }} + {{ $database := .Values.global.database.database | required "You must set `global.database.database` when using an external database" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database name +*/}} +{{- define "airbyte.database.name.env" }} +- name: DATABASE_DB + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_DB +{{- end }} + +{{/* +Renders the database user +*/}} +{{- define "airbyte.database.user" }} + {{- if .Values.postgresql.enabled }} + {{- .Values.postgresql.postgresqlUsername }} + {{- else if .Values.global.database.user }} + {{- .Values.global.database.user }} + {{- else }} + {{- if .Values.global.database.userSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- else }} + {{ $user := .Values.global.database.user | required "You must set `global.database.user` when using an external database" }} + {{- end }} + {{- end }} +{{- end }} + +{{/* +Renders the name of the secret where the database user will be referenced +*/}} +{{- define "airbyte.database.userSecretKey" }} + {{- if .Values.global.database.userSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- .Values.global.database.userSecretKey }} + {{- else }} + {{- printf "%s" "DATABASE_USER" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database user +*/}} +{{- define "airbyte.database.user.env" }} +- name: DATABASE_USER + valueFrom: + secretKeyRef: + {{- if .Values.global.database.userSecretKey }} + name: {{ .Values.global.database.secretName }} + {{- else }} + name: {{ .Release.Name }}-airbyte-secrets + {{- end }} + key: {{ include "airbyte.database.userSecretKey" .}} +{{- end }} + +{{/* +Renders the database password +*/}} +{{- define "airbyte.database.password" }} + {{- if .Values.postgresql.enabled }} + {{- .Values.postgresql.postgresqlPassword }} + {{- else if .Values.global.database.password }} + {{- .Values.global.database.password }} + {{- else }} + {{- if .Values.global.database.passwordSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- else }} + {{ $password := .Values.global.database.password | required "You must set `global.database.password` when using an external database" }} + {{- end }} + {{- end }} +{{- end }} + +{{/* +Renders the name of the secret where the database password will be referenced +*/}} +{{- define "airbyte.database.passwordSecretKey" }} + {{- if .Values.global.database.passwordSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- .Values.global.database.passwordSecretKey }} + {{- else }} + {{- printf "%s" "DATABASE_PASSWORD" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database password +*/}} +{{- define "airbyte.database.password.env" }} +- name: DATABASE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ include "airbyte.database.passwordSecretKey" . }} +{{- end }} + + +{{/* +Renders the database url (JDBC) +*/}} +{{- define "airbyte.database.url" }} +{{- $host := (include "airbyte.database.host" .) }} +{{- $dbName := (include "airbyte.database.name" .) }} +{{- $port := (include "airbyte.database.port" . ) }} +{{- printf "jdbc:postgresql://%s:%s/%s" $host $port $dbName }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database url (JDBC) +*/}} +{{- define "airbyte.database.url.env" }} +- name: DATABASE_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_URL +{{- end }} + +{{/* +Renders the name of the secret containing database credentials +*/}} +{{- define "airbyte.database.secretName" }} + {{- if .Values.global.database.secretName }} + {{- .Values.global.database.secretName | quote }} + {{- else }} + {{ .Release.Name }}-airbyte-secrets + {{- end }} +{{- end }} + +{{/* +Renders all of the common environment variables which provide database credentials +*/}} +{{- define "airbyte.database.envs" }} +{{ include "airbyte.database.host.env" . }} +{{ include "airbyte.database.port.env" . }} +{{ include "airbyte.database.name.env" . }} +{{ include "airbyte.database.user.env" . }} +{{ include "airbyte.database.password.env" . }} +{{ include "airbyte.database.url.env" . }} +{{- end }} + +{{/* +Renders a set of database secrets to be included in the shared Airbyte secret +*/}} +{{- define "airbyte.database.secrets" }} +{{ $user := (include "airbyte.database.user" .)}} +{{- if not (empty $user) }} +DATABASE_USER: {{ $user }} +{{- end }} +{{ $password := (include "airbyte.database.password" .)}} +{{- if not (empty $password) }} +DATABASE_PASSWORD: {{ $password }} +{{- end}} +{{- end }} + +{{/* +Renders a set of database configuration variables to be included in the shared Airbyte config map +*/}} +{{- define "airbyte.database.configVars" }} +DATABASE_HOST: {{ include "airbyte.database.host" . }} +DATABASE_PORT: {{ include "airbyte.database.port" . | quote }} +DATABASE_DB: {{ include "airbyte.database.name" . }} +DATABASE_URL: {{ include "airbyte.database.url" . }} +{{- if .Values.global.database.user }} +DATABASE_USER: {{ include "airbyte.database.user" . }} +{{- end}} +{{- if .Values.global.database.password }} +DATABASE_PASSWORD: {{ include "airbyte.database.password" . }} +{{- end}} +{{- end }} diff --git a/helm/airbyte-v1/templates/_enterprise.tpl b/helm/airbyte-v1/templates/_enterprise.tpl new file mode 100644 index 00000000..8e74d5aa --- /dev/null +++ b/helm/airbyte-v1/templates/_enterprise.tpl @@ -0,0 +1,83 @@ +{{/* +Enteprise Configuration +*/}} + +{{- define "airbyte.enterprise.license" -}} +{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) }} +{{- $secretName := .Values.global.enterprise.secretName | required "You must set `global.enterprise.secretName` when `global.edition` is 'enterprise'" }} +{{- $secretKey := .Values.global.enterprise.licenseKeySecretKey | required "You must set `global.enterprise.licenseKeySecretKey` when `global.edition` is 'enterprise'" }} +- name: AIRBYTE_LICENSE_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.global.enterprise.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.enterprise.licenseKeySecretKey }} +{{- end }} +{{- end }} + +{{- define "airbyte.enterprise.instanceAdmin" -}} +{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) }} +{{- $auth := .Values.global.auth | required "You must set `global.auth` when `global.edition` is 'enterprise'"}} +{{- $authInstanceAdminSecretName := .Values.global.auth.instanceAdmin.secretName | required "You must set `global.auth.instanceAdmin.secretName` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminFirstName := .Values.global.auth.instanceAdmin.firstName | required "You must set `global.auth.instanceAdmin.firstName` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminLastName := .Values.global.auth.instanceAdmin.lastName | required "You must set `global.auth.instanceAdmin.lastName` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminEmailSecretKey := .Values.global.auth.instanceAdmin.emailSecretKey | required "You must set `global.auth.instanceAdmin.emailSecretKey` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminPasswordSecretKey := .Values.global.auth.instanceAdmin.passwordSecretKey | required "You must set `global.auth.instanceAdmin.passwordSecretKey` when `global.edition` is 'enterprise'" }} +- name: INITIAL_USER_FIRST_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INITIAL_USER_FIRST_NAME +- name: INITIAL_USER_LAST_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INITIAL_USER_LAST_NAME +- name: INITIAL_USER_EMAIL + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.instanceAdmin.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.instanceAdmin.emailSecretKey }} +- name: INITIAL_USER_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.instanceAdmin.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.instanceAdmin.passwordSecretKey }} +{{- end }} +{{- end }} + +{{- define "airbyte.enterprise.identityProvider" -}} +{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) .Values.global.auth.identityProvider }} +{{- $authIdentityProviderSecretName := .Values.global.auth.identityProvider.secretName | required "You must set `global.auth.identityProvider.secretName` when enabling SSO" }} +{{- $authIdentityProviderType := .Values.global.auth.identityProvider.type | required "You must set `global.auth.identityProvider.type` when enabling SSO "}} +{{- $authIdentityProviderOIDC := .Values.global.auth.identityProvider.oidc | required "You must set `global.auth.identityProvider.oidc` when enabling SSO" }} +{{- $authIdentityProviderOIDCDomain := .Values.global.auth.identityProvider.oidc.domain | required "You must set `global.auth.identityProvider.oidc.domain` when enabling SSO" }} +{{- $authIdentityProviderOIDCAppName := .Values.global.auth.identityProvider.oidc.appName | required "You must set `global.auth.identityProvider.oidc.appName` when enabling SSO" }} +{{- $authIdentityProviderOIDCClientIdSecretKey := .Values.global.auth.identityProvider.oidc.clientIdSecretKey | required "You must set `global.auth.identityProvider.oidc.clientIdSecretKey` when enabling SSO" }} +{{- $authIdentityProviderOIDCClientSecretSecretKey := .Values.global.auth.identityProvider.oidc.clientSecretSecretKey | required "You must set `global.auth.identityProvider.oidc.clientSecretSecretKey` when enabling SSO" }} +- name: IDENTITY_PROVIDER_TYPE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: IDENTITY_PROVIDER_TYPE +- name: OIDC_DOMAIN + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OIDC_DOMAIN +- name: OIDC_APP_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OIDC_APP_NAME +- name: OIDC_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.identityProvider.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.identityProvider.oidc.clientIdSecretKey }} +- name: OIDC_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.identityProvider.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.identityProvider.oidc.clientSecretSecretKey }} +{{- end }} +{{- end }} diff --git a/helm/airbyte-v1/templates/_helpers.tpl b/helm/airbyte-v1/templates/_helpers.tpl new file mode 100644 index 00000000..d99db7f4 --- /dev/null +++ b/helm/airbyte-v1/templates/_helpers.tpl @@ -0,0 +1,350 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + + +{{/* +Common DB labels +*/}} +{{- define "airbyte.databaseLabels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.databaseSelectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector DB labels +*/}} +{{- define "airbyte.databaseSelectorLabels" -}} +app.kubernetes.io/name: {{ printf "%s-db" .Release.Name }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Common DB labels +*/}} +{{- define "airbyte.minioLabels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.minioSelectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector DB labels +*/}} +{{- define "airbyte.minioSelectorLabels" -}} +app.kubernetes.io/name: {{ printf "%s-minio" .Release.Name }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "airbyte.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "airbyte.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Add environment variables to configure minio +*/}} +{{- define "airbyte.storage.minio.endpoint" -}} +{{- if ((((.Values.global).storage).minio).endpoint) }} + {{- .Values.global.storage.minio.endpoint -}} +{{- else -}} + {{- printf "http://airbyte-minio-svc:9000" -}} +{{- end -}} +{{- end -}} + +{{- define "airbyte.s3PathStyleAccess" -}} +{{- ternary "true" "" (eq (lower (default "" .Values.global.storage.type)) "minio") -}} +{{- end -}} + +{{/* +Returns the GCP credentials path +*/}} +{{- define "airbyte.gcpLogCredentialsPath" -}} +{{- if ((((.Values.global).storage).gcs).credentialsPath) }} + {{- printf "%s" .Values.global.storage.gcs.credentialsPath -}} +{{- else -}} + {{- printf "%s" "/secrets/gcs-log-creds/gcp.json" -}} +{{- end -}} +{{- end -}} + +{{/* +Construct comma separated list of key/value pairs from object (useful for ENV var values) +*/}} +{{- define "airbyte.flattenMap" -}} +{{- $kvList := list -}} +{{- range $key, $value := . -}} +{{- $kvList = printf "%s=%s" $key $value | mustAppend $kvList -}} +{{- end -}} +{{ join "," $kvList }} +{{- end -}} + +{{/* +Construct semi-colon delimited list of comma separated key/value pairs from array of objects (useful for ENV var values) +*/}} +{{- define "airbyte.flattenArrayMap" -}} +{{- $mapList := list -}} +{{- range $element := . -}} +{{- $mapList = include "airbyte.flattenMap" $element | mustAppend $mapList -}} +{{- end -}} +{{ join ";" $mapList }} +{{- end -}} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Convert tags to a comma-separated list of key=value pairs. +*/}} +{{- define "airbyte.tagsToString" -}} +{{- $result := list -}} +{{- range . -}} + {{- $key := .key -}} + {{- $value := .value -}} + {{- if eq (typeOf $value) "bool" -}} + {{- $value = ternary "true" "false" $value -}} + {{- end -}} + {{- $result = append $result (printf "%s=%s" $key $value) -}} +{{- end -}} +{{- join "," $result -}} +{{- end -}} diff --git a/helm/airbyte-v1/templates/_images.tpl b/helm/airbyte-v1/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/helm/airbyte-v1/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/helm/airbyte-v1/templates/_keycloak.tpl b/helm/airbyte-v1/templates/_keycloak.tpl new file mode 100644 index 00000000..ac0545db --- /dev/null +++ b/helm/airbyte-v1/templates/_keycloak.tpl @@ -0,0 +1,44 @@ +{{/* +Keycloak Configuration +*/}} + +{{- define "airbyte.keycloak.database.user.env" }} +- name: KEYCLOAK_DATABASE_USERNAME + valueFrom: + secretKeyRef: + {{- if .Values.global.database.userSecretKey }} + name: {{ .Values.global.database.secretName }} + {{- else }} + name: {{ .Release.Name }}-airbyte-secrets + {{- end }} + key: {{ include "airbyte.database.userSecretKey" .}} +{{- end }} + +{{- define "airbyte.keycloak.database.password.env" }} +- name: KEYCLOAK_DATABASE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ include "airbyte.database.passwordSecretKey" . }} +{{- end }} + +{{- define "airbyte.keycloak.database.url" }} +{{ $host := (include "airbyte.database.host" .) }} +{{ $dbName := (include "airbyte.database.name" .) }} +{{ $port := (include "airbyte.database.port" . ) }} +{{- printf "jdbc:postgresql://%s:%s/%s?currentSchema=keycloak" $host $port $dbName }} +{{- end }} + +{{- define "airbyte.keycloak.database.url.env" }} +- name: KEYCLOAK_DATABASE_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_DATABASE_URL +{{- end }} + +{{- define "airbyte.keycloak.database.envs" }} +{{ include "airbyte.keycloak.database.user.env" . }} +{{ include "airbyte.keycloak.database.password.env" . }} +{{ include "airbyte.keycloak.database.url.env" . }} +{{- end }} diff --git a/helm/airbyte-v1/templates/_logging.tpl b/helm/airbyte-v1/templates/_logging.tpl new file mode 100644 index 00000000..f1382739 --- /dev/null +++ b/helm/airbyte-v1/templates/_logging.tpl @@ -0,0 +1,10 @@ +{{/* +Common logging configs +*/}} +{{- define "airbyte.logging.envs" }} +- name: LOG_LEVEL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: LOG_LEVEL +{{- end }} diff --git a/helm/airbyte-v1/templates/_storage.tpl b/helm/airbyte-v1/templates/_storage.tpl new file mode 100644 index 00000000..70819063 --- /dev/null +++ b/helm/airbyte-v1/templates/_storage.tpl @@ -0,0 +1,243 @@ +{{/* +Storage configs +*/}} + +{{/* +Returns the provider name +*/}} +{{- define "airbyte.storage.provider" }} +{{- if .Values.global.storage.type }} + {{- printf "%s" (lower .Values.global.storage.type) }} +{{- else }} + {{- printf "minio" }} +{{- end }} +{{- end }} + +{{/* +Returns the storage provider secret name +*/}} +{{- define "airbyte.storage.secretName" }} +{{- if .Values.global.storage.secretName }} + {{- printf "%s" .Values.global.storage.secretName }} +{{- else if .Values.global.storage.storageSecretName }} + {{- printf "%s" .Values.global.storage.storageSecretName }} +{{- else -}} + {{/* GCS has its own default secret we create */}} + {{- if eq (include "airbyte.storage.provider" .) "gcs" }} + {{- printf "%s-gcs-log-creds" .Release.Name }} + {{- else }} + {{- printf "%s-airbyte-secrets" .Release.Name }} + {{- end }} +{{- end }} +{{- end }} + +{{/* +Returns azure environment variables. +*/}} +{{- define "airbyte.storage.azure.envs" }} +{{- if .Values.global.storage.azure.connectionString }} +- name: AZURE_STORAGE_CONNECTION_STRING + value: {{ .Values.global.storage.azure.connectionString }} +{{- end }} +{{- if .Values.global.storage.azure.connectionStringSecretKey }} +- name: AZURE_STORAGE_CONNECTION_STRING + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.azure.connectionStringSecretKey }} +{{- end }} +{{- end }} + +{{/* +Returns azure secrets +*/}} +{{- define "airbyte.storage.azure.secrets" }} +{{- if .Values.global.storage.azure }} +AZURE_STORAGE_CONNECTION_STRING: {{ .Values.global.storage.azure.connectionString | default "" }} +{{- end }} +{{- end }} + +{{/* +Returns S3 environment variables. +*/}} +{{- define "airbyte.storage.s3.envs" }} +{{- if eq .Values.global.storage.s3.authenticationType "credentials" }} +- name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.s3.accessKeyIdSecretKey | default "s3-access-key-id" }} +- name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.s3.secretAccessKeySecretKey | default "s3-secret-access-key" }} +{{- end }} +{{- if .Values.global.storage.s3.region }} +- name: AWS_DEFAULT_REGION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AWS_DEFAULT_REGION +{{- end }} +{{- end}} + +{{/* +Returns S3 secrets +*/}} +{{- define "airbyte.storage.s3.secrets" }} +{{- if and (.Values.global.storage.s3) (eq .Values.global.storage.s3.authenticationType "credentials") }} +AWS_ACCESS_KEY_ID: {{ .Values.global.storage.s3.accessKeyId | default "" }} +AWS_SECRET_ACCESS_KEY: {{ .Values.global.storage.s3.secretAccessKey | default "" }} +{{- end }} +{{- end }} + +{{/* +Returns GCS environment variables. +*/}} +{{- define "airbyte.storage.gcs.envs" }} +- name: GOOGLE_APPLICATION_CREDENTIALS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: GOOGLE_APPLICATION_CREDENTIALS +{{- end}} + +{{/* +Returns GCS secrets. +*/}} +{{- define "airbyte.storage.gcs.secrets" }} +{{- if .Values.global.storage.gcs }} +gcp.json: {{ .Values.global.storage.gcs.credentialsJson }} +{{- end }} +{{- end}} + +{{/* +Returns Minio environment variables. +*/}} +{{- define "airbyte.storage.minio.envs" }} +{{- if .Values.global.storage.minio }} +- name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.minio.accessKeyIdSecretKey | default "MINIO_ACCESS_KEY_ID" }} +- name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.minio.secretAccessKeySecretKey | default "MINIO_SECRET_ACCESS_KEY" }} +{{- else }} +- name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: "MINIO_ACCESS_KEY_ID" +- name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: "MINIO_SECRET_ACCESS_KEY" +{{- end }} +- name: MINIO_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MINIO_ENDPOINT +{{- end }} + +{{- define "airbyte.storage.minio.secrets" }} +{{- if .Values.global.storage.minio }} +MINIO_ACCESS_KEY_ID: {{ .Values.global.storage.minio.accessKeyId | default "minio" | quote }} +MINIO_SECRET_ACCESS_KEY: {{ .Values.global.storage.minio.secretAccessKey | default "minio123" | quote }} +{{- else }} +MINIO_ACCESS_KEY_ID: "minio" +MINIO_SECRET_ACCESS_KEY: "minio123" +{{- end }} +{{- end }} + +{{/* +Returns storage config environment variables. +*/}} +{{- define "airbyte.storage.envs" }} +{{- $storageProvider := (include "airbyte.storage.provider" .) }} +- name: S3_PATH_STYLE_ACCESS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: S3_PATH_STYLE_ACCESS +- name: STORAGE_TYPE + value: {{ upper $storageProvider }} +- name: STORAGE_BUCKET_ACTIVITY_PAYLOAD + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_ACTIVITY_PAYLOAD +- name: STORAGE_BUCKET_LOG + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_LOG +- name: STORAGE_BUCKET_STATE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_STATE +- name: STORAGE_BUCKET_WORKLOAD_OUTPUT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_WORKLOAD_OUTPUT +{{/* S3 */}} +{{- if eq $storageProvider "s3" }} +{{- include "airbyte.storage.s3.envs" . }} +{{- end }} + +{{/* GCS */}} +{{- if eq $storageProvider "gcs" }} +{{- include "airbyte.storage.gcs.envs" . }} +{{- end }} + +{{/* MINIO */}} +{{- if eq $storageProvider "minio" }} +{{- include "airbyte.storage.minio.envs" . }} +{{- end }} + +{{/* AZURE */}} +{{- if eq $storageProvider "azure" }} +{{- include "airbyte.storage.azure.envs" . }} +{{- end }} + +{{- end }} + +{{/* +Returns storage config variables. +*/}} +{{- define "airbyte.storage.configVars" }} +{{- end }} + +{{/* +Returns storage config secrets. +*/}} +{{- define "airbyte.storage.secrets" }} +{{- $storageProvider := (include "airbyte.storage.provider" .) }} +{{/* S3 */}} +{{- if eq $storageProvider "s3" }} +{{- include "airbyte.storage.s3.secrets" . }} +{{- end }} + +{{/* GCS */}} +{{- if eq $storageProvider "gcs" }} +{{- include "airbyte.storage.gcs.secrets" . }} +{{- end }} + +{{/* MINIO */}} +{{- if eq $storageProvider "minio" }} +{{- include "airbyte.storage.minio.secrets" . }} +{{- end }} + +{{/* AZURE */}} +{{- if eq $storageProvider "azure" }} +{{- include "airbyte.storage.azure.secrets" . }} +{{- end }} +{{- end }} diff --git a/helm/airbyte-v1/templates/_temporal.tpl b/helm/airbyte-v1/templates/_temporal.tpl new file mode 100644 index 00000000..c4e213c9 --- /dev/null +++ b/helm/airbyte-v1/templates/_temporal.tpl @@ -0,0 +1,58 @@ +{{/* +Temporal Configuration +*/}} + +{{- define "airbyte.temporal.database.host.env" }} +- name: POSTGRES_SEEDS + valueFrom: + {{- if .Values.global.database.hostSecretKey }} + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ .Values.global.database.hostSecretKey }} + {{- else }} + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_HOST + {{- end }} +{{- end }} + +{{- define "airbyte.temporal.database.port.env" }} +- name: DB_PORT + valueFrom: + {{- if .Values.global.database.portSecretKey }} + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ .Values.global.database.portSecretKey }} + {{- else }} + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_PORT + {{- end }} +{{- end }} + +{{- define "airbyte.temporal.database.user.env" }} +- name: POSTGRES_USER + valueFrom: + secretKeyRef: + {{- if .Values.global.database.userSecretKey }} + name: {{ .Values.global.database.secretName }} + {{- else }} + name: {{ .Release.Name }}-airbyte-secrets + {{- end }} + key: {{ include "airbyte.database.userSecretKey" .}} +{{- end }} + +{{- define "airbyte.temporal.database.password.env" }} +- name: POSTGRES_PWD + valueFrom: + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ include "airbyte.database.passwordSecretKey" . }} +{{- end }} + +{{- define "airbyte.temporal.database.envs" }} +{{ include "airbyte.temporal.database.host.env" . }} +{{ include "airbyte.temporal.database.port.env" . }} +{{ include "airbyte.temporal.database.user.env" . }} +{{ include "airbyte.temporal.database.password.env" . }} +{{- end }} diff --git a/helm/airbyte-v1/templates/airbyte-db.yaml b/helm/airbyte-v1/templates/airbyte-db.yaml new file mode 100644 index 00000000..91cbd658 --- /dev/null +++ b/helm/airbyte-v1/templates/airbyte-db.yaml @@ -0,0 +1,85 @@ +{{- if .Values.postgresql.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: airbyte-db-svc + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" + labels: + {{ include "airbyte.databaseLabels" . | nindent 4 }} +spec: + type: ClusterIP + ports: + - port: 5432 + protocol: TCP + selector: + {{ include "airbyte.databaseSelectorLabels" . | nindent 4 }} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airbyte-db + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" + labels: + {{ include "airbyte.databaseLabels" . | nindent 4 }} +spec: + replicas: 1 + serviceName: airbyte-db-svc + selector: + matchLabels: + {{ include "airbyte.databaseSelectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{ include "airbyte.databaseSelectorLabels" . | nindent 8 }} + spec: + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: airbyte-db-container + image: {{ include "imageUrl" (list .Values.postgresql.image $) }} + env: + - name: POSTGRES_DB + value: {{ .Values.postgresql.postgresqlDatabase }} + - name: POSTGRES_PASSWORD + value: {{ .Values.postgresql.postgresqlPassword }} + - name: POSTGRES_USER + value: {{ .Values.postgresql.postgresqlUsername }} + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + ports: + - containerPort: 5432 + securityContext: {{- toYaml .Values.postgresql.containerSecurityContext | nindent 12 }} + volumeMounts: + - name: airbyte-volume-db + mountPath: /var/lib/postgresql/data + {{- with .Values.postgresql.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.postgresql.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.postgresql.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.postgresql.podSecurityContext | nindent 8 }} + + volumeClaimTemplates: + - metadata: + name: airbyte-volume-db + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 500Mi +{{- end }} diff --git a/helm/airbyte-v1/templates/airbyte-yml-secret.yaml b/helm/airbyte-v1/templates/airbyte-yml-secret.yaml new file mode 100644 index 00000000..eb6574e6 --- /dev/null +++ b/helm/airbyte-v1/templates/airbyte-yml-secret.yaml @@ -0,0 +1,19 @@ +{{- if .Values.global.airbyteYml }} +# The Secret that contains the airbyte.yml content. For this to work helm must be started with +# --set-file global.airbyteYml=/airbyte.yml +# For Airbyte Enterprise our installation script automatically specifies this, for Community +# users will need to specify it, if they want to use the airbyte.yml config file. +# If nothing is specified we'll assume an empty config +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-airbyte-yml + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + labels: + {{- include "airbyte.labels" . | nindent 4 }} +type: Opaque +data: + fileContents: "{{ .Values.global.airbyteYml | default "" | nindent 4 | b64enc }}" +{{- end }} diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml new file mode 100644 index 00000000..bfbeea2b --- /dev/null +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -0,0 +1,160 @@ +{{- $airbyteYmlDict := (default "" .Values.global.airbyteYml | fromYaml) }} +# default to empty dict if airbyteYml is undefined +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-airbyte-env + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + labels: + {{- include "airbyte.labels" . | nindent 4 }} +data: + AIRBYTE_VERSION: {{ .Values.version | default .Chart.AppVersion }} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + AIRBYTE_EDITION: "pro" + {{- else }} + AIRBYTE_EDITION: "community" + {{- end }} + + {{- if $airbyteYmlDict }} + AIRBYTE_URL: {{ (index $airbyteYmlDict "webapp-url") | quote }} + {{- else}} + AIRBYTE_URL: {{ .Values.global.airbyteUrl | quote }} + {{- end }} + + AIRBYTE_SERVER_HOST: {{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} + API_URL: {{ .Values.webapp.api.url }} + CONNECTOR_BUILDER_API_URL: {{ index .Values.webapp "connector-builder-server" "url" | quote }} + CONFIG_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} # temporary solution for oss kube deploys for airbyte api server until that server is wrapped into the config server + CONFIG_ROOT: /configs + CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: "0.35.15.001" + DATA_DOCKER_MOUNT: airbyte_data + DB_DOCKER_MOUNT: airbyte_db + {{- include "airbyte.database.configVars" . | nindent 2 }} + KEYCLOAK_DATABASE_URL: {{ include "airbyte.keycloak.database.url" . | quote }} + GOOGLE_APPLICATION_CREDENTIALS: {{ include "airbyte.gcpLogCredentialsPath" . | quote }} + INTERNAL_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} + WORKLOAD_API_HOST: http://{{ .Release.Name }}-workload-api-server-svc:{{ index .Values "workload-api-server" "service" "port" }} + + + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + INITIAL_USER_FIRST_NAME: {{ .Values.global.auth.instanceAdmin.firstName }} + INITIAL_USER_LAST_NAME: {{ .Values.global.auth.instanceAdmin.lastName }} + {{- if .Values.global.auth.identityProvider }} + IDENTITY_PROVIDER_TYPE: {{ .Values.global.auth.identityProvider.type }} + OIDC_DOMAIN: {{ .Values.global.auth.identityProvider.oidc.domain }} + OIDC_APP_NAME: {{ .Values.global.auth.identityProvider.oidc.appName }} + {{- end }} + KEYCLOAK_INTERNAL_HOST: {{ .Release.Name }}-airbyte-keycloak-svc:{{ .Values.keycloak.service.port }} + KEYCLOAK_PORT: {{ .Values.keycloak.service.port | quote }} + + {{- if $airbyteYmlDict }} + KEYCLOAK_HOSTNAME_URL: {{ printf "%s/auth" (index $airbyteYmlDict "webapp-url") | quote }} + {{- else }} + KEYCLOAK_HOSTNAME_URL: {{ printf "%s/auth" .Values.global.airbyteUrl | quote }} + {{- end }} + + KEYCLOAK_JAVA_OPTS_APPEND: -Djgroups.dns.query={{ .Release.Name }}-airbyte-keycloak-headless-svc + {{- else }} + KEYCLOAK_INTERNAL_HOST: localhost # just a placeholder so that nginx template is valid - shouldn't be used when edition isn't "pro" + {{- end }} + + CONNECTOR_BUILDER_API_HOST: {{ .Release.Name }}-airbyte-connector-builder-server-svc:{{ index .Values "connector-builder-server" "service" "port" }} + + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + {{- if $airbyteYmlDict }} + AIRBYTE_API_HOST: {{ printf "%s/api/public" (index $airbyteYmlDict "webapp-url") | quote }} + {{- else }} + AIRBYTE_API_HOST: {{ printf "%s/api/public" .Values.global.airbyteUrl | quote }} + {{- end }} + {{- else if (eq .Values.global.edition "community")}} + AIRBYTE_API_HOST: http://localhost:{{ .Values.server.service.port }}/api/public + {{- else }} + AIRBYTE_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }}/api/public + {{- end }} + + {{- if $.Values.global.jobs.kube.annotations }} + JOB_KUBE_ANNOTATIONS: {{ $.Values.global.jobs.kube.annotations | include "airbyte.flattenMap" | quote }} + {{- end }} + + {{- if $.Values.global.jobs.kube.labels }} + JOB_KUBE_LABELS: {{ $.Values.global.jobs.kube.labels | include "airbyte.flattenMap" | quote }} + {{- end }} + + {{- if $.Values.global.jobs.kube.nodeSelector }} + JOB_KUBE_NODE_SELECTORS: {{ $.Values.global.jobs.kube.nodeSelector | include "airbyte.flattenMap" | quote }} + {{- end }} + + {{- if $.Values.global.jobs.kube.tolerations }} + JOB_KUBE_TOLERATIONS: {{ $.Values.global.jobs.kube.tolerations | include "airbyte.flattenArrayMap" | quote }} + {{- end }} + + JOB_KUBE_BUSYBOX_IMAGE: {{ include "imageUrl" (list $.Values.global.jobs.kube.images.busybox $) }} + JOB_KUBE_CURL_IMAGE: {{ include "imageUrl" (list $.Values.global.jobs.kube.images.curl $) }} + {{ $workloadLauncher := (index .Values "workload-launcher") }} + CONTAINER_ORCHESTRATOR_IMAGE: {{ include "imageUrl" (list $workloadLauncher.containerOrchestrator.image $) }} + WORKLOAD_INIT_IMAGE: {{ include "imageUrl" (list $workloadLauncher.workloadInit.image $) }} + CONNECTOR_SIDECAR_IMAGE: {{ include "imageUrl" (list $workloadLauncher.connectorSidecar.image $) }} + + JOB_MAIN_CONTAINER_CPU_LIMIT: {{ ((.Values.global.jobs.resources | default dict).limits | default dict).cpu | default "" | quote }} + JOB_MAIN_CONTAINER_CPU_REQUEST: {{ ((.Values.global.jobs.resources | default dict).requests | default dict).cpu | default "" | quote }} + JOB_MAIN_CONTAINER_MEMORY_LIMIT: {{ ((.Values.global.jobs.resources | default dict).limits | default dict).memory | default "" | quote }} + JOB_MAIN_CONTAINER_MEMORY_REQUEST: {{ ((.Values.global.jobs.resources | default dict).requests | default dict).memory | default "" | quote }} + + {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} + JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET: {{ $.Values.global.jobs.kube.main_container_image_pull_secret }} + {{- end }} + JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: "0.29.15.001" + + JOB_KUBE_LOCAL_VOLUME_ENABLED: {{ .Values.global.jobs.local.volume.enabled | quote }} + + LOG_LEVEL: {{ default "INFO" (((.Values.global).logging).level) }} + MICROMETER_METRICS_ENABLED: "false" + MICROMETER_METRICS_STATSD_FLAVOR: "datadog" + RUN_DATABASE_MIGRATION_ON_STARTUP: {{ index .Values "airbyte-bootloader" "runDatabaseMigrationsOnStartup" | default "true" | quote }} + SEGMENT_WRITE_KEY: 7UDdp5K55CyiGgsauOr2pNNujGvmhaeu + # Storage start + STORAGE_TYPE: {{ (((.Values.global).storage).type) | default "minio" | quote }} + STORAGE_BUCKET_ACTIVITY_PAYLOAD: {{ ((((.Values.global).storage).bucket).activityPayload) | default "airbyte-storage" | quote }} + STORAGE_BUCKET_LOG: {{ ((((.Values.global).storage).bucket).log) | default "airbyte-storage" | quote }} + STORAGE_BUCKET_STATE: {{ ((((.Values.global).storage).bucket).state) | default "airbyte-storage" | quote }} + STORAGE_BUCKET_WORKLOAD_OUTPUT: {{ ((((.Values.global).storage).bucket).workloadOutput) | default "airbyte-storage" | quote }} + + {{- with .Values.global.storage.s3 }} + AWS_DEFAULT_REGION: {{ .region | default "" | quote }} + {{- end}} + + MINIO_ENDPOINT: {{ include "airbyte.storage.minio.endpoint" . | quote }} + S3_PATH_STYLE_ACCESS: {{ include "airbyte.s3PathStyleAccess" . | quote }} + # Storage end + STATSD_HOST: "localhost" + STATSD_PORT: "8125" + TEMPORAL_HOST: {{ .Release.Name }}-temporal:{{ .Values.temporal.service.port }} + TEMPORAL_WORKER_PORTS: 9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040 + TRACKING_STRATEGY: segment + WEBAPP_URL: {{ .Values.webapp.url | default (printf "http://%s-airbyte-webapp-svc:%d" .Release.Name (.Values.webapp.service.port | int)) }} + WORKER_ENVIRONMENT: kubernetes + WORKSPACE_DOCKER_MOUNT: airbyte_workspace + WORKSPACE_ROOT: /workspace + METRIC_CLIENT: {{ .Values.global.metrics.metricClient | default "" | quote }} + OTEL_COLLECTOR_ENDPOINT: {{ .Values.global.metrics.otelCollectorEndpoint | default "" | quote }} + ACTIVITY_MAX_ATTEMPT: {{ .Values.worker.activityMaxAttempt | default "" | quote }} + ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS: {{ .Values.worker.activityInitialDelayBetweenAttemptsSeconds | default "" | quote }} + ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS: {{ .Values.worker.activityMaxDelayBetweenAttemptsSeconds | default "" | quote }} + WORKFLOW_FAILURE_RESTART_DELAY_SECONDS: "" + FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT: 5G + FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST: 5G + + LAUNCHER_MICRONAUT_ENVIRONMENTS: "control-plane,oss" + WORKERS_MICRONAUT_ENVIRONMENTS: "control-plane" + CRON_MICRONAUT_ENVIRONMENTS: "control-plane" + SERVER_MICRONAUT_ENVIRONMENTS: "control-plane" + SHOULD_RUN_NOTIFY_WORKFLOWS: "true" + MAX_NOTIFY_WORKERS: {{ .Values.worker.maxNotifyWorkers | default "5" | quote }} + KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS: "" + WORKLOAD_LAUNCHER_PARALLELISM: "10" + CONNECTOR_BUILDER_SERVER_API_HOST: http://{{ .Release.Name }}-airbyte-connector-builder-server-svc:{{ index .Values "connector-builder-server" "service" "port" }} + PUB_SUB_ENABLED: "false" + PUB_SUB_TOPIC_NAME: "" + ENTERPRISE_SOURCE_STUBS_URL: {{ .Values.server.env_vars.ENTERPRISE_SOURCE_STUBS_URL | default "https://connectors.airbyte.com/files/resources/connector_stubs/v0/connector_stubs.json" }} diff --git a/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml new file mode 100644 index 00000000..acdc1f93 --- /dev/null +++ b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml @@ -0,0 +1,18 @@ +{{- if and + (eq .Values.global.deploymentMode "oss") + (eq (lower (default "" .Values.global.storage.type)) "gcs") + (not .Values.global.storage.secretName) + (not .Values.global.storage.storageSecretName) +}} +{{ $gcsConfig := required "You must set 'global.storage.gcs' when setting 'global.storage.type' to 'gcs'" .Values.global.storage.gcs }} +{{ $credentialsJson := required "You must set 'global.storage.gcs.credentialsJson' when 'global.storage.secretName' is not set" .Values.global.storage.gcs.credentialsJson }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-gcs-log-creds + labels: + {{- include "airbyte.labels" . | nindent 4 }} +type: Opaque +data: + gcp.json: {{ $credentialsJson | default "" | quote }} +{{- end }} diff --git a/helm/airbyte-v1/templates/minio.yaml b/helm/airbyte-v1/templates/minio.yaml new file mode 100644 index 00000000..a47ea4e2 --- /dev/null +++ b/helm/airbyte-v1/templates/minio.yaml @@ -0,0 +1,185 @@ +{{- if (eq (lower (default "" .Values.global.storage.type)) "minio")}} +apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 +kind: StatefulSet +metadata: + # This name uniquely identifies the Deployment + name: airbyte-minio + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" + labels: + {{ include "airbyte.minioLabels" . | nindent 4 }} +spec: + selector: + matchLabels: + {{ include "airbyte.minioSelectorLabels" . | nindent 6 }} + serviceName: airbyte-minio-svc + volumeClaimTemplates: + - metadata: + name: airbyte-minio-pv-claim + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: {{ .Values.minio.storage.volumeClaimValue }} + template: + metadata: + labels: + # Label is used as selector in the service. + {{ include "airbyte.minioSelectorLabels" . | nindent 8 }} + spec: + # Refer to the PVC created earlier + securityContext: + fsGroup: 1000 + containers: + - name: airbyte-minio + image: {{ include "imageUrl" (list .Values.minio.image $) }} + args: + - server + - /storage + env: + # Minio access key and secret key. This must match the S3_ACCESS_KEY_ID and S3_SECRET_ACCESS_KEY declared in /dev/.env. + - name: MINIO_ROOT_USER + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_ACCESS_KEY_ID + - name: MINIO_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_SECRET_ACCESS_KEY + ports: + - containerPort: 9000 + resources: + requests: + memory: "1024Mi" + cpu: "200m" + limits: + memory: "1024Mi" + cpu: "200m" + # Mount the volume into the pod + securityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + volumeMounts: + - name: airbyte-minio-pv-claim # must match the volume name, above + mountPath: "/storage" + {{- with .Values.minio.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.minio.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.minio.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + +--- +apiVersion: v1 +kind: Service +metadata: + name: airbyte-minio-svc + labels: + {{ include "airbyte.minioLabels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" +spec: + ports: + - port: 9000 + targetPort: 9000 + protocol: TCP + selector: + {{ include "airbyte.minioSelectorLabels" . | nindent 4 }} +--- +# This pod creates the state-storage bucket in the minio server, +# which the local cloud deployment requires to store its state. +apiVersion: v1 +kind: Pod +metadata: + name: airbyte-minio-create-bucket + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation +spec: + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + restartPolicy: OnFailure + securityContext: + fsGroup: 1000 + containers: + - name: minio-mc + image: {{ include "imageUrl" (list .Values.minio.mcImage $) }} + command: ["/bin/sh", "-c", + "until (/usr/bin/mc config host add myminio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY) do echo '...waiting...' && sleep 1; done; + /usr/bin/mc mb --ignore-existing myminio/state-storage; + /usr/bin/mc policy set public myminio/state-storage; + /usr/bin/mc mb --ignore-existing myminio/airbyte-dev-logs; + /usr/bin/mc policy set public myminio/airbyte-dev-logs;"] + securityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + env: + {{- if and (eq (lower (default "" .Values.global.storage.type)) "minio") (((.Values.global).storage).minio) }} + - name: MINIO_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + key: {{ include "airbyte.minioAccessKeyIdSecretKey" .Values.global.storage.minio.accessKeyIdSecretKey }} + - name: MINIO_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + key: {{ include "airbyte.minioSecretAccessKeySecretKey" .Values.global.storage.minio.secretAccessKeySecretKey }} + {{- else }} + # this is for the internally deployed minio + - name: MINIO_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_ACCESS_KEY_ID + - name: MINIO_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_SECRET_ACCESS_KEY + {{- end }} + - name: MINIO_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MINIO_ENDPOINT +{{- end }} diff --git a/helm/airbyte-v1/templates/secret.yaml b/helm/airbyte-v1/templates/secret.yaml new file mode 100644 index 00000000..7d4230d0 --- /dev/null +++ b/helm/airbyte-v1/templates/secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-airbyte-secrets + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + labels: + {{- include "airbyte.labels" . | nindent 4 }} +type: Opaque +stringData: + {{- include "airbyte.database.secrets" . | nindent 2 }} + {{- include "airbyte.storage.secrets" . | nindent 2 }} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + KEYCLOAK_ADMIN_USER: {{ .Values.keycloak.auth.adminUsername | quote }} + KEYCLOAK_ADMIN_PASSWORD: {{ .Values.keycloak.auth.adminPassword | quote }} + {{- end }} + WORKLOAD_API_BEARER_TOKEN: {{ index ".Values.workload-api.bearerToken" | quote }} diff --git a/helm/airbyte-v1/templates/serviceaccount.yaml b/helm/airbyte-v1/templates/serviceaccount.yaml new file mode 100644 index 00000000..7f7acd85 --- /dev/null +++ b/helm/airbyte-v1/templates/serviceaccount.yaml @@ -0,0 +1,77 @@ +{{- if eq .Values.global.deploymentMode "oss" }} +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "airbyte.serviceAccountName" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-10" + {{- with .Values.serviceAccount.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ include "airbyte.serviceAccountName" . }}-role + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-5" +rules: + - apiGroups: ["*"] +{{- if eq .Values.global.edition "community" }} + resources: ["jobs", "pods", "pods/log", "pods/exec", "pods/attach", "secrets"] +{{- else }} + resources: ["jobs", "pods", "pods/log", "pods/exec", "pods/attach"] +{{- end }} + verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # over-permission for now +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ include "airbyte.serviceAccountName" . }}-binding + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-3" +roleRef: + apiGroup: "" + kind: Role + name: {{ include "airbyte.serviceAccountName" . }}-role +subjects: + - kind: ServiceAccount + name: {{ include "airbyte.serviceAccountName" . }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + {{- include "airbyte.labels" . | nindent 4 }} + name: node-viewer +rules: + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + {{- include "airbyte.labels" . | nindent 4 }} + name: {{ include "airbyte.serviceAccountName" . }}-admin-node-viewer +subjects: + - kind: ServiceAccount + name: {{ include "airbyte.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: node-viewer + apiGroup: rbac.authorization.k8s.io +{{- end }} +{{- end }} diff --git a/helm/airbyte-v1/templates/tests/test-webapp.yaml b/helm/airbyte-v1/templates/tests/test-webapp.yaml new file mode 100644 index 00000000..8b33ae24 --- /dev/null +++ b/helm/airbyte-v1/templates/tests/test-webapp.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "common.names.fullname" . }}-test-connection" + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: wget + image: {{ include "imageUrl" (list .Values.testWebapp.image $) }} + command: ['wget'] + args: ['{{ .Release.Name }}-airbyte-webapp-svc:{{ .Values.webapp.service.port }}'] + resources: + requests: + memory: "64Mi" + cpu: "100m" + limits: + memory: "128Mi" + cpu: "200m" + restartPolicy: Never diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml new file mode 100644 index 00000000..76789bf7 --- /dev/null +++ b/helm/airbyte-v1/values.yaml @@ -0,0 +1,2379 @@ +### TEST FOR RELEASE WORKFLOW + + +# Global params that are overwritten with umbrella chart +global: + # -- Service Account name override + serviceAccountName: &service-account-name "airbyte-admin" + # -- Deployment mode, whether or not render the default env vars and volumes in deployment spec + deploymentMode: "oss" + # -- Edition; "community" or "pro" + edition: "community" + + airbyteYml: "" + + enterprise: + # -- Secret name where an Airbyte license key is stored + secretName: "airbyte-airbyte-secrets" + # -- The key within `licenseKeySecretName` where the Airbyte license key is stored + licenseKeySecretKey: "license-key" + + # -- The URL where Airbyte will be reached; This should match your Ingress host + airbyteUrl: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "1.2.0" + + # Docker image pull secret + imagePullSecrets: [] + + # -- Auth configuration + auth: + # -- Whether auth is enabled + enabled: true + # -- Admin user configuration + instanceAdmin: + # -- Secret name where the instanceAdmin configuration is stored + secretName: "airbyte-airbyte-secrets" + # -- The first name of the initial user + firstName: "" + # -- The last name of the initial user + lastName: "" + # -- The key within `emailSecretName` where the initial user's email is stored + emailSecretKey: "instance-admin-email" + # -- The key within `passwordSecretName` where the initial user's password is stored + passwordSecretKey: "instance-admin-password" + + # -- SSO Identify Provider configuration; (requires Enterprise) + #identityProvider: + # # -- Secret name where the OIDC configuration is stored + # secretName: "airbyte-airbyte-secrets" + # # -- The identity provider type (e.g. oidc) + # type: "" + # # -- OIDC configuration (required if `auth.identityProvider.type` is "oidc") + # oidc: + # # -- OIDC application domain + # domain: "" + # # -- OIDC application name + # appName: "" + # # -- The key within `clientIdSecretName` where the OIDC client id is stored + # clientIdSecretKey: "client-id" + # # -- The key within `clientSecretSecretName` where the OIDC client secret is stored + # clientSecretSecretKey: "client-secret" + + # -- Environment variables + env_vars: {} + + # -- Database configuration + database: + type: "external" # "external" + + # -- Secret name where database credentials are stored + secretName: "airbyte-airbyte-secrets" # e.g. "airbyte-airbyte-secrets" + + # -- The database host + host: "" + + # -- The database port + port: "" + + # -- The database name + database: "" + + # -- The database user + user: "" + # -- The key within `secretName` where the user is stored + #userSecretKey: "" # e.g. "database-user" + + # -- The database password + password: "" + # -- The key within `secretName` where the password is stored + #passwordSecretKey: "" # e.g."database-password" + + + + storage: + # -- The storage backend type. Supports s3, gcs, azure, minio (default) + type: minio # default storage used + # -- Secret name where storage provider credentials are stored + #storageSecretName: "airbyte-airbyte-secrets" + + # S3 + #bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. + # log: airbyte-bucket + # state: airbyte-bucket + # workloadOutput: airbyte-bucket + #s3: + # region: "" ## e.g. us-east-1 + # authenticationType: credentials ## Use "credentials" or "instanceProfile" + + # GCS + #bucket: ## GCS bucket names that you've created. We recommend storing the following all in one bucket. + # log: airbyte-bucket + # state: airbyte-bucket + # workloadOutput: airbyte-bucket + #gcs: + # projectId: + # credentialsJson: /secrets/gcs-log-creds/gcp.json + + # Azure + #bucket: ## Azure Blob Storage container names that you've created. We recommend storing the following all in one bucket. + # log: airbyte-bucket + # state: airbyte-bucket + # workloadOutput: airbyte-bucket + #azure: + # # one of the following: connectionString, connectionStringSecretKey + # connectionString: + # connectionStringSecretKey: + + metrics: + # -- The metric client to configure globally. Supports "otel" + metricClient: "" + # -- The open-telemetry-collector endpoint that metrics will be sent to + otelCollectorEndpoint: "" + + # Jobs resource requests and limits, see http://kubernetes.io/docs/user-guide/compute-resources/ + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. + jobs: + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- Job resource requests + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- Job resource limits + limits: {} + + local: + volume: + enabled: false + + kube: + ## JOB_KUBE_ANNOTATIONS + # pod annotations of the sync job and the default pod annotations fallback for others jobs + # -- key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + # -- key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + # -- Node labels for pod assignment + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + # -- Node tolerations for pod assignment + # Any boolean values should be quoted to ensure the value is passed through as a string. + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + # -- image pull secret to use for job pod + main_container_image_pull_secret: "" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + # -- busybox image used by the job pod + busybox: "busybox:1.35" + ## JOB_KUBE_CURL_IMAGE + # -- curl image used by the job pod + curl: "curlimages/curl:8.1.1" + +## @section Common Parameters + +# -- String to partially override airbyte.fullname template with a string (will prepend the release name) +nameOverride: "" +# -- String to fully override airbyte.fullname template with a string +fullnameOverride: "" + +# Pods Service Account, see https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ +serviceAccount: + # -- Specifies whether a ServiceAccount should be created + create: true + # -- Annotations for service account. Evaluated as a template. Only used if `create` is `true`. + annotations: {} + # -- Name of the service account to use. If not set and create is true, a name is generated using the fullname template. + name: *service-account-name + +# -- Sets the AIRBYTE_VERSION environment variable. Defaults to Chart.AppVersion. +## If changing the image tags below, you should probably also update this. +version: "" + +## @section Webapp Parameters + +webapp: + enabled: true + # -- Number of webapp replicas + replicaCount: 1 + + ## webapp.image.repository + ## webapp.image.pullPolicy + ## webapp.image.tag The airbyte webapp image tag. Defaults to the chart's AppVersion + image: + # -- The repository to use for the airbyte webapp image + repository: airbyte/webapp + # -- The pull policy to use for the airbyte webapp image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the webapp pods + podAnnotations: {} + + # -- webapp.podLabels [object] Add extra labels to the webapp pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=101(nginx) + fsGroup: 101 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=101(nginx) + runAsUser: 101 + # gid=101(nginx) + runAsGroup: 101 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Configure extra options for the webapp containers' liveness and readiness probes, + ## see https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + livenessProbe: + # -- Enable livenessProbe on the webapp + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the webapp + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + service: + # -- The service type to use for the webapp service + type: ClusterIP + # -- The service port to expose the webapp on + port: 80 + # -- Annotations for the webapp service resource + annotations: {} + + ## Web app resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the Web container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the Web container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Configure the ingress resource that allows you to access the Airbyte installation. + ## ref: http://kubernetes.io/docs/user-guide/ingress/ + ingress: + # -- Set to true to enable ingress record generation + enabled: true + # -- Specifies ingressClassName for clusters >= 1.18+ + className: "nginx" + # -- Ingress annotations done as key:value pairs + annotations: {} + # kubernetes.io/tls-acme: "true" + # -- The list of hostnames to be covered with this ingress record. + hosts: + - host: + paths: + - path: / + pathType: ImplementationSpecific + # -- Custom ingress TLS configuration + tls: [] + + api: + # -- The webapp API url + url: /api/v1/ + + connector-builder-server: + url: /connector-builder-api + + fullstory: + # -- Whether or not to enable fullstory + enabled: false + + ## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: var-run + ## mountPath: /var/run/ + ## - name: var-cache-nginx + ## mountPath: /var/cache/nginx + ## - mountPath: /etc/nginx/conf.d + ## name: nginx-conf-d + ## + # -- Additional volumeMounts for webapp containers + extraVolumeMounts: [] + + ## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: var-run + ## emptyDir: {} + ## - name: var-cache-nginx + ## emptyDir: {} + ## - name: nginx-conf-d + ## emptyDir: {} + # -- Additional volumes for webapp pods + extraVolumes: [] + + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for server pods + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for server pods + extraInitContainers: [] + + ## Example: (With default env vars and values taken from generated config map) + # extraEnv: + # - name: POSTGRES_USER + # valueFrom: + # secretKeyRef: + # name: airbyte-secrets + # key: DATABASE_USER + # - name: POSTGRES_PWD + # valueFrom: + # secretKeyRef: + # name: airbyte-secrets + # key: DATABASE_PASSWORD + # - name: DYNAMIC_CONFIG_FILE_PATH + # value: "config/dynamicconfig/development.yaml" + # - name: DB + # value: "postgresql" + # - name: DB_PORT + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: DATABASE_PORT + # - name: POSTGRES_SEEDS + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: DATABASE_HOST + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + +## @section Pod Sweeper parameters + +pod-sweeper: + enabled: true + image: + # -- The image repository to use for the pod sweeper + repository: bitnami/kubectl + # -- The pull policy for the pod sweeper image + pullPolicy: IfNotPresent + # -- The pod sweeper image tag to use + tag: 1.28.9 + + # -- Add extra annotations to the podSweeper pod + podAnnotations: {} + + # -- Add extra labels to the podSweeper pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1001(anon) + fsGroup: 1001 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1001(anon) + runAsUser: 1001 + # gid=1001(anon) + runAsGroup: 1001 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the podSweeper + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 5 + # -- Period seconds for livenessProbe + periodSeconds: 30 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the podSweeper + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 5 + # -- Period seconds for readinessProbe + periodSeconds: 30 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## Pod Sweeper app resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the podSweeper container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the podSweeper container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for pod assignment, see https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Examples: + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for podSweeper container(s). + extraVolumeMounts: [] + + ## Examples: + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for podSweeper pod(s). + extraVolumes: [] + +## @section Server parameters + +server: + enabled: true + # -- Number of server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte server image. + repository: airbyte/server + # -- the pull policy to use for the airbyte server image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the server pods + podAnnotations: {} + + # -- Add extra labels to the server pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Configure extra options for the server containers' liveness and readiness probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the server container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for server pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for server pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at + level: "INFO" + + ## Examples (when using `server.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for server containers + extraVolumeMounts: [] + + ## Examples (when using `server.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for server pods + extraVolumes: [] + + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for server pods + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for server pods + extraInitContainers: [] + + ## Example: (With default env vars and values taken from generated config map) + # extraEnv: + # - name: AIRBYTE_VERSION + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: AIRBYTE_VERSION + # - name: API_URL + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: API_URL + # - name: TRACKING_STRATEGY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: TRACKING_STRATEGY + # - name: FULLSTORY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: FULLSTORY + # - name: INTERNAL_API_HOST + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: INTERNAL_API_HOST + ## + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + +## @section Worker Parameters + +worker: + enabled: true + # -- Number of worker replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte worker image. + repository: airbyte/worker + # -- the pull policy to use for the airbyte worker image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the worker pods + podAnnotations: {} + + # -- Add extra labels to the worker pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the worker + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the worker + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## worker resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + #! -- The resources limits for the worker container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the worker container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for worker pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + #! -- The log level to log at. + level: "INFO" + + ## Example: + ## + ## extraEnv: + ## - name: JOB_KUBE_TOLERATIONS + ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" + # -- Additional env vars for worker pods + extraEnv: [] + + ## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for worker containers + extraVolumeMounts: [] + + ## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for worker pods + extraVolumes: [] + # -- Additional container for worker pods + extraContainers: [] + + hpa: + enabled: false + + debug: + enabled: false + + ## current no exist documentations + activityMaxAttempt: "" + activityInitialDelayBetweenAttemptsSeconds: "" + activityMaxDelayBetweenAttemptsSeconds: "" + maxNotifyWorkers: 5 + +## @section Workload Launcher Parameters + +workload-launcher: + enabled: true + # -- Number of workload launcher replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte workload launcher image. + repository: airbyte/workload-launcher + # -- The pull policy to use for the airbyte workload launcher image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the workload launcher pods + podAnnotations: {} + + # -- Add extra labels to the workload launcher pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the workload launcher + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the workload launcher + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## workload launcher resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the workload launcher container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the workload launcher container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for workload launcher pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # Affinity and anti-affinity for workload launcher pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at + level: "INFO" + + ## Example: + ## + ## extraEnv: + ## - name: JOB_KUBE_TOLERATIONS + ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" + # -- Additional env vars for workload launcher pods + extraEnv: [] + + ## Examples (when using `workload launcher.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for workload launcher containers + extraVolumeMounts: [] + + ## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for workload launcher pods + extraVolumes: [] + + extraContainers: [] + + hpa: + enabled: false + + debug: + enabled: false + + containerOrchestrator: + # -- Enable or disable Orchestrator + enabled: true + # -- Orchestrator image + # This is a template string that will be passed to the "tpl" helper. + image: "airbyte/container-orchestrator:{{ default .Chart.AppVersion .Values.global.image.tag }}" + + connectorSidecar: + # -- Connector Sidecar image + # This is a template string that will be passed to the "tpl" helper. + image: "airbyte/connector-sidecar:{{ default .Chart.AppVersion .Values.global.image.tag }}" + + workloadInit: + # -- Workload init image + # This is a template string that will be passed to the "tpl" helper. + image: "airbyte/workload-init-container:{{ default .Chart.AppVersion .Values.global.image.tag }}" + + ## current no exist documentations + activityMaxAttempt: "" + activityInitialDelayBetweenAttemptsSeconds: "" + activityMaxDelayBetweenAttemptsSeconds: "" + + maxNotifyWorkers: 5 + +## @section Rollout Worker Parameters + +connector-rollout-worker: + enabled: false + # -- Number of connector rollout worker replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte connector rollout worker image. + repository: airbyte/connector-rollout-worker + # -- The pull policy to use for the airbyte connector rollout worker image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the connector rollout worker pods + podAnnotations: {} + + # -- Add extra labels to the connector rollout worker pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the connector rollout worker + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the connector rollout worker + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## connector rollout worker resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the connector rollout worker container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the connector rollout worker container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for connector rollout worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # Affinity and anti-affinity for connector rollout worker pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at + level: "INFO" + + ## Example: + ## + ## extraEnv: + ## - name: JOB_KUBE_TOLERATIONS + ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" + # -- Additional env vars for connector rollout worker pods + extraEnv: [] + + ## Examples (when using `connector rollout worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for connector rollout worker containers + extraVolumeMounts: [] + + ## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for connector rollout worker pods + extraVolumes: [] + + extraContainers: [] + + hpa: + enabled: false + + debug: + enabled: false + + containerOrchestrator: + # -- Enable or disable Orchestrator + enabled: true + # -- Orchestrator image + image: "" + + ## current no exist documentations + activityMaxAttempt: "" + activityInitialDelayBetweenAttemptsSeconds: "" + activityMaxDelayBetweenAttemptsSeconds: "" + + maxNotifyWorkers: 5 + +## @section Metrics parameters +metrics: + enabled: false + + # -- Number of metrics-reporter replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte metrics-reporter image. + repository: airbyte/metrics-reporter + # -- The pull policy to use for the airbyte metrics-reporter image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the metrics-reporter pod + podAnnotations: {} + + # -- Add extra labels to the metrics-reporter pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## metrics-reporter app resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the metrics-reporter container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the metrics-reporter container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for metrics-reporter pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for metrics-reporter pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Example: + ## + ## extraEnv: + ## - name: SAMPLE_ENV_VAR + ## value: "key=sample-value" + # -- Additional env vars for metrics-reporter pods + extraEnv: [] + + ## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for metrics-reporter containers + extraVolumeMounts: [] + + ## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for metrics-reporter pods + extraVolumes: [] + + extraContainers: [] + + secrets: {} + + env_vars: {} + +## @section Bootloader Parameters + +airbyte-bootloader: + enabled: true + image: + # -- The repository to use for the airbyte bootloader image. + repository: airbyte/bootloader + # -- The pull policy to use for the airbyte bootloader image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the bootloader pod + podAnnotations: {} + + # -- Add extra labels to the bootloader pod + podLabels: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + ## Bootloader resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the airbyte bootloader image + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the airbyte bootloader image + limits: {} + + # -- Affinity and anti-affinity for bootloader pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Example: (With default env vars and values taken from generated config map) + ## extraEnv: + ## - name: AIRBYTE_VERSION + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: AIRBYTE_VERSION + ## - name: DATABASE_HOST + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: DATABASE_HOST + ## - name: DATABASE_PORT + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: DATABASE_PORT + ## - name: DATABASE_PASSWORD + ## valueFrom: + ## secretKeyRef: + ## name: airbyte-secrets + ## key: DATABASE_PASSWORD + ## - name: DATABASE_URL + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: DATABASE_URL + ## - name: DATABASE_USER + ## valueFrom: + ## secretKeyRef: + ## name: airbyte-secrets + ## key: DATABASE_USER + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for server pod(s) + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for server pods + extraInitContainers: [] + + ## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for server containers + extraVolumeMounts: [] + + ## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for server pods + extraVolumes: [] + +## @section Temporal parameters +## TODO: Move to consuming temporal from a dedicated helm chart + +temporal: + enabled: true + # -- The number of temporal replicas to deploy + replicaCount: 1 + + image: + # -- The temporal image repository to use + repository: temporalio/auto-setup + # -- The pull policy for the temporal image + pullPolicy: IfNotPresent + # -- The temporal image tag to use + tag: "1.23.0" + + service: + # -- The Kubernetes Service Type + type: ClusterIP + # -- The temporal port and exposed kubernetes port + port: 7233 + + # -- Add extra annotations to the temporal pod + podAnnotations: {} + + # -- Add extra labels to the temporal pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(temporal) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(temporal) + runAsUser: 1000 + # gid=1000(temporal) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraInitContainers: + ## - name: config-loader + ## image: temporalio/auto-setup:1.23 + ## command: + ## - /bin/sh + ## - -c + ## - >- + ## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; + ## volumeMounts: + ## - name: config + ## mountPath: /config + # -- Additional InitContainers to initialize the pod + extraInitContainers: [] + + livenessProbe: + # -- Enable livenessProbe on the temporal + enabled: false + + readinessProbe: + # -- Enable readinessProbe on the temporal + enabled: false + + # -- Node labels for temporal pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for temporal pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for temporal pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Example: + ## + ## extraEnv: + ## - name: SAMPLE_ENV_VAR + ## value: "key=sample-value" + # -- Additional env vars for temporal pod(s). + extraEnv: [] + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + ## - name: config + ## mountPath: /etc/temporal/config + # -- Additional volumeMounts for temporal containers + extraVolumeMounts: [] + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + ## - name: config + ## emptyDir: {} + # -- Additional volumes for temporal pods + extraVolumes: [] + + ## Temporal resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for temporal pods + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for temporal pods + limits: {} + + extraContainers: [] + +## @section Temporal parameters +## TODO: Move to consuming temporal from a dedicated helm chart + +temporal-ui: + enabled: false + # -- The number of temporal-ui replicas to deploy + replicaCount: 1 + + image: + # -- The temporal-ui image repository to use + repository: temporalio/ui + # -- The pull policy for the temporal-ui image + pullPolicy: IfNotPresent + tag: "2.30.1" + + service: + # -- The Kubernetes Service Type + type: ClusterIP + # -- The temporal-ui port and exposed kubernetes port + port: 8088 + + # -- Add extra annotations to the temporal-ui pod + podAnnotations: {} + + # -- Add extra labels to the temporal-ui pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(temporal-ui) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: false + # uid=1000(temporal-ui) + runAsUser: 0 + # gid=1000(temporal-ui) + runAsGroup: 0 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraInitContainers: + ## - name: config-loader + ## image: temporalio/ui:2.30.1 + ## command: + ## - /bin/sh + ## - -c + ## - >- + ## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; + ## volumeMounts: + ## - name: config + ## mountPath: /config + # -- Additional InitContainers to initialize the pod + extraInitContainers: [] + + livenessProbe: + # -- Enable livenessProbe on the temporal-ui + enabled: false + + readinessProbe: + # -- Enable readinessProbe on the temporal-ui + enabled: false + + # -- Node labels for temporal-ui pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for temporal-ui pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for temporal-ui pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Example: + ## + ## extraEnv: + ## - name: SAMPLE_ENV_VAR + ## value: "key=sample-value" + # -- Additional env vars for temporal-ui pod(s). + extraEnv: [] + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + ## - name: config + ## mountPath: /etc/temporal/config + # -- Additional volumeMounts for temporal containers + extraVolumeMounts: [] + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + ## - name: config + ## emptyDir: {} + # -- Additional volumes for temporal-ui pods + extraVolumes: [] + + ## Temporal UI resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for temporal-ui pods + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for temporal-ui pods + limits: {} + + extraContainers: [] + +## @section Airbyte Database parameters + +# PostgreSQL chart configuration, see https://github.com/bitnami/charts/blob/master/bitnami/postgresql/values.yaml +postgresql: + # -- Switch to enable or disable the PostgreSQL helm chart + enabled: false + + ## image.repository Repository for airbyte-db statefulset + image: + repository: airbyte/db + # -- Airbyte Postgresql username + postgresqlUsername: airbyte + # -- Airbyte Postgresql password + postgresqlPassword: airbyte + # -- Airbyte Postgresql database + postgresqlDatabase: db-airbyte + # fullnameOverride: *db-hostname + ## This secret is used in case of postgresql.enabled=true and we would like to specify password for newly created postgresql instance + # -- Name of an existing secret containing the PostgreSQL password ('postgresql-password' key) + existingSecret: "" + podSecurityContext: + # gid=70(postgres) + fsGroup: 70 + containerSecurityContext: + # -- Ensures the container will run with a non-root user + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=70(postgres) + runAsUser: 70 + # gid=70(postgres) + runAsGroup: 70 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + commonAnnotations: + # -- It will determine when the hook should be rendered + helm.sh/hook: pre-install + # -- The order in which the hooks are executed. If weight is lower, it has higher priority + helm.sh/hook-weight: "-1" + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for postgresql pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for postgresql pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +# External PostgreSQL configuration, All of these values are only used when postgresql.enabled is set to false +externalDatabase: + # -- Database host + host: "" + # -- non-root Username for Airbyte Database + user: "" + # -- Database password + password: "" + # -- Name of an existing secret resource containing the DB password + existingSecret: "" + # -- Name of an existing secret key containing the DB password + existingSecretPasswordKey: "" + # -- Database name + database: "" + # -- Database port number + port: "" + # -- Database full JDBC URL (ex: jdbc:postgresql://host:port/db?parameters) + jdbcUrl: "" + + +minio: + image: + # -- Minio image used by Minio helm chart + repository: minio/minio + # -- Minio tag image + tag: latest + + mcImage: + repository: airbyte/mc + tag: latest + + storage: + volumeClaimValue: 500Mi + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + # -- Tolerations for minio pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + + # -- Affinity and anti-affinity for minio pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +## @section cron parameters +cron: + enabled: true + # -- Number of cron replicas + replicaCount: 1 + image: + # -- The repository to use for the airbyte cron image. + repository: airbyte/cron + # -- The pull policy to use for the airbyte cron image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the cron pods + podAnnotations: {} + + # -- Add extra labels to the cron pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # uid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the cron + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the cron + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## cron resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the cron container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the cron container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for cron pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for cron pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at. + level: "INFO" + + ## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for cron containers + extraVolumeMounts: [] + + ## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for cron pods + extraVolumes: [] + + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for cron pods + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for cron pods + extraInitContainers: [] + + ## Example: (With default env vars and values taken from generated config map) + # extraEnv: + # - name: AIRBYTE_VERSION + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: AIRBYTE_VERSION + # - name: API_URL + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: API_URL + # - name: TRACKING_STRATEGY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: TRACKING_STRATEGY + # - name: FULLSTORY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: FULLSTORY + # - name: INTERNAL_API_HOST + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: INTERNAL_API_HOST + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + +connector-builder-server: + enabled: true + # -- Number of connector-builder-server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte connector-builder-server image. + repository: airbyte/connector-builder-server + # -- The pull policy to use for the airbyte connector-builder-server image + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## connector-builder-server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the connector-builder-server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the connector-builder-server container + requests: {} + + log: + # -- The log level to log at. + level: "INFO" + + env_vars: {} + service: + port: 80 + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +keycloak: + enabled: false + env_vars: {} + + auth: + adminUsername: airbyteAdmin + adminPassword: keycloak123 + + image: + repository: airbyte/keycloak + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=0(root) + fsGroup: 0 + + initContainers: + initDb: + image: "postgres:13-alpine" + + initContainerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=70(postgres) + runAsUser: 70 + # gid=70(postgres) + runAsGroup: 70 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(keycloak) + runAsUser: 1000 + # gid=0(root) + runAsGroup: 0 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +keycloak-setup: + enabled: false + env_vars: {} + + image: + repository: airbyte/keycloak-setup + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + initContainerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # gid=100(curl_user) + runAsUser: 100 + # gid=101(curl_group) + runAsGroup: 101 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + initContainers: + keycloakReadinessCheck: + image: "curlimages/curl:8.1.1" + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +workload-api-server: + enabled: true + + bearerToken: token + + # -- workload-api-server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte-workload-api-server image. + repository: airbyte/workload-api-server + # -- The pull policy to use for the airbyte-workload-api-server image + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## airbyte-workload-api-server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the airbyte-workload-api-server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the airbyte-workload-api-server container + requests: {} + + log: + # -- The log level at which to log + level: "INFO" + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + env_vars: {} + service: + port: 8007 + + # Configure the ingress resource that allows you to access the Airbyte Workload API, see http://kubernetes.io/docs/user-guide/ingress/ + ingress: + # -- Set to true to enable ingress record generation + enabled: false + # -- Specifies ingressClassName for clusters >= 1.18+ + className: "" + # -- Ingress annotations done as key:value pairs + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + # -- The list of hostnames to be covered with this ingress record + hosts: [] + # - host: localhost + # paths: + # - path: / + # pathType: ImplementationSpecific + # -- Custom ingress TLS configuration + tls: [] + # - secretName: chart-example-tls + # hosts: + # - localhost + +featureflag-server: + enabled: false + + # -- workload-api-server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte-workload-api-server image. + repository: airbyte/featureflag-server + # -- The pull policy to use for the airbyte-workload-api-server image + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## airbyte-workload-api-server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the airbyte-workload-api-server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the airbyte-workload-api-server container + requests: {} + + log: + # -- The log level at which to log + level: "INFO" + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + env_vars: {} + service: + port: 8007 + + # Configure the ingress resource that allows you to access the Airbyte Workload API, see http://kubernetes.io/docs/user-guide/ingress/ + ingress: + # -- Set to true to enable ingress record generation + enabled: false + # -- Specifies ingressClassName for clusters >= 1.18+ + className: "" + # -- Ingress annotations done as key:value pairs + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + # -- The list of hostnames to be covered with this ingress record + hosts: [] + # - host: localhost + # paths: + # - path: / + # pathType: ImplementationSpecific + # -- Custom ingress TLS configuration + tls: [] + # - secretName: chart-example-tls + # hosts: + # - localhost + +testWebapp: + image: + repository: busybox + tag: latest From c4b494025ec143733bba2f867d15cc16e62bab89 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 10:52:17 +0100 Subject: [PATCH 08/69] Set airbyte-v1 helm chart version --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 70966181..607dec54 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte type: application -version: 1.2.0 +version: "v1.0.0" From fcf53c15cafec0153f2a003457bcd213f1970f17 Mon Sep 17 00:00:00 2001 From: manojsaikumar <64740477+Manoj-07@users.noreply.github.com> Date: Fri, 6 Dec 2024 17:31:34 +0530 Subject: [PATCH 09/69] Update release.yaml --- .github/workflows/release.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index db38651d..7cbb1727 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -4,6 +4,7 @@ on: branches: - main - eks_upgrade + - airbyte_v1 paths: - 'helm/**' release: From ec83a319cea8f21840cf6f4b2929156dc9bc1775 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:31:39 +0100 Subject: [PATCH 10/69] Add default global.database.user on airbyte-v1 --- helm/airbyte-v1/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 76789bf7..1531318f 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -86,7 +86,7 @@ global: database: "" # -- The database user - user: "" + user: "rds_admin" # -- The key within `secretName` where the user is stored #userSecretKey: "" # e.g. "database-user" From 3bf7560cdfec7e2d0a04959449136985a276aad2 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:45:40 +0100 Subject: [PATCH 11/69] Test removal of required vals on airbyte-v1 --- helm/airbyte-v1/templates/_database.tpl | 27 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/helm/airbyte-v1/templates/_database.tpl b/helm/airbyte-v1/templates/_database.tpl index fd0e5ef8..508a2e4c 100644 --- a/helm/airbyte-v1/templates/_database.tpl +++ b/helm/airbyte-v1/templates/_database.tpl @@ -11,7 +11,8 @@ Renders the database host {{- else if .Values.global.database.host }} {{- .Values.global.database.host }} {{- else }} - {{ $host := .Values.global.database.host | required "You must set `global.database.host` when using an external database" }} + # {{ $host := .Values.global.database.host | required "You must set `global.database.host` when using an external database" }} + {{ printf "%s" "" }} {{- end }} {{- end }} @@ -35,7 +36,8 @@ Renders the database port {{- else if .Values.global.database.port }} {{- .Values.global.database.port }} {{- else }} - {{ $port := .Values.global.database.port | required "You must set `global.database.port` when using an external database" }} + # {{ $port := .Values.global.database.port | required "You must set `global.database.port` when using an external database" }} + {{ printf "%s" "" }} {{- end }} {{- end }} @@ -59,7 +61,8 @@ Renders the database name {{- else if .Values.global.database.database }} {{- .Values.global.database.database }} {{- else }} - {{ $database := .Values.global.database.database | required "You must set `global.database.database` when using an external database" }} + # {{ $database := .Values.global.database.database | required "You must set `global.database.database` when using an external database" }} + {{ printf "%s" "" }} {{- end }} {{- end }} @@ -84,9 +87,11 @@ Renders the database user {{- .Values.global.database.user }} {{- else }} {{- if .Values.global.database.userSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{ printf "%s" "" }} {{- else }} - {{ $user := .Values.global.database.user | required "You must set `global.database.user` when using an external database" }} + # {{ $user := .Values.global.database.user | required "You must set `global.database.user` when using an external database" }} + {{ printf "%s" "" }} {{- end }} {{- end }} {{- end }} @@ -96,7 +101,8 @@ Renders the name of the secret where the database user will be referenced */}} {{- define "airbyte.database.userSecretKey" }} {{- if .Values.global.database.userSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{ printf "%s" "" }} {{- .Values.global.database.userSecretKey }} {{- else }} {{- printf "%s" "DATABASE_USER" }} @@ -128,9 +134,11 @@ Renders the database password {{- .Values.global.database.password }} {{- else }} {{- if .Values.global.database.passwordSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{ printf "%s" "" }} {{- else }} - {{ $password := .Values.global.database.password | required "You must set `global.database.password` when using an external database" }} + # {{ $password := .Values.global.database.password | required "You must set `global.database.password` when using an external database" }} + {{ printf "%s" "" }} {{- end }} {{- end }} {{- end }} @@ -140,7 +148,8 @@ Renders the name of the secret where the database password will be referenced */}} {{- define "airbyte.database.passwordSecretKey" }} {{- if .Values.global.database.passwordSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{ printf "%s" "" }} {{- .Values.global.database.passwordSecretKey }} {{- else }} {{- printf "%s" "DATABASE_PASSWORD" }} From 23beafc5e0d756a616d4105dae1519bd715b48ac Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:47:37 +0100 Subject: [PATCH 12/69] Test removal of required vals on airbyte-v1 --- helm/airbyte-v1/templates/_database.tpl | 9 --------- 1 file changed, 9 deletions(-) diff --git a/helm/airbyte-v1/templates/_database.tpl b/helm/airbyte-v1/templates/_database.tpl index 508a2e4c..a21196d4 100644 --- a/helm/airbyte-v1/templates/_database.tpl +++ b/helm/airbyte-v1/templates/_database.tpl @@ -11,7 +11,6 @@ Renders the database host {{- else if .Values.global.database.host }} {{- .Values.global.database.host }} {{- else }} - # {{ $host := .Values.global.database.host | required "You must set `global.database.host` when using an external database" }} {{ printf "%s" "" }} {{- end }} {{- end }} @@ -36,7 +35,6 @@ Renders the database port {{- else if .Values.global.database.port }} {{- .Values.global.database.port }} {{- else }} - # {{ $port := .Values.global.database.port | required "You must set `global.database.port` when using an external database" }} {{ printf "%s" "" }} {{- end }} {{- end }} @@ -61,7 +59,6 @@ Renders the database name {{- else if .Values.global.database.database }} {{- .Values.global.database.database }} {{- else }} - # {{ $database := .Values.global.database.database | required "You must set `global.database.database` when using an external database" }} {{ printf "%s" "" }} {{- end }} {{- end }} @@ -87,10 +84,8 @@ Renders the database user {{- .Values.global.database.user }} {{- else }} {{- if .Values.global.database.userSecretKey }} - # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{ printf "%s" "" }} {{- else }} - # {{ $user := .Values.global.database.user | required "You must set `global.database.user` when using an external database" }} {{ printf "%s" "" }} {{- end }} {{- end }} @@ -101,7 +96,6 @@ Renders the name of the secret where the database user will be referenced */}} {{- define "airbyte.database.userSecretKey" }} {{- if .Values.global.database.userSecretKey }} - # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{ printf "%s" "" }} {{- .Values.global.database.userSecretKey }} {{- else }} @@ -134,10 +128,8 @@ Renders the database password {{- .Values.global.database.password }} {{- else }} {{- if .Values.global.database.passwordSecretKey }} - # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{ printf "%s" "" }} {{- else }} - # {{ $password := .Values.global.database.password | required "You must set `global.database.password` when using an external database" }} {{ printf "%s" "" }} {{- end }} {{- end }} @@ -148,7 +140,6 @@ Renders the name of the secret where the database password will be referenced */}} {{- define "airbyte.database.passwordSecretKey" }} {{- if .Values.global.database.passwordSecretKey }} - # {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{ printf "%s" "" }} {{- .Values.global.database.passwordSecretKey }} {{- else }} From 63c8e173c981da19869b9e08200ac2feacbde770 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:50:03 +0100 Subject: [PATCH 13/69] Add default global.database values --- helm/airbyte-v1/templates/_database.tpl | 18 +++++++++--------- helm/airbyte-v1/values.yaml | 10 ++++++---- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/helm/airbyte-v1/templates/_database.tpl b/helm/airbyte-v1/templates/_database.tpl index a21196d4..fd0e5ef8 100644 --- a/helm/airbyte-v1/templates/_database.tpl +++ b/helm/airbyte-v1/templates/_database.tpl @@ -11,7 +11,7 @@ Renders the database host {{- else if .Values.global.database.host }} {{- .Values.global.database.host }} {{- else }} - {{ printf "%s" "" }} + {{ $host := .Values.global.database.host | required "You must set `global.database.host` when using an external database" }} {{- end }} {{- end }} @@ -35,7 +35,7 @@ Renders the database port {{- else if .Values.global.database.port }} {{- .Values.global.database.port }} {{- else }} - {{ printf "%s" "" }} + {{ $port := .Values.global.database.port | required "You must set `global.database.port` when using an external database" }} {{- end }} {{- end }} @@ -59,7 +59,7 @@ Renders the database name {{- else if .Values.global.database.database }} {{- .Values.global.database.database }} {{- else }} - {{ printf "%s" "" }} + {{ $database := .Values.global.database.database | required "You must set `global.database.database` when using an external database" }} {{- end }} {{- end }} @@ -84,9 +84,9 @@ Renders the database user {{- .Values.global.database.user }} {{- else }} {{- if .Values.global.database.userSecretKey }} - {{ printf "%s" "" }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{- else }} - {{ printf "%s" "" }} + {{ $user := .Values.global.database.user | required "You must set `global.database.user` when using an external database" }} {{- end }} {{- end }} {{- end }} @@ -96,7 +96,7 @@ Renders the name of the secret where the database user will be referenced */}} {{- define "airbyte.database.userSecretKey" }} {{- if .Values.global.database.userSecretKey }} - {{ printf "%s" "" }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{- .Values.global.database.userSecretKey }} {{- else }} {{- printf "%s" "DATABASE_USER" }} @@ -128,9 +128,9 @@ Renders the database password {{- .Values.global.database.password }} {{- else }} {{- if .Values.global.database.passwordSecretKey }} - {{ printf "%s" "" }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{- else }} - {{ printf "%s" "" }} + {{ $password := .Values.global.database.password | required "You must set `global.database.password` when using an external database" }} {{- end }} {{- end }} {{- end }} @@ -140,7 +140,7 @@ Renders the name of the secret where the database password will be referenced */}} {{- define "airbyte.database.passwordSecretKey" }} {{- if .Values.global.database.passwordSecretKey }} - {{ printf "%s" "" }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} {{- .Values.global.database.passwordSecretKey }} {{- else }} {{- printf "%s" "DATABASE_PASSWORD" }} diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 1531318f..81a4c52a 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -77,13 +77,15 @@ global: secretName: "airbyte-airbyte-secrets" # e.g. "airbyte-airbyte-secrets" # -- The database host - host: "" + # -- Value will be overriden by TF + host: "airbyte-host" # -- The database port - port: "" + # -- Value will be overriden by TF + port: "3306" # -- The database name - database: "" + database: "airbyte-v1" # -- The database user user: "rds_admin" @@ -91,7 +93,7 @@ global: #userSecretKey: "" # e.g. "database-user" # -- The database password - password: "" + password: "pwd" # -- The key within `secretName` where the password is stored #passwordSecretKey: "" # e.g."database-password" From 4e851c57e359098d49eb43daa345f9c8e79242c3 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:54:00 +0100 Subject: [PATCH 14/69] Comment Chart.yaml dependencies on airbyte-v1 --- helm/airbyte-v1/Chart.yaml | 132 ++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 607dec54..f12c937c 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,71 +1,71 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x -- condition: airbyte-bootloader.enabled - name: airbyte-bootloader - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: temporal.enabled - name: temporal - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: temporal-ui.enabled - name: temporal-ui - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: webapp.enabled - name: webapp - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: server.enabled - name: server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: worker.enabled - name: worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: workload-api-server.enabled - name: workload-api-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: workload-launcher.enabled - name: workload-launcher - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: pod-sweeper.enabled - name: pod-sweeper - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: metrics.enabled - name: metrics - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: cron.enabled - name: cron - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: connector-builder-server.enabled - name: connector-builder-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: connector-rollout-worker.enabled - name: connector-rollout-worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: keycloak.enabled - name: keycloak - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: keycloak-setup.enabled - name: keycloak-setup - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 +# dependencies: +# - name: common +# repository: https://charts.bitnami.com/bitnami +# tags: +# - bitnami-common +# version: 1.x.x +# - condition: airbyte-bootloader.enabled +# name: airbyte-bootloader +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: temporal.enabled +# name: temporal +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: temporal-ui.enabled +# name: temporal-ui +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: webapp.enabled +# name: webapp +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: server.enabled +# name: server +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: worker.enabled +# name: worker +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: workload-api-server.enabled +# name: workload-api-server +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: workload-launcher.enabled +# name: workload-launcher +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: pod-sweeper.enabled +# name: pod-sweeper +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: metrics.enabled +# name: metrics +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: cron.enabled +# name: cron +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: connector-builder-server.enabled +# name: connector-builder-server +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: connector-rollout-worker.enabled +# name: connector-rollout-worker +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: keycloak.enabled +# name: keycloak +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 +# - condition: keycloak-setup.enabled +# name: keycloak-setup +# repository: https://airbytehq.github.io/helm-charts/ +# version: 1.2.0 description: Helm chart to deploy airbyte name: airbyte type: application From f8fd59d14bb693ab02fce9d57585bc1c9448dd12 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:55:31 +0100 Subject: [PATCH 15/69] Comment Chart.yaml dependencies on airbyte-v1 --- helm/airbyte-v1/Chart.yaml | 66 -------------------------------------- 1 file changed, 66 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index f12c937c..95553bd9 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,71 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -# dependencies: -# - name: common -# repository: https://charts.bitnami.com/bitnami -# tags: -# - bitnami-common -# version: 1.x.x -# - condition: airbyte-bootloader.enabled -# name: airbyte-bootloader -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: temporal.enabled -# name: temporal -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: temporal-ui.enabled -# name: temporal-ui -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: webapp.enabled -# name: webapp -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: server.enabled -# name: server -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: worker.enabled -# name: worker -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: workload-api-server.enabled -# name: workload-api-server -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: workload-launcher.enabled -# name: workload-launcher -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: pod-sweeper.enabled -# name: pod-sweeper -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: metrics.enabled -# name: metrics -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: cron.enabled -# name: cron -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: connector-builder-server.enabled -# name: connector-builder-server -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: connector-rollout-worker.enabled -# name: connector-rollout-worker -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: keycloak.enabled -# name: keycloak -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 -# - condition: keycloak-setup.enabled -# name: keycloak-setup -# repository: https://airbytehq.github.io/helm-charts/ -# version: 1.2.0 description: Helm chart to deploy airbyte name: airbyte type: application From c7f18c6e5a69eab13c82698a1379bdd2ced5a4b1 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:57:45 +0100 Subject: [PATCH 16/69] Remove chart lock --- helm/airbyte-v1/Chart.lock | 51 -------------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 helm/airbyte-v1/Chart.lock diff --git a/helm/airbyte-v1/Chart.lock b/helm/airbyte-v1/Chart.lock deleted file mode 100644 index 1eb0e17d..00000000 --- a/helm/airbyte-v1/Chart.lock +++ /dev/null @@ -1,51 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -- name: airbyte-bootloader - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: temporal - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: temporal-ui - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: webapp - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: workload-api-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: workload-launcher - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: pod-sweeper - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: metrics - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: cron - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: connector-builder-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: connector-rollout-worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: keycloak - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: keycloak-setup - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 -generated: "2024-11-07T16:46:04.022416291Z" From a4ad60a1ad6bf45b50fece740d63223fd8d712b3 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 13:59:53 +0100 Subject: [PATCH 17/69] Add chart loc k --- helm/airbyte-v1/Chart.lock | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 helm/airbyte-v1/Chart.lock diff --git a/helm/airbyte-v1/Chart.lock b/helm/airbyte-v1/Chart.lock new file mode 100644 index 00000000..4731a935 --- /dev/null +++ b/helm/airbyte-v1/Chart.lock @@ -0,0 +1,2 @@ +digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 +generated: "2024-11-07T16:46:04.022416291Z" From eb380c7b11a30673452762153dcf8ddb8ced88ef Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 14:06:11 +0100 Subject: [PATCH 18/69] Add the dependencies --- helm/airbyte-v1/Chart.lock | 51 +++++++++++++- helm/airbyte-v1/Chart.yaml | 66 ++++++++++++++++++ .../charts/airbyte-bootloader-1.2.0.tgz | Bin 0 -> 19006 bytes helm/airbyte-v1/charts/common-1.17.1.tgz | Bin 0 -> 14611 bytes .../charts/connector-builder-server-1.2.0.tgz | Bin 0 -> 19500 bytes .../charts/connector-rollout-worker-1.2.0.tgz | Bin 0 -> 20393 bytes helm/airbyte-v1/charts/cron-1.2.0.tgz | Bin 0 -> 19551 bytes helm/airbyte-v1/charts/keycloak-1.2.0.tgz | Bin 0 -> 20269 bytes .../charts/keycloak-setup-1.2.0.tgz | Bin 0 -> 18955 bytes helm/airbyte-v1/charts/metrics-1.2.0.tgz | Bin 0 -> 18104 bytes helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz | Bin 0 -> 19381 bytes helm/airbyte-v1/charts/server-1.2.0.tgz | Bin 0 -> 22346 bytes helm/airbyte-v1/charts/temporal-1.2.0.tgz | Bin 0 -> 19894 bytes helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz | Bin 0 -> 18280 bytes helm/airbyte-v1/charts/webapp-1.2.0.tgz | Bin 0 -> 20452 bytes helm/airbyte-v1/charts/worker-1.2.0.tgz | Bin 0 -> 22793 bytes .../charts/workload-api-server-1.2.0.tgz | Bin 0 -> 20958 bytes .../charts/workload-launcher-1.2.0.tgz | Bin 0 -> 23369 bytes 18 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/common-1.17.1.tgz create mode 100644 helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/cron-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/keycloak-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/metrics-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/server-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/temporal-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/webapp-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/worker-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz diff --git a/helm/airbyte-v1/Chart.lock b/helm/airbyte-v1/Chart.lock index 4731a935..92a366ec 100644 --- a/helm/airbyte-v1/Chart.lock +++ b/helm/airbyte-v1/Chart.lock @@ -1,2 +1,51 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +- name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 -generated: "2024-11-07T16:46:04.022416291Z" +generated: "2024-12-06T14:01:16.900954+01:00" diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 95553bd9..607dec54 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,5 +1,71 @@ apiVersion: v2 appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +- condition: airbyte-bootloader.enabled + name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal.enabled + name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal-ui.enabled + name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: webapp.enabled + name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: server.enabled + name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: worker.enabled + name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-api-server.enabled + name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-launcher.enabled + name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: pod-sweeper.enabled + name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: metrics.enabled + name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: cron.enabled + name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-builder-server.enabled + name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-rollout-worker.enabled + name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak.enabled + name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak-setup.enabled + name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 description: Helm chart to deploy airbyte name: airbyte type: application diff --git a/helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz b/helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..23f9ec65aa21f301c8681a474d94a7d4b98c7d66 GIT binary patch literal 19006 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 J+Z+IZ0RY0N)YJd~ literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz b/helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5a0963f41cdaf2b6951597519bc49680d75dc998 GIT binary patch literal 19500 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 P00960H8X%F0O|n%Rg#Pj literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz b/helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..db6c0790094df7e978d94e019ec718fd4ad3844d GIT binary patch literal 20393 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 Qg(OJD&PMjy?6EW1zMAY@jqy-* z@zz@Q(@Poh0>}{C(4$0uiifK6OdB`>lN})}?-?4T5r}Yn!;~x-%mQN}-#bq^p%_MN ziy}s%3GxJS+w%WAUP2i6aza!;Z&~o#w4|oEO!J{iAWyVG;`1ik9w++e&X!!w-r@ko zVkdb(lBv2-_TK`MO#fZ1UfX80IF2qCf;0~Gb*TFZ3`WR6*aRl0;kMra>!N_GKe-$K z?g)7q!>JU#RQeoYrbaaS6re8fYK`y8?tD7zbAXi#~ z;74z3>-P56hmuO4(BW33O0liC#|K9z7f0T;hskj)A*>0gf+R@OuB^_+r!fczpTG z>HACYasT{$|K#%c=mMOcgM-tP!{f{2(~}Eu`V-hc`3HD&d~&!65LSk~Pl?PYK`6ju zxt#mXg-#A*kZ0C=X^O=Gh+sTS;Shl#nILsYkRUq7Of8Tw4xI>(vB^(SX^#ILT|Dyi YJUvg(qd)(D00030|7e3kRsaG50D-6tlmGw# literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/cron-1.2.0.tgz b/helm/airbyte-v1/charts/cron-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cc8a2b5a174f0273b8659e1af70dc39483819ce2 GIT binary patch literal 19551 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 O0RR6kh?g}0=m7vbgIsU` diff --git a/helm/airbyte-v1/charts/cron/Chart.lock b/helm/airbyte-v1/charts/cron/Chart.lock deleted file mode 100644 index 435017d8..00000000 --- a/helm/airbyte-v1/charts/cron/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2022-10-25T16:47:38.253767-04:00" diff --git a/helm/airbyte-v1/charts/cron/Chart.yaml b/helm/airbyte-v1/charts/cron/Chart.yaml index 5fbd9dbd..6db7eefd 100644 --- a/helm/airbyte-v1/charts/cron/Chart.yaml +++ b/helm/airbyte-v1/charts/cron/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-cron name: cron type: application diff --git a/helm/airbyte-v1/charts/keycloak-1.2.0.tgz b/helm/airbyte-v1/charts/keycloak-1.2.0.tgz deleted file mode 100644 index dfb5a0576498a420bf8014d672b5a2b6a566aaa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20269 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 E0Fm4{UjP6A diff --git a/helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz b/helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz deleted file mode 100644 index 2cb6bc86d90695ed5569f385dba6a94b9e455a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18955 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 diff --git a/helm/airbyte-v1/charts/keycloak-setup/Chart.lock b/helm/airbyte-v1/charts/keycloak-setup/Chart.lock deleted file mode 100644 index 5974e298..00000000 --- a/helm/airbyte-v1/charts/keycloak-setup/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2024-11-07T16:44:17.163672506Z" diff --git a/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml b/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml index b46bc335..a4eff29e 100644 --- a/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml +++ b/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-keycloak-setup name: keycloak-setup type: application diff --git a/helm/airbyte-v1/charts/keycloak/Chart.lock b/helm/airbyte-v1/charts/keycloak/Chart.lock deleted file mode 100644 index 0813d16b..00000000 --- a/helm/airbyte-v1/charts/keycloak/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2024-11-07T16:44:10.502425544Z" diff --git a/helm/airbyte-v1/charts/metrics-1.2.0.tgz b/helm/airbyte-v1/charts/metrics-1.2.0.tgz deleted file mode 100644 index 10a7f16a23b4f51798b0bc0c4d40ce897b33a5b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18104 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 Q7XSeN|MpQ4X#mCn0Q3XP^#A|> diff --git a/helm/airbyte-v1/charts/metrics/Chart.lock b/helm/airbyte-v1/charts/metrics/Chart.lock deleted file mode 100644 index 017faffa..00000000 --- a/helm/airbyte-v1/charts/metrics/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2022-08-31T12:09:18.473209+01:00" diff --git a/helm/airbyte-v1/charts/metrics/Chart.yaml b/helm/airbyte-v1/charts/metrics/Chart.yaml index 9513bfd1..84bf0611 100644 --- a/helm/airbyte-v1/charts/metrics/Chart.yaml +++ b/helm/airbyte-v1/charts/metrics/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-metrics name: metrics type: application diff --git a/helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz b/helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz deleted file mode 100644 index 9fbd245688d85f29f33db4536a803f986c1a0c3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19381 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 A{{R30 diff --git a/helm/airbyte-v1/charts/pod-sweeper/Chart.lock b/helm/airbyte-v1/charts/pod-sweeper/Chart.lock deleted file mode 100644 index 5fdb23f1..00000000 --- a/helm/airbyte-v1/charts/pod-sweeper/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2022-10-17T18:35:27.057672332Z" diff --git a/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml b/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml index 3fdc79dc..919123a9 100644 --- a/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml +++ b/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-pod-sweeper name: pod-sweeper type: application diff --git a/helm/airbyte-v1/charts/server-1.2.0.tgz b/helm/airbyte-v1/charts/server-1.2.0.tgz deleted file mode 100644 index 5134142478762aaef32659cb290c639e73e396c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22346 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 diff --git a/helm/airbyte-v1/charts/temporal-ui/Chart.lock b/helm/airbyte-v1/charts/temporal-ui/Chart.lock deleted file mode 100644 index fb50c706..00000000 --- a/helm/airbyte-v1/charts/temporal-ui/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2024-11-07T16:44:37.102389418Z" diff --git a/helm/airbyte-v1/charts/temporal-ui/Chart.yaml b/helm/airbyte-v1/charts/temporal-ui/Chart.yaml index b6769df7..590c8b4b 100644 --- a/helm/airbyte-v1/charts/temporal-ui/Chart.yaml +++ b/helm/airbyte-v1/charts/temporal-ui/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-temporal-ui name: temporal-ui type: application diff --git a/helm/airbyte-v1/charts/temporal/Chart.lock b/helm/airbyte-v1/charts/temporal/Chart.lock deleted file mode 100644 index 4deb970e..00000000 --- a/helm/airbyte-v1/charts/temporal/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2022-10-17T18:35:19.234598793Z" diff --git a/helm/airbyte-v1/charts/temporal/Chart.yaml b/helm/airbyte-v1/charts/temporal/Chart.yaml index 20a9d427..468bee38 100644 --- a/helm/airbyte-v1/charts/temporal/Chart.yaml +++ b/helm/airbyte-v1/charts/temporal/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-temporal name: temporal type: application diff --git a/helm/airbyte-v1/charts/webapp-1.2.0.tgz b/helm/airbyte-v1/charts/webapp-1.2.0.tgz deleted file mode 100644 index 93e6d157d408dde448e14e5f12e2b3a529569c9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20452 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 diff --git a/helm/airbyte-v1/charts/worker/Chart.lock b/helm/airbyte-v1/charts/worker/Chart.lock deleted file mode 100644 index 7000cfe2..00000000 --- a/helm/airbyte-v1/charts/worker/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2022-10-17T18:35:31.130386898Z" diff --git a/helm/airbyte-v1/charts/worker/Chart.yaml b/helm/airbyte-v1/charts/worker/Chart.yaml index 4e1892a2..7af3b504 100644 --- a/helm/airbyte-v1/charts/worker/Chart.yaml +++ b/helm/airbyte-v1/charts/worker/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-worker name: worker type: application diff --git a/helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz b/helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz deleted file mode 100644 index 3045136182ac2afd04fa8518d925d46417b7fa6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20958 zcmV*2KzF|%iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POvJTN}BOFpTft{uH$)=MK!F+cpp~$Gh44Ccw;LCkgz3nf%T@ zGf$AaWm`kL)g!4*e3Cq${kinkt$yHXuaEzGnXJ``r+ghG(x7*#{+f)B`yWR4?-MyXOzxDQB_I7*wFMBWc{;k`4(S5o1 zZ_r&&^YfpS3&j4dd*`;wo%==}l#pLAmg*d@+h~t1@-fwvj zqY3UqKqnI#w*VMUC?|rlSs%tiB)s401d@NaKOiDT6XFMS(lLLx00bKGeha_@^Ulj) zP4kvN`X5^%<^dy#P_O=uqX{U$ASi@5iRcW(7=z2eAQ_khxTTS-;q8`~CAbeLNg@&; z3A!~c_V=*||MF@6Kg6@{>Fvy>-b=sN3dsm_(FZ<8 zJ1_S8Aqs+*yDwjM(Tn}PZqV)ZaCiUZaQOZAd)+V`e*d@q-QF-BnGcjvPExBkw{{)-)dr}y&3UeD{k?038E zf3?Yci>Ge>Pf?U&zCHzD{`}wB+1;ztAY1;L|B)jD+?B{wNqaq_IFG#*Fvj*WX(J8yot=1&(kaD0_njIO6at9sGd< z@jG~sax8TPp5TBCXFzXaK%qttMZirxh;+pvWlooDvqk8A`1HkTdetW9wp3^#L;?*E z$8ub1NM&FBA}6YPC$WMf8eC%rWP(Q6&>X}V3AiCqq;#H{#12J~F2ns6=)ZJ383cw$ zgbSuhCutN(J`h97CZ-+?8J%nc_D8;275bgdWaimg{qMWoZbw1PURk_1;6!03&`1K8 z^pfO2gbii_TeKiU2Xlz201^jL8e)iP>=nxbPlGWa4uh1>2K3`L2s}wBL(w)&NKEK9 zU=jEVpgAvi-tm-F9JU zex!61VK|Iv8p4I3OiuaD9}h3K6iMC~lE9&oQ7Nk-&?w-RLO&i}*e*#bRm;hh1IL1( zh{NR=LxRLu5kl6KA2}d~;f4_*a14UZ1@YgU#_$?(yuSxH4rqu&_(Q(?@$d}XriLU^ zVpiZ-Xp)Qq-Y=0ZW9AJw8N!UF3YCdmL*-bYIOB3NV-!!x1wpTc9B2$Y7~?RFFxv*L zq5+CSwY|kG1D`J`d|UQD298AmVL=sD6nPA*C`51w|9x@#PIbtDbE=j5P$m`Osv*^) z+Zsv*1%^3|rkKN~pwQ7hK5ec+? zLa(3Z_ljU0sB*!)T&9j(<$O58LzG4$8*?S?o^v?J>^rS&;dl3V27IT^bOMlftq&)| zcT}7)%%u*a5KU-!5XV%g+3cuA2Vtl=8j$nZAZAccXxQ4=Xca*yWypdqD_c2KqgFKm zbQCKEE3lg61rAb1#7wG|_@e;(ThHl_A{(cyhOB@55lxavZk9JT8eyrAQvXTg1OAT2 z=adSEb4^&%4P9uWDQ&x9D3ihA z&mkgH982v+$`jc-QNI#K2bfEk3=i{-|8+XREXD$JpU_T71KtscU-M32TlNwfdRYU` zd)ttgHR9<;IvY;qtl12)Gx;i8b&vI0TlgsDW8S-($|NRImK@;-%`R|2QAclxUDZ`gzhPm9F!4LWci0sWW zV0fx@&m7E!ez5>dtMEb!kfLk`sG)ct_PbJmxYU!Z-vTHSM2cvDau53;mBli`nK;jw zs+L`fUu*cKRDCsuDORq7w~%EPgII!T76Vz5Z59Jsl5r}4TE#a@v(E1QvCf52r;VyLQ{oVFs3BP)e4D;50|QJ#HrjoGmJRq zQVWO!{Vx+-E<$oP;CM}N?l^6->sB5GJlft0lDY}iIsPYP(rzSzHOv|q_l zBpxxjB4t8d*+G#MK3oYcL5=B6Goaa39h{x`tI2xPkdp9lg9j){eDf|h7U^BRT;d#y zQI29jSqSD}OYY2SKm`%v{2iKLxKJXNU~T~%W}oEf1bVJ;_^(&c^LyX_wGJAp+oqiu zeB6&Ajj@!;*Lc=fr$Ue*!gw9bF_q#`PV|UyA$Q{PO^ha3ZOsO98#ToYhkA)oOIeWw zejQj5N_Zlj26`Z;HjT|=$PO7^QDr6C$g%XZwhh4 z3PDRs%E)cdJuxUW>xqaPxEjf<(K_r}#zy8xc#0!ExO4>im()t=2#{z+bR^-Z*L`T8 zy!+v_t?N35thY3k`h^|KgZx-z>V9`5Oty4x@-5%pdc)?;7{|t%dDXNp_Um`kujC+I zZK)l41wFHGx5waOl7xhr&AGOfo$0X=lSE3PDu7I`7HoKpy)G{S57E{6y;R2HBcd0v zVi(K3%g*HL`j_Ea?P1H+el{xSdo33^Dsc26ppjl#TN+1gx&lronBjzWMxzL}I3hg4IGGhk0!0al zv3V!;eH4d%`1QFe`+OUo?{}a7-fGpsF81d*o@Sl6NY#m@HfG^?3RA?0l?!I5C0mv@$MLjCkb{%+ z*Z;UY{_xB3`NhfUJIfvt>JN-ga^A>}!GFRtsckxgt|8fT793BVZ*uXiHezO`#72@( ztK7=Go-gT!f`wCWT}04YtEQ3+ri_siM+cV&uMaMcKb#$0T)aO$Kk5S)jK(9+9_W?I z{d{qJ-iOJ|3kRN5lv);ErWNCO`aw~@jOZ#u&B-K*q#_j74!9gG(~PEbiGY3R`g>h} zucbb2WE$W}EHIOlIx4BCRBm`6xpn4nl27xIBPf7AaX90dJ@av@cj zKcjx9^XyXrkuQDcg>2U?aP<015djGjsxXUv=}W{rE}s8=`ugHS2ITF@yOXy+zy0vT zn}57N_{WF0CqJGaT%Mf1bBAW^aip zH?m%@k+RQ->XtpVIY@|^y#tIGW|#CD#}|%HSUBF%WjrAZdFmWGS8(m2q;ov2i-Rhz z4*&G|bbWK`(7w5~YdouIOun7lmfKI&`4A7%QLWm~@PrC{B){tg{6)9>;>j;Cd+PlE z1fC>Prtr>(F^&?~z70R+0!Q_BNN{9aM3hw(hx#m;aM&E^L;Rz67qYC z{D9^-W>nBX{BunrUDx7Sc)22S2_vx>Li;b=`wMTEVChDeXRrD{3ry#XrrIiK-w8RA zYD5it=u&E-o-?YdR6eBTuDDdze;ZE?_^iBHP=KNR*EY02v{#=(%Aen;63rOu?;6E1 zjwU`IYj6KPeEO6*VU|1O>n5w;c|i%v3TkfFUCjMaFTGk6^aihvN_wLE^_Y{G3ls;qh_^eP z3P>Mm+`@rTr8L$Bw5@Bgao{Woafc~$4Zl3kiY-6(3ikBeKWI4V&rTo4FwC zv|-a-B0FtWWNQmHwPUpTZ_ z)-Kg_`~RKpPH*Q){y)Uy#{Z)v;hkx(bxq>14@bGNae@VsdSkz3 zPbyqRRtF0!MUp#PSEbQ{QJ-~Kgc5mW{Wr>X2cIF9t4S#WL7SrGIeXcEEZ1hbLa zJ>M`Q@Z9Pp$y`%ps~I(;po3hqkia7oilv>Z&S@l9)t{3P2_5yp+&7jy6ZG-t7)=q0 z&>+Hn=;rS)QZ~ZMfBi2l04p>Mp&gEqPgJ1!EvWu|-nG@}{xFoUpqJ6U7UMjg!6{Rs zikVg-iKdph;}EkpY=$Hd&{l8TH6Yt2exVJ|mPfIQpc~7P6?462>IZXmwB3dl<6gqt z3JLXhO$4(e9Lz{oOEpr#)rZc~D7rAGr&;;(mm*CVibr^PV78jos_gl)vJM&3*7Acn zZ*&VTl3AgW3*#LIwE%zRA+4b6dQoO&3eJpoLDq$ScU&`9$$ZM>o{D$CGJ|_}6zd#E za*i%}e&i6044nsM@k#{X1Yl+0y^{Y!jZ&IN6=iI1d{10eB;UbqDlbHftd5L(w&l*6 zY$Do-wzeZHDxrK|zO=KNIG*;KB)d9^%sfAx=4>DT`{0*@50|H>Z$6x!U7no2yKrXz z)Wq|9|9=GrJT$_wh{&M-M|hLGQiuHsW#UyRK5!abW3i3GkYUbWb$#_;-|2%!rE~xa zU%qT>ioTj{^OPqz4qwIXCDtzdXIYdLGeAI_a^9}%a@lvK)M4!;1I|-%l!3yNsi0-E zq~|)&6zkMF(UcKAd3Sky{_fz-hl8^dOs5YZgrt0J4+K7oo_3g>w`RUu^%j5G8 zZ;vm}PYy3W9KSnw{pR@S@sM5ur#a|fTpnCr9DVrV&A~6H=U-JP>M^rjF<&2-U+R!3 zA$WFr{`d$Mkgy0|9=|<1JwJH!$TX}+!y@_q^!%qcrw2!BO1?fmI6prBaC!RE@e;B( z%iA#zTVwRq%K@|y}ri5z`0dd&=`%D^OK0cy-f|?=+rWZ^N@G^k2;@?&YKS z?7B$ZTXRH7UsG*1j9RhH25npa=T&m?-0QA39UC+0I8}Hh zSxps}MmQ^=R*c3fA&lZsowF}tzu3|T@)5nk3^p@$v0bqu>#SxfG=6If+M__$tznQt zt}9QY=?r-x8mulomQ%JA8MgdDRl_jNDSX|MT_|_!6At&-WQmp=i{JA6q7*e(cMR85 z^j0=i7ysp&ZK$za>&wilM6DAI^T`1|wLzheJY|-eFnWr(i?|!=EU9d~fZRQ10b(0A z%X`eNCQQx0`7RbVV=7>Cv%dURwZhicigtM$FfV0??Il8+FKG^|Nd*H6?XmomwxZ%@0&IU5}AyA zK2}K+d_p?|6pnDm6!%PNkHkaDCP?S7`QKd3BK&F?A>r{qQ^fEV{QIw$<*OJMG$G4- zPVr^hIB@Q>4Dob93wddE)yX3Gt=4L{QtB+Tf2M?~9FDxz`V8lJoZM$H84PE4zO)L#2v?S3t4# zIZr72*@i`ahO19suHZ9BFwOTbG?XtM!F`4SrI9S6GW?WEl~30`1Bn&97v1iQtn4CK znNLRpMpc`=ayI@9SHJ#VETr8Zn!Z-Nr<)2Ig?k=4CEa{p(bD-!Q=_?^x2A;A`3o1j z!DkyB`x&mZn|QmnK)q95!*p5T z{gtiHyA3t!Jg2fs``w0GMK7tWe6Oi|#gQqm(om!1LRD8jOPgI}t9L(~=Hpfflxtvu zQiNo4srly=&~~>@RmY0bF$c*L}HLKL6W)vG-*Ed5EWU@)jV0N9vxSlX%Dw7c31#%5d>; zf2V~UyNbQ(KQ|Zj;Q-!{0YhvC%0!}gNO={E7)=u?ZH!GKq9YQ(0E-)pW3VO*W6fxR zzQ#&hSctw0TJPA@6)J-n5W#UY^jl+UPtbV3(-{#lP6w_P#4@#D70bvG@~ z_O&%ZB#(!-PH?ZyM}U+?OZ2OytC_a5i>ACKYUX8bZf*(&B;)%K>5*(rO9TGcto!t= z;aM#IO?rZR%m38v_V)M7`JZ~dC;9&%&&CFn#NfsToG4+-w5eKUxjj7T93Fw7G}3ow zB#cU}8*_DA&Hv%oBmr}Gkg~ez`zi9@Ry29~+V#io_0waY#q;0E25LhBP9+mKNN+x}kRC7ooEEoM(6G@g}jQe0S2zS0~onw)*7!Yte6v}py zT@|QOWU3o0S~aQR9KMmYxGw=@nQpG}tPSlSPEXq=>kYT*TiUM=&fD_;|F>-tbXKx3 z&u>9iNf;ht#&CF~u4TE%?jAf*E-vQv@kbn_N_TB37cW%_$AOawO$6iPj|sz^7t>#P zS#Yy|jc3J(E_*+W)Thf~z`PiX=wysCHxiXX-#yhtUDR-m%fIzu?Ul1_y5l%TEWFb= zN&xpej=BX|#V$w752I^cyTojgIq-c$V>xH^?l5rKn90fBhPIw9_cDTd@CsRkl-bF& z>G~=zCpCNrph|LEfU5ar6{xyK0ji<*9NH@hn9$JDzoV?Qf~-Cs2@Ol~Frbr!#yA$) zSg7N{w|VZ$cF`}>`BF>|w&XZDC}atPGbG%bAlhy4^AB0s3KC8g)u%0}B6@q#oKsy+ z>OzLei-PMclrny*!QCv6g?112Ck65vDsDA~pk@rM0>Vrp>5Mj8<)T?qziNvAtdh?3 z=TN@VTq)$T7>9so+we?Z(%OGjGbm+@o@oJRl2MqW@)~heX;>wCO;CUfasHucEx3FeUr1W$UV;F%vZsOo1Ck!w_g1uT;CL|O9H!i{@s1{ zHH16gV&*M9?@CQp=iJ?9+%ofR&J0`IRR8-2Y%_o6KLxuJJa3(3)E}Z-)&MZ+g=;3Vl1S1G#y`#N~X@)io|+(XIkNp z0>{dlu^hb&q9h*q*Wc^A*49Y6fYJC5I#`luw)8{t)<7y~%aO_!T_1UzdsUXBkW*o4 zBK7tjoT^FOU8PL=^(7n}3RfsmD2 zqKH+NABSP<8~)p!8?F-_b>q2sx^+^k{)6s#a`?!MmZ22(MnjQmqM zaIHkbdDYiP%ER-cWeFIta0U9^o%K*ca<*TIbPYAvN40~q6BDzrB<)Z_Y=z}X*j)z+ z&0USF^Iv1#^^x)KlC^0pPy}Z*go9L29-s)bC8;`2&?3?ZiD=D{Ap_Rd$ z#G}r1M-^E>+)9NevM#K={BUrUl~VRXj*Ge;Tls$4JF^LgU4Qqle(L~k&17H#Y6-?rc^huVBpBz{lA{<<7!n=P3++!| zzO>ctXxhouZy9e>i5B5*+v@61hDZ3LGVHq7f9ixyjX1!UFWL3;3NndDS$?f+tQ}-+ zSrWs4?)tlO^+_WkF#rT@5(~_RD8Py$Lz>268!%&3a`JbV6b2X=p3o@{;bx5W#0Zc; z5gk3}Fd;FSq;cJ7eD~dwN_Cp33^)$1h56u6ru}Ji`fJzw+wWW7{rdlW`Te^uU!JvL zvp^pB41!+hpo6VEqmN>rdEEBcwzB_;&r0@R#dE9Q2ED-lYqz)8EBk--dQbUZ9^_fh z{;S0N<(ScQG}e+w3mTn5PtN0%%m3?hI2-fHjc*KyF%lp_DgidYx}4u?{mjt__w_;L z6h$Od%D}N~pxf2AOBdJEybw2@HNI>(!oC7oygg0b`O!|082f@|k*M8n8`?VDD*Hp< zP|_X}9EGZiF6wo=&MnLp414#5VQ&Qtdl`lmRLpcWc@8u1yo!n2t?a0+W<;ta*eV`s zOP%1{`VD8XzX@VUdtZ4_ZVfyzOMz#TV}w4ukqFSCQ`$tSaj7_{^-k&>>Naqqyp=WU z5dk+eel9?a8NIQKq-@t7gnDq8{gtE}@!7$}#rxCqqYF4bKR-S1!#`-M=VQX? zl!O>&G-VK^Oi>}9zokj8Z)ewyx0@S%WmL(+%l2=^(;_OV&2)v zJMU@s^KQl@viVC%JTm3Y$naZq@h_!H#$TdPtjds|)g2EHeq{ahtnpb%|5Moy)~^5U z?Y($e*8jTuyHEPxLp&?!e~#59VKk8fP+hBPoP{dthv63WPa8HtYa8n4Ii)wtL~rl%Rh(oAK{=)VF#Yty%%+`=}OM{V&e(MMK6pi!xmeB*3s zU3*TwBZGSt^tr{zI)7EW@T#Fkqt}7+HyM_IxyBxKJwoR%ysuo}3dPEFQQdAf8!1Q@ z%$$nLnDh*D9ns(#GdNKUk@eZ6u#uoSY=$^tI6wl2eRZ)}kuUU(%I;m;#%!}Shh3Ar zc!_Cw`Bvcy-}bhfzwK=0TwU~0S%$?6SUF0j^IkHgLQh|m)XaemJ73XceQb4Y?aylZzs(J{+6G{u{@>dv z>;F41p6tI5@~qEO42*6WOd?lu0y6Ebs_dOr1xPaIT&6a*VUj_7Kue@JyYcakBxmGC0}3 z$T@xQzgln-Ugv{Wdmv7kx?Ii$Ugxc}RV~%*TBI9rMqV!iE-U2U^J_fa!7lHE%s2O* zlnOv|m8`oFlvC}5Lt77JyV3?g4LtXw>!2k`WdV{{6rpY9--Z!IVt=pv-8QFKwc4Og zBv)N2=kMyyv`c|tQVlSk0a6Y~l~LuJR_7U#pUnv~4wn!N_B8s;KxykWd=bl5t2vCe zS>qw|{mLFP6&D$mesjLFh9=JKyev%D4kN_5k~Vju=Sd0Ligc}3pYMRQI(hG%x*2f; z%!D^VF&e2833H(3W?z)j^YYCFa59Q<*pd~;{<&@|Rogs`{y>*UG zH7Th=8t_gk$E{QHLfOC?fm`RoL22Ar506V z#DBswD1dI42@&XYl=>)yNin}vwXC=!ub#Y1YM+(#e-o#>X8V7ySJnT!dr$X2KFG6z z{om2$xj=DrTE^u>W-qo=`p9aMei)dR2n!hV~ zS0&Yx{QTCRmE^zXmsQ38Li^8t`TpOX-peQdzlV8NkpIUY6DgsjMjIOgiE=bn`Jo%d zlq+Mryod>fR&|v$vFfKR>0A&aSQ-bgzpMTvlZ$jXBp;#eRdsreq`A#lXAD+oN}R3N zGveCSd@##V*K63K4wwa{dg$r>Me5FONA%y>B~B`tJPI(h|JsK3hxY9|g)+ho(#yGFfjQTgn(5lV~+hfPDOqjwjw ztg?h9IN0)ACqwHCrh#Nm_73eyZs1aMS8ntYd4uhIn#+Qfjiluh`!VAcuM~nS^yO*6wt{) zd7s++`HL52lP9W1z-C_?C2Vtv0%;30)OfETZJL%k706|Ll3j=4=R7CkvI|TdB}xoY zu~U|pD1WP|jGK;YYbEY^0R3+z{ohMQ z=d7EST?$KO@jkhFvvcXby0%$Jr2Npcr48-LEcKvR?8X!`6qRYprDS)r$~!#s+>IMXKT8C?CMw+XTN^ot}1_xMO{R53fS(~s{&=YbB$+9 zi5-;;RYpg<)ExtubVgm&n&r6BRDcL8iRSu$@=E)RMFXX{Xf zOSOR7JQ)J2VPV-8P2&*KSYnYK4Orf@)P2rP&72#oQ7^+)pDiF!(@dVfMKQZ#q`WP} zc@_u^&#&=pZZpCrNYR|F#*FatN}NwgYctfO#Nk#8V8@5EEVkWtbxKfqlH|mb0yCek z+#+qsQ=F@F@mIc|YJz4{7P%t8RUITr$H-Jj@pif2*v!$4sHR|Tr+0lgS5qUJIkTli zF4N-!i1Ce`NmYuP;WN{oCpgfy9n*#9`or^r?9d414a>ge=q+6StIJNdFh0vL>%W3_ z+b*8Z?A$E9&P72v`F{4n7PWwl6m!b=y5O7cXN3(9SkC%Mt0?7lG!-P`{z%=f{sW^E zDb?L8cz7H9lIV99uzb7H)a)-dk9}jqs)TI%Cr80n%XDoY=C-bf=LiX;c3Tmp*J%Rn zsa(FTuKujn7^@A5W_-8&P=at`9v#503TNEM+|TYsKSg%1%2<8rPc>Pjt&UZba^W&p zuzzd+h5y!ukYb(V%80jYG1uRJi`%w)y4CsN_QngiVLY8+s=Rj%Wt~vg&oJ2E!*SqV zAK>=ei8Cw(Pucs$UBYG)>Xkc-nxcN5S+~nGXL^=%r_^(tRV6L?Y}yn>#JXihr5+Jym$I%DFwMBs&gWvZmTxq%(%@eRmi1&a zqBoeqrd%TqqGXJqx3#5zzDp;VkpOyIu$d-FwbW;mN99AiY2K>xJRqbZgPSVg5&n3t z59$x1=nWCdI@SK|xAzV$p#6W^@L4KtTrhaCEbx5irS@Ki5_yTjgyZ9MIE--Z)T7dJ=2 zg=Pp)F+a8P+i*-E3*><(S$ZyYC|+ZWcM2?<45rjnzP&Ra6pqU1>j3u)AH8bkma;Y1 zBn7BcbMNgcw)kp(rMX8WN>*2EnNOSePjw7bD6&;DE88{PEu(`Te{28NcJnN_dc~r; zT9K*8tg$ywi^4J5hb6G>#hxJhN|ZVz*-Z2Hs8gz^tG ziMHx%e?@skR+|6X1i1G2k8Zb||GD>a_bLA4L7o-nzYgXnvCfyTB5wtSk=)PQ-L*N> zYnA|-gUm7I2n#ds=Wpw6(qr>h)$#1hCFMdx!`TjdikS8JsmEEhcS(=q=`V=cn>z8w zgfd}na@7F7e0lY3^Ew^iKtzf-*6`rC?SA@H?_jLI=GGaLg~9CA!K3g8r?C`{uiBrK z$=jDDbkP5oFJId583u^s{XOthlDo2z=5r_}TmunLGt}is2P(+JmGVnIeZcA70sNb>_It zAUl=gm!CcADheXZvCZn!UQ0vg)VJW10hF1N#v-bwkaG8lAf~ZrN-x85&4-jFznyD5 z>lOJ>dF!moiG}vc-d?8r>Ht3b#_$v~j(?Ib`>(+KG^L7M<`yjv^6d^x{n~@4t-_I| z!ww}^F~53tHrIl0CLMeon&;E=H9RZn|2K%mBp$801z2eR?N;o+d%I8fe?Q2xg8u(r zk3OIQO@+Deh0!QdQCMg+Pwmeb$CSTBqdDon&nXr2qT*MB6$Yx4}v1 zy=8KWma}(%)@Q*#kT`_4$A0@Q{OhyNe2jKp?DyL`-RS#+^LHoje(b|}-g^kKz=6Oa zY)X~fNgV#=OJBZ`Wxjmb+6JR?#M#{!I-#FFGLL4!uY+HkfgH359atQ+ZlE(~2is@tl$^$9D0wg!~VAR+0aXb4%w# zfH+5S$k5`&V1fL9(e3S*|8Ha4**UXvAI`J2G49mHI6r)Q_Iqmk5ch;s@XW00DSReQd>&*PYJ%g=o*Ls=N zd8YfBV|w0_4VptduS=OEs}Dzd*VotmZCoRlC9bmvErq_+>}YZb24p3yssPWp04@bc zmn}gE2S0Pn&KMq&k4u5M#xq}6DnYUygRU=OzBkI_7fNjw-P)8|L77$@o|WT%R0i5| z44FD(-LfAIL3C2eVx&;TvyYdJSF3nMR=V5h5?RB%?L~;?cChNVdjH1!0A{faP&p2g z%6)kjZjB42>yudPk~k*=L;8_K1hJVDAfRp9Dk}pSjfFM2QC5ohn=9NFP8FLuWRAFc z1hKIY?Sg^L&rx(ZrtAuw!_;%D9Ajtg-6cnz@PrMvZr*W6d#uT_<|Mzl#r=0(B@5S!Z{_jDa+wA||%Ar4cz4qOo zWvQ=b?`J#Oxbsud&v)DP**5NH&sRgzm3Dl#z5$0)F~0StuLP@p%ZFGnCISZ{WwnQD zWrUpKWk{(QH*XzFaO6TOD>Q5y&nXoRTSw-6Y8P6qfg_h+>t^D>NX_eo^%rkn=hr{S zNkjt0B2C??mZ(DgO1H%2QEJ>47Ya6SjSY`@a){TwJ1$^Q?2SUwWt7_l;#L^0ZiifS zjC5~UE8wtIb#Py|5yDcsO60YgAc;CX9W5L$IyNw}dNib_Rqg9d|F~wj+uMI=JfiEc|Ma?hySo+p&)!q~$Adh#vj51TKYIPY7#{t{`i($_uf855 zklWj4OOQtUjrz<~X>ZEvO%D~$VX zZEp=w?rM88V83$P+tL=ACJp*NEi`N1=QQ?Vk(tJsP`5DC+^b1+-j?Ls9h$q_MeUH? zzg_gPO*0Sj+}{4D68|q12)fAs>qX`M-@V=LQ~c+HJh!s{%`X0bZ`N=4E8HaU_+~%V z$$RzuQZ3w*nXgRD)r@?q_F7DQE~Hy}d=-$nwZE4O<;mOY$=j>C!&fu$5biYvEsv^KEum3h1|OV^UpMdbDqAU#f+1SL>1j z`jy+3mNsHEt8Vvc!nmL5b!W?ko>$+vKUcjP{mqT$@+QJe8h+h=T(^C0ZU0Fq7bAw3 zF#;{{|LW~m>_0DdpW^=>=DCgi=S&a%eHeipuKH>$K{-y%=AgXH-E2ZmTlZraswePD z)*%PP9n-+nK&mwnWxLC)yu1Bc3{^^d`}lTl1>SmU8Ud8;%M&xv%leqeIVro42kt zUYf5mi<^7@Ew=gwUJ@Iu?GjcJ;*E>S{2mn5>Cz^q;ZCL6QcgP#dumQmH{>s@Wm0sz z#)jgkKboy+@d~<{C1No=XQ9)CYP{xm1qLlQve;p^ey3~`nQxZI)WN0RhO|}e&Yb;p zV;idiUbCsn>EenUb33Ee96)!pT)Bhwb(^oOv7@3At~dk@YUMo|L)N=JSh`2|B0ch= zKW7J`izSHCm8(;84&Q=1$C8T5SiIAzu2QvR+{oIMRj9tjdypiqvU)pFQdD=pVJ@!i z&-$dBOXw9PT^Z^EP-~WVZfnWyMPBXR_8VrG#y%}znFf|fO4Hoshk4~5$9{Zk`!B;G zS@I%?1^$2gyWMWt|8M8%{>O)TTDLI(pUbhopYUJJR$qf!h zLd@mNvbx%G7THFJy8@7FJmY?%%9a4BD<=>m|HR=hnDGV^T>+R=#h>arZG9I~vkhBF z4U^4aGk1PdS0a`A(XMl%*jiYtS^@uA+cj$%Y%;eu>eb8mft8KL^? z-!^UZzM{#_@jokZ+Z^9Hw`8+zyC{Mi8(!H@&TakMH(W0=Lumm!Z>_Fh6jn1n)x)^s z&P)USDosv$#nX35+Krg*{nC_H78$c}-s2u?ZCXh4vfn(+x{f<$^GSa=#=$kuPGJ(7W9^DM;Y7s>IWG%HSf+?$=(Yl<74lizV+wU`+s+tTVMrPu>arN-!1R| zU+nGmp7#F_@!V$nZ??m-jN0fAaCNV*b$3->P3%J&54&9{TsF%pUv}xQdev^)>u1gk zMn&?vU85#9wANd1YrU+sWmLWy2TE)4@D&SGzSS#RXH9Gh#c1+|)p z!a5!qP$YIV6n};$Q6btf-|RKmQ*yPU(VkM@E{740F+&1}o#n$U%`NbY+SkQQ-wZM# z5~#k3X1|9e^!j|M(lRoW!Hbb|L3sKO5-AeUZ5%zvg=B<<#4Z%j}i& zb7%YFJ~j5GUB04V;gp=rJhyDF4Lg56O`3&GNPvwdXUgDY#Or)V5=ejjG*t?M{9>-~4RZAWY{?^|X6hIp=;hMOnnC zoDOCwD-;=FahNiOK%|NGwns`f?YRvqnDp&O1xM3MIadea&M1-yh>>LPjxV_?B%f(EqzH zcFOnvcDwt#Px}8uJR5L^gp^cV^0ppkx$ML+NJ$h*DW0I<8jUdbTN`jWCLDO0B$Npb ze2k+=`MkgciC|3P(Kav~Awi~Q+05UgIBab|j7Qo_dQ+Pwj5jL$`<4%yKO&-|{;$z*`GbG5j{3iSF&=f~|Ljjb zjXOD@0Sd0uMD2Ze>pP#{B(3lK0lIE|=Zi_w`tJX2ZNM*x5t?#1IXdPoKVkF_9Eg@r zLX0}P9HW1<{3#D;h&$hqRbuh{KR-S=dVB0o!dtg7fBx@xU-n)W=YQ|z&dyW*p9gt1 z;5893nh-l1-jD&4TFaqif>!GQe*HU+CdJpkZ;pjXc)!z;YlF|nosb5+BWOYb-idV4 z4~C64WSK2x{~j@#CQ_tm)`EzRNB{#YZm<+M1`%D)Z?!fy;PTCX9G$mXS65e3vu=er z!EuP=fMBD&%eA#{;Hh=qm{R-D^FR6@t=A3ZL{K*CgGJmlV%qcrI_a3dWn-$v0pjD< zGmz***6<9{MCz$oDTNnG$S=0tX|Hun;;;{L2Tw+CQPP@Vfu!~Gj3Gd=RDqQFUj;f$aYPe{@r@Y|NTp(}xuG)tTXvCv35wAOGr!e(T^P`bL%r)nOTA| zO8GGj<#vw_#T9&pb1YI80|NO1^l)~L!t<9%u^MUQ5$kHB2ye|)AbEjZ!}1$Q6g=H@Zn?# zSNWNtX7MYlO6s#XVpvoJ-W0=znT8Nx80I%{s$0ia?cA7QpHV z7~WAu&M6h`Y|~>Mmc$tAwxDeTs-InL1IHMCJ+ak(-`r4T7^Pw>b2{dNr7Crx4>cV~ z(kRj~3H++I14lHt#!T}doZ}JUg3Z8$F}y<)%waRc3Bv&rIPA*>3W`lI9EX^lh$R6^pX%mP?I(WuNEVzv%F&m7;6tr$&*^xgE*D#lAwj5viGmofdpbsO&xm?+=nutnD1=mX4 z{~<&TFcWX}3F0~aGsRrwdR2v}**-wl^31^_pg5+&g!;&Na{1;0I2pyJ92t^8Ez{~` z4hws1XXmS1J)8c{%LcW~S{CzyH6rXmh^lmfH)w#P``RruHGPXCjrFctiw-LyMHL%( z6&5X4&T)h-0J_3TG?;JpF&HSPC_P3}T@a3P>1QMk=Dqb`Sm`hS7~TsUtyh$4Dp zLM*jkY*x;sm881UA)do1tI@zk#i2n{-vNb6+tZ6I7buF92!75TT$jT@4Q=J@QrA*V zB~i+6r%TS8nP&Gne{SA!PJV;Ct`(p8g5{0^%79_P2%ci)J5Gjx zB8E{ogFvkuq3`bF3xQ>x$vRo25VVcgWcW+b{mK&Aw%u!2-|e)wpdI0OB*ty%b)n4# zqwy$DP$lKRX{PXZ&cxfG>u-aut8_hG_P}l%_5Ousv0HWAr$&@t6^;>Y&IAMr!&Bwb zo<)&a(pvKA`aUcqU%e;RxAfR`SWt#Wczr&YkF)5m&vWx}R=ol<>ml)j2yxdu@7m|h zuz@nIHo& z@6|-w>Q()9N}>>OJSB|A6CFUyh>Au~3c7ZQKw4#3(H%^)Y+cO#DvNxz8>N`t%v`Rv z?o5ZUaGOdCS)D}Z5LlTP7AP*Zcjm2X#IrApN37*;l%mD8iYjthFl2O+8HcWb4*tM_ zFatsa*ZJp>7_Zcg>p}t({c9EFtF{|I;hF5j8^Ya?0S-gLxNy24F;;;)$OPesrmK{h zvSvT1lx3xcM-bE4v!&f`RF&#$JnI!Zr&Q^>?is1|OCI}w3m5;#cUSw0*Y<~gZV~$M z_?p9GxBnGAu3%Y^lEXcGULwiNeKK7^FIy@(lpo(E70s1d&9=?auiV#XDI<#e`I8s| z#FedWmU}mDJE4c#8F7^RM2zW;T{fMi)Q1bXnfb*{E%p26hE2Dk`nd%Q#;=&?=&Ek~ zY?0>VU~nRUnY9H0A0w&2YTrtAr?7Il%o6FWGJfmHu64B>slLi*(fE~8EOB%6sRD&v zc53plRU`CPLOFU}%I|*rVXbOs22U@ab#qdkUgdKq^Q5p7NSn;mUTJ`}@4UoEnc#>p z9zq;wY%(m(XsQX2atsCwvum;^fSOGAB##!2Um=qe&uq#oj-R?od0nGdJANuF)FY3c z#NjI%ySfWkuT~yA=gQr+3}AKaoI4^PcL1I1ULIr=7mQ!&4uxCJJ?F-ZJB?p;+;sl) z#~m^!`|`ugxh2LeK%ApEWT-H9tB%{Dg|a5OSslL&&qp4^43CEz$3<%%jYstEI*WvI z^m+|559SS`LH4niK8?l0E`G`s^B%F7#G}P_m?dm3cQT7CG$bssX}{CH-sS2WLlvLV zC?fIb5{=}_Z-@nGKvQAT>X;HB&`1gSES~3T_4uCF#s*v@I3OqjqA19NF`gjqM3PBR zdHNz|Vp{qw05MB&UjiiYs09$_!_~KeFt)gpo>a#r5e^YmF+eQ<{1Hu(2=^gWwR}Qb zEhiJxf~L;1l8TY@$SD`H$=KA1M^K40Ajr&7P|uA@O`$-+#cdP{mJ% z@2EIqnB!PH*Z3Gmu^b`97@D;Jh`>6Z?R-paI@V|g+#(%oAV7yX`Zh>wGru#s5YObd zS|J{!4!H;Va)}CQbYE=rvJzKHx<%w#IS@+j#vcVkK;j`~6CEj`bAxerko2_^lD7|H z?dBH;*Z>>gerqFROPAv|3dz5U{IVhG-!S?c;0!;wBhlIb-F1VJNx`)N&UtY@v&@wu z3+ZI<;n3y5Ic@e`B1k&6TINh#9d|F{%^$~<>(sqDf&zY_Q98lJgY#`T8Cu?Jd+lv- zn|Y_QmbKd^tyM_4#FIlflLQTPo-t0S6l?{I+g`iXLP3Bze@jEW2;Bo!5+*dvudZyw zyU@@%M&Wx#1U^**z{x)sHg-Y&iC1Xh`yWZGl^`)*1ozD3iyq_y85SUAspjUfvt=DU z=o^LM&~)7Zhp;6AY=EMGLV81;G&#*?JX`bv%h^^Xsaw!XH=nb09<#oHZf7Sm1N|D$ z-l8NSu@V~vSmu3}3Q)r|TEI1)89(0|XKeYA#7#(O{Pp46Tw?32d>N`6;3B&LkZF~& zkiDeoCp^nYDQT%XED=kkq&ry6U-%m z8x*TaIg+(?kO0%?`U&Nns5BBY-K=qgCXAPi$QS(*1t$6-fnG315se zCWW5g^}DUsuctA*qfSdiIjVE=!r4*Om6V4Z4hI^VS@gk%+1rJL#epzuu)<1IMy+WN0`g? zF(Nt-ul$~8xizy)Z4m^OVu7-RWjYgEQ-Y zZeDXu4#M63stCKHN^%98HpokoVK9RM6=Pj#M|E%4(%u0iM^-0pR^2bc+^NFUiGhK} z(QM0yU;mC7o}cvECcBm_fD&RlrJc#P)V?=BvE-=`CR9-=-|cEckfiRFo32cI?X^7k zSyDmkK_oH zhNnEWlbR$XV@w={cbgDt<&Wg3VHG=FPT(r`>Pk=K_XOaG`hx zg!2^h<(t$xx|v0WPkDf2#0bq&nr8U`5HHpaDdw_yE3oWrMDa|HV~$4N3+*RgoNI2^ z^qi4s^Lcm|iD6a}hKHD0G4(4Q4v8{4s$wAxQn|BHqc(r;Om{v^cRx(XNDpymBm2`! zIraj?G2b$?#C(cJdhl!?1cm9YWR{;f9;OjQB);aF7i`P2#X`P!kqXKPig<@%PNOOI zByv0I|GQp7x$tsC^f-4Mc+2#prnpM;p-W&-_CdAhO?Ny&&7Zp+wVJ&l0gmNP@{lGo zeWC3C3TQI>54n2n*xAx*nQ|edacHhXJxEY6#umah*qnwteit@nfwuY7-ujQ01V-ZtCC!hrBw|1bdPKp-{AC6;z|Go=6tttCi$^gErK zn;Rb~EPcvGok*ABoi`_k$L}tVy&bu1{~Sk{^L&9E%=FqA=w$5Z2Bh>DF|4IJiQ$G3 zp>7-DbSQ2R!>y2T!N?#L1p-;D2nV--6vi>M4=&*3q7APPE>14CTklUU|9<-OCA>d4 zKR2k-s?Kb^cg+6GLtA@5_N@<~tzWTKXHzja}f z!`Q|%>%B6?k^mwUk5V+kFrrhe4+#>?CWPw+62)OFA`@csQ&hU+e?u3KJUvg()AQ)h R{}%uN|Nk`TkJA7I0svcyUMc_p diff --git a/helm/airbyte-v1/charts/workload-api-server/Chart.lock b/helm/airbyte-v1/charts/workload-api-server/Chart.lock deleted file mode 100644 index d174ec61..00000000 --- a/helm/airbyte-v1/charts/workload-api-server/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2023-11-02T09:27:52.217541-07:00" diff --git a/helm/airbyte-v1/charts/workload-api-server/Chart.yaml b/helm/airbyte-v1/charts/workload-api-server/Chart.yaml index 3c5cbd86..f63ba3ff 100644 --- a/helm/airbyte-v1/charts/workload-api-server/Chart.yaml +++ b/helm/airbyte-v1/charts/workload-api-server/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy the workload-api service name: workload-api-server type: application diff --git a/helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz b/helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz deleted file mode 100644 index c32ac33d32901e4164206f4f5c192f7ec0e7af5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23369 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 z 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 diff --git a/helm/airbyte-v1/charts/workload-launcher/Chart.lock b/helm/airbyte-v1/charts/workload-launcher/Chart.lock deleted file mode 100644 index 19ec138f..00000000 --- a/helm/airbyte-v1/charts/workload-launcher/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2024-11-07T16:44:30.742568346Z" diff --git a/helm/airbyte-v1/charts/workload-launcher/Chart.yaml b/helm/airbyte-v1/charts/workload-launcher/Chart.yaml index 64d70b66..3f26dadb 100644 --- a/helm/airbyte-v1/charts/workload-launcher/Chart.yaml +++ b/helm/airbyte-v1/charts/workload-launcher/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-workload-launcher name: workload-launcher type: application From 4988e86dfe02c30ae5087a83af387d5b8f949e3d Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 14:30:26 +0100 Subject: [PATCH 20/69] Add local deps on airbyte-v1 --- helm/airbyte-v1/Chart.yaml | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 95553bd9..7d9fcbee 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -4,3 +4,52 @@ description: Helm chart to deploy airbyte name: airbyte type: application version: "v1.0.0" +dependencies: + - name: server + version: "1.2.0" + repository: "file://../server" + - name: temporal + version: "1.2.0" + repository: "file://../temporal" + - name: keycloak-setup + version: "1.2.0" + repository: "file://../keycloak-setup" + - name: metrics + version: "1.2.0" + repository: "file://../metrics" + - name: temporal-ui + version: "1.2.0" + repository: "file://../temporal-ui" + - name: worker + version: "1.2.0" + repository: "file://../worker" + - name: workload-api-server + version: "1.2.0" + repository: "file://../workload-api-server" + - name: common + version: "1.2.0" + repository: "file://../common" + - name: cron + version: "1.2.0" + repository: "file://../cron" + - name: connector-rollout-worker + version: "1.2.0" + repository: "file://../connector-rollout-worker" + - name: keycloak + version: "1.2.0" + repository: "file://../keycloak" + - name: webapp + version: "1.2.0" + repository: "file://../webapp" + - name: workload-launcher + version: "1.2.0" + repository: "file://../workload-launcher" + - name: airbyte-bootloader + version: "1.2.0" + repository: "file://../airbyte-bootloader" + - name: connector-builder-server + version: "1.2.0" + repository: "file://../connector-builder-server" + - name: pod-sweeper + version: "1.2.0" + repository: "file://../pod-sweeper" From 132388c043fc64d56820951d605bdc84fd9a0648 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 14:31:53 +0100 Subject: [PATCH 21/69] Change local deps on airbyte-v1 --- helm/airbyte-v1/Chart.yaml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 7d9fcbee..75767af9 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -7,49 +7,49 @@ version: "v1.0.0" dependencies: - name: server version: "1.2.0" - repository: "file://../server" + repository: "file://./charts/server" - name: temporal version: "1.2.0" - repository: "file://../temporal" + repository: "file://./charts/temporal" - name: keycloak-setup version: "1.2.0" - repository: "file://../keycloak-setup" + repository: "file://./charts/keycloak-setup" - name: metrics version: "1.2.0" - repository: "file://../metrics" + repository: "file://./charts/metrics" - name: temporal-ui version: "1.2.0" - repository: "file://../temporal-ui" + repository: "file://./charts/temporal-ui" - name: worker version: "1.2.0" - repository: "file://../worker" + repository: "file://./charts/worker" - name: workload-api-server version: "1.2.0" - repository: "file://../workload-api-server" + repository: "file://./charts/workload-api-server" - name: common version: "1.2.0" - repository: "file://../common" + repository: "file://./charts/common" - name: cron version: "1.2.0" - repository: "file://../cron" + repository: "file://./charts/cron" - name: connector-rollout-worker version: "1.2.0" - repository: "file://../connector-rollout-worker" + repository: "file://./charts/connector-rollout-worker" - name: keycloak version: "1.2.0" - repository: "file://../keycloak" + repository: "file://./charts/keycloak" - name: webapp version: "1.2.0" - repository: "file://../webapp" + repository: "file://./charts/webapp" - name: workload-launcher version: "1.2.0" - repository: "file://../workload-launcher" + repository: "file://./charts/workload-launcher" - name: airbyte-bootloader version: "1.2.0" - repository: "file://../airbyte-bootloader" + repository: "file://./charts/airbyte-bootloader" - name: connector-builder-server version: "1.2.0" - repository: "file://../connector-builder-server" + repository: "file://./charts/connector-builder-server" - name: pod-sweeper version: "1.2.0" - repository: "file://../pod-sweeper" + repository: "file://./charts/pod-sweeper" From 50ca207a68d71190a63274467d6e71ce9edc2f5c Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 14:41:42 +0100 Subject: [PATCH 22/69] Readd deps --- helm/airbyte-v1/Chart.lock | 51 ++++++++ helm/airbyte-v1/Chart.yaml | 117 ++++++++++-------- .../charts/airbyte-bootloader-1.2.0.tgz | Bin 0 -> 19006 bytes helm/airbyte-v1/charts/common-1.17.1.tgz | Bin 0 -> 14611 bytes .../charts/connector-builder-server-1.2.0.tgz | Bin 0 -> 19500 bytes .../charts/connector-rollout-worker-1.2.0.tgz | Bin 0 -> 20393 bytes helm/airbyte-v1/charts/cron-1.2.0.tgz | Bin 0 -> 19551 bytes helm/airbyte-v1/charts/keycloak-1.2.0.tgz | Bin 0 -> 20269 bytes .../charts/keycloak-setup-1.2.0.tgz | Bin 0 -> 18955 bytes helm/airbyte-v1/charts/metrics-1.2.0.tgz | Bin 0 -> 18104 bytes helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz | Bin 0 -> 19381 bytes helm/airbyte-v1/charts/server-1.2.0.tgz | Bin 0 -> 22346 bytes helm/airbyte-v1/charts/temporal-1.2.0.tgz | Bin 0 -> 19894 bytes helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz | Bin 0 -> 18280 bytes helm/airbyte-v1/charts/webapp-1.2.0.tgz | Bin 0 -> 20452 bytes helm/airbyte-v1/charts/worker-1.2.0.tgz | Bin 0 -> 22793 bytes .../charts/workload-api-server-1.2.0.tgz | Bin 0 -> 20958 bytes .../charts/workload-launcher-1.2.0.tgz | Bin 0 -> 23369 bytes 18 files changed, 118 insertions(+), 50 deletions(-) create mode 100644 helm/airbyte-v1/Chart.lock create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/common-1.17.1.tgz create mode 100644 helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/cron-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/keycloak-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/metrics-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/server-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/temporal-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/webapp-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/worker-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz create mode 100644 helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz diff --git a/helm/airbyte-v1/Chart.lock b/helm/airbyte-v1/Chart.lock new file mode 100644 index 00000000..1eb0e17d --- /dev/null +++ b/helm/airbyte-v1/Chart.lock @@ -0,0 +1,51 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +- name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 +generated: "2024-11-07T16:46:04.022416291Z" diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 75767af9..70966181 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,55 +1,72 @@ apiVersion: v2 appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +- condition: airbyte-bootloader.enabled + name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal.enabled + name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal-ui.enabled + name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: webapp.enabled + name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: server.enabled + name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: worker.enabled + name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-api-server.enabled + name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-launcher.enabled + name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: pod-sweeper.enabled + name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: metrics.enabled + name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: cron.enabled + name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-builder-server.enabled + name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-rollout-worker.enabled + name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak.enabled + name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak-setup.enabled + name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 description: Helm chart to deploy airbyte name: airbyte type: application -version: "v1.0.0" -dependencies: - - name: server - version: "1.2.0" - repository: "file://./charts/server" - - name: temporal - version: "1.2.0" - repository: "file://./charts/temporal" - - name: keycloak-setup - version: "1.2.0" - repository: "file://./charts/keycloak-setup" - - name: metrics - version: "1.2.0" - repository: "file://./charts/metrics" - - name: temporal-ui - version: "1.2.0" - repository: "file://./charts/temporal-ui" - - name: worker - version: "1.2.0" - repository: "file://./charts/worker" - - name: workload-api-server - version: "1.2.0" - repository: "file://./charts/workload-api-server" - - name: common - version: "1.2.0" - repository: "file://./charts/common" - - name: cron - version: "1.2.0" - repository: "file://./charts/cron" - - name: connector-rollout-worker - version: "1.2.0" - repository: "file://./charts/connector-rollout-worker" - - name: keycloak - version: "1.2.0" - repository: "file://./charts/keycloak" - - name: webapp - version: "1.2.0" - repository: "file://./charts/webapp" - - name: workload-launcher - version: "1.2.0" - repository: "file://./charts/workload-launcher" - - name: airbyte-bootloader - version: "1.2.0" - repository: "file://./charts/airbyte-bootloader" - - name: connector-builder-server - version: "1.2.0" - repository: "file://./charts/connector-builder-server" - - name: pod-sweeper - version: "1.2.0" - repository: "file://./charts/pod-sweeper" +version: 1.2.0 diff --git a/helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz b/helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..23f9ec65aa21f301c8681a474d94a7d4b98c7d66 GIT binary patch literal 19006 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 J+Z+IZ0RY0N)YJd~ literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz b/helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5a0963f41cdaf2b6951597519bc49680d75dc998 GIT binary patch literal 19500 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 P00960H8X%F0O|n%Rg#Pj literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz b/helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..db6c0790094df7e978d94e019ec718fd4ad3844d GIT binary patch literal 20393 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 Qg(OJD&PMjy?6EW1zMAY@jqy-* z@zz@Q(@Poh0>}{C(4$0uiifK6OdB`>lN})}?-?4T5r}Yn!;~x-%mQN}-#bq^p%_MN ziy}s%3GxJS+w%WAUP2i6aza!;Z&~o#w4|oEO!J{iAWyVG;`1ik9w++e&X!!w-r@ko zVkdb(lBv2-_TK`MO#fZ1UfX80IF2qCf;0~Gb*TFZ3`WR6*aRl0;kMra>!N_GKe-$K z?g)7q!>JU#RQeoYrbaaS6re8fYK`y8?tD7zbAXi#~ z;74z3>-P56hmuO4(BW33O0liC#|K9z7f0T;hskj)A*>0gf+R@OuB^_+r!fczpTG z>HACYasT{$|K#%c=mMOcgM-tP!{f{2(~}Eu`V-hc`3HD&d~&!65LSk~Pl?PYK`6ju zxt#mXg-#A*kZ0C=X^O=Gh+sTS;Shl#nILsYkRUq7Of8Tw4xI>(vB^(SX^#ILT|Dyi YJUvg(qd)(D00030|7e3kRsaG50D-6tlmGw# literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/cron-1.2.0.tgz b/helm/airbyte-v1/charts/cron-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cc8a2b5a174f0273b8659e1af70dc39483819ce2 GIT binary patch literal 19551 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 O0RR6kh?g}0=m7vbgIsU` literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/keycloak-1.2.0.tgz b/helm/airbyte-v1/charts/keycloak-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..dfb5a0576498a420bf8014d672b5a2b6a566aaa7 GIT binary patch literal 20269 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 E0Fm4{UjP6A literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz b/helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2cb6bc86d90695ed5569f385dba6a94b9e455a0b GIT binary patch literal 18955 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 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/metrics-1.2.0.tgz b/helm/airbyte-v1/charts/metrics-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..10a7f16a23b4f51798b0bc0c4d40ce897b33a5b8 GIT binary patch literal 18104 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 Q7XSeN|MpQ4X#mCn0Q3XP^#A|> literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz b/helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9fbd245688d85f29f33db4536a803f986c1a0c3f GIT binary patch literal 19381 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 A{{R30 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/server-1.2.0.tgz b/helm/airbyte-v1/charts/server-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5134142478762aaef32659cb290c639e73e396c8 GIT binary patch literal 22346 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 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/webapp-1.2.0.tgz b/helm/airbyte-v1/charts/webapp-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..93e6d157d408dde448e14e5f12e2b3a529569c9d GIT binary patch literal 20452 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 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz b/helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3045136182ac2afd04fa8518d925d46417b7fa6d GIT binary patch literal 20958 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 R{}%uN|Nk`TkJA7I0svcyUMc_p literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz b/helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c32ac33d32901e4164206f4f5c192f7ec0e7af5f GIT binary patch literal 23369 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 z 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 literal 0 HcmV?d00001 From 16f34993903cee6bda1fe4f50f1cd9b36b714315 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 14:51:22 +0100 Subject: [PATCH 23/69] Fix gcs secrets yaml --- helm/airbyte-v1/templates/gcs-log-creds-secret.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml index acdc1f93..daf0a7cf 100644 --- a/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml +++ b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml @@ -9,10 +9,8 @@ apiVersion: v1 kind: Secret metadata: - name: {{ .Release.Name }}-gcs-log-creds - labels: - {{- include "airbyte.labels" . | nindent 4 }} -type: Opaque + name: gcs-log-creds-secret + namespace: {{ .Release.Namespace }} data: - gcp.json: {{ $credentialsJson | default "" | quote }} + gcs-log-creds.json: {{ .Values.gcsLogCreds | b64enc | quote }} {{- end }} From f6f4d87f60a66825ab4dc89e2dd4b20e6ac81ac1 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 15:08:53 +0100 Subject: [PATCH 24/69] Fix indent in gcs-log-creds-secret.yaml --- helm/airbyte-v1/templates/gcs-log-creds-secret.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml index daf0a7cf..92214675 100644 --- a/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml +++ b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml @@ -4,13 +4,15 @@ (not .Values.global.storage.secretName) (not .Values.global.storage.storageSecretName) }} -{{ $gcsConfig := required "You must set 'global.storage.gcs' when setting 'global.storage.type' to 'gcs'" .Values.global.storage.gcs }} -{{ $credentialsJson := required "You must set 'global.storage.gcs.credentialsJson' when 'global.storage.secretName' is not set" .Values.global.storage.gcs.credentialsJson }} +{{- $gcsConfig := required "You must set 'global.storage.gcs' when setting 'global.storage.type' to 'gcs'" .Values.global.storage.gcs }} +{{- $credentialsJson := required "You must set 'global.storage.gcs.credentialsJson' when 'global.storage.secretName' is not set" .Values.global.storage.gcs.credentialsJson }} apiVersion: v1 kind: Secret metadata: - name: gcs-log-creds-secret - namespace: {{ .Release.Namespace }} + name: {{ .Release.Name }}-gcs-log-creds + labels: + {{- include "airbyte.labels" . | nindent 4 }} +type: Opaque data: - gcs-log-creds.json: {{ .Values.gcsLogCreds | b64enc | quote }} + gcp.json: {{ $credentialsJson | default "" | quote }} {{- end }} From 9577f0a805dea565efcee4d935607b024bac1fc9 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 15:25:56 +0100 Subject: [PATCH 25/69] Disable linting for release --- .github/workflows/release.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 7cbb1727..815ff9d2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -21,3 +21,4 @@ jobs: with: token: ${{ secrets.BO_CHARTS_HELM_TOKEN }} charts_dir: helm + linting: off From 701711cc645c47882c97ac4dab387781edd16df0 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 15:30:02 +0100 Subject: [PATCH 26/69] trigger release action --- helm/airbyte-v1/values.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 81a4c52a..997a2fdd 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -1117,7 +1117,6 @@ connector-rollout-worker: log: # -- The log level to log at level: "INFO" - ## Example: ## ## extraEnv: From 63bcfac8e9df4cb761a7c72697a87ee3c730e1bb Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 15:38:53 +0100 Subject: [PATCH 27/69] Disable kubeval --- .github/workflows/ci.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 282c54a2..c528cadc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,17 +29,17 @@ jobs: steps: - name: Checkout uses: actions/checkout@v1 - - name: Run kubeval - env: - KUBERNETES_VERSION: ${{ matrix.k8s }} - run: .github/kubeval.sh + # - name: Run kubeval + # env: + # KUBERNETES_VERSION: ${{ matrix.k8s }} + # run: .github/kubeval.sh install-chart: name: install-chart runs-on: ubuntu-latest needs: - lint-chart - - kubeval-chart + # - kubeval-chart strategy: matrix: k8s: From 1ae0de3f97619356d037a87ab124e41474bcecb9 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 15:46:19 +0100 Subject: [PATCH 28/69] Pin charts airbyte-v1 --- helm/airbyte-v1/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 70966181..ed3eb363 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.0.0 dependencies: - name: common repository: https://charts.bitnami.com/bitnami @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte type: application -version: 1.2.0 +version: "v1.0.0" From 018475d6586a6cc5bc0ae084a20ded99c27e9ff3 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 15:46:23 +0100 Subject: [PATCH 29/69] Pin charts airbyte-v1 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index ed3eb363..c85f440a 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -67,6 +67,6 @@ dependencies: repository: https://airbytehq.github.io/helm-charts/ version: 1.2.0 description: Helm chart to deploy airbyte -name: airbyte +name: airbyte-v1 type: application version: "v1.0.0" From 34361ff7ea5f8488a4a468f60f2ce8b1da38047b Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 16:09:28 +0100 Subject: [PATCH 30/69] Fix secrets and cp --- helm/airbyte-v1/values.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 997a2fdd..3c13c102 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -14,7 +14,7 @@ global: enterprise: # -- Secret name where an Airbyte license key is stored - secretName: "airbyte-airbyte-secrets" + secretName: "airbyte-v1-airbyte-secrets" # -- The key within `licenseKeySecretName` where the Airbyte license key is stored licenseKeySecretKey: "license-key" @@ -39,7 +39,7 @@ global: # -- Admin user configuration instanceAdmin: # -- Secret name where the instanceAdmin configuration is stored - secretName: "airbyte-airbyte-secrets" + secretName: "airbyte-v1-airbyte-secrets" # -- The first name of the initial user firstName: "" # -- The last name of the initial user @@ -52,7 +52,7 @@ global: # -- SSO Identify Provider configuration; (requires Enterprise) #identityProvider: # # -- Secret name where the OIDC configuration is stored - # secretName: "airbyte-airbyte-secrets" + # secretName: "airbyte-v1-airbyte-secrets" # # -- The identity provider type (e.g. oidc) # type: "" # # -- OIDC configuration (required if `auth.identityProvider.type` is "oidc") @@ -74,7 +74,7 @@ global: type: "external" # "external" # -- Secret name where database credentials are stored - secretName: "airbyte-airbyte-secrets" # e.g. "airbyte-airbyte-secrets" + secretName: "airbyte-v1-airbyte-secrets" # e.g. "airbyte-v1-airbyte-secrets" # -- The database host # -- Value will be overriden by TF @@ -103,7 +103,7 @@ global: # -- The storage backend type. Supports s3, gcs, azure, minio (default) type: minio # default storage used # -- Secret name where storage provider credentials are stored - #storageSecretName: "airbyte-airbyte-secrets" + #storageSecretName: "airbyte-v1-airbyte-secrets" # S3 #bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. From 82bdd0dcb30b6a3901336be09f67b64f16a63066 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 6 Dec 2024 16:18:17 +0100 Subject: [PATCH 31/69] Update appVersion to 1.2.0 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index c85f440a..33f2eec2 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 1.0.0 +appVersion: 1.2.0 dependencies: - name: common repository: https://charts.bitnami.com/bitnami From 5f4d695f3830f096aeb37ad2ef1edfad403e18bf Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 09:40:00 +0100 Subject: [PATCH 32/69] Create new workflow only for airbyte-v1 --- .github/workflows/airbyte-v1.yaml | 70 +++++++++++++++++++++++++++++ .github/workflows/release.yaml | 4 +- helm/airbyte-v1/values.yaml | 73 +------------------------------ 3 files changed, 74 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/airbyte-v1.yaml diff --git a/.github/workflows/airbyte-v1.yaml b/.github/workflows/airbyte-v1.yaml new file mode 100644 index 00000000..136e8fce --- /dev/null +++ b/.github/workflows/airbyte-v1.yaml @@ -0,0 +1,70 @@ +name: Lint and Test Charts, Release +on: + push: + branches: + - main + - eks_upgrade + - airbyte_v1 + paths: + - 'helm/airbyte-v1/**' + release: + types: [published, created] + + +jobs: + lint-chart: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Run chart-testing (lint) + uses: helm/chart-testing-action@main + with: + command: lint + config: .github/ct.yaml + + kubeval-chart: + runs-on: ubuntu-latest + needs: + - lint-chart + strategy: + matrix: + k8s: + - v1.24.1 + steps: + - name: Checkout + uses: actions/checkout@v1 + + install-chart: + name: install-chart + runs-on: ubuntu-latest + needs: + - lint-chart + strategy: + matrix: + k8s: + - v1.24.1 + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Create kind ${{ matrix.k8s }} cluster + uses: helm/kind-action@main + with: + node_image: kindest/node:${{ matrix.k8s }} + - name: Run chart-testing (install) + uses: helm/chart-testing-action@main + with: + command: install + config: .github/ct.yaml + + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Publish Helm charts + uses: stefanprodan/helm-gh-pages@v1.4.1 + with: + token: ${{ secrets.BO_CHARTS_HELM_TOKEN }} + charts_dir: helm + linting: off diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 815ff9d2..2a74fa21 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -7,6 +7,9 @@ on: - airbyte_v1 paths: - 'helm/**' + paths-ignore: + # Ignore airbyte-v1 charts, airbyte-v1 runs under airbyte-v1.yaml workflow due to incompatibility on Publish + - 'helm/airbyte-v1/**' release: types: [published, created] @@ -21,4 +24,3 @@ jobs: with: token: ${{ secrets.BO_CHARTS_HELM_TOKEN }} charts_dir: helm - linting: off diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 3c13c102..1cbb67b0 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -1,6 +1,3 @@ -### TEST FOR RELEASE WORKFLOW - - # Global params that are overwritten with umbrella chart global: # -- Service Account name override @@ -48,23 +45,6 @@ global: emailSecretKey: "instance-admin-email" # -- The key within `passwordSecretName` where the initial user's password is stored passwordSecretKey: "instance-admin-password" - - # -- SSO Identify Provider configuration; (requires Enterprise) - #identityProvider: - # # -- Secret name where the OIDC configuration is stored - # secretName: "airbyte-v1-airbyte-secrets" - # # -- The identity provider type (e.g. oidc) - # type: "" - # # -- OIDC configuration (required if `auth.identityProvider.type` is "oidc") - # oidc: - # # -- OIDC application domain - # domain: "" - # # -- OIDC application name - # appName: "" - # # -- The key within `clientIdSecretName` where the OIDC client id is stored - # clientIdSecretKey: "client-id" - # # -- The key within `clientSecretSecretName` where the OIDC client secret is stored - # clientSecretSecretKey: "client-secret" # -- Environment variables env_vars: {} @@ -89,15 +69,9 @@ global: # -- The database user user: "rds_admin" - # -- The key within `secretName` where the user is stored - #userSecretKey: "" # e.g. "database-user" # -- The database password password: "pwd" - # -- The key within `secretName` where the password is stored - #passwordSecretKey: "" # e.g."database-password" - - storage: # -- The storage backend type. Supports s3, gcs, azure, minio (default) @@ -114,25 +88,6 @@ global: # region: "" ## e.g. us-east-1 # authenticationType: credentials ## Use "credentials" or "instanceProfile" - # GCS - #bucket: ## GCS bucket names that you've created. We recommend storing the following all in one bucket. - # log: airbyte-bucket - # state: airbyte-bucket - # workloadOutput: airbyte-bucket - #gcs: - # projectId: - # credentialsJson: /secrets/gcs-log-creds/gcp.json - - # Azure - #bucket: ## Azure Blob Storage container names that you've created. We recommend storing the following all in one bucket. - # log: airbyte-bucket - # state: airbyte-bucket - # workloadOutput: airbyte-bucket - #azure: - # # one of the following: connectionString, connectionStringSecretKey - # connectionString: - # connectionStringSecretKey: - metrics: # -- The metric client to configure globally. Supports "otel" metricClient: "" @@ -400,32 +355,6 @@ webapp: # -- Additional init containers for server pods extraInitContainers: [] - ## Example: (With default env vars and values taken from generated config map) - # extraEnv: - # - name: POSTGRES_USER - # valueFrom: - # secretKeyRef: - # name: airbyte-secrets - # key: DATABASE_USER - # - name: POSTGRES_PWD - # valueFrom: - # secretKeyRef: - # name: airbyte-secrets - # key: DATABASE_PASSWORD - # - name: DYNAMIC_CONFIG_FILE_PATH - # value: "config/dynamicconfig/development.yaml" - # - name: DB - # value: "postgresql" - # - name: DB_PORT - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: DATABASE_PORT - # - name: POSTGRES_SEEDS - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: DATABASE_HOST # -- Supply extra env variables to main container using full notation extraEnv: [] ## Example: @@ -1736,7 +1665,7 @@ minio: tag: latest mcImage: - repository: airbyte/mc + repository: minio/minio tag: latest storage: From eafa77ed80c907de97bbbadf4b23739327484e22 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 09:43:13 +0100 Subject: [PATCH 33/69] Uncomment kubeval --- .github/workflows/ci.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c528cadc..b198f025 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,17 +29,17 @@ jobs: steps: - name: Checkout uses: actions/checkout@v1 - # - name: Run kubeval - # env: - # KUBERNETES_VERSION: ${{ matrix.k8s }} - # run: .github/kubeval.sh + - name: Run kubeval + env: + KUBERNETES_VERSION: ${{ matrix.k8s }} + run: .github/kubeval.sh install-chart: name: install-chart runs-on: ubuntu-latest needs: - lint-chart - # - kubeval-chart + - kubeval-chart strategy: matrix: k8s: @@ -56,4 +56,4 @@ jobs: uses: helm/chart-testing-action@main with: command: install - config: .github/ct.yaml \ No newline at end of file + config: .github/ct.yaml From 89398b1b0414b4bdfb211ed2e6493b44bc9c6353 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 09:43:58 +0100 Subject: [PATCH 34/69] Yaml lint --- .github/workflows/airbyte-v1.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/airbyte-v1.yaml b/.github/workflows/airbyte-v1.yaml index 136e8fce..88ae7502 100644 --- a/.github/workflows/airbyte-v1.yaml +++ b/.github/workflows/airbyte-v1.yaml @@ -10,7 +10,6 @@ on: release: types: [published, created] - jobs: lint-chart: runs-on: ubuntu-latest From 4c7ad4470936b444fea1aff7824ad491eb5b7fe0 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 09:49:45 +0100 Subject: [PATCH 35/69] fix paths --- .github/workflows/release.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2a74fa21..53952aa3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -5,11 +5,8 @@ on: - main - eks_upgrade - airbyte_v1 - paths: - - 'helm/**' paths-ignore: - # Ignore airbyte-v1 charts, airbyte-v1 runs under airbyte-v1.yaml workflow due to incompatibility on Publish - - 'helm/airbyte-v1/**' + - 'helm/backend-sdk/**' release: types: [published, created] From 49c5547907e8401f655210dd3266fb61d1b44221 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 09:51:31 +0100 Subject: [PATCH 36/69] fix paths on ci.yml --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b198f025..90e41a64 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,8 +2,8 @@ name: Lint and Test Charts on: pull_request: - paths: - - 'helm/**' + paths-ignore: + - 'helm/airbyte-v1/**' jobs: lint-chart: From a7723358b2988e776e138ffa39611e3e5b4f0590 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 09:58:54 +0100 Subject: [PATCH 37/69] Ignore airbyte-v1 on kubeval --- .github/kubeval.sh | 2 +- helm/airbyte-v1/values.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/kubeval.sh b/.github/kubeval.sh index 49807c59..e4445de5 100755 --- a/.github/kubeval.sh +++ b/.github/kubeval.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -CHART_DIRS="$(git diff --find-renames --name-only "$(git rev-parse --abbrev-ref HEAD)" remotes/origin/main -- helm | grep '[cC]hart.yaml' | sed -e 's#/[Cc]hart.yaml##g')" +CHART_DIRS="$(git diff --find-renames --name-only "$(git rev-parse --abbrev-ref HEAD)" remotes/origin/main -- helm | grep '[cC]hart.yaml' | grep -v '/helm/airbyte-v1/Chart.yaml' | sed -e 's#/[Cc]hart.yaml##g')" KUBEVAL_VERSION="0.14.0" SCHEMA_LOCATION="https://raw.githubusercontent.com/instrumenta/kubernetes-json-schema/master/" diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 1cbb67b0..441c58eb 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -1659,7 +1659,7 @@ externalDatabase: minio: image: - # -- Minio image used by Minio helm chart + # -- Minio image used by Minio helm chart repository: minio/minio # -- Minio tag image tag: latest From 046d48bc4f7a58498cd6512b13da72d520bfbec6 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 10:06:26 +0100 Subject: [PATCH 38/69] Reorganize worflows --- .../{airbyte-v1.yaml => airbyte-v1-ci.yaml} | 37 ++----------------- .github/workflows/airbyte-v1-release.yaml | 24 ++++++++++++ 2 files changed, 28 insertions(+), 33 deletions(-) rename .github/workflows/{airbyte-v1.yaml => airbyte-v1-ci.yaml} (56%) create mode 100644 .github/workflows/airbyte-v1-release.yaml diff --git a/.github/workflows/airbyte-v1.yaml b/.github/workflows/airbyte-v1-ci.yaml similarity index 56% rename from .github/workflows/airbyte-v1.yaml rename to .github/workflows/airbyte-v1-ci.yaml index 88ae7502..d8a9067a 100644 --- a/.github/workflows/airbyte-v1.yaml +++ b/.github/workflows/airbyte-v1-ci.yaml @@ -1,14 +1,9 @@ -name: Lint and Test Charts, Release -on: - push: - branches: - - main - - eks_upgrade - - airbyte_v1 +name: (Airbyte-v1) Lint and Test Charts + +on: + pull_request: paths: - 'helm/airbyte-v1/**' - release: - types: [published, created] jobs: lint-chart: @@ -22,18 +17,6 @@ jobs: command: lint config: .github/ct.yaml - kubeval-chart: - runs-on: ubuntu-latest - needs: - - lint-chart - strategy: - matrix: - k8s: - - v1.24.1 - steps: - - name: Checkout - uses: actions/checkout@v1 - install-chart: name: install-chart runs-on: ubuntu-latest @@ -55,15 +38,3 @@ jobs: with: command: install config: .github/ct.yaml - - release: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Publish Helm charts - uses: stefanprodan/helm-gh-pages@v1.4.1 - with: - token: ${{ secrets.BO_CHARTS_HELM_TOKEN }} - charts_dir: helm - linting: off diff --git a/.github/workflows/airbyte-v1-release.yaml b/.github/workflows/airbyte-v1-release.yaml new file mode 100644 index 00000000..e8437b71 --- /dev/null +++ b/.github/workflows/airbyte-v1-release.yaml @@ -0,0 +1,24 @@ +name: (Airbyte-v1) Release +on: + push: + branches: + - main + - eks_upgrade + - airbyte_v1 + paths: + - 'helm/airbyte-v1/**' + release: + types: [published, created] + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Publish Helm charts + uses: stefanprodan/helm-gh-pages@v1.4.1 + with: + token: ${{ secrets.BO_CHARTS_HELM_TOKEN }} + charts_dir: helm + linting: off From 9ef102d39b0d0eb76f68e23ae02b9f62fd9fe4a8 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 10:07:49 +0100 Subject: [PATCH 39/69] Fix release workflow --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 53952aa3..45bdbc66 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -6,7 +6,7 @@ on: - eks_upgrade - airbyte_v1 paths-ignore: - - 'helm/backend-sdk/**' + - 'helm/airbyte-v1/**' release: types: [published, created] From 409f8220163a71e3e8cadfd8a31015a5b056cf24 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 10:12:00 +0100 Subject: [PATCH 40/69] Fix kubeval ignore of airbyte-v1, delete airbyte-v1 workflows --- .github/kubeval.sh | 2 +- .github/workflows/airbyte-v1-ci.yaml | 40 ----------------------- .github/workflows/airbyte-v1-release.yaml | 24 -------------- .github/workflows/release.yaml | 2 ++ 4 files changed, 3 insertions(+), 65 deletions(-) delete mode 100644 .github/workflows/airbyte-v1-ci.yaml delete mode 100644 .github/workflows/airbyte-v1-release.yaml diff --git a/.github/kubeval.sh b/.github/kubeval.sh index e4445de5..236a025f 100755 --- a/.github/kubeval.sh +++ b/.github/kubeval.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -CHART_DIRS="$(git diff --find-renames --name-only "$(git rev-parse --abbrev-ref HEAD)" remotes/origin/main -- helm | grep '[cC]hart.yaml' | grep -v '/helm/airbyte-v1/Chart.yaml' | sed -e 's#/[Cc]hart.yaml##g')" +CHART_DIRS="$(git diff --find-renames --name-only "$(git rev-parse --abbrev-ref HEAD)" remotes/origin/main -- helm | grep '[cC]hart.yaml' | grep -v 'helm/airbyte-v1/Chart.yaml' | sed -e 's#/[Cc]hart.yaml##g')" KUBEVAL_VERSION="0.14.0" SCHEMA_LOCATION="https://raw.githubusercontent.com/instrumenta/kubernetes-json-schema/master/" diff --git a/.github/workflows/airbyte-v1-ci.yaml b/.github/workflows/airbyte-v1-ci.yaml deleted file mode 100644 index d8a9067a..00000000 --- a/.github/workflows/airbyte-v1-ci.yaml +++ /dev/null @@ -1,40 +0,0 @@ -name: (Airbyte-v1) Lint and Test Charts - -on: - pull_request: - paths: - - 'helm/airbyte-v1/**' - -jobs: - lint-chart: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v1 - - name: Run chart-testing (lint) - uses: helm/chart-testing-action@main - with: - command: lint - config: .github/ct.yaml - - install-chart: - name: install-chart - runs-on: ubuntu-latest - needs: - - lint-chart - strategy: - matrix: - k8s: - - v1.24.1 - steps: - - name: Checkout - uses: actions/checkout@v1 - - name: Create kind ${{ matrix.k8s }} cluster - uses: helm/kind-action@main - with: - node_image: kindest/node:${{ matrix.k8s }} - - name: Run chart-testing (install) - uses: helm/chart-testing-action@main - with: - command: install - config: .github/ct.yaml diff --git a/.github/workflows/airbyte-v1-release.yaml b/.github/workflows/airbyte-v1-release.yaml deleted file mode 100644 index e8437b71..00000000 --- a/.github/workflows/airbyte-v1-release.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: (Airbyte-v1) Release -on: - push: - branches: - - main - - eks_upgrade - - airbyte_v1 - paths: - - 'helm/airbyte-v1/**' - release: - types: [published, created] - -jobs: - release: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Publish Helm charts - uses: stefanprodan/helm-gh-pages@v1.4.1 - with: - token: ${{ secrets.BO_CHARTS_HELM_TOKEN }} - charts_dir: helm - linting: off diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 45bdbc66..9d248480 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -21,3 +21,5 @@ jobs: with: token: ${{ secrets.BO_CHARTS_HELM_TOKEN }} charts_dir: helm + # Due to airbyte-v1 version incompatility with the current config of gh actions it always fails on linting so we switched it off + linting: off From befc51ac15882034afae489dfbc2725fbb3561d1 Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Tue, 10 Dec 2024 10:15:07 +0100 Subject: [PATCH 41/69] Ignore all airbyte-v1 chart.yml from kubeval --- .github/kubeval.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/kubeval.sh b/.github/kubeval.sh index 236a025f..0c24056f 100755 --- a/.github/kubeval.sh +++ b/.github/kubeval.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -CHART_DIRS="$(git diff --find-renames --name-only "$(git rev-parse --abbrev-ref HEAD)" remotes/origin/main -- helm | grep '[cC]hart.yaml' | grep -v 'helm/airbyte-v1/Chart.yaml' | sed -e 's#/[Cc]hart.yaml##g')" +CHART_DIRS="$(git diff --find-renames --name-only "$(git rev-parse --abbrev-ref HEAD)" remotes/origin/main -- helm | grep '[cC]hart.yaml' | grep -v 'helm/airbyte-v1' | sed -e 's#/[Cc]hart.yaml##g')" KUBEVAL_VERSION="0.14.0" SCHEMA_LOCATION="https://raw.githubusercontent.com/instrumenta/kubernetes-json-schema/master/" From d8efe8ab35f22974af55674d0d45d5a57c4572cf Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 19 Dec 2024 15:48:13 +0100 Subject: [PATCH 42/69] Add imagepullsecrets value secret --- helm/airbyte-v1/values.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 441c58eb..37d1e72b 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -27,7 +27,8 @@ global: tag: "1.2.0" # Docker image pull secret - imagePullSecrets: [] + imagePullSecrets: + - name: regcred # -- Auth configuration auth: @@ -953,7 +954,7 @@ workload-launcher: connector-rollout-worker: enabled: false # -- Number of connector rollout worker replicas - replicaCount: 1 + replicaCount: 2 image: # -- The repository to use for the airbyte connector rollout worker image. From 8d9d527da7cd4a486a9e9a948bffb71b5a773342 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 19 Dec 2024 18:54:51 +0100 Subject: [PATCH 43/69] update airbyte-v1 chart to v1.1.1 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 33f2eec2..90c515c1 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.0.0" +version: "v1.0.1" From ab7b042c23d8968a23b991c0b0b09e7612d3ef5e Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 19 Dec 2024 19:30:13 +0100 Subject: [PATCH 44/69] test release v1 --- helm/airbyte-v1/values.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 37d1e72b..8ad562c8 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -1,3 +1,6 @@ +### Airbyte V1 Helm Chart + + # Global params that are overwritten with umbrella chart global: # -- Service Account name override From 554adfb994df6239d16639d7b96b0f45dc4e2759 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 19 Dec 2024 19:31:29 +0100 Subject: [PATCH 45/69] update airbyte-v1 chart to v1.0.1 --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 9d248480..6bffd3a7 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -5,8 +5,8 @@ on: - main - eks_upgrade - airbyte_v1 - paths-ignore: - - 'helm/airbyte-v1/**' + # paths-ignore: + # - 'helm/airbyte-v1/**' release: types: [published, created] From f9fe22fd5545a94008556a8175cac87084a4ac96 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 20 Dec 2024 10:26:34 +0100 Subject: [PATCH 46/69] Enable pull docker image from dockerhub --- helm/airbyte-v1/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 8ad562c8..211359c1 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -144,7 +144,7 @@ global: ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET # -- image pull secret to use for job pod - main_container_image_pull_secret: "" + main_container_image_pull_secret: "regcred" images: ## JOB_KUBE_BUSYBOX_IMAGE From 2f0911e3e1a02d09ec80a93ac9b49883cac5c5ad Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Mon, 23 Dec 2024 18:01:04 +0100 Subject: [PATCH 47/69] Add rolling update deployment for airbyte-server --- helm/airbyte-v1/charts/server/values.yaml | 2 +- .../charts/workload-launcher/templates/deployment.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/charts/server/values.yaml b/helm/airbyte-v1/charts/server/values.yaml index 390f80a4..4798c10b 100644 --- a/helm/airbyte-v1/charts/server/values.yaml +++ b/helm/airbyte-v1/charts/server/values.yaml @@ -213,7 +213,7 @@ extraLabels: {} ## deploymentStrategyType [string] - deployment strategy type for airbyte-server deployment. ## Defaults to Recreate since the pod is using pvc -deploymentStrategyType: Recreate +deploymentStrategyType: RollingUpdate debug: enabled: false diff --git a/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml b/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml index ce0dfa93..533d08f4 100644 --- a/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml +++ b/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml @@ -16,7 +16,7 @@ spec: {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} {{- end }} strategy: - type: Recreate + type: RollingUpdate template: metadata: labels: From 46e336f3a02bbbd4bc32671aa13a59f5388915df Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Tue, 24 Dec 2024 09:55:39 +0100 Subject: [PATCH 48/69] Update airbyte-1 helm chart --- helm/airbyte-v1/Chart.yaml | 2 +- helm/airbyte-v1/values.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 90c515c1..f5114848 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.0.1" +version: "v1.0.2" diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 211359c1..cf9fbdd0 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -79,18 +79,18 @@ global: storage: # -- The storage backend type. Supports s3, gcs, azure, minio (default) - type: minio # default storage used + type: s3 # default storage used # -- Secret name where storage provider credentials are stored - #storageSecretName: "airbyte-v1-airbyte-secrets" + storageSecretName: "airbyte-v1-airbyte-secrets" # S3 - #bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. - # log: airbyte-bucket - # state: airbyte-bucket - # workloadOutput: airbyte-bucket - #s3: - # region: "" ## e.g. us-east-1 - # authenticationType: credentials ## Use "credentials" or "instanceProfile" + bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. + log: b-multitenantdev-dev-airbyte-v1-logs + state: b-multitenantdev-dev-airbyte-v1-logs + workloadOutput: b-multitenantdev-dev-airbyte-v1-logs + s3: + region: "us-east-1" ## e.g. us-east-1 + authenticationType: credentials ## Use "credentials" or "instanceProfile" metrics: # -- The metric client to configure globally. Supports "otel" From 4cb3a5f7c707fafcd51a3ae950f3ef31cf3a8592 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Mon, 30 Dec 2024 10:04:17 +0100 Subject: [PATCH 49/69] test airbyte-v1 1.3.0 version --- airbyte-1.3.0.tgz | Bin 0 -> 346882 bytes airbyte-v1-notused/.helmignore | 26 + airbyte-v1-notused/Chart.lock | 51 + airbyte-v1-notused/Chart.yaml | 72 + .../charts/airbyte-bootloader-1.2.0.tgz | Bin .../charts/airbyte-bootloader/.gitignore | 2 + .../charts/airbyte-bootloader/Chart.yaml | 6 + .../charts/airbyte-bootloader/README.md | 47 + .../airbyte-bootloader/templates/_helpers.tpl | 51 + .../airbyte-bootloader/templates/_images.tpl | 17 + .../templates/bootloader-secrets.yaml | 18 + .../airbyte-bootloader/templates/pod.yaml | 130 + .../charts/airbyte-bootloader/values.yaml | 189 ++ .../charts/common-1.17.1.tgz | Bin airbyte-v1-notused/charts/common/.helmignore | 22 + airbyte-v1-notused/charts/common/Chart.yaml | 23 + airbyte-v1-notused/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + airbyte-v1-notused/charts/common/values.yaml | 5 + .../charts/connector-builder-server-1.2.0.tgz | Bin .../connector-builder-server/.gitignore | 2 + .../connector-builder-server/Chart.yaml | 6 + .../charts/connector-builder-server/README.md | 64 + .../templates/_helpers.tpl | 59 + .../templates/_images.tpl | 17 + .../templates/deployment.yaml | 179 ++ .../templates/secrets.yaml | 17 + .../templates/service.yaml | 20 + .../connector-builder-server/values.yaml | 192 ++ .../charts/connector-rollout-worker-1.2.0.tgz | Bin .../connector-rollout-worker/Chart.yaml | 6 + .../charts/connector-rollout-worker/README.md | 60 + .../charts/common/.helmignore | 22 + .../charts/common/Chart.yaml | 23 + .../charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/common/values.yaml | 5 + .../templates/_helpers.tpl | 51 + .../templates/_images.tpl | 17 + .../templates/deployment.yaml | 216 ++ .../templates/secrets.yaml | 17 + .../connector-rollout-worker/values.yaml | 273 ++ .../charts/cron-1.2.0.tgz | Bin airbyte-v1-notused/charts/cron/Chart.yaml | 6 + airbyte-v1-notused/charts/cron/README.md | 62 + .../charts/cron/charts/common/.helmignore | 22 + .../charts/cron/charts/common/Chart.yaml | 23 + .../charts/cron/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../cron/charts/common/templates/_errors.tpl | 23 + .../cron/charts/common/templates/_images.tpl | 75 + .../cron/charts/common/templates/_ingress.tpl | 68 + .../cron/charts/common/templates/_labels.tpl | 18 + .../cron/charts/common/templates/_names.tpl | 70 + .../cron/charts/common/templates/_secrets.tpl | 140 + .../cron/charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../cron/charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/cron/charts/common/values.yaml | 5 + .../charts/cron/templates/_helpers.tpl | 59 + .../charts/cron/templates/_images.tpl | 17 + .../charts/cron/templates/cron-secrets.yaml | 18 + .../charts/cron/templates/deployment.yaml | 187 ++ airbyte-v1-notused/charts/cron/values.yaml | 233 ++ .../charts/keycloak-1.2.0.tgz | Bin .../charts/keycloak-setup-1.2.0.tgz | Bin .../charts/keycloak-setup/.gitignore | 2 + .../charts/keycloak-setup/Chart.yaml | 6 + .../charts/keycloak-setup/README.md | 48 + .../keycloak-setup/templates/_helpers.tpl | 51 + .../keycloak-setup/templates/_images.tpl | 17 + .../charts/keycloak-setup/templates/job.yaml | 143 + .../charts/keycloak-setup/values.yaml | 190 ++ airbyte-v1-notused/charts/keycloak/.gitignore | 2 + airbyte-v1-notused/charts/keycloak/Chart.yaml | 12 + airbyte-v1-notused/charts/keycloak/README.md | 71 + .../charts/keycloak/templates/_helpers.tpl | 51 + .../charts/keycloak/templates/_images.tpl | 17 + .../charts/keycloak/templates/service.yaml | 60 + .../keycloak/templates/statefulset.yaml | 193 ++ .../charts/keycloak/values.yaml | 245 ++ .../charts/metrics-1.2.0.tgz | Bin airbyte-v1-notused/charts/metrics/.helmignore | 25 + airbyte-v1-notused/charts/metrics/Chart.yaml | 6 + airbyte-v1-notused/charts/metrics/README.md | 40 + .../charts/metrics/charts/common/.helmignore | 22 + .../charts/metrics/charts/common/Chart.yaml | 23 + .../charts/metrics/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/metrics/charts/common/values.yaml | 5 + .../charts/metrics/templates/_helpers.tpl | 39 + .../charts/metrics/templates/_images.tpl | 17 + .../charts/metrics/templates/deployment.yaml | 124 + airbyte-v1-notused/charts/metrics/values.yaml | 110 + .../charts/pod-sweeper-1.2.0.tgz | Bin .../charts/pod-sweeper/.gitignore | 2 + .../charts/pod-sweeper/Chart.yaml | 6 + .../charts/pod-sweeper/README.md | 71 + .../charts/pod-sweeper/templates/_helpers.tpl | 59 + .../charts/pod-sweeper/templates/_images.tpl | 17 + .../pod-sweeper/templates/configmap.yaml | 73 + .../pod-sweeper/templates/deployment.yaml | 105 + .../charts/pod-sweeper/values.yaml | 120 + .../charts/server-1.2.0.tgz | Bin airbyte-v1-notused/charts/server/.gitignore | 2 + airbyte-v1-notused/charts/server/Chart.yaml | 6 + airbyte-v1-notused/charts/server/README.md | 68 + .../charts/server/templates/_helpers.tpl | 242 ++ .../charts/server/templates/_images.tpl | 17 + .../charts/server/templates/deployment.yaml | 453 ++++ .../charts/server/templates/secrets.yaml | 17 + .../charts/server/templates/service.yaml | 23 + airbyte-v1-notused/charts/server/values.yaml | 220 ++ .../charts/temporal-1.2.0.tgz | Bin .../charts/temporal-ui-1.2.0.tgz | Bin .../charts/temporal-ui/Chart.yaml | 6 + .../temporal-ui/charts/common/.helmignore | 22 + .../temporal-ui/charts/common/Chart.yaml | 23 + .../temporal-ui/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../temporal-ui/charts/common/values.yaml | 5 + .../charts/temporal-ui/templates/_helpers.tpl | 51 + .../charts/temporal-ui/templates/_images.tpl | 17 + .../temporal-ui/templates/deployment.yaml | 124 + .../charts/temporal-ui/templates/service.yaml | 20 + .../charts/temporal-ui/values.yaml | 194 ++ airbyte-v1-notused/charts/temporal/.gitignore | 2 + airbyte-v1-notused/charts/temporal/Chart.yaml | 6 + airbyte-v1-notused/charts/temporal/README.md | 62 + .../charts/temporal/templates/_helpers.tpl | 59 + .../charts/temporal/templates/_images.tpl | 17 + .../charts/temporal/templates/configmap.yaml | 54 + .../charts/temporal/templates/deployment.yaml | 162 ++ .../charts/temporal/templates/secrets.yaml | 17 + .../charts/temporal/templates/service.yaml | 18 + .../charts/temporal/values.yaml | 193 ++ .../charts/webapp-1.2.0.tgz | Bin airbyte-v1-notused/charts/webapp/.gitignore | 2 + airbyte-v1-notused/charts/webapp/Chart.yaml | 6 + airbyte-v1-notused/charts/webapp/README.md | 69 + .../charts/webapp/templates/_helpers.tpl | 60 + .../charts/webapp/templates/_images.tpl | 17 + .../charts/webapp/templates/deployment.yaml | 172 ++ .../charts/webapp/templates/ingress.yaml | 62 + .../charts/webapp/templates/secrets.yaml | 17 + .../charts/webapp/templates/service.yaml | 29 + airbyte-v1-notused/charts/webapp/values.yaml | 261 ++ .../charts/worker-1.2.0.tgz | Bin airbyte-v1-notused/charts/worker/.gitignore | 2 + airbyte-v1-notused/charts/worker/Chart.yaml | 6 + airbyte-v1-notused/charts/worker/README.md | 72 + .../charts/worker/templates/_helpers.tpl | 242 ++ .../charts/worker/templates/_images.tpl | 17 + .../charts/worker/templates/deployment.yaml | 500 ++++ .../charts/worker/templates/secrets.yaml | 17 + airbyte-v1-notused/charts/worker/values.yaml | 294 +++ .../charts/workload-api-server-1.2.0.tgz | Bin .../charts/workload-api-server/.gitignore | 2 + .../charts/workload-api-server/Chart.yaml | 6 + .../charts/workload-api-server/README.md | 85 + .../templates/_helpers.tpl | 59 + .../workload-api-server/templates/_images.tpl | 17 + .../templates/deployment.yaml | 208 ++ .../templates/secrets.yaml | 17 + .../templates/service.yaml | 22 + .../charts/workload-api-server/values.yaml | 281 ++ .../charts/workload-launcher-1.2.0.tgz | Bin .../charts/workload-launcher/.helmignore | 23 + .../charts/workload-launcher/Chart.yaml | 6 + .../charts/workload-launcher/README.md | 71 + .../charts/common/.helmignore | 22 + .../charts/common/Chart.yaml | 23 + .../workload-launcher/charts/common/README.md | 350 +++ .../charts/common/templates/_affinities.tpl | 102 + .../charts/common/templates/_capabilities.tpl | 154 ++ .../charts/common/templates/_errors.tpl | 23 + .../charts/common/templates/_images.tpl | 75 + .../charts/common/templates/_ingress.tpl | 68 + .../charts/common/templates/_labels.tpl | 18 + .../charts/common/templates/_names.tpl | 70 + .../charts/common/templates/_secrets.tpl | 140 + .../charts/common/templates/_storage.tpl | 23 + .../charts/common/templates/_tplvalues.tpl | 13 + .../charts/common/templates/_utils.tpl | 62 + .../charts/common/templates/_warnings.tpl | 14 + .../templates/validations/_cassandra.tpl | 72 + .../common/templates/validations/_mariadb.tpl | 103 + .../common/templates/validations/_mongodb.tpl | 108 + .../common/templates/validations/_mysql.tpl | 103 + .../templates/validations/_postgresql.tpl | 129 + .../common/templates/validations/_redis.tpl | 76 + .../templates/validations/_validations.tpl | 46 + .../charts/common/values.yaml | 5 + .../workload-launcher/templates/_helpers.tpl | 258 ++ .../workload-launcher/templates/_images.tpl | 17 + .../templates/deployment.yaml | 557 ++++ .../templates/jobs-secrets.yaml | 18 + .../workload-launcher/templates/secrets.yaml | 17 + .../charts/workload-launcher/values.yaml | 294 +++ airbyte-v1-notused/templates/NOTES.txt | 22 + airbyte-v1-notused/templates/_database.tpl | 234 ++ airbyte-v1-notused/templates/_enterprise.tpl | 83 + airbyte-v1-notused/templates/_helpers.tpl | 350 +++ airbyte-v1-notused/templates/_images.tpl | 17 + airbyte-v1-notused/templates/_keycloak.tpl | 44 + airbyte-v1-notused/templates/_logging.tpl | 10 + airbyte-v1-notused/templates/_storage.tpl | 243 ++ airbyte-v1-notused/templates/_temporal.tpl | 58 + airbyte-v1-notused/templates/airbyte-db.yaml | 85 + .../templates/airbyte-yml-secret.yaml | 19 + .../templates/env-configmap.yaml | 160 ++ .../templates/gcs-log-creds-secret.yaml | 18 + airbyte-v1-notused/templates/minio.yaml | 185 ++ airbyte-v1-notused/templates/secret.yaml | 18 + .../templates/serviceaccount.yaml | 77 + .../templates/tests/test-webapp.yaml | 29 + airbyte-v1-notused/values.yaml | 2313 +++++++++++++++++ helm/airbyte-v1/Chart.lock | 34 +- helm/airbyte-v1/Chart.yaml | 34 +- .../charts/airbyte-bootloader/Chart.lock | 6 + .../charts/airbyte-bootloader/Chart.yaml | 10 +- .../connector-builder-server/Chart.lock | 6 + .../connector-builder-server/Chart.yaml | 10 +- .../connector-rollout-worker/Chart.lock | 6 + .../connector-rollout-worker/Chart.yaml | 10 +- helm/airbyte-v1/charts/cron/Chart.lock | 6 + helm/airbyte-v1/charts/cron/Chart.yaml | 10 +- .../charts/keycloak-setup/Chart.lock | 6 + .../charts/keycloak-setup/Chart.yaml | 10 +- helm/airbyte-v1/charts/keycloak/Chart.lock | 6 + helm/airbyte-v1/charts/keycloak/Chart.yaml | 4 +- helm/airbyte-v1/charts/metrics/Chart.lock | 6 + helm/airbyte-v1/charts/metrics/Chart.yaml | 10 +- helm/airbyte-v1/charts/pod-sweeper/Chart.lock | 6 + helm/airbyte-v1/charts/pod-sweeper/Chart.yaml | 10 +- helm/airbyte-v1/charts/server/Chart.lock | 6 + helm/airbyte-v1/charts/server/Chart.yaml | 10 +- helm/airbyte-v1/charts/temporal-ui/Chart.lock | 6 + helm/airbyte-v1/charts/temporal-ui/Chart.yaml | 10 +- helm/airbyte-v1/charts/temporal/Chart.lock | 6 + helm/airbyte-v1/charts/temporal/Chart.yaml | 10 +- .../charts/temporal/templates/deployment.yaml | 10 +- helm/airbyte-v1/charts/webapp/Chart.lock | 6 + helm/airbyte-v1/charts/webapp/Chart.yaml | 10 +- helm/airbyte-v1/charts/worker/Chart.lock | 6 + helm/airbyte-v1/charts/worker/Chart.yaml | 10 +- .../charts/workload-api-server/Chart.lock | 6 + .../charts/workload-api-server/Chart.yaml | 10 +- .../charts/workload-launcher/Chart.lock | 6 + .../charts/workload-launcher/Chart.yaml | 10 +- .../templates/deployment.yaml | 2 +- helm/airbyte-v1/templates/env-configmap.yaml | 3 +- .../templates/gcs-log-creds-secret.yaml | 6 +- helm/airbyte-v1/templates/minio.yaml | 8 +- helm/airbyte-v1/values.yaml | 155 +- 336 files changed, 25282 insertions(+), 125 deletions(-) create mode 100644 airbyte-1.3.0.tgz create mode 100644 airbyte-v1-notused/.helmignore create mode 100644 airbyte-v1-notused/Chart.lock create mode 100644 airbyte-v1-notused/Chart.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/airbyte-bootloader-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/.gitignore create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/Chart.yaml create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/README.md create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/bootloader-secrets.yaml create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/pod.yaml create mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/common-1.17.1.tgz (100%) create mode 100644 airbyte-v1-notused/charts/common/.helmignore create mode 100644 airbyte-v1-notused/charts/common/Chart.yaml create mode 100644 airbyte-v1-notused/charts/common/README.md create mode 100644 airbyte-v1-notused/charts/common/templates/_affinities.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_capabilities.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_errors.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_ingress.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_labels.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_names.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_secrets.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_storage.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_tplvalues.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_utils.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/_warnings.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/validations/_redis.tpl create mode 100644 airbyte-v1-notused/charts/common/templates/validations/_validations.tpl create mode 100644 airbyte-v1-notused/charts/common/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/connector-builder-server-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/connector-builder-server/.gitignore create mode 100644 airbyte-v1-notused/charts/connector-builder-server/Chart.yaml create mode 100644 airbyte-v1-notused/charts/connector-builder-server/README.md create mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml create mode 100644 airbyte-v1-notused/charts/connector-builder-server/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/connector-rollout-worker-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/README.md create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/cron-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/cron/Chart.yaml create mode 100644 airbyte-v1-notused/charts/cron/README.md create mode 100644 airbyte-v1-notused/charts/cron/charts/common/.helmignore create mode 100644 airbyte-v1-notused/charts/cron/charts/common/Chart.yaml create mode 100644 airbyte-v1-notused/charts/cron/charts/common/README.md create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl create mode 100644 airbyte-v1-notused/charts/cron/charts/common/values.yaml create mode 100644 airbyte-v1-notused/charts/cron/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/cron/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml create mode 100644 airbyte-v1-notused/charts/cron/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/cron/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/keycloak-1.2.0.tgz (100%) rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/keycloak-setup-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/keycloak-setup/.gitignore create mode 100644 airbyte-v1-notused/charts/keycloak-setup/Chart.yaml create mode 100644 airbyte-v1-notused/charts/keycloak-setup/README.md create mode 100644 airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml create mode 100644 airbyte-v1-notused/charts/keycloak-setup/values.yaml create mode 100644 airbyte-v1-notused/charts/keycloak/.gitignore create mode 100644 airbyte-v1-notused/charts/keycloak/Chart.yaml create mode 100644 airbyte-v1-notused/charts/keycloak/README.md create mode 100644 airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/keycloak/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/keycloak/templates/service.yaml create mode 100644 airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml create mode 100644 airbyte-v1-notused/charts/keycloak/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/metrics-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/metrics/.helmignore create mode 100644 airbyte-v1-notused/charts/metrics/Chart.yaml create mode 100644 airbyte-v1-notused/charts/metrics/README.md create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/.helmignore create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/README.md create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl create mode 100644 airbyte-v1-notused/charts/metrics/charts/common/values.yaml create mode 100644 airbyte-v1-notused/charts/metrics/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/metrics/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/metrics/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/metrics/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/pod-sweeper-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/pod-sweeper/.gitignore create mode 100644 airbyte-v1-notused/charts/pod-sweeper/Chart.yaml create mode 100644 airbyte-v1-notused/charts/pod-sweeper/README.md create mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml create mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/pod-sweeper/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/server-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/server/.gitignore create mode 100644 airbyte-v1-notused/charts/server/Chart.yaml create mode 100644 airbyte-v1-notused/charts/server/README.md create mode 100644 airbyte-v1-notused/charts/server/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/server/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/server/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/server/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/server/templates/service.yaml create mode 100644 airbyte-v1-notused/charts/server/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/temporal-1.2.0.tgz (100%) rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/temporal-ui-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/temporal-ui/Chart.yaml create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/README.md create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml create mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/service.yaml create mode 100644 airbyte-v1-notused/charts/temporal-ui/values.yaml create mode 100644 airbyte-v1-notused/charts/temporal/.gitignore create mode 100644 airbyte-v1-notused/charts/temporal/Chart.yaml create mode 100644 airbyte-v1-notused/charts/temporal/README.md create mode 100644 airbyte-v1-notused/charts/temporal/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/temporal/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/temporal/templates/configmap.yaml create mode 100644 airbyte-v1-notused/charts/temporal/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/temporal/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/temporal/templates/service.yaml create mode 100644 airbyte-v1-notused/charts/temporal/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/webapp-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/webapp/.gitignore create mode 100644 airbyte-v1-notused/charts/webapp/Chart.yaml create mode 100644 airbyte-v1-notused/charts/webapp/README.md create mode 100644 airbyte-v1-notused/charts/webapp/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/webapp/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/webapp/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/webapp/templates/ingress.yaml create mode 100644 airbyte-v1-notused/charts/webapp/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/webapp/templates/service.yaml create mode 100644 airbyte-v1-notused/charts/webapp/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/worker-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/worker/.gitignore create mode 100644 airbyte-v1-notused/charts/worker/Chart.yaml create mode 100644 airbyte-v1-notused/charts/worker/README.md create mode 100644 airbyte-v1-notused/charts/worker/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/worker/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/worker/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/worker/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/worker/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/workload-api-server-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/workload-api-server/.gitignore create mode 100644 airbyte-v1-notused/charts/workload-api-server/Chart.yaml create mode 100644 airbyte-v1-notused/charts/workload-api-server/README.md create mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/service.yaml create mode 100644 airbyte-v1-notused/charts/workload-api-server/values.yaml rename {helm/airbyte-v1 => airbyte-v1-notused}/charts/workload-launcher-1.2.0.tgz (100%) create mode 100644 airbyte-v1-notused/charts/workload-launcher/.helmignore create mode 100644 airbyte-v1-notused/charts/workload-launcher/Chart.yaml create mode 100644 airbyte-v1-notused/charts/workload-launcher/README.md create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/README.md create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml create mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl create mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml create mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml create mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml create mode 100644 airbyte-v1-notused/charts/workload-launcher/values.yaml create mode 100644 airbyte-v1-notused/templates/NOTES.txt create mode 100644 airbyte-v1-notused/templates/_database.tpl create mode 100644 airbyte-v1-notused/templates/_enterprise.tpl create mode 100644 airbyte-v1-notused/templates/_helpers.tpl create mode 100644 airbyte-v1-notused/templates/_images.tpl create mode 100644 airbyte-v1-notused/templates/_keycloak.tpl create mode 100644 airbyte-v1-notused/templates/_logging.tpl create mode 100644 airbyte-v1-notused/templates/_storage.tpl create mode 100644 airbyte-v1-notused/templates/_temporal.tpl create mode 100644 airbyte-v1-notused/templates/airbyte-db.yaml create mode 100644 airbyte-v1-notused/templates/airbyte-yml-secret.yaml create mode 100644 airbyte-v1-notused/templates/env-configmap.yaml create mode 100644 airbyte-v1-notused/templates/gcs-log-creds-secret.yaml create mode 100644 airbyte-v1-notused/templates/minio.yaml create mode 100644 airbyte-v1-notused/templates/secret.yaml create mode 100644 airbyte-v1-notused/templates/serviceaccount.yaml create mode 100644 airbyte-v1-notused/templates/tests/test-webapp.yaml create mode 100644 airbyte-v1-notused/values.yaml create mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock create mode 100644 helm/airbyte-v1/charts/connector-builder-server/Chart.lock create mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock create mode 100644 helm/airbyte-v1/charts/cron/Chart.lock create mode 100644 helm/airbyte-v1/charts/keycloak-setup/Chart.lock create mode 100644 helm/airbyte-v1/charts/keycloak/Chart.lock create mode 100644 helm/airbyte-v1/charts/metrics/Chart.lock create mode 100644 helm/airbyte-v1/charts/pod-sweeper/Chart.lock create mode 100644 helm/airbyte-v1/charts/server/Chart.lock create mode 100644 helm/airbyte-v1/charts/temporal-ui/Chart.lock create mode 100644 helm/airbyte-v1/charts/temporal/Chart.lock create mode 100644 helm/airbyte-v1/charts/webapp/Chart.lock create mode 100644 helm/airbyte-v1/charts/worker/Chart.lock create mode 100644 helm/airbyte-v1/charts/workload-api-server/Chart.lock create mode 100644 helm/airbyte-v1/charts/workload-launcher/Chart.lock diff --git a/airbyte-1.3.0.tgz b/airbyte-1.3.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f1bd28eaf72c1f64d6db79c03b34b7db5e582e92 GIT binary patch literal 346882 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

g&<(kCVrf8V}B2q*2>i8Cm5~bi3UZdci zr(sYQz!Bx8l~_wnOD?lh-Dn-RmmJ%T2^uHr&=Yz8QH?%4Qel3DsP$E@)h>P?KjcpL z)YkOibJta}`$usw2}TdRr8*#=>`6z$%X9N;E8+5@dql|=m=QeIg0{OKCQ?xJ+yDI1 z*Ry?n^XL4R+xNkv4(R>&`2M&GE2~YkMD}1GML`V22Ib*35qbD-KKG+RG&Q2@vu0%W+TPH@Ss zqtHSA3i2tox-Z$&c34s%1+LAs?x8QPOi47Q0JpS&rUXI(nnHv$33~wzc)%Kl&TJXo zm#S{NUP~OTGwQ!DThQ|{O)oeHUqWgs6(c|wJbF?$%kUZkdE)tBvUEBhs*s=*O!N)9 zwp5&$e|Ag}_)657Z9lxfv=zl7uM1sTVZ;jK9xmd-!V(=PgKumB6sy71eX2j`x24C#__V?n7^62V#=HDaw;SqC%zQk2nDuHQ7`kE^Lf?l~# zH>#AKl-_TnUzhKlt^KTmMYO-nNe(VDPHDMww&u+Mu2g;9@gGeA8*gnrJ++Did&^b% zylQeVJfy5&fapXM*JZGC@}T7~vrVSmgC1k~he2xOTGJ}jParpZ2pQ=>cowJXxa|)d z2K6E(qnqr*u76@1vy#dHeW!{0L;!uVYm@pf0^h-1Jt!ec9No(8*KStQ9xYOAvDF@3b5O$65HO1Ubejn;A%*-KT#i)~~PeG}yDio@(v zXOUzLOOGj;{ja-7A`7B*1R<5ABZJb)RY!p3IU@)Dof!v>O{j6eExF)PX$$jSZ-ap# zCP6HkeJD;t-LAPt0T-?ftt!G0>7vz;u-_7X7$MRHv zVKb^*>|MDw>?mgWhe#g_%Em*)#V)aBIn1%ZACl)aeVL~>!BB2qE@^X8YTPFY6e?H#&b)33&m*#dL2A0WL7In$5ZEFO_vNagK{(v@mLVc_FqPdyafmBd%sm`}&&px;CwFXbfY% zlS#OetsUCe@w}tA3>NY0T9zZ6Ny~ z@XY4iQx33P`v&i-pI(aBX;r{VyC%8(d_9Ax%pBgi( zm1M}JN7{J$NUYTrkaJS)&X1((<-KHis8oMusrgMS{#(8t21C*>>>l}|XFa+8nHEWW zYcQ*H|PBj{D}##@!NjwabNe| ze8ZR7lk)hlzzRL!bKAS;X2<97md~@rr*GJ=SRhxfwtYp=`btS@gQ9KGJim=HJEPsDM36Sl zlHaf=lOi$>38}k|3oRWF|92)U+dQ!}SL}9(PsCC{`c_FiDYL9twF$%9adG^_7<08$ z{I?=PAx;W8DjNe>&p}iX;4U!x!5lT64?zX)r074!EO=3aLPwTT(h}V7@guLxN!|(z z3$g|UakMeNjRGBMY3RO0NH>4br0io7Tt&RATCXXF=hQ3M174%5oYA! z(F*fbB?1iThJ4-}+0Mgr;b*+kz;s5#0YCqaelRLe`! zqx-TiV)Pa*x+>#oI=aCQFp9WZTM4llgQ-lsPqoT!f5 zONlC{oWJWQKYn&6fi_ZznjLgX|9(IGq1U53-2zw%?gJykdkWSsHG!;$?Ht7JGTB6< z;xn-@p>N7I}0{axK?sffxGIJanTJ~rvUBP8xV99~`!h~(woEkuZu zmdfaLL{lMl3{&r+ffWVy{hU!nt8bdxpQ-=)>&=%0-8U}Fz+%xSd(XdKx!qcP`OqV| z3T0T`J$*PXa`^5BXnz&>krzDbkF0hRQ}Tn=6`d41+TfbD0bP4=3UQ3C%2Wbqd>Kij z02B!cM=4dduZB!szFu4>M1;w5)q@WZWebmVYGr %-d|1k9hPA+?wpmM*F;*MR}9 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 z zQchi?`5szPLP`u){9Sab%$0A^RjXAjTW|$gz6NktQx*GS%PLG6E0tepD9h$Mb@Z(_ z)o7@(Fiq4Uw+URy!oUJs8)-RjuXNLB0WgEH7VD(u`eW2FW4q>cs-tYy%*=*}leZ|0 zfg;;AHLBt!=9M}%wd}x%x_q~;d@0aiUZti+A!K4jdCN|rX7CG^EcK=4vt%J`;TZD^is^bnvx9*h-qR{ zxfmKM>uMPD4pmk1zxo>liWOu7YV!Z;>}?nQzjk+??EfF-DH!khI3q&{ad;dLQp~b+ z;%AeTICJv^iA*0>9(VLshOu@; zhm@&r?ii=nUJ?(TYcji`X#g2iBs3R^*cpzi&0rlD4JI+f6m)d@BWH}m+@wiqYv1UE zDw8x?pkI!aw?)UubQh?Zm$|vQvCbBbm2=W5rgr((to!t=;Avj}@1G5($^WZc%>TC4 z>2{vh|3`V&)=*&?Tw6oOu-KYu7Y~lx2Zt!5G!lXHl9Y1Mi!g|b`G44Tm>?n|afy`e z5Uwo$t(GQ{iuP&g_->x&`ENu6kXoN`$%p_A^M7~uWpVy*?QM6S=Ko_n;P5^T$31YW zAA}L%oBr!DCyPHKJ)|Otv|l*qB%7o$!jN1Q&c8YuGq}h@C^V!F^ zKKe}j3COOHn^IIFu}_q-0l07-iL9=+tBb2`3%qMGvv2lj!q09rdz|Dem3kT9x1pEgh#(Yr6rIo0{3w!BF%EU#Ns@Vte=T`!J>a6|RR7I`HV zHyUhC!U3oxR3I5mn~jovhq6{JhxpQ!gtMMO`Na&el+_rSZK7u|Ya#YdiQq+yo{0rc zT7Su#oJB0az|lLwKC#x#T90sDJSS_pp^PRpqQe;km$m6LqKuzU$dcRI>L#bP$$gv2 zneT#+H#wKzZ{6xixVkA=iO40*5PH;+4>wk8=t*+Z?mG}C3KJW?w4^c}r*`9X$B*WcSb!@|8 z+1AQv6_f0Srq{CLi&06|Ia`ugd-tXl`J9m$v>A)hOClP^L+|>Ph_$>z((!%dPugFQ zXsYyM@>ZVfX$0U{P z`nMob7!Omz*n$L7rE7?z+ z&h|@@uBPVdsJ4H0EN#FSq#aH|Rbg=wc2+?`8LNGH{;RFKIx_yuS)0Zgj?ftm(EcQ& z%*PQ)7o_Sa!AnS_+sl$u>o?6EmQ!x4L@SAT7!TXiEhy4J+){-)vNl#;d^i}yLgc-W zIn)DT`>Ar~gbZza+yC^OeRP9okdSah{Og+1H&|GEhH;kCVB(ViP2wz!bb)Pe+v|v| zfA)!*gOOC;L^q?*ALVI@u$8i{_2ui=7DC#{)pMk^DMu@0X4??@KP5x*85Fx__Y_8<4IgK8ZTZfC{#}p$c}5^YRw0OGOaJ` z)89Jo4}WaD`0fAw`p1i}U!S$mx>&pH+K1=C;f#;Ub z2Gd~wwcXw67VW>fotIDg-^X|s)BnOUe>qC&WH=Hlk636#FnvCcMUGZ+52y0PGM!&} zgfqlJ!UEPOqMYYA?-?GFp17!-;wTJ27&zh$bUGrtjJ==cg_yLg@p!`#@c^V902P8Y zwGy0-yo`DZt4^ndTEgc>{~>})wICB9R1rnpPRGc?Qo^wNP#AWXz_6<^ETJN&tIT+y z!Lu?ZX1DZJTg8Z!Nw8sGYIB+3T-gn)22p}jEUd3wRBR2oNNxqL@|zAk^p+z)2S#b> zw+Q)xVZY-t2V?^Z!CG0cUYMa98b8laHcIJ@+9Xvnck($yE;`VE-v6Xw3>WofDwvm(I1Vc6D~VA@n>uFi1s>M@!!y89(zN#)wSJFPCg%%u zbbfw%-b26AiI|T`N~d8!(2Pz}BlU!tH5{@v$`c@*X}6ky`nJ!$$T1(aNA$+cXgf>k zq#qGBqBL_yBpM4Nc{gNiLRfn(@4PG6&%GIik;-He#zR?Njtsj)7ynVHB<&@vVr7QB zMFSj0kA7wS^sMk%O8&cJHo&I%FFP;yit=CQT{|M8O&@B=L#cb{8jG4>zW$1RtLu4;h+Gll)A5N zQZd#5SU^ZYps*|(i zm|6`(D@LGAuOffcVqP7~@ju~*NSyISN1n8~IIQ;TIZR%f87pV?!lAH%y({o(W^(ye z9qjm;?B@|U^MO_+>W$0fkXDvk!2~JY3N+?zG3lr72{yi$Y4+&d`Hm**w-(n{{wyc| zORJ704*-qwf47+bb!%(qN&ovO&ocJEKY`vNBdCx4Yd#}L%(o;^;Dk)Xch16oM8vfm zjv~`Qc>nBJ-99l>^;_PfB$vrn^lBnQs7Xzz{3?IRZ)Y^k@^A82Q9pTRXd?}nS`q1q z5RD?UH~Abg*kENz)pxTtZ%5Z|AIF)8;1#4@Tc;_CC*wXzH#kVX!OLnMI?m8d7)7X0 zP?qAD@o5%7V99U*?#CIL;V~rOB{68=w7OF#BBv=wGmJAbBqdenAt#)v=e!&d{aIZ? zstK;e2^!ZcKud$8&qc=Vd+&9_O?Z_JTIGc}O(8+L3B1Z$X`@`K-n2+GV2r%j2257S zzw?2#zQf2C&q4B=l^?YT5TS&_G7o}$svR?(@V(RqLKX1LkEVeZCzS#i#+eOmBmXvt zD9(0wir-apz^dg2MI^NHPC5TncP2~H`Wluxto=R?Ak$u8H3g4Ui3UJKwFZo zVr1Tu?&1i+no` z#eq%|#;op~lR+NV%WRFWQ~~u_d&0-9Es5M-(*x?7V44S)!+s|~pNl|*`B~3^RHKbk z>$K7F`RBPgt*To}u~dyP`-RMq1-exvgda^RDtiZPPsj}V2=IjGb2Vg!nqGx#{x` z*Zyqk+a;Q4YdOu|m%Pi8>S_J_yFW{<|AJqZUH%*OKfBw7{2yE0y(jy>$9a}m|BpT= ze1+l?Z7dZeU}y~Sp=*~ZbB%HHBGMHa>cVQG)4$^}Llh{YQ+wf;NzL*RK z;b+ux%QC${@*pKRlSm0PInK)J88cyO-k;^Di#@EV19C$tUwXQbVc+bC_*>`qfQaJQ zC#dz$7HWNJ-Mv#-6K*hxq8a*Yf}?N{@`Fi|KxaMYBN5P{e8$`0m@{pH&ght!TDknx zD2^=<)LbZ`vQfy;x+K-%$ptS9ny`fU8=iAKP_|$Kh&Hk}XdmVZE}%P@(R1V_w)1Ju z3ziO&ici!>%`0xf1+i3MA-bDK$Y-&%2w0e34LmhD1QdJg)VNx2mqxJ2g%&i??lR0a z|AgGgghES6Vt@9xhZ_s;AU`6ww>gsy2`FB+Z=`Vu96PYggF%5*BGK8VbCZSZ(UII&kEY zHp!;J@Np^SH=v-wXqcUJc9hUl>9F7^1r_Rl?i&qwmE0tRP17HmFhzELi)E4e>}GVFhrZ9Y zd9)X!C^EtmvR8T*CNQfHE}EEjU8&XG;{14wpn8tB5&~>P7>uPU|3#qTwbFv z4#?+uwVr9D>y0NHr<(%NJlnJrCrwdGvNR-9!g&k)6r+^jV1|4U)`Nv+W$rR5ZdDBP zF3aIn9h>c0h+5KPG5BDIg)REfb}Rg9w^|#h6_I$DjasPNfia|f48e}TKE+#q&ov;E zlfT5V$hBDZxfsdkI5E7BBhdFW#pMJNgVYcvQ`mI>cql95yz14)^wRp~!)y8T@A%4ud>}oe*x6{)tWcQh(m$qm0~=ld{9djiv#(qRLPw zpeR#W=A@T2G-S_a&b(c|J%|ac_n{J(iUn%@cz|#P3-h+SF}YDQsZ3Ehd~({eg!n?YBfIcie0XlH z9Ri`eVcxeKy~gdoyzS_X@tMY~_ZqcYYV&-i=4Rn_z7!OL@9Ph$r~)ikF{6C9gFM-N zU0Cvf;;dhUh*I1~Cs`OVZ%DFV$n3|Ij`^x?rr=>M0b;18@B1nKFn=h49_9XFr2m`O0OpgYEAj}tz`9QmC9J5NR;Ed0h!5>;qzz!HbppT zK4yM46aCoipoFpN(qAf~NGlnuBILqlE@1!O`Um^Hg#t=Mj4Qdk>CIex|2=N0?ul0C zyW2}E;F|F?oT>8O)s!_{S#ME)cZbBjnLfbmx8Y}4aGp|0rcJ`?3H92XMRi_3&y?Ba znK3)ZN$+KTjrOl7>F&ZlLu^ zl9Wr`$~Y>YT6Oal$}>L1v8(~wSBSz5rR*vS?-HHwl=XT@)JP+L-PZxU8iZ(Vzvyx$gC-W{Jp?>#-s-T!4Y z#Y3`U|IcoBx0wHBYisA}{_jzq<>SAYF$yjOLm=?^sa(G$$N0QJ?s%fZbHSx}g)ZJG zuxK!tLR0ziPJRF!LFsD%_pFa@IdV%;n=69?l&YC|yX+QU&#yH1iUii`axM93o%{vY zKvt2Bf?8Sa;bs}(^!R)0_m&xF!IUeS>Iy-o8nfEoJZ&c5-?P;Ep9gwaY6oao|2w;# zlKsbScjsySe~f3T^*;_ssB^I@dEH_bD!Atjd z(_BH4uY6e&sV`rwfygFUWJH7f9KyZ+}rW}$?&inbtdKL6ozJ)rjdb!}b zP}8tJVNY?YY<{Y7hW0M$Q9S*CQ$b}$xMJ3If zNf-r)#8WiIsklB9<|SCz-8YV0feK>S)KH9PuD%Fv9*Y7fLk$XFzyvCZLeP3J{s+W_ z=JKxWuu%ilga??BA4^q1+vpZ!V-?#lH;Gzkc{r@P66;7PEIqVQArQmQTz6RurN%BJ z%eUS^O2=xm6eHL;a&s?kw5f#nwbYy{0nW8nyf^Y1%NRkgmD}COxhJojT1I8qa`9sbs{@ z=HJNVA;2dDy+-TmA}L44<`Cn*8oRReA}m*bNm;PlxhAu&&4*yEvn(fC?G>%PWcT3$UVlr;l%$OO z!e91YBl%O7vboGGS{&rNU6^{67f&13m8HQB1yeDve0MfigD)o?`aUGjr{{ZkmXiN( za2kj4aM>e3qyD#3(*N#spYne{%Cm(0|51!S!hJf)WWtw}MiF>n;o&^7Uo(y@e~E{4 z!hfGrn$277E1{V>Qyd3qU27&<%ILU-jDX%7GNx!TdiSlk3;r>T1JrWU-+vGO`RtaB z@Yc)SUQ2`<{kVUAa(wbr51r?|M*+!*pOFBqbCKK#9RBrdkH6t%zJA@CWX-c1rq^Eo`FVNj;F%ng=6f-*1+Bk?p$X)N3(z&N`;1BIjwNtsGQ0S0^! zr^S`6xV#nDDCrowi>EE*zsa-A`fnJwv_JWnF&qaeZr%(U*8i8C?rvfIf7yBR|9hNg ziS=Jv0ugkehCYvsm!}NEsYp{;O7XRbtyIob8epArNCke?#$3vX-##%cW&&b+m&kI$ z>?7~23bCFNY5SpU;5F7-{lQ#`t!P(SnN?Y)d)hEPZ%H}LVV2jWDJQFk4#lajC;D5v zM=nZS;|yAGeW^InE|JW;6tNm&e< zwuJfFDED6|v}v2QfmlIPAvioM`u#uz+M*8`+_7$`kCGrFD5dQwRI==2Mdj5pR*|Ld z)|y0CFmI~~v0M*U{#I?@m|ws&uK^I_ASva`Q*bLxC{3HhN|VGn5f~<)!zje*%y1A8 zI&Fx`5DrI~Qn}Hz;PE$iaci6^Dssr22YvCuP;eF)1yfa6KO(AQb7*hr9Qn#uW9nU{@xCwJ zl|{T5@1bg@dQHJ`R9*K*iRC_G83f3Qu zC6Bm#h*x|%wlJ`J14x>Tau-M362n!UkZr?AGsBvN!$#S_ebq_`Md>n;SE`06+S{Am z7YT&S)u(05h1MJ*)J&>+?yD%j02Ai59)L_$IL)Wnzl$PgksWYlx||gX1B>8&2W5@| zTLJGbikt<(tXPesIaAEY$LH@7Bb$raf6GzL(Qg=0bCs+bG4uVmRm0s~|3l*;U4{Oq+u7OPF6n=^ zpZq@_<++pohY$VXoBxrL;eW1P2_*UI`%wa!y{*>-3AFF23o@H}Acatwyvr$sWc`&W zglt$f3ZeOG92-Q98mCdIROnQ_Qt5kB2p!@K_c1Hh59I5|QYc*z<>ygWC5dm1koG6p z=qTqE1CHj48Z{KWKB{N4W%MN`77b_72he^A9fXO(cc~VWOWnVLT1-?hC)s^k)o_}X zah$UXT`u7A@H)A|j`m&YKSEzxLh&<`u78N#D zr+Wk8tG|+C;{tf!MJFJ^{=Ic?vJ*>;`(1T!HBj!Wdy`c{U zYxl|j^HH8V>HlUI|M%O~EB>rZ65n3!2c3LS%P(l*fz*6OVlJoTgW4-m@tKhBXz^ts zb7y-m6Uvjd*ORqZ`GgNM`rkmQ^{s8atd;Y-(kgvpOE1BIPj+74M%UE1=dDiDw5pB2 z8Rxs4umI@aTgL=lSa`JWs$Z&vabN8c0R7H&OA9M8>P5GQRAD^K^t!j^Ld>hbxjk34 z82z^!&BaxOdNusM?YQpx+*$vVP?il-vWOC>!TzheThjl$+Jd-ay( zijIahjI+`l>!Rw`Ditf9z1e(2ZA!UVC1vZ6`Q_sE=h}+7v7!(&Wh`v07>V^3|`<@gHcN3oj;)emzIqnEYjPHmtS&+nY z-kw)xwh1Gi%5Y@G#Lw;i|8KT=%HrS*7&2&x8JLqznh-P@kMkfeWo91^31}!$y zY%p7WQdWV?*NbCn;8Lwa+OWGb=R958#MNz} zD2aqi4nd7r`GCrh)gBKP?$Lv+9(mFC`a-mM1p!&PJT>R=Ei&g=QW6>MoK97h$|d7k z)-LTr)h#~2N@5DDcUwwqarbY`#g+Y8-Rfo%ddZcp2(LZ_F;W zeQIEt8kR^3)7<2TdF8&1{`k)N-;@O5f{7p+?EiMRJDrmK-&6j_$9bH)D1guT*guT> zuVAb1M)wQo)T@2r^ZhiwqJ@W1_Lhjbm|9j;TTCNcYj9@)xh6B_B~Z2i2vSbqH2fC{ zK9H2vsOT(UMip-=>a;{Iq&hAi>s}`%0_}g$V}zqQl!!<#AYIyMHeQIh2?uj_9xkB`SFx2+>GOdk+Y@H z{4TWlM&`ntLie#Gw5VOLLDhZd_^YO++-Ixo4EwVJx6QGgGfUR%w(TXjw&A7iXGn8HC&Z8D}d;3~nLgv~Kdts|a_Tml5w4is~JBrxO7eB&5UGwIQF@sB`TTEga}8R6hV%c4~(*m9(kqLOBI; zVHi+iZ1$>`)k==bkxXlyQ6-50*6~n+3S&b;@n(1&S>BHMVXsD?l8Y6!`jqN+85)w9 zq&Oo%dvP~QnFYS7eNjyIO(GNE3|BW%Z}+f(T%T`MB4f0twPV(SshN9N7!OOwg`9^y zJVU7r>L{MYohji#??7j3XxiM%+OJ_TBhE~YvqTZ z4dsMsyeZ#yPfPdQ&!$*=jPmIqw=%29kYopwG$nDaRBW}1iW?jUdgYKSMnQj~TB@TO zRJx=`@$>^uO(V$~H1abHy3CKuz9=GCyZ3wid#tPx|G|EbD^5D1ae+A>IY|L;qsGw7 z)&L0b&;P-mmzOo2pcw}NdhWVhEaJzl*Uxxyxe9PBa2$C26qd6_KKjNxMZgjzzK?TF zv;6OkNHh+IF-^%G+h~ygJ1@72`F}f|m)$4%|1q95bcQp&QZdfkVwm~16Qlkli~_!j zC)mHnL&7{~4PA~xhS(%YXqqv^MkI>B<^_#$=8wX7xQS8{;VhiWZ8Lw52;x+kk+W^KQ=sc8b>okW2nhdLJ3Jx6vo7Jyu*u67kra**3bd)CHio1fr2n)jyDXm zHvB8lcf9_;(l-37UW|rq{*U^}rg1w5)W`nyB!ROJb6$AtCUIVPeSGb_@Un5@y!ii| zHS__eA)PREe0anhFG=a2#LpZr3 z{Q1Az+3W7v^S`^d)p?5l^C-_6dJ|?b9*1f+ybb#)ms$=u6FAO3`t4^DjqTTetdFuR zVZC;n?+qRswFBz2c1DxXXYEK7{Uq6FjhEQ~{r51XlY}oRg0)aYhoO)9B)cJe!I6lF zdYP#B#MMBB;07LTH~1zjZo`n5=9h!q-hki1QKg&=s3<& z8cg6C!f{}c7J^8U(rFkFhOnZ!Qs?o0B_w6&W)%7(1mEOgNpim=E0~Pj-$kX@l$bWXBK8Y7JO3&g)kqRzyb zF{~ojExIyIl7BosZAsk(Q>wbwoBi_^|M$OI8&_y9DkGc*7ApM3W22JLKoO-xm4pTg zlQ#c5&cZ6pG%7wFCp0E;rV+~ZDpxkE)S@DYQliSkp#l@?04KN~Mhi}C_Pu=9zN*3#CrL_^Gz2ZEE(*Jnf^dg% zUjom3?<=CZD4qs{2gH+QI3t5e#7Gg*Me#HtJRF{341O*57Ibtr0XWGYp1(HkP zdH!bq0HuV{N$Qhj&|PvK1=VOSjOW4m;T?#%ES?FCLVs3;>Y{k^os9UCG|Xla*hAnM zlkA43*JovP7sXRTSPsXf@x)1ZLDFgHle?}<`)9`r!UK-`D8cvS&!1@;{)@&Lj?ftm z(EcQ&%*Roa_^|ByDfMamG-4yG@MOXiCKR_PaE5}T%QW8$x4rFuE=S9HJVAsyN>iFH zB|JU2)U>K+>9f#cP?wP39$au+)$=fjnp1%QpLvsHnBsus-U{LdkFR~l8M+Ch2$7gg zz$c^96x|W0nydY!te#CrfSbyPNgjwl;Fw*nvT= zsybf6>h9fF!Bui+F{V|mZ1tV2S|P;QWI1iex7e~DZ?#$3vz%(?TWs!s8-XH!tO+R( z)_v?>lQ_7l7y|T@G)YP)b+m2}#`ozBO5E?Kqr0sr0hwZIS_lI_8uibss#!2WJ zwV4~nZrAPZwvA_a2U&S;UM&3n}(Y?lBsJuHDAr@dionLYs508SaS6V(bTTR&lFc|>f2?m<|%YQQe8|uToq^B{hDi4 zoYBM+!sS7qczX|qFZbMf66xSPHvXT~3CTq@vRSnZqc{(ZEE- zpg~>V5e`7w6Pql{a1_B3{G1uME`|XNZRze()PkmxXu|F$OU|2_^7J`>Zr*cF{tZuE zOFr`#mU}KJf5Y?Dl8-qXgkin8E*i(L;(92p@aK<>5~WI^!YibyVw?=Q`0@SgVln`K z=GJ(o|1@i@C6rT{V-jiW*>whHbmk?)$!^hJ&)pLDmlCQDq<-HUuWnlKz+ zza@?4_0S++egzW%t#wQJi0>_T8%DJ{VDUWnCkxmE~c@J#6GEBD2)OY zS1M=u*FVt1+L!-~Qs(B1{KpRe{WMr=eUQGf&rB2bTNW>X(31}XV#LgFl%smi`} z=(u`z#dl498j)Q4J`0<*MGt#hv@%9tK)vvQEVnYyCht{v+KOHM%_NKhMB-_f(s(Q! zXwwk95kNo}CJ|VO3`?4W36`z$xnE|JFL$Hhv#ZtRaCA?F3ky@Bw6Ky%L=1tYd7(jY zQN5FIp%GWTw69o;-6(jA3lTNT*MdPx$67gbg=qgz;%9O|!i*X|sM(pBA)tJa6y_x}zi{@>nQ?K|GvAN#q3>%+H~9KLn?-_c_(EDa$!%**Em zg3LT5(^+!aLcyWD_&%X%uH>q z(HpgG8e6G{F8E>QgBe=tkM%VbZUy?eff~loj&pQXHGZl{eQ+>zoS{_iEf}#8<^rs+ zt%RJyU~;Jg=`1sTtBJ04wHT?s%cp7l3L%!5y!r%3VUwNeENo$f-f<|0Zwm3?+$ z=}hA3=Cf{2sMD)_?r2L2HGzc649-e@B5db5KA?gNGif2j5RGMor5T+F0!$b|5({~1 zQa6BtOb@gkHI1JYNs4Km@{;2RnUq&GdX?h`QK7!^=y4prqp_<>xO%np*cmBzS2BR* zu`_Z+e%k>w(!D&&C^n2=A&0^p=bn)<<6h%e9ybyH{M!zh5q+7SjpsKWLygB{jbqcEN8^0mV{l|q_b>h=lVoCJVoYq?wr$(CZQGdG zwr$(CjlOxFKk9euR^6(8)%~Vx_o+T>pS`}HMbOnV*`JTyt==~&_y8_X_)*ou<3Ds@ z+lp^6p=bl26eDUjC-H0iv+#LlWoLM z8AIjIz!fB{^YNfXeY5kQsyQ;~l^{kA0>$V%EQ+3yYmBXw%S)cZTf+lR;3rCmyV;Fe)e1_j{B-%xn07h>#nFkD9h9#!$$>!t7it6;x!JyF_Y~ z!9bA{H{{NAWbC#UveGYcFCX&Xg|ll{HCCKYm|@F?{lb>@h&YKnkyc%%A4uJA#vrg) zMs0ahX`tZehp$ucnN>%WpBd0>Q#pZ&a?f6hhrD`3f%_wY$QjwiLGf&!G`H~~2J8ZC z(sz^mKhJ8zOgZrsQDc}h2>!*zfFTI|W`7?Sx8$C|uzq87k3o+69>jOmB}yfW7kLzR zryXzrtI$Nz2?QoMvAJiLq=z~HmLBO>6c_|IJjM@iM9yk?G1Nas{}2MXNX%*Yw>E#+ z%1rs1Iz?-l_03$^6B4y2dMw6fDdwbYKqP2aMR3r~maEQCEcQ2B2^UTt7o%k=M;uf} zbR^z&-)?JbFq1c$3_0J^5tQ-KUnG&fj&_=L?vC$HXTsW=upu2eOk>$%tX748lr0Aa zj8R5TcM!vn;0QW1*nYyA9q!q?f0Yw6j>PFDp9pgSUshW^vSn$Oy{~VCX>ybt1_&Ck zw7M$%N?R`kUE>3VL)y1i3VEF#g}ycOo1qr}OwRFPRlP3e&m*%X8>se59RDf^@G^oN zP@GO+CP|_CR6{eW+H^BQQFVT*374rc*FP)Zsp%L~q<7}@t^skR;aV%T+CxtqD7oGw zgPsSQ6U#t0&3-Z0SfU2TBCpBW9E=J$6?a1 z5>N6T1%g&KgJP2c5Rp)hh(uD1t=fMsCZ?qaPt)>#jDum|&D}pFM{z4?G9YEGE3#yU z1VQm>;U>ixPHFXo%xS5y*BadkEyPv3T^H?3@i4^7*SNz7;;K+}f_p^jo#lV}7eE2b z1RU4~Jea!Of1XhkZhM5kws4R>INpAa3uBhf@WbzMJ#$EZsU*6sJ0=m82}tH#>1ug# zaq~Jk5IC08_;|*UdqOD)oY(t*8N;qung=lVgzn_RgYQOM6QTLJqTkd zq0e#%Z?Dww@tRJ-_`w@dPm+1wvrds1k?$RWa_U$HnOX_|8o`uTHsdNY{^%XMdMyMB+ik*M1S2r05b`&{WD=7F zLsj|R5}yW8a3^&P@0WKGobRz^VU1S$*1iOisYv#dDqx)ABQW!$m~12`3oA}?E;nizyKAM27FYLyD-gb?`4uD- zV{MDyrgl#$KF^aB$w?Z?NmVf5`d3_@CXqi>;D-*FSNw1qigQ=Y$`73=W9TGMVzfz0 zer{u1P&KV$syHmSt^n713LZFf`Ug%dkPdDw479E1nQl@fk!KLhkC=!3A<kZ*lcb-&y+~PJerfO=G->Wpr{I{O~~~IUCTI~u%4dKfm!oj{*Dg`c{<+X&lu!m zD!)WI7l}WK*1c^jBlIU_K+)uKk);yk8shb;4a+Rz z5*i{FmB=Wg9${1=Zt)PK@(PqD+#4WogWjw^xdeZ8+wHl92n>@1QEwN;%^guCc#V4@ z9WWJf6qUvN_Dk31%nQ0ZUJ58S`5R;Eh3&|6uLHs9?pd9#jqDgwICZ>djVyRgM2-=s zM6K8}*M|>U{1*kfly{F5>rd00qiOq-dHa_+HrxyX0Ys8yUFl z6G5R_`_xbW{m<4nsDQ59BmiA$qEnc1+mmI?40AuMNwMFIiI_&z2Ksx;1$mr-Ra7X- zal@}gOqL=-Fb!TlptTczHivV|fsq2RX)|E+%9xzZccFFs8-BfH6 zc`)h#oH6Jx722Mw=PQH~Bwb{HY2%L5I1Sx+Sh76q%aNr!>;_)R3Y=LO7mgv#^Fic~ zakF5L6uiG$$pQ`8@92{ZWX3x{H^!b~;hI>CFddZCdp2j;Vryf=1*7J{gwy<2KB8#{ z7Y{pI3%gCzYr_XmG^oxi@N#Bw`!rJT@)i7U$uJG6t~`{!U3>thKAMhW)W%LC3*Sf` z^O-bV7(ZBfG)~=*c9`DcN;mHy63wH**WRn{%!{l0^X>7A`2FYHyW7{n-OI^eX6C=y z(YvF&voSD^FT|_d&j=rO9`;QkB9w^E8OXuJJaVX!+HBA1U>LYU%$0RdxuFoA2s^H< zT>^eV4&wa;e1bDJBZI&}`(2?uHl;gqiLJX7SuTZ9fW5SdkIwTJR!HN(cg) zhc0BFfPDzjLwkf}@jO2u$(6`p%y09LVu#~S#{159Ixpbwx$aI+^zd6xmtqEBtKS{~p_GD3l3>v7) zduikP+vg=z#&yLP)#(=gkhpJa3vLbiwqgs9Bj#D&)h+%j-$Es${LJSCJI}>wMj{k;V(?@YM9Ah5m`QRV=t?0AlYds|bj+a=9^P z?RH+yh|oOPoJUA`38=csxls%k;rUBILP69cas$7}yPveZV;-VoLX}fkaQsEYP z;80rp-^P1U)3O@R;3&yggeE|I z7zq{n6`?Pi{w6>Q5-`}ed?kWwz+k#=j~E{Uwu=Z{5=^2W!4Ag-k?uHeXx*gnR;l3` zl`^J=4SbqSt%1|3_0HH=0(@o_zw*6GB7Z-(@Um4~?hgb`ezjS1@j) zsN5C&*Q3h&&=`ZEEYz#&Un9htb)vfP4*^AD@jPGT&S_hhI94uMFrWBz8@CgQ`AH-G z`XItchI@2M@F)7ON3|`XtvK|5dQ=Q4|I?$o*6$-LS#rQ0Y4)>wXXIIlIiOQ)X7$Pt z_@zTr;&(s)YQ76UhD)SlQJDAyE7!IcJDUw`d~_qMhmptjMPmsKWyrfAAoX$1Yig#O zJBZEw`j6=!i;edx{}YL%ACl49c%Y`m@ish&xxevnchag^6f!28rDY7P5M2|fP8JjU zrq~E;C9t_nd=qmzn|%Vs1f4$i1k)BXsBR6;j6BNE11>^0a57>xh&|PWc^-Xi3kmQx z7|YOYR0^)iYV{3O>kdd*tu4Ph9p=Mx5v@5f&#BVN%%!mGJJp;+b0?IEpnzdfp@Yv$ zjcO?NIXfpYLaq*cp6Fj8F+-dvx2axD!7W*GDqB!ykm7=vWNfClmgGR{Y$Q$z*@cULf9WIB0LJ?fw^nSK~baK{3jWvs*>CkWjs3~eApJjMm?ayOh#OXQB{vmHJFz=flPh+a8KfA)z|{U> zj0Q+8z?ktjlLI?kvhHNrzXFqF61|8XAN99hx*Xfr=`hn8O;`THa2NTS7F-%d)n2i4 z5ad`s;62yt6Q${p+V^%5_(9DrF$6Gd;-8wCDog#t%F0$t;_UHc;SM|^9K2u3WEbq@*y%_eSn8M|Q# zJ2gt=UFMOMZtwe-Hs%c*2`kf4LP2y~%c#xi!YZkFif!1wK;#1He-)(%ze0c5(Yt#p zQU@>Nh9E!uqUreC0(|MKT$};dKG1fWO~(x9Jz%K9Cf-DU2X(-|JWI} zi3O&MeAO-0tU!DDBn(7sp`f}*Y@xErbWgl-hJ54B=IIE=hS$i0(z@-kAw zUNPaMUKMtOy^Tb~X^6MyfrB6n(T*Iz7hZpl5s*)A$tLT=!ek_cSejM=G*N=vzOq}g zzm;~9Dt!Jdk<^`5&_&FOr?KCL(ROA+{PvakmC}Wzb@QJlRE*~N>2lJ!| z6NK@TrkZh<>^c#+Roy5}Es;VoOq;Q{|C!R1qALkv?gLZ`ROVg;gtDE`3#9vtbwo2u z`AC4=7c%P*J}53%%EPQ;0po(zkRhZ{@TFvyzr2&@jpEUx`2I)o+X)71r3J38E>tD1 zOn5y$0eT9Fg^6jHT{3p#ojT~vMkoItYL$u%F!Z2Xw_o#$QbVnmde|+P)K|7E7#yDH zol;FTIx<^Uq#$H?3CB8Gmi6$T>#-v=LRfD6t3(aHsHv*ZW!`)BLXw&wlH+QIvcVOh z_0mInj^cj3s6<%NGRm0!vQ4<;Zy&(x=TuFqXf6+Swk~#V&gj$(lU9mt9Ox??>A0P` zue{2{c}n!4;=|unbXAt3TDHxe&7bt8{o~n>jWiKDkYA9F1a4Y#66?>uErs#RSd`~C z^hQ7@8d#Z9W?;yY3S{yRP=x1?)}HL}gEpPS@`JC%6q1G$q(J~!y2QrHtjiFEe>5eD z62H`W8z>Zs!<#XnZVnN-eC&~$&|yZ_(+;m+E>hO!-Js^MWjbNcj!X|=C9P@I4X{`{ z3EfNdqM;^4?}rOwVd*h>WwTuVh^`Vy>&L!fuAen9@W$*}aBZt6hkxgORIJHh>dB)a zr%{dj1H5}*v7Chk=FLu0Q~ZLfORI@kMY}N%QPMhX{#|P??mQ+2xjzrCru`4$g&Q(< zEDYTh4Sq@A6^(Om__v9U-*py5uh;r!MM6531WC)WA+XE1h-iojlb7+m@<_u%-H9P< z+>aZMWFKD0+&?qO0R#5sdK+JFdI(MBtR!<&)u(Vj-+zXyD&JW@4RT{!c}sr0g2%7x z_^(~l+=Ax%Z_i2TdZPm(2u0?LDgNo<@SJNjzw+vtGv}dIZa3AF7bKWhctQL3h7Pl5 z8J(J>lqO>$H1K1KIK4s%8{iQk_sCyXYH>gwr3Y6|ojAXFs`I_e-g#me6C9B6#wCdm zjn^2alb|`#Z_N6Sa42L&-^i0B-7LP~-(#Ax?yq=va00p~{&i~y*v@c2I+%J&8l)Dp znIIIoMj6^qGrZK`zB8VFba4?%*KGMb4_Vw=&bamMWrD%&cr_uG`kNnY9zZldWt%-s z&u^`7yPqjpk(TE;uN-sT7He!JuUpVAO01agyx)KJ^eLJG;yERKkbs5KQi)xez|3m_ z>+2VnYtML^*;iFRfu5fNtlP`H$L^T8{XPrb`s|quWa0q&6)|s3-Uq)zbUXE0_D4R>QU% zZD!;#@jw?5gqepdpQHL;EDF-=zgX0F+W&_|RdQW+4={E&T{>QTj@Znopa?fwabk^HoCm*g(BH!d(`V z%C%5fwvHT-MK_(_w6y?9$6QWZfb_>tRoJ1p3Fy$&l>PY0tCNTh@b$MBSuJ}9aRQ||6SECw*RVEV|WTZ%6*16O|u2;U)p&)y$EuuM`75e$kL zBAOIRce~Lg5OCw=H?5fAOsAened^4puDC!~Wl9=#fC;m(%(g?Q;`_E)oI{iIV^-Uj z@e$JjISJ8W+tm`W0bMNp*MmB?{(n6vwExG0N^7(Jzj#nP}D3)yjpaaKN# z{3Zg&6@)t9TtVI+bNY6mFg$TbOZ2~lDaO9PqDM8+?fnU@^eM&z!=vHIlJ}g%80;w- z$Lochm2>q{>nk+b=l(7AdN%cUdBsW#A-lJtyh|9cY$V0oV zG-;&2QAA4j7h|DWUK~DqHVt1Sm{A~&KP-;NetA&dl}{1Hg7|w3EUiKa8L?WC$P?-S zKP#jUR5V1NLc*+<3)HawrF=o2-Y&^yZ$@8&6f)67`zIfA-%bdg7eOP8j1+j3N*Br< zLm(s@V0b9l`imv{lg3M1-@XU|+!HhZdn!Ae-(N^`E>}5s2|oeg#H6 z5YsJ+PT@a1MID)qv`ALN5PrF zH2o|-?13JGM_7OJOaPu*!X<^YJdyN?xgQTmqiOkGu3>c5(mk%EjI1WLkQIX*9MM}= zpw`9plPyQd*1O|ryHH7=-NiZ8XU8LBZBj&}xWq<^sUcvvM#iXB>6eHNq~bvT1p+fb|hmG;H~}55?oynzk{W;Ac?T z6i(TXf-yDGdvZi918}2|T?rUwy%n~AXKv~nt}`39(eyLKc9WwHA~ivYA^ky);*A%M z=A1o9#@TR5pL(w|Q}i$RCj-0PHe%GKq|Z!ooMWTzZ=#8cU$t5lS*R{z-$T}YUqaMh z4P@VtZ*mEpR*?+zU45I%y4>`x_S;#h*2||-uyilcF?L$>Huc&AQu_x)K(CX&$@;*z z6zJitUPr_?t=fbF;Hp`)zKG5#g=ePIJH73rdx{jX;U*0Emsv>ERZr{M@l)BhP?9d!W0$l_pwBwk{~jHHwf(uu6EhsD}%Tg z#l?k#JMa1yQe#jgvYsUyG(Vti<=G-AXUt?2==f|93m8_wtpx?-hI-SR6ti8lfzeph z$y*{fY4rqu(@FRlH=?F*2?Ht+%Dyg1jaOdY)yEd$i7#s)+WtOH)^iHk7<968a`y;b zdmc=EL>4+8f)8g7u#P^-U+n($_}oKiV}E)*+Th^;!enG<=jH&8UiR+!#-Gc+n13|n z@8q|@s|$V=;*r~sufA(Hd{Iyzkm{6VyOy#8Z2 zc@btYUB1aB>H;$#s_~iR1kd}_7=CYBEEU>|U!rA6K>ZU&JwuIiU^PFNmF}Uum-xK; z&{-={0Q8Al?CGR-#veO(UQ0>rn;W7_n2`?xYQEq>KRNS+u z_y*bsT0rEv>{tABf|mC$78~KUVhG$YE5;IlR0z%&17LYjhD#41jg~E4|(G&TUo|}9NZG3*Z&3- zS}h*)MHHu`gC*-*M72-#)j|P5&skgWulYwq@kQL(S>&S_V4?OV86GWyPy`cG_)&-+ zlz}NjB|H6|u7VL$);lm@E9$6)4`uKa`&P&2TJDEoVr5$1$7bT?T4tbHL|M1Mz_o~I zX<|Z72QDvHFa6VhP6Gob z(P~8+GaU@IOOi=b(XehA9kCBdFM?xlB2Mt%cyMP0n|AhA9%KZO!nyh zk+=C`Nx$K>XFGiVbn<=N{3uIC1Kt<;HT36TRAD!?&-QWQEoTg2sjknmH#xJdrjje}v zPxtL^JFdr72(F{9xaJSGKMBoL*W>fm@ghi~fK20tuufbdHpewx|kvrk_Rn`PGFr)QZ0iE@qrc=c31FDn=i6HObL1zTw1$&!0_iGf_$iv{MXJZ!| z?Sr9GhKH55ZKIfiI;0{FzT;c`0)=n&^XQB6)IsM~ z!7gFdo-ciLBy=QaUCEYSXRu=NWiBVEX48iVw8jMI=wkyfVMu37&3J?(mA97df(n(2 z{1CB_dAXr(%w{OX;XE&C10>`qhWDoP3mDR3mCUrf=TjBgDzM@DZI#;m;r?HF*SQ(J z$x$0rwM}P+_s_>|b&E_o3?#MdOb_ynP|gaD>P+V-idu(H<<9HOlmdY=k7&X4kH#JU zM3M_gYZlAOj47R+-fXnr61ItJ6ch{d?#jq))6te;H2a?GyBED=s^w8uV8jz6>I|gN z&gQFrHm_D&F5e41$#m{hR=pSdJutbKs$T#+_?Me$-Bo-L;?(OpzrMX^*F2H!IQDje}4hx}M_^7Q>b zQHVW4WQ^qg&h`FgKuKVA99HIuy2Qj1@Vj?Nded?o;oyu0QVbL{eC^_bvsr|VoS_EE z6uf0tC2VMMnIxM7$#ao)TS-!oj6418Mdn`EuR2Sue7qbTUCIcF{Rf2;|#4$U@=DqlF82!BJ5s1ogbfIyFo=1 z!oo7)ae)Yl{&j#v?OkkqR6-34Fr~Qj`xf;K0dZAV$r08ErvqP7%)I5-JzPZKm0Lhx z-vI^ShS!Io{Q$7xX4KmOmV-B*=YgC>Sa-&o4c$1%=u~R3R2G+35{Az73xSSdPoYiE z@naOhT|t=D%&x@MOk~j@-mI77Mmx_KC;)G}6SDCy9%Br3Uqj&n-{;4UKisTpWPe-x zZ+YSpvj8&TF=z~)@5z5q94RXs?@y9vktBmy=KXmT`BcrvV)G3jM*g%l?h(fkcL%;&U_ojG8=_l$Ao;hxlq%q#gGs}6U}wIXZl+W%#<`94zp)wLlT;&B8G*M`LS)JC5d ztDxqAX!7%d z0)zH9nTjqRFJu4U8|c&KGRsKTHpz=~TEixoZ7lo8O^ZGwvP}$_CERlM>&^S-%D#jT z*!0DuYckCRmn(P7MZYa2o0Z|DGiN~9x%n@Lum(jN85nyuuWXe1w+G#u2VWRRwqbKT z*xvI8fLY^9D<%LicRT%kL&?hPlf6^pwwc35FEjO>JN&T*(?(n)Os&4av&z>eRaM8$m?EdS>RU^ zcLM@hI=VJs62XoMINk(bs_z@NOD6CUKMlrpW2HLdAmxsKI$UoRz+)dTVkyMxX3AsB z6hYr9)8fPu(v}i`=EQIn${_d7Y-C0Q(O^|dFUS;>H9uQL6qE^`7Q^IjcP^OMS7i+) zV|}$_m1<+QL00xS)%_*TmZ>nPCJLH9Pd!R*XftL&$-_>)s(=&mNB`{t!OC%DN4MkP z-;vW#gDTFl&5wuX?ee%u-*q{x>;!XwdolI&;<=>XXBw2@_1jynwfy~9?(OqYSQT`b z>CC_9BJpR`viNhC+=_yuqZ%g%JB!Q9mfdehE7&K_Lc3N-lyfcXud|w_>*Lv1c>Z;w z13EBLB4AN4QmPR00-QRI34Qo*ryg34DxZZdeX!$ai`MzL1FQCq)kNWC{1%mb*eXj( z*IYP~z`6{zY6jDvzMfzVKbKkm!eTc0=lD&{&rexh_@I2mcNI-hgT7~}2EU0>8y-m%w>F==x z(4%Y+c}zHa?lqTBj6lA!Dj|n ziOb8D2FYVh>w^=r189EOT>-otwfxrY-h}RL4#mYdzL9c=HIwc#6HS<*u=rSSuLp$7 z+J4m(b@;65t*rW9#o{VI^jvbgJD~&iRB~+Ib=xL$XUNF^F*e#Vz7lBL;(}{uu6H3uh*^`?RoYq_! zE;K?OVU*~@_lkE!tpN8%wNJz#2OA0uk<^p)bFQV z_^UrYxE4IZM44H9lx5~Tu63YZ)f$#jL9{Q%w~X2-K+%xZiX(|!^O%E8u89=^qzg4@ zSeGZfml7B#ovpYjGkpw9w0M%B0l32KHsX=)cPdfG3~;WzgE@;hvIw&GAwKBLm9DWb zX{p zEjh%tF$v8BhMT*``|%^fXCg`jo}&aB8^4}76x4oz1Xa?froKaRwz@NJqwBj;WWx5u zt~Pl2jAehk2KFq7F^~*ffgd4`n@G$T0lqniK?G8gJ&Ypwu^l-Cz95-=07hk<*svmvvTd{Ey8GPG(_}3r%pGmA#JWyD zr3&fj48xzzDqZy*ZY(d43114@caozX(O6vGvN7Mnj?bUl@nakSyGl|8$m$od^=NKMkR9n)Vv6r8%o#SCe|r}zq40*y<%`}CQA-6fW{-=KCJ}`_Mvtbwm)HCdmxq;IamKoc!#<^oL~Z zpbCBabHNfwMi}oF1#+*0v=@7CR!v(BYnP>;nHDbP$R` zWrZJYOZcwRW>cal9{asLxVgaSW`;W5Z3{&N9(`dutC#XRE#4)4B>i?FS6!$@vrSwM zy_ia#C@oOGGg2u=ujXX?sCAuT^xPH(u?1u>EGmjsr8xe8IWxoJZ0m}wu8{%V{LDJ zAnW_4tLgH{22`005cO0B?9AQD06ZyW@jiBXB)h;w^HH4~I}^+W^wO)Y z(TzaZK{1l3QN{BM-wCzjIo1X}pb&{w_JcrGTnCX{qUD1~W!W@6^}?n$$lMWgR?26JvC-ge|aPQyceI-4ZM{B_tBku5DeJALqzS3C-PjLT)5g&9c&eVqe^p z<5s1rYwfp)*Tov69l7~O9(P(FyyRX)K-a8o4|(X^{ren-j%!Me0Ri(pQ|0DL?voJ z*cjV+@jz4awMO_XSvgR3!sM&{_$<7%_5Nn+>rn%UFnOl}SU&Oo{)nx(032|B^lZ3$ zR03#uj}3y6kgWfq63x%54Tsoh|J!6Hp^7w9HB(ouCK35WA>N@vC|3Iyx!X8uU{^~E z7<_0jVCci+M_4xY06TPyz+d4brvsZDKF44%w&2l8$*bVD+5&nEQRsPu0T3FQy5gVP zX0CwA5h2s~?bZN8Z2wlpLum}lL@{p%^+ll@LZ*Tvai{r>1?$6K?yQ~@$pd;gnUTlH zAX=?b&Ba`97zra*lO*RAg0Z?>>T&ljm6V)Oi#^0Sx9etL)u;4#d33vvn+8=2>1IAk z2dE}rJK9mc)+LU~$$&>g1Co*^tO+Fh_8OPq#(14DkFkrxPQ$5G<+Ey`|Geu8RxcT< zYgwtsJIwkC(w!QSf|_`I|0p*BZ6kI*0&`-IJ;=O3Al#;rqMfSb>Rw4)`M3(s#IUqP zqxE6v3@S~_#GXUDkDgM}+RvKG;LDXD=M!RC2VLFk; zkpzkxQh~<$f$)fp3OZRIxTr=>>e$fS+hYHuW+%xxt26{`*~eO2e?!u(^vSMt_quMq z(b{=FUUGw|1AO2`J$$elOA48U0#trMQKhBStfVRmE5@<}{b@7cb4BxeCEbL@6~O7i z zt9S0zf|+!Xde5b2%d!i+HDBDy0T!)bAS@-5nF|qR1aa*UR;uE9l zFaw?F6qc*@t0nb0h=xHgOpiKBX*DOh*_!!UJU>xQ-FYc~61vzr{cl&vi7P7VpARmP zUf1W?!v#!+;*?hyTeGAkiwpb*N+?D|=BXSS>4C$UHtFkK61~?5JqL zsAPesksj@pt31(8T@J>YE=@AjW~`UP6Xp02Oa4&Dh4!DoC=gTk!ooHL|3ezEsd^_+d<1SHM^2?B2Xy zmm^h>H>saAr~UaoW~Kt%L=8OUV60y9F_X)|EI!;o^nO7`c8kRm=Z%7*JX`e6=JZ{A z|FcY4)JyU}Q*mwqau;MZ{zMbMOo$ur#y4C>{Il7^H<7$$hm0>Q-<-ubSn{(o40dDp1?2XWbo_%VD<}0hd=4Q2#Zq8;tGBPMXvJi(BuHJ``ry3*||2Ud#Y7 z_#L!mCOxtXQQ`unm$`t0Bw@utU!e&+vh+yhE$O}i5Cr8EAJboyv6R+Z-OTovnw%-b zLMyx+AkCZqutsX@U75LQ@k8$$laU9gka3{i-zHZp_9VVe!BHFd0t&~M><^Q%DGmY^&Bz|SSCtW?fk})YW93NdM6jOjXM<=5 z_9?Yf#Jau*2K_`yvWNfP7^=l?Dl8qJ=K(cY*lg4EjFePRR&^4_TRL~8d^bja$F1<` z#AiontX=NeU>rTZ(zv0w+M{W;8E9)0k1`1^b7XW(9d3C3-0_WTL#H`=GoF0i=qlHI zxja5!ZN7S|YsJ;}}j5A_G_v-5S_ z`n34WEWA^66W`Ng6IOR<3W;UN-jk3=9ElYcyA!D;FU_BW)vQyy0 z=ayyJbMk*4)p3GAKc~e=&_+u7NXzbHgdmR|0Y?+5KwjX6qqBW~5ytUdm5HYsKuRF_ z)OP2Jsk38sl7_ z{IW3>q+hWa9tEq)7g<7xKRH*qfp-B{R7Rd+nO zpdUH}7ud!zVHxOf3Bt*MqGFXejwxzAG`;W9R$)1zCMcy-!+G<{?rhuBlNAF{etXe! zm;_qFF%S8u7~1)~wpjI7LcKwYqkqcZT)5&U8C{9T_X-Wqv%Lvuw~y!ou!8?IMdI>+ zy_e7&DW+>Sa*U~V&_!d?=D2iHN`_)n{4r(D22d-_DIvY6m|we~kK1$f!WDBJycHe0cy=j2U57W@#J*iG=~KJg2Y~~8 z!B{`XoR3d;7d?0Z3l5L?{MbX-#Cn=xhcdgjw7PIZSn|gcso9}?k=W@|-uWQ!Wt0z2 zkYq>$Lg_5IfzSbo9L>%)wOS-(i6Q!AntBopM=S)<4I7MdW}EoqQb zk4PNEzhkcVZJ^)q?jN-QIKNW2Ug(WrOdx|RSOb}VYU;hyy!vlmABPiwE2nJilddKR z!R@A$Ck9516b5LSgrb_{-O`XsIT6{0UZ%q+s87?d)^OMkFTE2Z@LiXr6T9)VJlt}S zT8Y?(&mSx|=q6>~S~6Ej0W+_@v1{ue=WM@cJv*=!E=W|Y_1M9879fT|F zfht71Q>ux1nzvZ0A3f1V-V`U%4PEjb$^_!AtxH- z&wAv}7FaD44Z!jx>{?ZyKH?G0DtL_UW1L6479r&M$-QOsGmP;nC~Dr-gqK4$ERfdt zI{P?!CAihTG#k7P-GLi?VB_fF?lro(7Hk3`i!BpZ%@SG(K?Lu9YM=Sy1N=Ovbq0!G zIn%B3ZHO9oubOSGRmP~u>_$TlPpB!;O?sYC&847o`Dx|kc5DCktIA`u=Ui2(5LKAh z+VZ8PJC8RV$i9xZD{ZC{x4jvpIB`t+lu?^!!Z22$Ha$5+>+YMWxZj_tzQh9o?jg6 z^_i;jJSwkS@Z9rb&d`a{)0!O=YoOwnxHT0A%&f=8B)bfXP*OBvW6479QHzS6dqH*T zV67u=)X+29uaiAqG(D~0>8h^q3cE)biW6E7l%0m1kqL@ zyL&583j#?kwIt&Wd&G&LuYLhOy9l~q5%py&f9SLZ%=&L)Est&%?3$9yQK|vEtC&DnhO-5hr$ z{)+w20)N8`FZk|sB8e?5wiJRoh;CFvD(LAdq93|A3qs{{czlotIekTw1${Papa@hf zvH2iVTVyp!6p!bvCrj*P2%Lf)+QFzd`4s5xqzIhBVDQGaQ;2(OZp_Q~nbJyX*ss?) z%@u?s)aW)Rs^fWwLl0#%oWh#*B*FEA?PV%Oo)usF{@`cIcIlTKUF$B(ln0>3${||* zN5{?%$v9V;^JDaboTZ23#^%`!GO3q*kL6yY2=LZoXRsE#O!%(tE!F+Q$4<5iub8%n ztE<4*6{nz14Zb#8nYco+?mgw#RmI5{=i5#VJFVAM4I%%e1G>dwr$T1fs|?jj{@MRI zhqB1PQVy@?NceOwIezz$XEbK5LH}AWPuFz+S-8YLzzRn|bpyadYXb1$*64ZyaHpI} ze)OIAd8^5NC^uDn|DxjS5Z`w3Uh>&a(4w1y;e-6m=qkGObu*>f?CuEI(b$u=C7IK* z=I8Yesq63v04ZKxX@0s_nYNXvcuc15LIK`hbN9y4URdY0bc8no8#sE+A&@7T_4Df&X#UiNj+}i8+*LRlQ6$VYLw(4c4Y73!`DjNFQ zi<_E-2E_NQnKh--W$2cJRv+{|I-Ory8@*UqQ1ptS{i-!)Fzm={kx*OeRHid4f0>-* zvtv<5uPfx##Iv$Zc1@O`D@32E$uX-*cu2{HA?w+% z?hPDt^Nhtv^52>*bSM_pg1xYFGYk@m$f;NUTmo7Vi=1`6J4@{Q5zh= zQV6nma-DJ&V5xJD7w~RC&plCwB_&@}wguSuPZ+vO8$CL5Fe{g*PHKpEG($7Lxc#CG zr>xYmCchin;-yDrjWKns$c#MAq10|#VwSdc>vHs*sOdgr&anmz9?o<8Vn(ttkc+ll9>s@mJOXI9KuDDxQ4@IzD4t9$=~qfOt?Jd>F5LB8s{(wrW62 zw67?6b!87KJX$e~ZDG^57VFD3Sfi~f`m$F>!8Gd0QjIBL$C8la_I>jYsS7HFg-@7| zmBP`=W%3*dnl5VF;^@whtWt+<8Hg2(vH24bho;vxo}f-+hx0L(^fKGKl&h}|eyb>> zv1Zx` zArJ5h*@rf<)hFsE{;VJRnAA%mcb}%(jUer7PQmE)e4ajiYhR4qT)%swPbfxwy|K}Z5BYtg&P~0EJ0|WE>T(mU7_cLTj5{dq z*NS@Xm1kX+TZUmYgrGtNsYzNMS=Oy=|88ia$Ja>DE1Jh**)K2!c|aYGGx=?cp8C(23+JMxoSrBA@zVpcBR@h$}Q|>Buae z2I;BxRhEjC{*}lFm)T*~;(3a{lB$_J{s%|>D$P|-LzWxHbYa~-zi4k%#_6I>>}1qd zjCM=9vq{NBVY=q<`N_}%M^a8&zBYyUWMYJ19m(VpoDn?8r_dCOMh zI`>N#SR-y>0M4VzF={&DcV`}oaj^nDM0o^O8nMgKETxFBuYrffKt`pLjE+fUOI*81 z0<~U}=^r~C+*Ctlq4?*$j!SKmAN#C-+ZdJES;m`bsKu zW*!C!WGh~X02R_mRmqExeHRo2nO=&}K8i|$2>Zu0XJ9WTNq4lPH0v90M!r)_2}b@Y zly_x3AT;)+{LMF1R>afw9$?L-xeMx0r$EoYVG%LZoak@wzaUh(&mKj)i&AG+3pQ<< z2CQ<(o}UHGB4|!wt<#Hr?-tTQmDJ}t)-rjymhi=4Ts2hEkr1i8(_`wQ})6@oPVPV)a^?VW-o3*T?e zvejkVwr$(CZQHhOSC`dg+vswaZ7ZjK|ARSk&cwuA%;k>Ai`P1KG^I^xH>TDk+9cED23=0(HzV_LU47HXcHBB?cm-j?VG> zeAgfs0fK5?1Idufn>P+vlE~1OCbIwNXoCs5lpd?}RJe+YFS`QxtwBuUz z1#85#w+4WoH-SHvI0Nw#2t=?RpHVm-mTN5|^;1%^o9&NLG5|iCEJ7%M>-ml{4e2sm zl$Z}b4zm|dlJeSLER|F~iLSh3nWOzsh8!n&i)2{T>YV0>&E1+=HTXbABFOqXR zTJX5v;zk|mID`;X53Mvas7oSLalY_OHFhR#tNY028aIk#XW;PyABXRp0UMIfUBTVu zNzO|>3fX}RqCi-Nv6Pd3(Ba+H)TW$Z>!$%9Q}P@ z9Y;R%fJGF8Q(QwYBVImU4wi%SrWsd1g&!b9`HeBbDLViy)vq)F9b?ob?|a(qZ|#@O z8TZaxf!7ICXi%TbhNkBL9nzPm~#k)TE8(|-F;SYN|Uh12}@V5tbOpw)bn@b365$h zA|>Inu*m*9Fki|WIJBq$#^Tbhn4vBX{*puFemF^>vS*=Qi`>I#c(h@l$r4}He6?yk z)jIxZ$g$(0UhFF%fMrSNohL%YMFMmC5BKc8IbOp4hkJH3R;EjPBKoyPDHZJpPPLeY zY6W8|RRvr-7g&y`b(o5Tzb=x%q`A*h`VJE0RN4FTkH`=z$RI(kb+@hE6iXUvw^4j7 zc1buKAy#k*=$=?EO#$R%o-+`Gv{z7dfsj*7WtvkDWT{s9tj1hgxOv)MJUTiGut*gi8nhVlE0Yj22HBz+0MY zq54^b9$>z$;Yov{8#VFBPq=zGaK8I{yqbDEZqrXYoi3Xb%?>JYa<99kKbejGlkllS zB7w+Gw4TMFNSvF^;CkPKyA9osWjT;4M#Su-x18?3OcRi1@0Wp>hmT3LWHIPV~^Si5J|))nG8_oh^#nG0AbRfRAVdMa0#qLJCBh7YL0chIwyHO{9M5@ z^vphU_6#=Zl$*-o8lGv*`=`;~WfpK^7Ncp-8e=vPPIjrDNNpCR;TXG^!%f%X<`+g2 zH*>9hK~JL`g?8YX_KHn&!aaxzR4vSaTdV$I3010;noZKETiFLhq3lSG^;-D&{A)@H zmnpS46Xkpj*&-Uz_Sc6Qf35PVq*QB;X9v|}$2;3vIi(4n9Ayn`t0PB0{XA`Y#59wB zn}3pV8-M1JV5(=cVCw#`gEgMqt2;q&`aPGJ^d6IkQSmzRr&7PFtS*RQzRbFMwNkeb zAz;QR_RmLn2`gE~#)$IYkqu|=T2iGD`FR-Ovj|WOR7glW6G+CS#rzFZtOzUWjJ=QP zpjI3(XKNdejOz4DY6Vz#HZ5l~i}R%u>zzO33g6HQdVB>duv2UpsRIArs!tA_Lzrtl z*2GR;)$|Zs(Z0_+nTl2ER6Rpj)#6f$Fa#O{^3YJu=5VJoo)t7Oh|`Q1dfxl&9I_y? z;zt(>(Ko@KR^~l|(w~XPiWRzbbPMq@T-SsP;>c+e8Vpb*YQ#?q8~%VO3V%gFJZdoz z2?LAe8n*~8y5lMU$x;PRAP+mAND{x`-f*Rdai5na5FuICOdQrZ_?so#zT<;GdHgR@ z7ZDU@1!+z?aP{zeL-*Y`ebg(F;u8Ugn#QDe^<@$ld-VfsW3P_fGKEE|-);RbxoI#c z=Vz8wE{~f&qnf;xy3Vo4gK@vJY3Rq3@p|jBDLhCP%9EU z&%HDR8Y3Oib3A89Eev%#=;8(;FF$RtZ61U^LPJtARBF>mm?_pM%LI2Qq_|m15UGXhD^60HZ3TNr9>q4bML|j5f{jz5cMhe=<__ zb+7Bv#ow-SHZmelMQ3G>iYA)RL0^TUH+OxnyCh|0_@Y@oXQbZQmli!b(q=3&wNDcv z0Kx*q8`o2Sxs>nEiSS>r#lkWKM!l~{yjtUqCRkEI+`+J{nFR(xm&fvmAR)<&;Z^3{ zqVTB-yJ`91rw%ru4yhz2(Xy6p8!d;O!?xhQg`^a_F5Ny>Keau6^#w-();Kgi!e5>@ z{pyrM(YPlFnk)hS zxh05l4;IlakdUBbxQadPg8k--P`@YJl#fx<$urm!F13Pfob^40dc4g9n(7PG=xXglr2Dwhz+ZZu_Jh6JU}$mgU@N^MWT zd6mHw&b&-Crh(ATC7$RY;Oyyhk{o$B6d z=5nF~zTGOOqk4ULc-M?}jK?vjkzsl|FL)g0aW@*=>OHF7 zl}*TsN#&f_`65&rA8bs4ImyA-jNDwI`~RuZ->(*&hy(!g2UgKJr<7uiV15r1##mS) zWF1J6XHyShC|xZ%a{>i2xVTbc5C3%q5>%F7D{=~D8p*pYon(M!Nkl#aWd#EA3w_`f ziy%yDC6s1o}$fhn>D7}IRjLMs>f0VsPyW!wq&q@W}E|N5Pg4&Ml< zz9C}nH@)5+vi+k#WlFvKfWfz;R0jd03Y!83$|OOXb7w0h$F=DKn+D3O5(mmk-NT`% zyJEIzIhjL+hk(Y$Kvr`3zzyblg|du$@R-DUpJ>Cf`tn;kZUtt_&MbcL#? z+uOp($SqTet{q947%G|sJ!#`|P9nVJ#60D3^4ji+X9w_;$cA0h0Uz$sNyTv8Gt3eM zA4C=P5W?YuwCAibTWcYm{#J)J2a$(JE)%q@-H&CG9UeRu!VMiT1UkTEdPb3&=XOjm zm13lj%Ia!Dvu`L-0ZTEUJU)%f1quhWwl%YSGAx%w+ z4A0gcoeO_fDYbiFF7nR}mNT-B&=6J$U3cRn&S0~CAEp0Bi z3tZQ*9q6}m8Kr45>sMqtdKyTEb3e#$;ab%`O9fY~92~|}CfcE5Y5i2>a-1y$i|3{X zB16-7pfQ(WQP2#=6j?5`*0dBLwU>7;Be*F>WSNyZ_K?w3wZ?&BXZQBWG+&Ja>0ZR4 z-(1N>qmwH`m>^fuMedZDC)+jERK6)g0x+gSMCr|UXDKEMMc{xrL*H8{vqrh^ADyrt z$2Ga)D6)id5x7RFjT0ABYB4mOmy4U{<7nnAMu^IketP8QUw;}O8nxMZQxw1qyh~R` z2gmu(%w#j$&@LZd$d(`dyt7#XhJ5TpJzh4fWe)Mp6h>6vKspYPL2>J#68}TP0r?)) zKemt_f0yrj+I@l*ZnTuxBvd_$m2pSU?g{bm5}Hz+vrGq5yXa0E3j8D&7v5hqi=p$H zm${*TKk!?(tDvxrXOfeck(6byWPcq^=dj~xsD0P~5dnhVlur;7h1O_Po>-yq)qlUS zLXpnwHlSW%uJmjS@C}{ch@qrO-dru5L#E%%kL4;N<{%k`BE2^QD%bnh2bN}do3jJSsIz_{3eB?~3yHV}-s8fqqE zhd@ps!vQn3@ss;N)&VSY zmekbm4V7t&5zSE;^x+y4CEOaH#(B(>w@oNuUP59jQpLh^)kW7dSki68 zoJz1gi?w6!WfDM)7L<9BCTOLr1Cxc9M>!e`hPQhI42#D~p#D*mAev*u;@km}XwZO{ zfsmi|mtyo=x6d2~FSGL?4d1<2@*db0hk_v}{0=!5x}Zwh$Jz4(;zeG>*j#PToXfXw zrpG&nnvs!Et7|LjKL-@3bqL;e!FsUBfn2L0%A=+{_ggqavh%7S$D+nnyjRp>iT&4* z9J*Oe8#tkR7D3=-kY}fZ1lEjn&m@So(4QtAG8qVDjz#77Z1a%_bAHCk2#}rJ0Boy| zAko^b8-nrmH$w<4OxUwLMZ3K0V-`+v+_B`M(nuZ>7iKXmWR?KvjQr{q(OCCEZdha= zdMGv_RUfk{CQ zH0wrXN~Tw&4BSisTt{#j@zMe-J^Z<7Su-PrA2G{BR09b!hHL6`Y{YOb25jx7b^oQo zEs@P7ElBaLLZ19C$UK}1!02Af|Cc@>m?0yWM8=JGu7q%a#Z1QwMqd6;pA~GgSg=q4 zoCm;<^vE0`Bjp{|!Zj%C#QKg|qU-D{d+Zgx()iaFy(`M{R$&_m%Y`yaSJ29xLk~u< zz7#AdVQ71MYHA8fnvz7gqPvQE#N7Z-AmHu&(yW7`?W&*|l}X(`@t|x2#{?}FPamYw zTb4?>hI_W3Y(&=_$H;V$fk-R_j79#gV-G(VPBjy_Jy0{21qnAV=%5*hmxr5&--q+{ z==GDp!Ji+p4>vC#zlUGI-wR?VH~7RszmN0h;^7_c&l@mq&o{;E-Ro0K1dvhL_($fH zCvqqVZ^otPvM%5pf$ z(+~J;0zfo79y;jSuDjh(U}CKIUGPPb_9;*@rhqTdI|XpUNnn72H_Y#&L$SP+7?Pfh z(;ke=?_>kobF5bJIQ1y9t4Zz}T0)u(<7XHCt(*%i_ot{xyUz8uz!P4SHnXXHY?wet zL)=#bp!OJ$I*hS)V?y^65UaieeB%LjC!4LF-7#$+NwMLPdBtK0K-fck5)ctkFvk?0 z3wW^x#~>5J?;Kf$he9Y)COmfeu*oM5yKfMmB~m;ezZ_kW0y5zKy__-ymxK^`C->hV z^b#P{w%-#$g<_({hyOdBcsuPL`WlNUxhd)Sl1S(STu;1w0Pwb)JR&OM0C;ZKtsj~* zfD#GFj}NqOfpr|d|4OZ;ZZ@wcy73N`aFUCSu7o+{4`R+pW)pfJ`=w)e9^XrE3m}g| z01cC$rFAml14%Si7>vULP9~MmmE58HzwCheSJU4e%R{uzerxtsUv%#ZR?1ThXVWK6 z$&P+6l&g?Kr9*EXQS>uzzt<52D;VU~f4FxxQ8Yw=Idg`?b+Th~rcfC#33>S(5>EW_ zu0aU^-~Vhevvo`bjv8!p=1r&eAiAIh@1GCFF<$_x>{DISVWYv9FKrCTwB;vqt-qK6 zZJU0<$r9Q0#nL8;xd|WoS1;dSeo4=|wJ|E0-F{kVt~^tcjtz?bdylZ}nXw%gYeKk> z)=-QWG%?6&Al>Btt_bZ8KbUKl(F+PGVTCQfc2=q(`AV{J%m7Qwf48e13jKMl+CV=IatO zKndx>sFb~?WZjK(pfrSz4rt%6iRV`R>I<2_Le?fgZ7o-|J94$WdwcF=+h%g1+z84Y-69W~ zXVw{M%B%#+(8f8ddP_;wH@Nh_d${xQM|y6jeQ<-)b8_O7U!-2aRD&*CjU7gmLPF z^MRsApz+!s(RA`}Fu~x9ev_AOWNpi)qV&OHFOoL4Oefq8W*pGG5tdX`s@ZZPZNo6_ zmGmtz@NkcI*>-0|d_rT*;~RFaYqPfBryil4sdW7yi|?$q&3WTVJE5sYV)Yq+g{ASt zcQ|?8&kk3nUKkAe`~c6VsuOtRPS4=l{ANwiXr~mI>*VL_83jAsgK{Y2^|uEhc41*K zw;W{Ny>&505M;jj6zkHt^{*o*UMaB~sx3mcs7s1BK4jz?gicp2yR^sZBy!nvJ^j{l zzizO9sZ+7tW^;IQF|5E+b5;D=5|5=ZQro$HCqCZ@VpQ?$K7>h#>Pz*OCXQQhCgRcC<7xafF39{z@DKBT;mc2BlmUyG#iT zEBU*hnJh{kNCEb2?Ld^qWHOy_B)38mUK{j&-rCoH5DWbvA=XSrxHc{hD?+7id|5M% zD@|^f9$R6g{0*u9@FjR+&Sk+rd^jKC?7oPfZh8U)3uVj|dK6W9SeCPRulMTg)?amd zTdqlsE#j!juO9B3HT-D}!rH-R4q38H>7mQU3mUl&B0ZhTfqtJLK$bn+TrbHvS=(i+QIQoYC#xn1$VPS_kbK{lut88 z1U~dn(7WC?h@?)IZ}r{$R+y$ltyE=BP?|=6L|DX`C?Bb3Hq|%|31NE1hdJHvkEc7- zqy~}B@cYw83P;6B#NJ)WS5HucbVc~5B}9BVv|K;Gy5K2q%SGXWny+$ACW zxx@W=;nluj^BTm8Oo&b=z^WTSlV`R=1L=%@_Zh7bWOEI8kr?6wd^){(%vwE zZXT2k567%o6xZtJx}e^Oh8#p?AeF&=;ABh)%aZ?Xl>bX>MwJDnDzq8Bz6d@`h@n7B zKO+&NpjZ0jgW+2--R7b&=>OXC5t`1ZO)PpraPIV_T%Q1ct9Jr5)_no`uIt?7$fxwi1af;IsQ?t>uo zBzUwSvYIP-$#aKV@c=Jw)JRwSh!0Hz7OS3m_c*@FY%44_XB#H5aiHuS;7#}(if5yE zf2=BsKG;2j>)eT!CP@l4Ir?Q)HL5GbUUWH)0lkr=j%T(GCA%*J|5THgxEeM zk3Y|VYCEAR(*iDuW?nx8lAi0`s_Q|@n zDlNW=Uv=zGkV&aONuV5%D-{%_5@}{jnl8-lL&=U9&iVVI@$!mlJ>5d5OSP|kD$JGx zX!9Dq6K9;5hsRK-ljg#pNJ}g&wURC&RMiqBQ^rx15iaGYjbxIM<==LDou9JqysEkB z_%ivRW3aJgS>B>NG*5n@-6Q1s@f2=PmZa;=c&ZR*4)^!*kzr_QA;kEDs@xnO8qDNn zSP>1|-@p5cvy!rg(VDTQa#keE{1QiN8@-!gYenF4ZC9Gy6SFpZW>Qj&?_+DnVSu=~ z_a}oYzhlO}CZ^l22Y~+9Cqwk^4-4V8Wz^Tp9?q))|Cwxgq3DqXeBSte};s>JLG73YbFrB6wnPr}JxueO=U3a>j9k zk?e72tU=Kl>wzCV9)XiN+FADwp?l5OR4+xUDXv*mTcc;bajH|?;t30?L8c>PQD@vT z$CIFrhnei9bCy~)DC3YUZN7bcb-~^kfSap^tyKUQL4)0_Xwy^&ySJeH(TyoUzA2WC zb+wL)zvL$oNY*g^*aBSH6Msc{2%xoi#}H=tA)orb{Tc~-B(%v3vVTfgXO2nO$2`&v zbFs0XmeqlLCb; zYl?M0Wj_x^TNLNN$2TJSeyJ6oen9z*JQ>+a^_EX`g_Bsc^yZ8Wm;Y4SQA51hN7%q3f`0!MLGluRNc9LnMLy(>lOH_WNauPa0s{epHs>@A1W*T&g{3$;Q z$Cx|9Ei?>w&NGF&NM*cbCFM@MlD)u5cJOn`g*rjl&bEQY=il_QJy1fl4pK5Ez^5Z6 zmIlEPAj>*Y*F^!|X4Q%hQz%f7gimO<~i^WNbNg^(dxq(({eye&qg1_O)>mUCn0UtvuZ1w zt{I-6E9J8TMhA)8p^O z@Rwf3xQ5e-!T7 zst#~^YsHZ#41GC5KROVnIYndXxEAJa_AP_+Y zHTN2SW9=-=ojC0Lya54k!?4RX^4H9Ak|M1bbN%TpufBJ1g|^WwD4<=9XeWzpRdoTq z{O@P4Zy!I4FTnBhnXn%tgF`)Y(`5twSe)GK_VV(5|9gE~c)QD4>&fQ*XwcAr7+dZ^Af+iE*CGEg z4n-rWe|-L}Ww1+KAe5X?TnLL-H>}0i-ZOl{Yuie{(c=Ys`RPbLtKKI&=l277p|2Kd z*8vG>K!CT8R|!{gMJ7_GF$eMf_-cd7SfRSR3vCiZlL}2oF^3C z^}vZBAXHM)(T4^`^LP6pFZp-+Sp9Rb2ESmMJd%9Y;!6?qgIOAWWxea><=9nfgBN5D zq#x}Z)p;ZT_x04`%x(ZqamW2}FI--2p10eRl^%~n)e>4b{f9ICM2VS%J9|ag9RVBdqRmq4!lG{YpZvJ6qdI1i zpOXlf#5f4J^q|A*UFA~090ye{j&vI}vt2BdfIN$@uYw5-*C)lqAM_9ZU!0ZCKK$Lk z0oy;Wq?U>puB&8Px`XL5(sU-hOFF}ks4j#3-{C{oZuHPLYe=I$X5!-`MB`L2ZsMU4 z`wn@Bh3d?IL_N6=A_$=*gj|jr@lW(ZayR@!O4J!EbXs>5L_-XEGfnDdjUjq{feZMH zQi~W2g7=mvQpvjPQ$CdE-fji~)Y!Z5_kaPRJiyI=LY>XTCk46B$3B2+fyA2TK5l}X zZk`d(_{@v2q|_D%HIAbA^L0gSh?r$zad~J8CMm>$H)&eJ&&chG9G9Q!)qU%W-Ix`diu7YO2%kW`I^Qp%$K$p-G<*-h zGAKViBMsv<4M0sS#=CXs%hyn8sy!1XFhLw&(Iy@g!O@Vn)5&7a!|*l!p(LBQhdx5(=T^;Oq$?YDrAO2!0( z6Chsb6r_2D(?3N*+-JzK9Sc^DAbJ$U^=%ua-D|!J`h?^6eZT*49TjJ-1}@qi#d&`; z%ce5$PX^i@S@@}~tM`=uN?j!?7>F~RqtI=U6u3PyxpXyX{cJj zqJVb~)el?M#Ws^+vmtE&=D7B6MR3zVuaGyfyt6htD!5o)9Qd?rJhqud$JcXtd&1h2 zE%xp!6JMfBsC(=vOAaVfd1kVuGU#?`R1>FTqi*MeKjNbqLocq*Y;ViZmdl~b2&Q9c zx=yb&lIGs}!!|uJsnb?2rR9OL8hEsl;TVU8+xRVTU_Z13$ zIJGg~vWld0kd zFz;kSnNyIJBVywq1i6H%jdUy|)PqB%mg|yJB|@;WN|=XRQ>yehte|uM!^{efm{g$N z#ES<%EQi+UVE6vjmXl0nbgaV}@kl(`e6|Nd#{ey73cU;Vqpn&wa0Mzm7=oB`=+1mw~bgp+>$<=c^EtvJIPJUII)pI3XoR zDAFT@(13bA?b6E?7gx3y?`C+nUw5M*D%kitBt$#dJ_8(YJ0<}ikR?6;`5#I^{8&NX zir}i*2dI#9zLz=$Wq3s*`b87B{1`dK{uE*bGI#d!UT>t5GK*%zIq+FB>bm@QT$Xp+ z|BcJaz+utX`(JQb>i-)qtLt;xoRcekE$6)zgOVJq8hO&#MuBF#-JrVmySLlMl8>br zw&k&oLk`Z3NP(weh0%{jcT7apub!JPv?+$%BLad(!eoNET3pBF#0kR6xy}m}e(RFA z8ebHx8PBaiT!Y9ZzLF^d4j}8&Y5ZKzx6_t%8V~HX@WV`i3da3=1T=j zfcSPsPu{trl&_5Xlm`7E5_2YHSPLTs_o_XHxG?^fIjc6vy12Ik-NTNwCIH0!FPGybr>=y-@=7u2lvyO z3s^hpMQ2E-an!fyt#Q>l>AY~##qie|Fv2mZ-~1)2s(_OylAGu3VjMa2@1iturU2kw z05HiE!HR6^hA@133t-*w(TxLqTe4#B$MR&&wM-gH}Uy z9mT4r*uod3%*P&Cm!n}1V@+){qsH8pc7Km_DBNbAd`?~2e>H`>xDJoWVEArwpZ z`yf@)dtj6>?K`5fjUi~=V2a)W^UKZIH55-)jlW0OxQuY4{m(}=u@xSA;_5-9q>-8yh z)%;v4ef{5yX+TV}ANzNoq!5ogNI&!|ZK^uCYVq=LZD8->J3_eF(YpRSFH7(L4_;Pt zVWd)|SJIhM*;R$q?+~o@gl7OYe0)Ed?j-Bg&!*Ut+8a8#fnt%HTpFna5*>T6jQ;bH zk|JlBCxzu=thl3yJ?HQPt*mr(Z>x?F1%qBNAWf1r%fdQ2aLvq4zo}&hRJjF-s&%)e zzN&usI>tZ-1KW3_9~68!d+#W?GDK53?QH+%ca5jX=kLgf z;=7^$$qm;Busa!O0NhMDAolupVg%YD@-fe!WHnjs0;~U{ny^4?^|RCa3mC3w|JGR4 z>$5Gix$JwENT|LGc+SV&di&9fmgE358E+3*WFxNS>iDhmm4e*=J1?u>A`x_K)3>54Q_(79om< z)@Nmvk;D!4@-<^an4FW%eW+X{Q3U3MTUX|P60^AfCou~J6(u-i>n8MvnKfW+RaYyC z=;A2V^nrVeMV4Wn!rJJ!Ab}u!yY;R1>;dv)N2FS&C#)B-^77LVOZ(#q$lH_EUtVk6 z)0ZElwW@R=702;C$^5F_yS*m3mcnF{M=S{5({p!rb$_19S;DZ`J32edSrWNbP^R>s zrqbF23nHVUjD)3bRJ?Zxn^1GtU-6pXIa8sN_GSq2z^deLh?<^&;u3^S1?K!02@>tP z_lxT}BCr%Xl1f@}lt~sVbEu3k5UxlR+MF3Y+yB4NSs*#*i5F0D{~I?828d}|6ktlL z=VkhddZ31*osVgC5G_`f?_}!pTdOuFM3ujd45Ki++pbGK6|aOrc~K=s`4GmWzy=(2`dhBM^%A5 zyy)m_4S#3_9h-I?LT=w(>7pi`+edv$cMq-lNDQuf_l9JfX||S9V~n%{${K7|1s1MM z@NX0KUt(srxDah9sVb-<@jn>?G+KPUN;qkId%C)|zgj}|URr;ITWYgyE5+MOBCd9y z-KDFa?NqxGJ0R0YOu28sm85S~Hxk@omgAxA-o}I(=$qGuRDd3Ir*mG|tw}`z85mq@ zh?6zteTVH}P(Np9YtGA7<`T0KF68aV$_*xeV^V&TT0?cN&(xFpv zU<4fJ8=mMGHR}+}atzlR=;&^~E*X5UrQ`7-0NES?7W7vD9xXp3VNY5`!q?4i*-kJC zWB6Uz9#m=+ofP%Y17T1DfeXKaTbou^Wliw)^l*KPpGo6MXSakk>`edCx;TW`O0M#| zI^fKKBJ}<~=UZ(>A)j+YvO=yVGFH`6oLNZ*N30meLD&gulHk60DGn2xIS6(n!DK#^#w_dtdbrkv+D;hY2PZBqA zCTqkT;;9iXnFCdSlIAhA<$tqwdgu3XgTg7Wq{4}U^A0p3C7aT^HRc(+6)r_O)ga0* zl)_ycJ(H_f|HN_HksjJ=lKym?QLwt^XbE%{Ulph>RZ!a-d9Au=TQ7`exou#*o(9`YX;+&k{usjgZMZ9miPaYnR@9)-rhF@`+d7){x3w}@`FoB6u4=l4z5tf0DS(&! zt&xDfyo!kL-J~O|2rUq+;*_2iddO@|S*KQr<-Ff(rhi~q+>H{Nu}Y#>ROVLFs-5L@C-V9Y{Wg76S6)UV&GDh8*Sd7nqS=xrX4mZ8){@ zZ!nd9+uD30mGa{QGw803p;dT62g)azxmyNdcX!C*?=~+!Qy^zd5~NQypn;FQ^N?V4 zrxaqjjJ*Vqa?jwA0n)i6!;%38$yWL)mxYMHTrCt=@#FE8$+QY_H`^qp`84F{IY!V; zY&8b`f~Y2Cl=Ko$3T#}3Sh`H>VeG#=9b;v|GW&Yj3$S}^Ej3R1=3Vd?@{z|SWof_n zgEeX9p>M8#-Rqarfp9O?fL4e_SdZ*-)79>5?f|J*&D+R5ZAPrC7bLDB7cD9m)9Qay zSv7u9)>Ss*=8I&KQ>UJa*A!1VZ_q2GshaJa8?uLcSBLTZxEcZ{%+M>A&~TfZmLb+h zi^p!NX)aW+^!?DSKfUeLt!>?wXx&oF4;Ndj=?-|USS*U?QwWb1*%_4Mhnf_z&;{RN zMojtBS1ZW4X@T#(b{@KBeW4CV6O3N0GTrMQJ0XxQ5lP~Wvz$BGu5u@j?r;d4)} zp{3gKS?Gp`-8|Fqw|kcdljJ%1%^| zp%5jNCLtJaP@Xo1;uzHrM?cJn9y!<&twOHu&cQt^w`=jis*Pf_%J8vM_Y*M1K{{mn zYU%2;RI1Q#II&_{re9F&VtDbel2YsTqQ6;H{hCf|gqv1+7}dl0){f~4Ovhv#azF>K zzL*8qcGq?{MVhdw<)(%@0#A0I9@t)V=8>5K*Jkeq>veaPFHY2AGF^FsqqkU6uCm;_ zt%A9~X0iv}eJwJ#$vs%Rox#4Ki^dNK_OizX$DNV^o>B>H2J_QZyT}Lc+V*s&>&_xy zb;)ttCq-2prV@uGwUl|MDn}hKg*K+DrO4}Oa?Mh0r;hi^IJvcspW(*{7WAPdcli4K zTa92tDa7DP|2Jqbs+kHuY`-PtNn#{dsyo;>)y{`c8E}^QH}**IJjve=Yx0}Tap9l& zmr@yh7h)_Ecr=ReMeUEGRc8>EDhw=!5@9NTYk*4JSH!Nin-+7v|7iUmBQ0+zMOHpk zW6TedR!juqTUdFO#DiB5Sw=J6w{PP3N_Lp#&#cN()Jki4K}x&W$tUIh+TPP7c{V%p zz(HCfml)2K*lc;EV2jXFD06?6zUjorjYCmfJYb#KG12WgH_NVNLsls6v^T|Q+)h>* zfEI+4a`|tS!MFv1M&sJ2lMCNeAx#%${75en)};DM?&T=e)GS(;4H<3sLzia4ouqYq zRM1VoO7Sx5pbh?fpmo8)Vg_YXXi8?_upVs27K`6L1!vi0Y?x*FVQSlSf;;naSbbv1 z-K3>W4C9$@U=S}1KkikIEig%?RJs$m=5u-7rqTs0YSm&>i=W~jF!@@CZme^VA?lRW zaTHkdiTY_EyZM8MbLrQg4a8J&s%c&iM0Y``&=tZh41}*X9>)s5RdNL!2eOACNM!>1 zZ1G<@OxI&%f?zm3JjDuAb%jDR-;`4A4+RwJWhLTcXQK#+ng`v4Wg8_i`hA)Ih=s6C7g9&_?tDT;E%uVs(ZYytI- zVBsE8`q)^_L*@22kZ4-j?%)2&18JRh2RYo2)p#@Lg{Or0K)Uv`QKs5UJ-Ip9@giQk zvQS-AE+};45B8?_9ξ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¬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 Z$LH~Rd>;Jy{{jF2|Nn%R=hgs*Bmf3G)nEVs literal 0 HcmV?d00001 diff --git a/airbyte-v1-notused/.helmignore b/airbyte-v1-notused/.helmignore new file mode 100644 index 00000000..2b1b66e6 --- /dev/null +++ b/airbyte-v1-notused/.helmignore @@ -0,0 +1,26 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ + +ci.sh +.cache/ diff --git a/airbyte-v1-notused/Chart.lock b/airbyte-v1-notused/Chart.lock new file mode 100644 index 00000000..1eb0e17d --- /dev/null +++ b/airbyte-v1-notused/Chart.lock @@ -0,0 +1,51 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +- name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 +generated: "2024-11-07T16:46:04.022416291Z" diff --git a/airbyte-v1-notused/Chart.yaml b/airbyte-v1-notused/Chart.yaml new file mode 100644 index 00000000..f5114848 --- /dev/null +++ b/airbyte-v1-notused/Chart.yaml @@ -0,0 +1,72 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +- condition: airbyte-bootloader.enabled + name: airbyte-bootloader + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal.enabled + name: temporal + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: temporal-ui.enabled + name: temporal-ui + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: webapp.enabled + name: webapp + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: server.enabled + name: server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: worker.enabled + name: worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-api-server.enabled + name: workload-api-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: workload-launcher.enabled + name: workload-launcher + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: pod-sweeper.enabled + name: pod-sweeper + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: metrics.enabled + name: metrics + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: cron.enabled + name: cron + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-builder-server.enabled + name: connector-builder-server + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: connector-rollout-worker.enabled + name: connector-rollout-worker + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak.enabled + name: keycloak + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +- condition: keycloak-setup.enabled + name: keycloak-setup + repository: https://airbytehq.github.io/helm-charts/ + version: 1.2.0 +description: Helm chart to deploy airbyte +name: airbyte-v1 +type: application +version: "v1.0.2" diff --git a/helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz b/airbyte-v1-notused/charts/airbyte-bootloader-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz rename to airbyte-v1-notused/charts/airbyte-bootloader-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/.gitignore b/airbyte-v1-notused/charts/airbyte-bootloader/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/Chart.yaml b/airbyte-v1-notused/charts/airbyte-bootloader/Chart.yaml new file mode 100644 index 00000000..fafc79c4 --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-bootloader +name: airbyte-bootloader +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/README.md b/airbyte-v1-notused/charts/airbyte-bootloader/README.md new file mode 100644 index 00000000..ceaa5352 --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/README.md @@ -0,0 +1,47 @@ +# airbyte-bootloader + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-bootloader + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.env_vars | object | `{}` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/bootloader"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/templates/_helpers.tpl b/airbyte-v1-notused/charts/airbyte-bootloader/templates/_helpers.tpl new file mode 100644 index 00000000..2b326d75 --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/templates/_images.tpl b/airbyte-v1-notused/charts/airbyte-bootloader/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/templates/bootloader-secrets.yaml b/airbyte-v1-notused/charts/airbyte-bootloader/templates/bootloader-secrets.yaml new file mode 100644 index 00000000..202def0e --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/templates/bootloader-secrets.yaml @@ -0,0 +1,18 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: bootloader-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/templates/pod.yaml b/airbyte-v1-notused/charts/airbyte-bootloader/templates/pod.yaml new file mode 100644 index 00000000..8a72fa90 --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/templates/pod.yaml @@ -0,0 +1,130 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 4 }} + {{- end }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "0" + {{- if .Values.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 4 }} + {{- end }} +spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 2 }} + {{- end }} + {{- end }} + restartPolicy: Never + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 4 }} + {{- end }} + containers: + - name: airbyte-bootloader-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: AIRBYTE_VERSION + - name: RUN_DATABASE_MIGRATION_ON_STARTUP + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: RUN_DATABASE_MIGRATION_ON_STARTUP + + # Airbyte auth secret keys and values + {{- if and (eq .Values.global.edition "community") .Values.global.auth.enabled }} + - name: AB_AUTH_SECRET_CREATION_ENABLED + value: "true" + - name: AB_KUBERNETES_SECRET_NAME + value: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + - name: AB_INSTANCE_ADMIN_PASSWORD_SECRET_KEY + value: {{ .Values.global.auth.instanceAdmin.passwordSecretKey | default "instance-admin-password" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_ID_SECRET_KEY + value: {{ .Values.global.auth.instanceAdmin.clientIdSecretKey | default "instance-admin-client-id" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_SECRET_SECRET_KEY + value: {{ .Values.global.auth.instanceAdmin.clientSecretSecretKey | default "instance-admin-client-secret" | quote }} + - name: AB_JWT_SIGNATURE_SECRET_KEY + value: {{ .Values.global.auth.jwtSignatureSecretKey | default "jwt-signature-secret" | quote }} + - name: AB_INSTANCE_ADMIN_PASSWORD + value: {{ .Values.global.auth.instanceAdmin.password | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_ID + value: {{ .Values.global.auth.instanceAdmin.clientId | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_SECRET + value: {{ .Values.global.auth.instanceAdmin.clientSecret | quote }} + - name: AB_JWT_SIGNATURE_SECRET + value: {{ .Values.global.auth.jwtSignatureSecret | quote }} + {{- end }} + + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: bootloader-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 8 }} + {{- end }} + {{- if .Values.extraVolumeMounts }} + volumeMounts: + {{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 4 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 4 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 6 }} + {{- if .Values.extraVolumes }} + volumes: + {{- toYaml .Values.extraVolumes | nindent 4 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/airbyte-bootloader/values.yaml b/airbyte-v1-notused/charts/airbyte-bootloader/values.yaml new file mode 100644 index 00000000..ee3bc615 --- /dev/null +++ b/airbyte-v1-notused/charts/airbyte-bootloader/values.yaml @@ -0,0 +1,189 @@ +## global.serviceAccountName Name of service account to be associated with service +## deploymentMode Determines deployment mode of airbyte +## secretName Overrides the secret name with credentials to S3 Bucket and logging +## database.secretName Name of database secret +## database.secretValue Value of database password key stored in secret +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + secretName: "" + database: + secretName: "" + secretValue: "" + secrets: {} + env_vars: {} + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + +# Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + +enabled: true +## image.repository The repository to use for the airbyte bootloader image. +## image.pullPolicy the pull policy to use for the airbyte bootloader image +## image.tag The airbyte bootloader image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/bootloader + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the bootloader pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the bootloader pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## Bootloader resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## bootloader.resources.limits [object] The resources limits for the airbyte bootloader image +## bootloader.resources.requests [object] The requested resources for the airbyte bootloader image +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## affinity [object] Affinity and anti-affinity for bootloader pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +## extraEnv: +## - name: AIRBYTE_VERSION +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: AIRBYTE_VERSION +## - name: DATABASE_HOST +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_HOST +## - name: DATABASE_PORT +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_PORT +## - name: DATABASE_PASSWORD +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_PASSWORD +## - name: DATABASE_URL +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_URL +## - name: DATABASE_USER +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_USER +## +extraEnv: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# DATABASE_PASSWORD: 12345 +# DATABASE_USER: airbyte +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/common-1.17.1.tgz b/airbyte-v1-notused/charts/common-1.17.1.tgz similarity index 100% rename from helm/airbyte-v1/charts/common-1.17.1.tgz rename to airbyte-v1-notused/charts/common-1.17.1.tgz diff --git a/airbyte-v1-notused/charts/common/.helmignore b/airbyte-v1-notused/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/airbyte-v1-notused/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/airbyte-v1-notused/charts/common/Chart.yaml b/airbyte-v1-notused/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/airbyte-v1-notused/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/airbyte-v1-notused/charts/common/README.md b/airbyte-v1-notused/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/airbyte-v1-notused/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/airbyte-v1-notused/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/airbyte-v1-notused/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/common/values.yaml b/airbyte-v1-notused/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/airbyte-v1-notused/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz b/airbyte-v1-notused/charts/connector-builder-server-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz rename to airbyte-v1-notused/charts/connector-builder-server-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/connector-builder-server/.gitignore b/airbyte-v1-notused/charts/connector-builder-server/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/connector-builder-server/Chart.yaml b/airbyte-v1-notused/charts/connector-builder-server/Chart.yaml new file mode 100644 index 00000000..47813507 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-connector-builder-server +name: connector-builder-server +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/connector-builder-server/README.md b/airbyte-v1-notused/charts/connector-builder-server/README.md new file mode 100644 index 00000000..9b49f69a --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/README.md @@ -0,0 +1,64 @@ +# connector-builder-server + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-connector-builder-server + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.deploymentStrategyType | string | `"RollingUpdate"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/connector-builder-server"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `80` | | +| service.type | string | `"NodePort"` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl b/airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl new file mode 100644 index 00000000..174aebfe --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl b/airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml b/airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml new file mode 100644 index 00000000..4eef212e --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml @@ -0,0 +1,179 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: {{ .Values.deploymentStrategyType }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-connector-builder-server + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: server-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + + ports: + - name: http + containerPort: 8080 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} +{{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml b/airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml new file mode 100644 index 00000000..e00ae6ba --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: connector-builder-server-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml b/airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml new file mode 100644 index 00000000..6f1cb26e --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-connector-builder-server-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} diff --git a/airbyte-v1-notused/charts/connector-builder-server/values.yaml b/airbyte-v1-notused/charts/connector-builder-server/values.yaml new file mode 100644 index 00000000..64326ab9 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-builder-server/values.yaml @@ -0,0 +1,192 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + deploymentStrategyType: RollingUpdate + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte server image. +## image.pullPolicy the pull policy to use for the airbyte server image +## image.tag The airbyte server image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/connector-builder-server + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: NodePort + port: 80 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 +env_vars: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz b/airbyte-v1-notused/charts/connector-rollout-worker-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz rename to airbyte-v1-notused/charts/connector-rollout-worker-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml new file mode 100644 index 00000000..38d167fd --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-connector-rollout-worker +name: connector-rollout-worker +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/README.md b/airbyte-v1-notused/charts/connector-rollout-worker/README.md new file mode 100644 index 00000000..ad3e11f2 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/README.md @@ -0,0 +1,60 @@ +# connector-rollout-worker + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-connector-rollout-worker + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|---------------------------------------------------|------|--------------------------------------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/connector-rollout-worker"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `50` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml new file mode 100644 index 00000000..f1094295 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml @@ -0,0 +1,216 @@ +{{- if or (eq .Values.global.edition "community") (eq .Values.global.enterprise.connectorRolloutOptIn true)}} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: Recreate + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-connector-rollout-worker-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: TEMPORAL_WORKER_PORTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_WORKER_PORTS + - name: LOG_LEVEL + value: "{{ .Values.log.level }}" + {{- end }} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just + # splitting into two separate blocks for readability. + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: connector-rollout-worker-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /health/liveness + port: heartbeat + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /health/readiness + port: heartbeat + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + - name: heartbeat + containerPort: 8016 # for heartbeat server + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml new file mode 100644 index 00000000..24e141b1 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: connector-rollout-worker-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/values.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/values.yaml new file mode 100644 index 00000000..85d6bf18 --- /dev/null +++ b/airbyte-v1-notused/charts/connector-rollout-worker/values.yaml @@ -0,0 +1,273 @@ +global: + + serviceAccountName: &service-account-name "airbyte-admin" + edition: community + credVolumeOverride: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + enterprise: + connectorRolloutOptIn: false + + jobs: + ## Jobs resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## jobs.resources.limits [object] The resources limits for jobs + ## jobs.resources.requests [object] The requested resources for jobs + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + + kube: + ## JOB_KUBE_ANNOTATIONS + ## pod annotations of the sync job and the default pod annotations fallback for others jobs + ## jobs.kube.annotations [object] key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + ## jobs.kube.labels [object] key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## any boolean values should be quoted to ensure the value is passed through as a string, eg: + ## - key: airbyte-server + ## operator: Equal + ## value: "true" + ## effect: NoSchedule + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + ## image pull secret to use for job pod + ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod + main_container_image_pull_secret: "" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + ## busybox image used by the job pod + ## jobs.kube.images.busybox [string] busybox image used by the job pod + busybox: "" + ## JOB_KUBE_SOCAT_IMAGE + ## socat image used by the job pod + ## jobs.kube.images.socat [string] socat image used by the job pod + socat: "" + ## JOB_KUBE_CURL_IMAGE + ## curl image used by the job pod + ## jobs.kube.images.curl [string] curl image used by the job pod + curl: "" + +enabled: true +## connector-rollout-worker.replicaCount Number of connector-rollout-worker replicas +replicaCount: 1 + +## connector-rollout-worker.image.repository The repository to use for the airbyte connector-rollout-worker image. +## connector-rollout-worker.image.pullPolicy the pull policy to use for the airbyte connector-rollout-worker image +## connector-rollout-worker.image.tag The airbyte connector-rollout-worker image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/connector-rollout-worker + pullPolicy: IfNotPresent + +## connector-rollout-worker.podAnnotations [object] Add extra annotations to the connector-rollout-worker pod(s) +## +podAnnotations: {} + +## connector-rollout-worker.podLabels [object] Add extra labels to the connector-rollout-worker pod(s) +## +podLabels: {} + +## connector-rollout-worker.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the connector-rollout-worker containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## connector-rollout-worker.livenessProbe.enabled Enable livenessProbe on the connector-rollout-worker +## connector-rollout-worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## connector-rollout-worker.livenessProbe.periodSeconds Period seconds for livenessProbe +## connector-rollout-worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## connector-rollout-worker.livenessProbe.failureThreshold Failure threshold for livenessProbe +## connector-rollout-worker.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 50 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## connector-rollout-worker.readinessProbe.enabled Enable readinessProbe on the connector-rollout-worker +## connector-rollout-worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## connector-rollout-worker.readinessProbe.periodSeconds Period seconds for readinessProbe +## connector-rollout-worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## connector-rollout-worker.readinessProbe.failureThreshold Failure threshold for readinessProbe +## connector-rollout-worker.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## connector-rollout-worker resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## connector-rollout-worker.resources.limits [object] The resources limits for the connector-rollout-worker container +## connector-rollout-worker.resources.requests [object] The requested resources for the connector-rollout-worker container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## connector-rollout-worker.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## connector-rollout-worker.tolerations [array] Tolerations for connector-rollout-worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## connector-rollout-worker.affinity [object] Affinity and anti-affinity for connector-rollout-worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## connector-rollout-worker.log.level The log level to log at. +log: + level: "INFO" + + + +## connector-rollout-worker.extraVolumeMounts [array] Additional volumeMounts for connector-rollout-worker container(s). +## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## connector-rollout-worker.extraVolumes [array] Additional volumes for connector-rollout-worker pod(s). +## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default values for connector-rollout-worker: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Workspace storage for running jobs (logs, etc) +# WORKSPACE_ROOT: /workspace +# WORKSPACE_DOCKER_MOUNT: airbyte_workspace + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# WEBAPP_URL: airbyte-webapp-svc:80 +# INTERNAL_API_HOST: http://airbyte-server-svc:8001 +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + +debug: + enabled: true + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/cron-1.2.0.tgz b/airbyte-v1-notused/charts/cron-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/cron-1.2.0.tgz rename to airbyte-v1-notused/charts/cron-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/cron/Chart.yaml b/airbyte-v1-notused/charts/cron/Chart.yaml new file mode 100644 index 00000000..6db7eefd --- /dev/null +++ b/airbyte-v1-notused/charts/cron/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-cron +name: cron +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/cron/README.md b/airbyte-v1-notused/charts/cron/README.md new file mode 100644 index 00000000..9f628a60 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/README.md @@ -0,0 +1,62 @@ +# cron + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-cron + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/cron"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.containerSecurityContext | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/airbyte-v1-notused/charts/cron/charts/common/.helmignore b/airbyte-v1-notused/charts/cron/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/airbyte-v1-notused/charts/cron/charts/common/Chart.yaml b/airbyte-v1-notused/charts/cron/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/airbyte-v1-notused/charts/cron/charts/common/README.md b/airbyte-v1-notused/charts/cron/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/values.yaml b/airbyte-v1-notused/charts/cron/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/cron/templates/_helpers.tpl b/airbyte-v1-notused/charts/cron/templates/_helpers.tpl new file mode 100644 index 00000000..174aebfe --- /dev/null +++ b/airbyte-v1-notused/charts/cron/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/cron/templates/_images.tpl b/airbyte-v1-notused/charts/cron/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml b/airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml new file mode 100644 index 00000000..1d22b17e --- /dev/null +++ b/airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml @@ -0,0 +1,18 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: cron-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/airbyte-v1-notused/charts/cron/templates/deployment.yaml b/airbyte-v1-notused/charts/cron/templates/deployment.yaml new file mode 100644 index 00000000..f64fb6a6 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/templates/deployment.yaml @@ -0,0 +1,187 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-cron + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CRON_MICRONAUT_ENVIRONMENTS + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: WORKLOAD_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_API_HOST + - name: WORKSPACE_DOCKER_MOUNT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_DOCKER_MOUNT + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + + # Database + {{- include "airbyte.database.envs" . | nindent 10 }} + + {{- end }} + + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: cron-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 10 }} + {{- end }} + + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} + {{- end }} + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + + {{- if .Values.extraVolumeMounts }} + volumeMounts: {{ toYaml .Values.extraVolumeMounts | nindent 10 }} + {{- end }} + + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} + {{- if .Values.extraVolumes }} + volumes: {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/cron/values.yaml b/airbyte-v1-notused/charts/cron/values.yaml new file mode 100644 index 00000000..1bbace43 --- /dev/null +++ b/airbyte-v1-notused/charts/cron/values.yaml @@ -0,0 +1,233 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + configMapName: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + secrets: {} + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## cron.replicaCount Number of cron replicas +replicaCount: 1 + +## cron.image.repository The repository to use for the airbyte cron image. +## cron.image.pullPolicy the pull policy to use for the airbyte cron image +## cron.image.tag The airbyte cron image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/cron + pullPolicy: IfNotPresent + +## cron.podAnnotations [object] Add extra annotations to the cron pod(s) +## +podAnnotations: {} + +## cron.podLabels [object] Add extra labels to the cron pod(s) +## +podLabels: {} + +## cron.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the cron containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## cron.livenessProbe.enabled Enable livenessProbe on the cron +## cron.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## cron.livenessProbe.periodSeconds Period seconds for livenessProbe +## cron.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## cron.livenessProbe.failureThreshold Failure threshold for livenessProbe +## cron.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## cron.readinessProbe.enabled Enable readinessProbe on the cron +## cron.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## cron.readinessProbe.periodSeconds Period seconds for readinessProbe +## cron.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## cron.readinessProbe.failureThreshold Failure threshold for readinessProbe +## cron.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + + ## server.containerSecurityContext Security context for the container + ## Examples: + ## containerSecurityContext: + ## runAsNonRoot: true + ## runAsUser: 1000 + ## readOnlyRootFilesystem: true + containerSecurityContext: {} + +## Web app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## cron.resources.limits [object] The resources limits for the Web container +## cron.resources.requests [object] The requested resources for the Web container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## cron.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## cron.tolerations [array] Tolerations for cron pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## cron.affinity [object] Affinity and anti-affinity for cron pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## cron.extraVolumeMounts [array] Additional volumeMounts for cron container(s). +## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: var-run +## mountPath: /var/run/ +## - name: var-cache-nginx +## mountPath: /var/cache/nginx +## - mountPath: /etc/nginx/conf.d +## name: nginx-conf-d +## +extraVolumeMounts: [] + +## cron.extraVolumes [array] Additional volumes for cron pod(s). +## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: var-run +## emptyDir: {} +## - name: var-cache-nginx +## emptyDir: {} +## - name: nginx-conf-d +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: POSTGRES_USER +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_USER +# - name: POSTGRES_PWD +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_PASSWORD +# - name: DYNAMIC_CONFIG_FILE_PATH +# value: "config/dynamicconfig/development.yaml" +# - name: DB +# value: "postgresql" +# - name: DB_PORT +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_PORT +# - name: POSTGRES_SEEDS +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default vars for cron: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# API_URL: /api/v1/ +# INTERNAL_API_HOST: http://airbyte-server-svc:8001 + +env_vars: {} + + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/keycloak-1.2.0.tgz b/airbyte-v1-notused/charts/keycloak-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/keycloak-1.2.0.tgz rename to airbyte-v1-notused/charts/keycloak-1.2.0.tgz diff --git a/helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz b/airbyte-v1-notused/charts/keycloak-setup-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz rename to airbyte-v1-notused/charts/keycloak-setup-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/keycloak-setup/.gitignore b/airbyte-v1-notused/charts/keycloak-setup/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak-setup/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/keycloak-setup/Chart.yaml b/airbyte-v1-notused/charts/keycloak-setup/Chart.yaml new file mode 100644 index 00000000..a4eff29e --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak-setup/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-keycloak-setup +name: keycloak-setup +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/keycloak-setup/README.md b/airbyte-v1-notused/charts/keycloak-setup/README.md new file mode 100644 index 00000000..724dc7c8 --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak-setup/README.md @@ -0,0 +1,48 @@ +# keycloak-setup + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-keycloak-setup + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.edition | string | `"community"` | | +| global.env_vars | object | `{}` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/keycloak-setup"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl b/airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl b/airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml b/airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml new file mode 100644 index 00000000..41e534df --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml @@ -0,0 +1,143 @@ +{{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} +{{- if eq .Values.global.deploymentMode "oss" }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": "post-install, post-upgrade" + "helm.sh/hook-delete-policy": "before-hook-creation" +spec: + completions: 1 + template: + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + restartPolicy: Never + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 12 }} + {{- end }} + initContainers: + - name: keycloak-readiness-check + image: {{ include "imageUrl" (list .Values.initContainers.keycloakReadinessCheck.image $) }} + command: [ "sh", "-c", "until curl --output /dev/null --head --fail http://${KEYCLOAK_INTERNAL_HOST}/auth/health/ready; do sleep 1; done;" ] + env: + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: KEYCLOAK_INTERNAL_HOST + securityContext: + {{- toYaml .Values.initContainerSecurityContext | nindent 14 }} + {{- if .Values.extraInitContainers }} + {{- toYaml .Values.extraInitContainers | nindent 8 }} + {{- end }} + containers: + - name: airbyte-keycloak-setup-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + - name: AIRBYTE_URL + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: AIRBYTE_URL + - name: KEYCLOAK_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_USER + - name: KEYCLOAK_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_PASSWORD + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: KEYCLOAK_INTERNAL_HOST + + {{- include "airbyte.database.envs" . | nindent 12 }} + {{- include "airbyte.enterprise.instanceAdmin" . | nindent 12 }} + {{- include "airbyte.enterprise.identityProvider" . | nindent 12 }} + {{- include "airbyte.keycloak.database.envs" . | nindent 12 }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: keycloak-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if .Values.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 12 }} + {{- end }} + + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + mountPath: /app/configs/airbyte.yml + subPath: fileContents + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} + {{- toYaml .Values.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} + volumes: + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + secret: + secretName: {{ .Release.Name }}-airbyte-yml + {{- end }} + {{- if .Values.extraVolumes }} + {{- toYaml .Values.extraVolumes | nindent 8 }} + {{- end }} +{{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/keycloak-setup/values.yaml b/airbyte-v1-notused/charts/keycloak-setup/values.yaml new file mode 100644 index 00000000..f134b437 --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak-setup/values.yaml @@ -0,0 +1,190 @@ +## global.serviceAccountName Name of service account to be associated with service +## deploymentMode Determines deployment mode of airbyte +## secretName Overrides the secrate name with with credentials to S3 Bucket and logging +## database.secretName Name of database secret +## database.secretValue Value of database password key stored in secret +global: + serviceAccountName: placeholderServiceAccount + edition: community + deploymentMode: oss + secretName: "" + database: + secretName: "" + secretValue: "" + secrets: {} + env_vars: {} + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + +enabled: true +## image.repository The repository to use for the airbyte keycloak-setup image. +## image.pullPolicy the pull policy to use for the airbyte keycloak-setup image +## image.tag The airbyte keycloak-setup image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/keycloak-setup + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the keycloak-setup pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the keycloak-setup pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## Keycloak Setup resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## keycloak-setup.resources.limits [object] The resources limits for the airbyte keycloak-setup image +## keycloak-setup.resources.requests [object] The requested resources for the airbyte keycloak-setup image +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## affinity [object] Affinity and anti-affinity for keycloak-setup pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +## extraEnv: +## - name: AIRBYTE_VERSION +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: AIRBYTE_VERSION +## - name: DATABASE_HOST +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_HOST +## - name: DATABASE_PORT +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_PORT +## - name: DATABASE_PASSWORD +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_PASSWORD +## - name: DATABASE_URL +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_URL +## - name: DATABASE_USER +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_USER +## +extraEnv: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## extraContainer [array] Additional container for keycloak pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# DATABASE_PASSWORD: 12345 +# DATABASE_USER: airbyte +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/airbyte-v1-notused/charts/keycloak/.gitignore b/airbyte-v1-notused/charts/keycloak/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/keycloak/Chart.yaml b/airbyte-v1-notused/charts/keycloak/Chart.yaml new file mode 100644 index 00000000..5641e569 --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +appVersion: 1.2.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: Helm chart to deploy airbyte-keycloak +name: keycloak +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/keycloak/README.md b/airbyte-v1-notused/charts/keycloak/README.md new file mode 100644 index 00000000..5b86476d --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/README.md @@ -0,0 +1,71 @@ +# keycloak + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-keycloak + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| bypassInit | bool | `false` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | airbyte deployment mode | +| global.edition | string | `"community"` | | +| global.env_vars | object | `{}` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.secrets | object | `{}` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| headlessService.annotations | object | `{}` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/keycloak"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `30` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `8180` | | +| service.type | string | `"ClusterIP"` | | +| startupProbe.enabled | bool | `true` | | +| startupProbe.failureThreshold | int | `60` | | +| startupProbe.initialDelaySeconds | int | `30` | | +| startupProbe.periodSeconds | int | `5` | | +| startupProbe.successThreshold | int | `1` | | +| startupProbe.timeoutSeconds | int | `1` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl b/airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak/templates/_images.tpl b/airbyte-v1-notused/charts/keycloak/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak/templates/service.yaml b/airbyte-v1-notused/charts/keycloak/templates/service.yaml new file mode 100644 index 00000000..3e7b5fea --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/templates/service.yaml @@ -0,0 +1,60 @@ +# If Cloud or Pro/Enterprise, render the keycloak service template. +{{- if or (eq .Values.global.deploymentMode "cloud") (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-keycloak-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + {{ if and (eq .Values.service.type "NodePort") (.Values.service.nodePort) }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} +--- +# This headless service sets ClusterIp: None so that it can be +# used for internal DNS resolution of all individual keycloak +# pods. Port 7800 is the default jgroups port that Keycloak +# expects to be open to enable Infinispan cache synchronization. +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-keycloak-headless-svc + {{- with .Values.headlessService.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: ClusterIP + clusterIP: None + ports: + - name: jgroups + port: 7800 + targetPort: 7800 + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml b/airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml new file mode 100644 index 00000000..89769cff --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml @@ -0,0 +1,193 @@ +# if Cloud or Pro/Enterprise, render the keycloak StatefulSet template. +{{- if or (eq .Values.global.deploymentMode "cloud") (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + serviceName: {{.Release.Name }}-airbyte-keycloak-headless-svc + podManagementPolicy: OrderedReady # embedded infinispan does not handle parallel joins well, src https://github.com/keycloak/keycloak/issues/21108#issuecomment-1599010602 + updateStrategy: + type: RollingUpdate + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + initContainers: + {{- if and (eq .Values.global.deploymentMode "oss") (ne .Values.bypassInit true)}} + # This init container will only executed if the deployment mode is "oss" and the bypassInit is not true. + - name: init-db + image: {{ include "imageUrl" (list .Values.initContainers.initDb.image $) }} + command: [ "sh", "-c" ] + args: + - > + PGPASSWORD=$DATABASE_PASSWORD psql -h $DATABASE_HOST -p $DATABASE_PORT -U $DATABASE_USER -d $DATABASE_DB -c "CREATE SCHEMA IF NOT EXISTS keycloak"; + env: + {{- include "airbyte.database.envs" . | nindent 12 }} + + securityContext: + {{- toYaml .Values.initContainerSecurityContext | nindent 14 }} + {{- end }} + {{- if .Values.extraInitContainers }} + {{- toYaml .Values.extraInitContainers | nindent 8 }} + {{- end }} + containers: + - name: airbyte-keycloak + image: {{ include "imageUrl" (list .Values.image $)}} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: KEYCLOAK_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_USER + - name: KEYCLOAK_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_PASSWORD + - name: KEYCLOAK_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_PORT + - name: JAVA_OPTS_APPEND + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_JAVA_OPTS_APPEND + {{- include "airbyte.keycloak.database.envs" . | nindent 12 }} + {{- end }} # end if oss + + {{- if .Values.extraEnv }} + {{ .Values.extraEnv | toYaml | nindent 12 }} + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: keycloak-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if .Values.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + - containerPort: 7800 + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} + {{- end }} + volumeMounts: + - name: keycloak-storage + mountPath: /opt/keycloak/data/infinispan + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 10 }} + {{- end }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /auth/health/live + port: {{ .Values.service.port }} + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /auth/health/ready + port: {{ .Values.service.port }} + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.startupProbe.enabled }} + startupProbe: + httpGet: + path: /auth/health/started + port: {{ .Values.service.port }} + initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.startupProbe.periodSeconds }} + timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }} + successThreshold: {{ .Values.startupProbe.successThreshold }} + failureThreshold: {{ .Values.startupProbe.failureThreshold }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 8 }} + {{- end }} + volumeClaimTemplates: + - metadata: + name: keycloak-storage + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi +{{- end }} diff --git a/airbyte-v1-notused/charts/keycloak/values.yaml b/airbyte-v1-notused/charts/keycloak/values.yaml new file mode 100644 index 00000000..30de3c4b --- /dev/null +++ b/airbyte-v1-notused/charts/keycloak/values.yaml @@ -0,0 +1,245 @@ +## global.serviceAccountName Name of service account to be associated with service +## deploymentMode Determines deployment mode of airbyte +## secretName Overrides the secrate name with with credentials to S3 Bucket and logging +## database.secretName Name of database secret +## database.secretValue Value of database password key stored in secret +global: + # serviceAccountName -- Service Account name override + serviceAccountName: placeholderServiceAccount + edition: community + # -- airbyte deployment mode + deploymentMode: oss + secretName: "" + database: + secretName: "" + secretValue: "" + secrets: {} + env_vars: {} + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + +enabled: true + +bypassInit: false +## image.repository The repository to use for the airbyte keycloak image. +## image.pullPolicy the pull policy to use for the airbyte keycloak image +## image.tag The airbyte keycloak image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/keycloak + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the keycloak pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the keycloak pod +## +podLabels: {} + +## Configure extra options for the keycloak containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on keycloak +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on keycloak +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +startupProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 1 + failureThreshold: 60 + successThreshold: 1 + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: ClusterIP + port: 8180 + annotations: {} + +headlessService: + annotations: {} + +## Keycloak resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## keycloak.resources.limits [object] The resources limits for the keycloak image +## keycloak.resources.requests [object] The requested resources for the keycloak image +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## affinity [object] Affinity and anti-affinity for keycloak pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +## extraEnv: +## - name: AIRBYTE_VERSION +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: AIRBYTE_VERSION +## - name: DATABASE_HOST +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_HOST +## - name: DATABASE_PORT +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_PORT +## - name: DATABASE_PASSWORD +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_PASSWORD +## - name: DATABASE_URL +## valueFrom: +## configMapKeyRef: +## name: airbyte-env +## key: DATABASE_URL +## - name: DATABASE_USER +## valueFrom: +## secretKeyRef: +## name: airbyte-secrets +## key: DATABASE_USER +## +extraEnv: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## extraContainer [array] Additional container for keycloak pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# DATABASE_PASSWORD: 12345 +# DATABASE_USER: airbyte +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + diff --git a/helm/airbyte-v1/charts/metrics-1.2.0.tgz b/airbyte-v1-notused/charts/metrics-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/metrics-1.2.0.tgz rename to airbyte-v1-notused/charts/metrics-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/metrics/.helmignore b/airbyte-v1-notused/charts/metrics/.helmignore new file mode 100644 index 00000000..f885da3f --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/.helmignore @@ -0,0 +1,25 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ + +ci.sh diff --git a/airbyte-v1-notused/charts/metrics/Chart.yaml b/airbyte-v1-notused/charts/metrics/Chart.yaml new file mode 100644 index 00000000..84bf0611 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-metrics +name: metrics +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/metrics/README.md b/airbyte-v1-notused/charts/metrics/README.md new file mode 100644 index 00000000..51fd055b --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/README.md @@ -0,0 +1,40 @@ +# metrics + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-metrics + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/metrics-reporter"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/metrics/charts/common/.helmignore b/airbyte-v1-notused/charts/metrics/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml b/airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/airbyte-v1-notused/charts/metrics/charts/common/README.md b/airbyte-v1-notused/charts/metrics/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/values.yaml b/airbyte-v1-notused/charts/metrics/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/metrics/templates/_helpers.tpl b/airbyte-v1-notused/charts/metrics/templates/_helpers.tpl new file mode 100644 index 00000000..9f3ccdc6 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/templates/_helpers.tpl @@ -0,0 +1,39 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/metrics/templates/_images.tpl b/airbyte-v1-notused/charts/metrics/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/metrics/templates/deployment.yaml b/airbyte-v1-notused/charts/metrics/templates/deployment.yaml new file mode 100644 index 00000000..d9bf336c --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/templates/deployment.yaml @@ -0,0 +1,124 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app.kubernetes.io/name: {{ include "airbyte.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + helm.sh/chart: {{ include "airbyte.chart" . }} + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.airbyte.io/fullname: {{ include "airbyte.fullname" . }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + airbyte: metrics + strategy: + type: Recreate # Needed due to volume claims + template: + metadata: + labels: + airbyte: metrics + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + containers: + - name: airbyte-metrics-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: METRIC_CLIENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: METRIC_CLIENT + - name: OTEL_COLLECTOR_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OTEL_COLLECTOR_ENDPOINT + + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: metrics-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.resources }} + resources: + {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: + {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + {{- if .Values.extraVolumeMounts }} + volumeMounts: + {{ toYaml .Values.extraVolumeMounts | nindent 10 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/metrics/values.yaml b/airbyte-v1-notused/charts/metrics/values.yaml new file mode 100644 index 00000000..6ccaa691 --- /dev/null +++ b/airbyte-v1-notused/charts/metrics/values.yaml @@ -0,0 +1,110 @@ + +global: + # imagePullSecrets: + # - name: "" + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + extraContainers: [] + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## metrics.replicaCount Number of metrics-reporter replicas +replicaCount: 1 + +## metrics.image.repository The repository to use for the airbyte metrics-reporter image. +## metrics.image.pullPolicy the pull policy to use for the airbyte metrics-reporter image +## metrics.image.tag The airbyte metrics-reporter image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/metrics-reporter + pullPolicy: IfNotPresent + +## metrics.podAnnotations [object] Add extra annotations to the metrics-reporter pod +## +podAnnotations: {} + +## metrics.podLabels [object] Add extra labels to the metrics-reporter pod +## +podLabels: {} + +## metrics.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## metrics-reporter app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## metrics.resources.limits [object] The resources limits for the metrics-reporter container +## metrics.resources.requests [object] The requested resources for the metrics-reporter container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## metrics.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## metrics.tolerations [array] Tolerations for metrics-reporter pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## metrics.affinity [object] Affinity and anti-affinity for metrics-reporter pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## metrics.extraEnv [array] Additional env vars for metrics-reporter pod(s). +## Example: +## +## extraEnv: +## - name: SAMPLE_ENV_VAR +## value: "key=sample-value" +extraEnv: [] + +## metrics.extraVolumeMounts [array] Additional volumeMounts for metrics-reporter container(s). +## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## metrics.extraVolumes [array] Additional volumes for metrics-reporter pod(s). +## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +extraContainers: [] + +secrets: {} + +env_vars: {} diff --git a/helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz b/airbyte-v1-notused/charts/pod-sweeper-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz rename to airbyte-v1-notused/charts/pod-sweeper-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/pod-sweeper/.gitignore b/airbyte-v1-notused/charts/pod-sweeper/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/pod-sweeper/Chart.yaml b/airbyte-v1-notused/charts/pod-sweeper/Chart.yaml new file mode 100644 index 00000000..919123a9 --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-pod-sweeper +name: pod-sweeper +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/pod-sweeper/README.md b/airbyte-v1-notused/charts/pod-sweeper/README.md new file mode 100644 index 00000000..cc34eedd --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/README.md @@ -0,0 +1,71 @@ +# pod-sweeper + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-pod-sweeper + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.jobs.kube.annotations | object | `{}` | | +| global.jobs.kube.main_container_image_pull_secret | string | `""` | | +| global.jobs.kube.nodeSelector | object | `{}` | | +| global.jobs.kube.tolerations | list | `[]` | | +| global.jobs.resources.limits | object | `{}` | | +| global.jobs.resources.requests | object | `{}` | | +| global.logs.accessKey.existingSecret | string | `""` | | +| global.logs.accessKey.existingSecretKey | string | `""` | | +| global.logs.accessKey.password | string | `"minio"` | | +| global.logs.gcs.bucket | string | `""` | | +| global.logs.gcs.credentials | string | `""` | | +| global.logs.gcs.credentialsJson | string | `""` | | +| global.logs.minio.enabled | bool | `true` | | +| global.logs.s3.bucket | string | `"airbyte-dev-logs"` | | +| global.logs.s3.bucketRegion | string | `""` | | +| global.logs.s3.enabled | bool | `false` | | +| global.logs.secretKey.existingSecret | string | `""` | | +| global.logs.secretKey.existingSecretKey | string | `""` | | +| global.logs.secretKey.password | string | `"minio123"` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"bitnami/kubectl"` | | +| image.tag | string | `"latest"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `5` | | +| livenessProbe.periodSeconds | int | `30` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| namespace | string | `""` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `5` | | +| readinessProbe.periodSeconds | int | `30` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| timeToDeletePods.running | string | `""` | | +| timeToDeletePods.succeeded | int | `120` | | +| timeToDeletePods.unsuccessful | int | `1440` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl b/airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl new file mode 100644 index 00000000..847ec7b4 --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl b/airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml b/airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml new file mode 100644 index 00000000..96ce9350 --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml @@ -0,0 +1,73 @@ +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }}-sweep-pod-script + namespace: {{ .Values.namespace | default .Release.Namespace }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + +data: + sweep-pod.sh: | + #!/bin/bash + get_job_pods () { + kubectl -n ${KUBE_NAMESPACE} -L airbyte -l airbyte=job-pod \ + get pods \ + -o=jsonpath='{range .items[*]} {.metadata.name} {.status.phase} {.status.conditions[0].lastTransitionTime} {.status.startTime}{"\n"}{end}' + } + delete_pod() { + printf "From status '%s' since '%s', " $2 $3 + echo "$1" | grep -v "STATUS" | awk '{print $1}' | xargs --no-run-if-empty kubectl -n ${KUBE_NAMESPACE} delete pod + } + while : + do + echo "Starting pod sweeper cycle:" + + if [ -n "${RUNNING_TTL_MINUTES}" ]; then + # Time window for running pods + RUNNING_DATE_STR=`date -d "now - ${RUNNING_TTL_MINUTES} minutes" --utc -Ins` + RUNNING_DATE=`date -d $RUNNING_DATE_STR +%s` + echo "Will sweep running pods from before ${RUNNING_DATE_STR}" + fi + + if [ -n "${SUCCEEDED_TTL_MINUTES}" ]; then + # Shorter time window for succeeded pods + SUCCESS_DATE_STR=`date -d "now - ${SUCCEEDED_TTL_MINUTES} minutes" --utc -Ins` + SUCCESS_DATE=`date -d $SUCCESS_DATE_STR +%s` + echo "Will sweep succeeded pods from before ${SUCCESS_DATE_STR}" + fi + + if [ -n "${UNSUCCESSFUL_TTL_MINUTES}" ]; then + # Longer time window for unsuccessful pods (to debug) + NON_SUCCESS_DATE_STR=`date -d "now - ${UNSUCCESSFUL_TTL_MINUTES} minutes" --utc -Ins` + NON_SUCCESS_DATE=`date -d $NON_SUCCESS_DATE_STR +%s` + echo "Will sweep unsuccessful pods from before ${NON_SUCCESS_DATE_STR}" + fi + ( + IFS=$'\n' + for POD in `get_job_pods`; do + IFS=' ' + POD_NAME=`echo $POD | cut -d " " -f 1` + POD_STATUS=`echo $POD | cut -d " " -f 2` + POD_DATE_STR=`echo $POD | cut -d " " -f 3` + POD_START_DATE_STR=`echo $POD | cut -d " " -f 4` + POD_DATE=`date -d ${POD_DATE_STR:-$POD_START_DATE_STR} '+%s'` + if [ -n "${RUNNING_TTL_MINUTES}" ] && [ "$POD_STATUS" = "Running" ]; then + if [ "$POD_DATE" -lt "$RUNNING_DATE" ]; then + delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" + fi + elif [ -n "${SUCCEEDED_TTL_MINUTES}" ] && [ "$POD_STATUS" = "Succeeded" ]; then + if [ "$POD_DATE" -lt "$SUCCESS_DATE" ]; then + delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" + fi + elif [ -n "${UNSUCCESSFUL_TTL_MINUTES}" ] && [ "$POD_STATUS" != "Running" ] && [ "$POD_STATUS" != "Succeeded" ]; then + if [ "$POD_DATE" -lt "$NON_SUCCESS_DATE" ]; then + delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" + fi + fi + done + ) + echo "Completed pod sweeper cycle. Sleeping for 60 seconds..." + sleep 60 + done diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml b/airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml new file mode 100644 index 00000000..374b9a4f --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml @@ -0,0 +1,105 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + namespace: {{ .Values.namespace | default .Release.Namespace }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + namespace: {{ .Values.namespace | default .Release.Namespace }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + annotations: + checksum/sweep-pod-script: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + {{- if .Values.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: airbyte-pod-sweeper + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + - name: KUBE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: RUNNING_TTL_MINUTES + value: "{{ .Values.timeToDeletePods.running }}" + - name: SUCCEEDED_TTL_MINUTES + value: "{{ .Values.timeToDeletePods.succeeded }}" + - name: UNSUCCESSFUL_TTL_MINUTES + value: "{{ .Values.timeToDeletePods.unsuccessful }}" + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + - mountPath: /script/sweep-pod.sh + subPath: sweep-pod.sh + name: sweep-pod-script + - mountPath: /.kube + name: kube-config + command: ["/bin/bash", "-c", /script/sweep-pod.sh] + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + exec: + command: + - /bin/sh + - -ec + - grep -aq sweep-pod.sh /proc/1/cmdline + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + exec: + command: + - /bin/sh + - -ec + - grep -aq sweep-pod.sh /proc/1/cmdline + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + - name: kube-config + emptyDir: {} + - name: sweep-pod-script + configMap: + name: {{ include "common.names.fullname" . }}-sweep-pod-script + defaultMode: 0755 diff --git a/airbyte-v1-notused/charts/pod-sweeper/values.yaml b/airbyte-v1-notused/charts/pod-sweeper/values.yaml new file mode 100644 index 00000000..fa4bb8a6 --- /dev/null +++ b/airbyte-v1-notused/charts/pod-sweeper/values.yaml @@ -0,0 +1,120 @@ +## global.serviceAccountName Name of service account to be associated with service +global: + serviceAccountName: &service-account-name "airbyte-admin" + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## podSweeper.image.repository The image repository to use for the pod sweeper +## podSweeper.image.pullPolicy The pull policy for the pod sweeper image +## podSweeper.image.tag The pod sweeper image tag to use +image: + repository: bitnami/kubectl + pullPolicy: IfNotPresent + tag: latest + +## podSweeper.podAnnotations [object] Add extra annotations to the podSweeper pod +## +podAnnotations: {} + +## podSweeper.podLabels [object] Add extra labels to the podSweeper pod +## +podLabels: {} + +## podSweeper.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the podSweeper containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## podSweeper.livenessProbe.enabled Enable livenessProbe on the podSweeper +## podSweeper.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## podSweeper.livenessProbe.periodSeconds Period seconds for livenessProbe +## podSweeper.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## podSweeper.livenessProbe.failureThreshold Failure threshold for livenessProbe +## podSweeper.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## podSweeper.readinessProbe.enabled Enable readinessProbe on the podSweeper +## podSweeper.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## podSweeper.readinessProbe.periodSeconds Period seconds for readinessProbe +## podSweeper.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## podSweeper.readinessProbe.failureThreshold Failure threshold for readinessProbe +## podSweeper.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Pod Sweeper app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## podSweeper.resources.limits [object] The resources limits for the podSweeper container +## podSweeper.resources.requests [object] The requested resources for the podSweeper container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## podSweeper.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## podSweeper.tolerations [array] Tolerations for podSweeper pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## podSweeper.affinity [object] Affinity and anti-affinity for podSweeper pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## Pod TTLs in minutes +## pod-sweeper will skip over pods with any status types with no TTL set (empty string) +## Pod Status docs: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase +## +## podSweeper.timeToDeletePods.running Time to remove pods on running status (minutes). +## podSweeper.timeToDeletePods.succeeded Time to remove pods on succeeded status (minutes). +## podSweeper.timeToDeletePods.unsuccessful Time to remove pods on neither running nor succeeded status (minutes). +timeToDeletePods: + running: "" + succeeded: 10 + ## 2 hours - generally long enough for someone trying to reproduce an error to debug. + unsuccessful: 120 + +replicaCount: 1 + +## namespace [string] namespace to deploy pod-sweeper at +namespace: "" diff --git a/helm/airbyte-v1/charts/server-1.2.0.tgz b/airbyte-v1-notused/charts/server-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/server-1.2.0.tgz rename to airbyte-v1-notused/charts/server-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/server/.gitignore b/airbyte-v1-notused/charts/server/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/server/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/server/Chart.yaml b/airbyte-v1-notused/charts/server/Chart.yaml new file mode 100644 index 00000000..e5ada841 --- /dev/null +++ b/airbyte-v1-notused/charts/server/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-server +name: server +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/server/README.md b/airbyte-v1-notused/charts/server/README.md new file mode 100644 index 00000000..b31933fb --- /dev/null +++ b/airbyte-v1-notused/charts/server/README.md @@ -0,0 +1,68 @@ +# server + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-server + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| deploymentStrategyType | string | `"Recreate"` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.edition | string | `"community"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/server"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `60` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `30` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `8001` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/server/templates/_helpers.tpl b/airbyte-v1-notused/charts/server/templates/_helpers.tpl new file mode 100644 index 00000000..b8ac92f8 --- /dev/null +++ b/airbyte-v1-notused/charts/server/templates/_helpers.tpl @@ -0,0 +1,242 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/server/templates/_images.tpl b/airbyte-v1-notused/charts/server/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/server/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/server/templates/deployment.yaml b/airbyte-v1-notused/charts/server/templates/deployment.yaml new file mode 100644 index 00000000..186082d6 --- /dev/null +++ b/airbyte-v1-notused/charts/server/templates/deployment.yaml @@ -0,0 +1,453 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + minReadySeconds: 30 + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: {{ .Values.deploymentStrategyType }} # Needed due to volume claims + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-server-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: API_AUTHORIZATION_ENABLED + value: "true" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise should always have API_AUTHORIZATION_ENABLED set to true, even + # if global.auth.enabled is not set to true. This can be simplified in the future, once + # globa.auth.enabled is changed to always default to true across all editions of Airbyte. + - name: API_AUTHORIZATION_ENABLED + value: "true" + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + {{- include "airbyte.logging.envs" . | nindent 8 }} + - name: AIRBYTE_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_API_HOST + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: AIRBYTE_EDITION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_EDITION + - name: AIRBYTE_URL + valueFrom: + configMapKeyRef: + name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} + key: AIRBYTE_URL + - name: CONFIG_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIG_ROOT + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SERVER_MICRONAUT_ENVIRONMENTS + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKER_ENVIRONMENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKER_ENVIRONMENT + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: JOB_MAIN_CONTAINER_CPU_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_REQUEST + - name: JOB_MAIN_CONTAINER_CPU_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_LIMIT + - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_REQUEST + - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_LIMIT + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_INTERNAL_HOST + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: KEYCLOAK_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_USER + - name: KEYCLOAK_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: KEYCLOAK_ADMIN_PASSWORD + {{- end }} + - name: CONNECTOR_BUILDER_SERVER_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_BUILDER_SERVER_API_HOST + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal server" + - name: ENTERPRISE_SOURCE_STUBS_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ENTERPRISE_SOURCE_STUBS_URL + + {{- if and (eq .Values.global.edition "community") .Values.global.auth.enabled }} + # Values for Airbyte auth configurations, secrets, and credentials in Community edition + - name: AB_INSTANCE_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.instanceAdmin.passwordSecretKey | default "instance-admin-password" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.instanceAdmin.clientIdSecretKey | default "instance-admin-client-id" | quote }} + - name: AB_INSTANCE_ADMIN_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.instanceAdmin.clientSecretSecretKey | default "instance-admin-client-secret" | quote }} + - name: AB_JWT_SIGNATURE_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.secretName | default "airbyte-auth-secrets" | quote }} + key: {{ .Values.global.auth.jwtSignatureSecretKey | default "jwt-signature-secret" | quote }} + - name: AB_COOKIE_SECURE + value: {{ .Values.global.auth.cookieSecureSetting | default "true" | quote }} + - name: AB_COOKIE_SAME_SITE + value: {{ .Values.global.auth.cookieSameSiteSetting | default "Strict" | quote }} + {{- end }} + + # Secrets Manager + - name: SECRET_PERSISTENCE + value: {{ include "airbyte.secretPersistence" . }} + # Values for AwsSecretsManager + {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} + - name: AWS_SECRET_MANAGER_REGION + value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} + - name: AWS_SECRET_MANAGER_SECRET_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} + - name: AWS_KMS_KEY_ARN + value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} + {{- end }} + + # Values for Azure Key Vault + {{- if (((.Values.global).secretsManager).azureKeyVault) }} + + - name: AB_AZURE_KEY_VAULT_VAULT_URL + value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} + + - name: AB_AZURE_KEY_VAULT_TENANT_ID + value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + {{- end }} + + {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} + - name: AB_AZURE_KEY_VAULT_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} + {{- end }} + + # Values for googleSecretManager secrets + {{- if (((.Values.global).secretsManager).googleSecretManager) }} + - name: SECRET_STORE_GCP_PROJECT_ID + value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} + - name: SECRET_STORE_GCP_CREDENTIALS + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + {{- end }} + + # Values for vault secrets + {{- if (((.Values.global).secretsManager).vault) }} + - name: VAULT_ADDRESS + value: {{ (((.Values.global).secretsManager).vault).address }} + - name: VAULT_PREFIX + value: {{ (((.Values.global).secretsManager).vault).prefix }} + - name: VAULT_AUTH_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + {{- end }} + + # Storage + {{- include "airbyte.storage.envs" . | nindent 8 }} + + {{- include "airbyte.database.envs" . | nindent 8 }} + {{- include "airbyte.enterprise.instanceAdmin" . | nindent 8 }} + {{- include "airbyte.enterprise.identityProvider" . | nindent 8 }} + {{- include "airbyte.enterprise.license" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: server-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /api/v1/health + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /api/v1/health + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + - name: http + containerPort: 8001 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + mountPath: /storage + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + mountPath: /app/configs/airbyte.yml + subPath: fileContents + readOnly: true + {{- end }} + {{- end }} + + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + persistentVolumeClaim: + claimName: airbyte-storage-pvc + {{- end }} + + {{- if eq .Values.global.deploymentMode "oss" }} + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + + {{- if .Values.global.airbyteYml }} + - name: airbyte-yml-volume + secret: + secretName: {{ .Release.Name }}-airbyte-yml + {{- end }} + {{- end }} + {{- if .Values.extraVolumes }} +{{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/server/templates/secrets.yaml b/airbyte-v1-notused/charts/server/templates/secrets.yaml new file mode 100644 index 00000000..f0101d7a --- /dev/null +++ b/airbyte-v1-notused/charts/server/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: server-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/server/templates/service.yaml b/airbyte-v1-notused/charts/server/templates/service.yaml new file mode 100644 index 00000000..d2d8d9b9 --- /dev/null +++ b/airbyte-v1-notused/charts/server/templates/service.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-server-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/server/values.yaml b/airbyte-v1-notused/charts/server/values.yaml new file mode 100644 index 00000000..4798c10b --- /dev/null +++ b/airbyte-v1-notused/charts/server/values.yaml @@ -0,0 +1,220 @@ + +global: + serviceAccountName: placeholderServiceAccount + edition: community + deploymentMode: oss + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + storage: + type: minio + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte server image. +## image.pullPolicy the pull policy to use for the airbyte server image +## image.tag The airbyte server image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/server + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the server pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: ClusterIP + port: 8001 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# DATABASE_DB: airbyte +# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 +# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 +env_vars: {} + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + + +## deploymentStrategyType [string] - deployment strategy type for airbyte-server deployment. +## Defaults to Recreate since the pod is using pvc +deploymentStrategyType: RollingUpdate + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/temporal-1.2.0.tgz b/airbyte-v1-notused/charts/temporal-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/temporal-1.2.0.tgz rename to airbyte-v1-notused/charts/temporal-1.2.0.tgz diff --git a/helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz b/airbyte-v1-notused/charts/temporal-ui-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz rename to airbyte-v1-notused/charts/temporal-ui-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/temporal-ui/Chart.yaml b/airbyte-v1-notused/charts/temporal-ui/Chart.yaml new file mode 100644 index 00000000..590c8b4b --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-temporal-ui +name: temporal-ui +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore b/airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml b/airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/README.md b/airbyte-v1-notused/charts/temporal-ui/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml b/airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl b/airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl new file mode 100644 index 00000000..7be7bc1a --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl b/airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml b/airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml new file mode 100644 index 00000000..06a07ea5 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml @@ -0,0 +1,124 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-temporal-ui + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /v1/health + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + + ports: + - name: http + containerPort: 8080 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/service.yaml b/airbyte-v1-notused/charts/temporal-ui/templates/service.yaml new file mode 100644 index 00000000..93d2c3eb --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/templates/service.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-airbyte-temporal-ui-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} diff --git a/airbyte-v1-notused/charts/temporal-ui/values.yaml b/airbyte-v1-notused/charts/temporal-ui/values.yaml new file mode 100644 index 00000000..9430941d --- /dev/null +++ b/airbyte-v1-notused/charts/temporal-ui/values.yaml @@ -0,0 +1,194 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + deploymentStrategyType: RollingUpdate + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: false +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte server image. +## image.pullPolicy the pull policy to use for the airbyte server image +## image.tag The airbyte server image tag. Defaults to the chart's AppVersion +image: + repository: temporalio/ui + pullPolicy: IfNotPresent + tag: 2.30.1 + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: NodePort + port: 80 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 +env_vars: + TEMPORAL_ADDRESS: ab-temporal:7233 + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/charts/temporal/.gitignore b/airbyte-v1-notused/charts/temporal/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/temporal/Chart.yaml b/airbyte-v1-notused/charts/temporal/Chart.yaml new file mode 100644 index 00000000..468bee38 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-temporal +name: temporal +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/temporal/README.md b/airbyte-v1-notused/charts/temporal/README.md new file mode 100644 index 00000000..036ddee1 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/README.md @@ -0,0 +1,62 @@ +# temporal + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-temporal + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"temporalio/auto-setup"` | | +| image.tag | string | `"1.23.0"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `5` | | +| livenessProbe.periodSeconds | int | `30` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `5` | | +| readinessProbe.periodSeconds | int | `30` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.port | int | `7233` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/temporal/templates/_helpers.tpl b/airbyte-v1-notused/charts/temporal/templates/_helpers.tpl new file mode 100644 index 00000000..847ec7b4 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} diff --git a/airbyte-v1-notused/charts/temporal/templates/_images.tpl b/airbyte-v1-notused/charts/temporal/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal/templates/configmap.yaml b/airbyte-v1-notused/charts/temporal/templates/configmap.yaml new file mode 100644 index 00000000..5f4b89fe --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/templates/configmap.yaml @@ -0,0 +1,54 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }}-dynamicconfig + labels: + {{- include "airbyte.labels" . | nindent 4 }} +data: + "development.yaml": | + # when modifying, remember to update the docker-compose version of this file in temporal/dynamicconfig/development.yaml + frontend.enableClientVersionCheck: + - value: true + constraints: {} + history.persistenceMaxQPS: + - value: 3000 + constraints: {} + frontend.persistenceMaxQPS: + - value: 3000 + constraints: {} + frontend.historyMgrNumConns: + - value: 30 + constraints: {} + frontend.throttledLogRPS: + - value: 20 + constraints: {} + frontend.enableUpdateWorkflowExecution: + - value: true + frontend.enableUpdateWorkflowExecutionAsyncAccepted: + - value: true + history.historyMgrNumConns: + - value: 50 + constraints: {} + system.advancedVisibilityWritingMode: + - value: "off" + constraints: {} + history.defaultActivityRetryPolicy: + - value: + InitialIntervalInSeconds: 1 + MaximumIntervalCoefficient: 100.0 + BackoffCoefficient: 2.0 + MaximumAttempts: 0 + history.defaultWorkflowRetryPolicy: + - value: + InitialIntervalInSeconds: 1 + MaximumIntervalCoefficient: 100.0 + BackoffCoefficient: 2.0 + MaximumAttempts: 0 + # Limit for responses. This mostly impacts discovery jobs since they have the largest responses. + limit.blobSize.error: + - value: 15728640 # 15MB + constraints: {} + limit.blobSize.warn: + - value: 10485760 # 10MB + constraints: {} diff --git a/airbyte-v1-notused/charts/temporal/templates/deployment.yaml b/airbyte-v1-notused/charts/temporal/templates/deployment.yaml new file mode 100644 index 00000000..83643ecd --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/templates/deployment.yaml @@ -0,0 +1,162 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} +{{- if .Values.extraInitContainers }} + initContainers: +{{- toYaml .Values.extraInitContainers | nindent 6 }} +{{- end }} + containers: + - name: airbyte-temporal + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- if eq .Values.global.deploymentMode "oss"}} + - name: AUTO_SETUP + value: "true" + - name: DB # The DB engine to use + value: "postgresql" + - name: DYNAMIC_CONFIG_FILE_PATH + value: "config/dynamicconfig/development.yaml" + + {{- include "airbyte.temporal.database.envs" . | nindent 10 }} + + {{- end }} + + {{- if eq .Values.global.database.type "external" }} + # Assume an external database requires SSL. + - name: POSTGRES_TLS_ENABLED + value: "false" + - name: POSTGRES_TLS_DISABLE_HOST_VERIFICATION + value: "false" + - name: SQL_TLS_ENABLED + value: "false" + - name: SQL_TLS_DISABLE_HOST_VERIFICATION + value: "false" + - name: SQL_SSL_MODE + value: "disable" + {{- end }} + + {{- if .Values.extraEnv }} + {{ .Values.extraEnv | toYaml | nindent 10 }} + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: temporal-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + ports: + - containerPort: 7233 + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + - name: airbyte-temporal-dynamicconfig + mountPath: "/etc/temporal/config/dynamicconfig/" + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + exec: + command: + - /bin/sh + - -ec + - 'test $(ps -ef | grep -v grep | grep temporal-server | wc -l) -eq 1' + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + exec: + command: + - /bin/sh + - -ec + - 'test $(ps -ef | grep -v grep | grep temporal-server | wc -l) -eq 1' + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + - name: airbyte-temporal-dynamicconfig + configMap: + name: {{ include "common.names.fullname" . }}-dynamicconfig + items: + - key: development.yaml + path: development.yaml + {{- if .Values.extraVolumes }} + {{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/temporal/templates/secrets.yaml b/airbyte-v1-notused/charts/temporal/templates/secrets.yaml new file mode 100644 index 00000000..f77d1ff1 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: temporal-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/temporal/templates/service.yaml b/airbyte-v1-notused/charts/temporal/templates/service.yaml new file mode 100644 index 00000000..39f13632 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/templates/service.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-temporal + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + protocol: TCP + targetPort: 7233 + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/temporal/values.yaml b/airbyte-v1-notused/charts/temporal/values.yaml new file mode 100644 index 00000000..64f90af2 --- /dev/null +++ b/airbyte-v1-notused/charts/temporal/values.yaml @@ -0,0 +1,193 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + configMapName: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + type: internal + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## temporal.replicaCount The number of temporal replicas to deploy +replicaCount: 1 + +## temporal.image.repository The temporal image repository to use +## temporal.image.pullPolicy The pull policy for the temporal image +## temporal.image.tag The temporal image tag to use +image: + repository: temporalio/auto-setup + pullPolicy: IfNotPresent + tag: "1.23.0" + +## temporal.service.type The Kubernetes Service Type +## temporal.service.port The temporal port and exposed kubernetes port +service: + type: ClusterIP + port: 7233 + +## temporal.podAnnotations [object] Add extra annotations to the temporal pod +## +podAnnotations: {} + +## temporal.podLabels [object] Add extra labels to the temporal pod +## +podLabels: {} + +## temporal.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## temporal.extraInitContainers Additional InitContainers to initialize the pod +## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraInitContainers: +## - name: config-loader +## image: temporalio/auto-setup:1.23 +## command: +## - /bin/sh +## - -c +## - >- +## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; +## volumeMounts: +## - name: config +## mountPath: /config +extraInitContainers: [] + +## Configure extra options for the temporal containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## temporal.livenessProbe.enabled Enable livenessProbe on the temporal +## temporal.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## temporal.livenessProbe.periodSeconds Period seconds for livenessProbe +## temporal.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## temporal.livenessProbe.failureThreshold Failure threshold for livenessProbe +## temporal.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## temporal.readinessProbe.enabled Enable readinessProbe on the temporal +## temporal.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## temporal.readinessProbe.periodSeconds Period seconds for readinessProbe +## temporal.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## temporal.readinessProbe.failureThreshold Failure threshold for readinessProbe +## temporal.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## temporal.nodeSelector [object] Node labels for temporal pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## temporal.tolerations [array] Tolerations for temporal pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## temporal.affinity [object] Affinity and anti-affinity for temporal pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## temporal.extraEnv [array] Additional env vars for temporal pod(s). +## Example: +## +## extraEnv: +## - name: SAMPLE_ENV_VAR +## value: "key=sample-value" +extraEnv: [] + +## temporal.extraVolumeMounts [array] Additional volumeMounts for temporal container(s). +## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## - name: config +## mountPath: /etc/temporal/config +## +extraVolumeMounts: [] + +## temporal.extraVolumes [array] Additional volumes for temporal pod(s). +## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## - name: config +## emptyDir: {} +## +extraVolumes: [] + +## Temporal resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## temporal.resources.limits [object] The resources limits for temporal pod(s) +## temporal.resources.requests [object] The requested resources for temporal pod(s) +resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + +extraContainers: [] + +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default vars for webapp: +# env_vars: + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DB: airbyte-db-svc +# DB_PORT: 5432 +# DATABASE_DB: airbyte +# POSTGRES_USER: airbyte +# POSTGRES_PWD: 12345 + +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/webapp-1.2.0.tgz b/airbyte-v1-notused/charts/webapp-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/webapp-1.2.0.tgz rename to airbyte-v1-notused/charts/webapp-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/webapp/.gitignore b/airbyte-v1-notused/charts/webapp/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/webapp/Chart.yaml b/airbyte-v1-notused/charts/webapp/Chart.yaml new file mode 100644 index 00000000..61c9c6d9 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-webapp +name: webapp +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/webapp/README.md b/airbyte-v1-notused/charts/webapp/README.md new file mode 100644 index 00000000..8becc7c3 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/README.md @@ -0,0 +1,69 @@ +# webapp + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-webapp + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| api.url | string | `"/api/v1/"` | | +| containerSecurityContext | object | `{}` | | +| enabled | bool | `true` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| fullstory.enabled | bool | `false` | | +| global.configMapName | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/webapp"` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts | list | `[]` | | +| ingress.tls | list | `[]` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `30` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `80` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | + diff --git a/airbyte-v1-notused/charts/webapp/templates/_helpers.tpl b/airbyte-v1-notused/charts/webapp/templates/_helpers.tpl new file mode 100644 index 00000000..e3f0d38f --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/templates/_helpers.tpl @@ -0,0 +1,60 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/webapp/templates/_images.tpl b/airbyte-v1-notused/charts/webapp/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/webapp/templates/deployment.yaml b/airbyte-v1-notused/charts/webapp/templates/deployment.yaml new file mode 100644 index 00000000..9fc93770 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/templates/deployment.yaml @@ -0,0 +1,172 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-webapp-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if eq .Values.global.deploymentMode "oss" }} + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: AIRBYTE_SERVER_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_SERVER_HOST + - name: KEYCLOAK_INTERNAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_INTERNAL_HOST + - name: CONNECTOR_BUILDER_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_BUILDER_API_HOST + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: API_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: API_URL + - name: CONNECTOR_BUILDER_API_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_BUILDER_API_URL + {{- end }} + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: webapp-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + tcpSocket: + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /index.html + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + - name: http + containerPort: 8080 + protocol: TCP + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if .Values.extraVolumeMounts }} + {{ toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} + {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if .Values.extraVolumes }} +{{ toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} +{{ toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/webapp/templates/ingress.yaml b/airbyte-v1-notused/charts/webapp/templates/ingress.yaml new file mode 100644 index 00000000..5fef4e02 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/templates/ingress.yaml @@ -0,0 +1,62 @@ +--- +{{ if .Values.ingress.enabled -}} +{{- $fullName := include "airbyte.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $.Release.Name }}-airbyte-webapp-svc + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }}-svc + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/webapp/templates/secrets.yaml b/airbyte-v1-notused/charts/webapp/templates/secrets.yaml new file mode 100644 index 00000000..8ac24955 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: webapp-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/webapp/templates/service.yaml b/airbyte-v1-notused/charts/webapp/templates/service.yaml new file mode 100644 index 00000000..a4ccded3 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/templates/service.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-airbyte-webapp-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + {{ if and (eq .Values.service.type "NodePort") (.Values.service.nodePort) }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} + {{- if .Values.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.service.loadBalancerIP }} + {{- end }} diff --git a/airbyte-v1-notused/charts/webapp/values.yaml b/airbyte-v1-notused/charts/webapp/values.yaml new file mode 100644 index 00000000..aedb5076 --- /dev/null +++ b/airbyte-v1-notused/charts/webapp/values.yaml @@ -0,0 +1,261 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + configMapName: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + +enabled: true +## webapp.replicaCount Number of webapp replicas +replicaCount: 1 + +## webapp.image.repository The repository to use for the airbyte webapp image. +## webapp.image.pullPolicy the pull policy to use for the airbyte webapp image +## webapp.image.tag The airbyte webapp image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/webapp + pullPolicy: IfNotPresent + +## webapp.podAnnotations [object] Add extra annotations to the webapp pod(s) +## +podAnnotations: {} + +## webapp.podLabels [object] Add extra labels to the webapp pod(s) +## +podLabels: {} + +## webapp.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the webapp containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## webapp.livenessProbe.enabled Enable livenessProbe on the webapp +## webapp.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## webapp.livenessProbe.periodSeconds Period seconds for livenessProbe +## webapp.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## webapp.livenessProbe.failureThreshold Failure threshold for livenessProbe +## webapp.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## webapp.readinessProbe.enabled Enable readinessProbe on the webapp +## webapp.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## webapp.readinessProbe.periodSeconds Period seconds for readinessProbe +## webapp.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## webapp.readinessProbe.failureThreshold Failure threshold for readinessProbe +## webapp.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## webapp.service.type The service type to use for the webapp service +## webapp.service.port The service port to expose the webapp on +## webapp.service.annotations Annotations for the webapp service resource +service: + type: ClusterIP + port: 80 + annotations: {} + +## Web app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## webapp.resources.limits [object] The resources limits for the Web container +## webapp.resources.requests [object] The requested resources for the Web container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## webapp.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## webapp.tolerations [array] Tolerations for webapp pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## webapp.affinity [object] Affinity and anti-affinity for webapp pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## Configure the ingress resource that allows you to access the Airbyte installation. +## ref: http://kubernetes.io/docs/user-guide/ingress/ +## webapp.ingress.enabled Set to true to enable ingress record generation +## webapp.ingress.className Specifies ingressClassName for clusters >= 1.18+ +## webapp.ingress.annotations [object] Ingress annotations done as key:value pairs +## webapp.ingress.hosts The list of hostnames to be covered with this ingress record. +## webapp.ingress.tls [array] Custom ingress TLS configuration +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: [] + # - host: chart-example.local + # paths: + # - path: / + # pathType: ImplementationSpecific + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +## webapp.api.url The webapp API url. +api: + url: /api/v1/ + +## webapp.fullstory.enabled Whether or not to enable fullstory +fullstory: + enabled: false + + +## webapp.extraVolumeMounts [array] Additional volumeMounts for webapp container(s). +## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: var-run +## mountPath: /var/run/ +## - name: var-cache-nginx +## mountPath: /var/cache/nginx +## - mountPath: /etc/nginx/conf.d +## name: nginx-conf-d +## +extraVolumeMounts: [] + +## webapp.extraVolumes [array] Additional volumes for webapp pod(s). +## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: var-run +## emptyDir: {} +## - name: var-cache-nginx +## emptyDir: {} +## - name: nginx-conf-d +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: POSTGRES_USER +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_USER +# - name: POSTGRES_PWD +# valueFrom: +# secretKeyRef: +# name: airbyte-secrets +# key: DATABASE_PASSWORD +# - name: DYNAMIC_CONFIG_FILE_PATH +# value: "config/dynamicconfig/development.yaml" +# - name: DB +# value: "postgresql" +# - name: DB_PORT +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_PORT +# - name: POSTGRES_SEEDS +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: DATABASE_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default vars for webapp: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# API_URL: /api/v1/ +# AIRBYTE_SERVER_HOST: airbyte-server-svc:8001 + +env_vars: {} + + + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} diff --git a/helm/airbyte-v1/charts/worker-1.2.0.tgz b/airbyte-v1-notused/charts/worker-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/worker-1.2.0.tgz rename to airbyte-v1-notused/charts/worker-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/worker/.gitignore b/airbyte-v1-notused/charts/worker/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/worker/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/worker/Chart.yaml b/airbyte-v1-notused/charts/worker/Chart.yaml new file mode 100644 index 00000000..7af3b504 --- /dev/null +++ b/airbyte-v1-notused/charts/worker/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-worker +name: worker +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/worker/README.md b/airbyte-v1-notused/charts/worker/README.md new file mode 100644 index 00000000..a9d1b210 --- /dev/null +++ b/airbyte-v1-notused/charts/worker/README.md @@ -0,0 +1,72 @@ +# worker + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-worker + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `true` | | +| env_vars.CONTAINER_ORCHESTRATOR_ENABLED | bool | `true` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.edition | string | `"community"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.jobs.kube.annotations | object | `{}` | | +| global.jobs.kube.images.busybox | string | `""` | | +| global.jobs.kube.images.curl | string | `""` | | +| global.jobs.kube.labels | object | `{}` | | +| global.jobs.kube.main_container_image_pull_secret | string | `""` | | +| global.jobs.kube.nodeSelector | object | `{}` | | +| global.jobs.kube.tolerations | list | `[]` | | +| global.jobs.resources.limits | object | `{}` | | +| global.jobs.resources.requests | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/worker"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `50` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/airbyte-v1-notused/charts/worker/templates/_helpers.tpl b/airbyte-v1-notused/charts/worker/templates/_helpers.tpl new file mode 100644 index 00000000..b8ac92f8 --- /dev/null +++ b/airbyte-v1-notused/charts/worker/templates/_helpers.tpl @@ -0,0 +1,242 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/worker/templates/_images.tpl b/airbyte-v1-notused/charts/worker/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/worker/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/worker/templates/deployment.yaml b/airbyte-v1-notused/charts/worker/templates/deployment.yaml new file mode 100644 index 00000000..ad46daeb --- /dev/null +++ b/airbyte-v1-notused/charts/worker/templates/deployment.yaml @@ -0,0 +1,500 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-worker-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: CONFIG_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIG_ROOT + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: CONTAINER_ORCHESTRATOR_SECRET_MOUNT_PATH + value: "/secrets/gcs-log-creds" + - name: CONTAINER_ORCHESTRATOR_SECRET_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + {{- end }} + {{- include "airbyte.logging.envs" . | nindent 8 }} + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKSPACE_DOCKER_MOUNT + value: workspace + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: TEMPORAL_WORKER_PORTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_WORKER_PORTS + - name: JOB_KUBE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: JOB_KUBE_SERVICEACCOUNT + value: {{ .Values.global.serviceAccountName }} + {{- if $.Values.global.jobs.kube.annotations }} + - name: JOB_KUBE_ANNOTATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_ANNOTATIONS + {{- end }} + {{- if $.Values.global.jobs.kube.labels }} + - name: JOB_KUBE_LABELS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_LABELS + {{- end }} + {{- if $.Values.global.jobs.kube.nodeSelector }} + - name: JOB_KUBE_NODE_SELECTORS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_NODE_SELECTORS + {{- end }} + {{- if $.Values.global.jobs.kube.tolerations }} + - name: JOB_KUBE_TOLERATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_TOLERATIONS + {{- end }} + - name: JOB_KUBE_BUSYBOX_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_BUSYBOX_IMAGE + - name: JOB_KUBE_CURL_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_CURL_IMAGE + {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} + - name: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + {{- end }} + - name: JOB_MAIN_CONTAINER_CPU_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_REQUEST + - name: JOB_MAIN_CONTAINER_CPU_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_LIMIT + - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_REQUEST + - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_LIMIT + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: WORKLOAD_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_API_HOST + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: METRIC_CLIENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: METRIC_CLIENT + - name: OTEL_COLLECTOR_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OTEL_COLLECTOR_ENDPOINT + - name: ACTIVITY_MAX_ATTEMPT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_ATTEMPT + - name: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + - name: SHOULD_RUN_NOTIFY_WORKFLOWS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SHOULD_RUN_NOTIFY_WORKFLOWS + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKERS_MICRONAUT_ENVIRONMENTS + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just + # splitting into two separate blocks for readability. + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- end }} + # SECRETS MANAGER + - name: SECRET_PERSISTENCE + value: {{ include "airbyte.secretPersistence" . }} + # Values for awsSecretManager + {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} + - name: AWS_SECRET_MANAGER_REGION + value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} + {{- end }} + + {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} + - name: AWS_SECRET_MANAGER_SECRET_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} + - name: AWS_KMS_KEY_ARN + value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} + {{- end }} + + # Values for Azure Key Vault + {{- if (((.Values.global).secretsManager).azureKeyVault) }} + + - name: AB_AZURE_KEY_VAULT_VAULT_URL + value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} + + - name: AB_AZURE_KEY_VAULT_TENANT_ID + value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + {{- end }} + + {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} + - name: AB_AZURE_KEY_VAULT_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} + {{- end }} + + # Values for googleSecretManager secrets + {{- if (((.Values.global).secretsManager).googleSecretManager) }} + - name: SECRET_STORE_GCP_PROJECT_ID + value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} + - name: SECRET_STORE_GCP_CREDENTIALS + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + {{- end }} + + # Values for vault secrets + {{- if (((.Values.global).secretsManager).vault) }} + - name: VAULT_ADDRESS + value: {{ (((.Values.global).secretsManager).vault).address }} + - name: VAULT_PREFIX + value: {{ (((.Values.global).secretsManager).vault).prefix }} + - name: VAULT_AUTH_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + {{- end }} + + # Storage + {{- include "airbyte.storage.envs" . | nindent 8 }} + + # Database + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: worker-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compatibility (if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: / + port: heartbeat + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: / + port: heartbeat + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + - name: heartbeat + containerPort: 9000 # for heartbeat server + - containerPort: 9001 # start temporal worker port pool + - containerPort: 9002 + - containerPort: 9003 + - containerPort: 9004 + - containerPort: 9005 + - containerPort: 9006 + - containerPort: 9007 + - containerPort: 9008 + - containerPort: 9009 + - containerPort: 9010 + - containerPort: 9011 + - containerPort: 9012 + - containerPort: 9013 + - containerPort: 9014 + - containerPort: 9015 + - containerPort: 9016 + - containerPort: 9017 + - containerPort: 9018 + - containerPort: 9019 + - containerPort: 9020 + - containerPort: 9021 + - containerPort: 9022 + - containerPort: 9023 + - containerPort: 9024 + - containerPort: 9025 + - containerPort: 9026 + - containerPort: 9027 + - containerPort: 9028 + - containerPort: 9029 + - containerPort: 9030 # end temporal worker port pool + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + mountPath: /storage + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} +{{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} +{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + persistentVolumeClaim: + claimName: airbyte-storage-pvc + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + {{- if .Values.extraVolumes }} +{{- toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} +{{- toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/worker/templates/secrets.yaml b/airbyte-v1-notused/charts/worker/templates/secrets.yaml new file mode 100644 index 00000000..93bb0c63 --- /dev/null +++ b/airbyte-v1-notused/charts/worker/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: worker-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/worker/values.yaml b/airbyte-v1-notused/charts/worker/values.yaml new file mode 100644 index 00000000..b05d279e --- /dev/null +++ b/airbyte-v1-notused/charts/worker/values.yaml @@ -0,0 +1,294 @@ +global: + serviceAccountName: &service-account-name "airbyte-admin" + edition: community + credVolumeOverride: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + storage: + type: minio + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + jobs: + ## Jobs resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## jobs.resources.limits [object] The resources limits for jobs + ## jobs.resources.requests [object] The requested resources for jobs + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + + kube: + ## JOB_KUBE_ANNOTATIONS + ## pod annotations of the sync job and the default pod annotations fallback for others jobs + ## jobs.kube.annotations [object] key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + ## jobs.kube.labels [object] key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## any boolean values should be quoted to ensure the value is passed through as a string, eg: + ## - key: airbyte-server + ## operator: Equal + ## value: "true" + ## effect: NoSchedule + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + ## image pull secret to use for job pod + ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod + main_container_image_pull_secret: "" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + ## busybox image used by the job pod + ## jobs.kube.images.busybox [string] busybox image used by the job pod + busybox: "" + ## JOB_KUBE_CURL_IMAGE + ## curl image used by the job pod + ## jobs.kube.images.curl [string] curl image used by the job pod + curl: "" + +enabled: true +## worker.replicaCount Number of worker replicas +replicaCount: 1 + +## worker.image.repository The repository to use for the airbyte worker image. +## worker.image.pullPolicy the pull policy to use for the airbyte worker image +## worker.image.tag The airbyte worker image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/worker + pullPolicy: IfNotPresent + +## worker.podAnnotations [object] Add extra annotations to the worker pod(s) +## +podAnnotations: {} + +## worker.podLabels [object] Add extra labels to the worker pod(s) +## +podLabels: {} + +## worker.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the worker containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## worker.livenessProbe.enabled Enable livenessProbe on the worker +## worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## worker.livenessProbe.periodSeconds Period seconds for livenessProbe +## worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## worker.livenessProbe.failureThreshold Failure threshold for livenessProbe +## worker.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 50 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## worker.readinessProbe.enabled Enable readinessProbe on the worker +## worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## worker.readinessProbe.periodSeconds Period seconds for readinessProbe +## worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## worker.readinessProbe.failureThreshold Failure threshold for readinessProbe +## worker.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## worker resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## worker.resources.limits [object] The resources limits for the worker container +## worker.resources.requests [object] The requested resources for the worker container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## worker.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## worker.tolerations [array] Tolerations for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## worker.affinity [object] Affinity and anti-affinity for worker pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## worker.log.level The log level to log at. +log: + level: "INFO" + + + +## worker.extraVolumeMounts [array] Additional volumeMounts for worker container(s). +## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## worker.extraVolumes [array] Additional volumes for worker pod(s). +## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +# - name: API_URL +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: API_URL +# - name: TRACKING_STRATEGY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: TRACKING_STRATEGY +# - name: FULLSTORY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: FULLSTORY +# - name: INTERNAL_API_HOST +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: INTERNAL_API_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default values for worker: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# DATABASE_DB: airbyte +# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 +# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 +env_vars: + CONTAINER_ORCHESTRATOR_ENABLED: true + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz b/airbyte-v1-notused/charts/workload-api-server-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz rename to airbyte-v1-notused/charts/workload-api-server-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/workload-api-server/.gitignore b/airbyte-v1-notused/charts/workload-api-server/.gitignore new file mode 100644 index 00000000..88e91e8a --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/.gitignore @@ -0,0 +1,2 @@ +# Charts are downloaded at install time with `helm dep build`. +charts diff --git a/airbyte-v1-notused/charts/workload-api-server/Chart.yaml b/airbyte-v1-notused/charts/workload-api-server/Chart.yaml new file mode 100644 index 00000000..f63ba3ff --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy the workload-api service +name: workload-api-server +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/workload-api-server/README.md b/airbyte-v1-notused/charts/workload-api-server/README.md new file mode 100644 index 00000000..7c1e72e6 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/README.md @@ -0,0 +1,85 @@ +# workload-api-server + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy the workload-api service + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `false` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.configMapName | string | `""` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.deploymentMode | string | `"oss"` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.logs.accessKey.existingSecret | string | `""` | | +| global.logs.accessKey.existingSecretKey | string | `""` | | +| global.logs.accessKey.password | string | `"minio"` | | +| global.logs.gcs.bucket | string | `""` | | +| global.logs.gcs.credentials | string | `""` | | +| global.logs.gcs.credentialsJson | string | `""` | | +| global.logs.minio.enabled | bool | `true` | | +| global.logs.s3.bucket | string | `"airbyte-dev-logs"` | | +| global.logs.s3.bucketRegion | string | `""` | | +| global.logs.s3.enabled | bool | `false` | | +| global.logs.secretKey.existingSecret | string | `""` | | +| global.logs.secretKey.existingSecretKey | string | `""` | | +| global.logs.secretKey.password | string | `"minio123"` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"placeholderServiceAccount"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/workload-api-server"` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts | list | `[]` | | +| ingress.tls | list | `[]` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `60` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `30` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| service.annotations | object | `{}` | | +| service.port | int | `8007` | | +| service.type | string | `"ClusterIP"` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl b/airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl new file mode 100644 index 00000000..847ec7b4 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl @@ -0,0 +1,59 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Define db secret +*/}} + +{{- define "database.secret.name" -}} +{{- printf "%s-postgresql" .Release.Name }} +{{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl b/airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml b/airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml new file mode 100644 index 00000000..9eb4fcdd --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml @@ -0,0 +1,208 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + minReadySeconds: 30 + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 0 + maxSurge: 100% + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-workload-api-server-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end }} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: AIRBYTE_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_API_HOST + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + # Database + {{- include "airbyte.database.envs" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: workload-api-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /health/liveness + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /health/liveness + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + + ports: + - name: http + containerPort: 8007 + protocol: TCP + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} +{{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} +{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 8 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + {{- if .Values.extraVolumes }} + {{- toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} + {{- toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml b/airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml new file mode 100644 index 00000000..03e6f309 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment + {{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: workload-api-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/service.yaml b/airbyte-v1-notused/charts/workload-api-server/templates/service.yaml new file mode 100644 index 00000000..7319b2e2 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/templates/service.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{.Release.Name }}-workload-api-server-svc + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "airbyte.selectorLabels" . | nindent 4 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/values.yaml b/airbyte-v1-notused/charts/workload-api-server/values.yaml new file mode 100644 index 00000000..2c378abc --- /dev/null +++ b/airbyte-v1-notused/charts/workload-api-server/values.yaml @@ -0,0 +1,281 @@ +global: + serviceAccountName: placeholderServiceAccount + deploymentMode: oss + edition: community + configMapName: "" + secretName: "" + credVolumeOverride: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + logs: + ## logs.accessKey.password Logs Access Key + ## logs.accessKey.existingSecret + ## logs.accessKey.existingSecretKey + accessKey: + password: minio + existingSecret: "" + existingSecretKey: "" + ## logs.secretKey.password Logs Secret Key + ## logs.secretKey.existingSecret + ## logs.secretKey.existingSecretKey + secretKey: + password: minio123 + existingSecret: "" + existingSecretKey: "" + + ## logs.minio.enabled Switch to enable or disable the Minio helm chart + minio: + enabled: true + + ## logs.s3.enabled Switch to enable or disable custom S3 Log location + ## logs.s3.bucket Bucket name where logs should be stored + ## logs.s3.bucketRegion Region of the bucket (must be empty if using minio) + s3: + enabled: false + bucket: airbyte-dev-logs + bucketRegion: "" + + ## Google Cloud Storage (GCS) Log Location Configuration + ## logs.gcs.bucket GCS bucket name + ## logs.gcs.credentials The path the GCS creds are written to + ## logs.gcs.credentialsJson Base64 encoded json GCP credentials file contents + gcs: + bucket: "" + # If you are mounting an existing secret to extraVolumes on scheduler, server and worker + # deployments, then set credentials to the path of the mounted JSON file + credentials: "" + # If credentialsJson is set then credentials auto resolves (to /secrets/gcs-log-creds/gcp.json) + credentialsJson: "" + +enabled: true +## replicaCount Number of server replicas +replicaCount: 1 + +## image.repository The repository to use for the airbyte workload api server image. +## image.pullPolicy the pull policy to use for the airbyte workload api server image +## image.tag The airbyte workload api server image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/workload-api-server + pullPolicy: IfNotPresent + +## podAnnotations [object] Add extra annotations to the server pod +## +podAnnotations: {} + +## podLabels [object] Add extra labels to the server pod +## +podLabels: {} + +## containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the server containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## livenessProbe.enabled Enable livenessProbe on the server +## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## livenessProbe.periodSeconds Period seconds for livenessProbe +## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## livenessProbe.failureThreshold Failure threshold for livenessProbe +## livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## readinessProbe.enabled Enable readinessProbe on the server +## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## readinessProbe.periodSeconds Period seconds for readinessProbe +## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## readinessProbe.failureThreshold Failure threshold for readinessProbe +## readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## Server app resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## resources.limits [object] The resources limits for the server container +## resources.requests [object] The requested resources for the server container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## service.type The service type to use for the API server +## service.port The service port to expose the API server on +service: + type: ClusterIP + port: 8007 + annotations: {} + +## nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## tolerations [array] Tolerations for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## affinity [object] Affinity and anti-affinity for server pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## Configure the ingress resource that allows you to access the Airbyte API. +## ref: http://kubernetes.io/docs/user-guide/ingress/ +## webapp.ingress.enabled Set to true to enable ingress record generation +## webapp.ingress.className Specifies ingressClassName for clusters >= 1.18+ +## webapp.ingress.annotations [object] Ingress annotations done as key:value pairs +## webapp.ingress.hosts The list of hostnames to be covered with this ingress record. +## webapp.ingress.tls [array] Custom ingress TLS configuration +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: [] + # - host: chart-example.local + # paths: + # - path: / + # pathType: ImplementationSpecific + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +## log.level The log level to log at +log: + level: "INFO" + +## extraVolumeMounts [array] Additional volumeMounts for server container(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## extraVolumes [array] Additional volumes for server pod(s). +## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db +# DATABASE_HOST: airbyte-db-svc +# DATABASE_PORT: 5432 +# DATABASE_DB: airbyte +# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} +# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte +# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 +# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 +env_vars: {} + + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz b/airbyte-v1-notused/charts/workload-launcher-1.2.0.tgz similarity index 100% rename from helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz rename to airbyte-v1-notused/charts/workload-launcher-1.2.0.tgz diff --git a/airbyte-v1-notused/charts/workload-launcher/.helmignore b/airbyte-v1-notused/charts/workload-launcher/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/airbyte-v1-notused/charts/workload-launcher/Chart.yaml b/airbyte-v1-notused/charts/workload-launcher/Chart.yaml new file mode 100644 index 00000000..3f26dadb --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 1.2.0 +description: Helm chart to deploy airbyte-workload-launcher +name: workload-launcher +type: application +version: 1.2.0 diff --git a/airbyte-v1-notused/charts/workload-launcher/README.md b/airbyte-v1-notused/charts/workload-launcher/README.md new file mode 100644 index 00000000..d636166f --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/README.md @@ -0,0 +1,71 @@ +# workload-launcher + +![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) + +Helm chart to deploy airbyte-workload-launcher + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | common | 1.x.x | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| containerSecurityContext | object | `{}` | | +| debug.enabled | bool | `false` | | +| debug.remoteDebugPort | int | `5005` | | +| enabled | bool | `false` | | +| env_vars | object | `{}` | | +| extraContainers | list | `[]` | | +| extraEnv | list | `[]` | | +| extraInitContainers | list | `[]` | | +| extraLabels | object | `{}` | | +| extraSelectorLabels | object | `{}` | | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| global.credVolumeOverride | string | `""` | | +| global.database.secretName | string | `""` | | +| global.database.secretValue | string | `""` | | +| global.extraContainers | list | `[]` | | +| global.extraLabels | object | `{}` | | +| global.extraSelectorLabels | object | `{}` | | +| global.jobs.kube.annotations | object | `{}` | | +| global.jobs.kube.images.busybox | string | `""` | | +| global.jobs.kube.images.curl | string | `""` | | +| global.jobs.kube.labels | object | `{}` | | +| global.jobs.kube.main_container_image_pull_secret | string | `""` | | +| global.jobs.kube.nodeSelector | object | `{}` | | +| global.jobs.kube.tolerations | list | `[]` | | +| global.jobs.resources.limits | object | `{}` | | +| global.jobs.resources.requests | object | `{}` | | +| global.secretName | string | `""` | | +| global.serviceAccountName | string | `"airbyte-admin"` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"airbyte/workload-launcher"` | | +| livenessProbe.enabled | bool | `true` | | +| livenessProbe.failureThreshold | int | `3` | | +| livenessProbe.initialDelaySeconds | int | `50` | | +| livenessProbe.periodSeconds | int | `10` | | +| livenessProbe.successThreshold | int | `1` | | +| livenessProbe.timeoutSeconds | int | `1` | | +| log.level | string | `"INFO"` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| readinessProbe.enabled | bool | `true` | | +| readinessProbe.failureThreshold | int | `3` | | +| readinessProbe.initialDelaySeconds | int | `10` | | +| readinessProbe.periodSeconds | int | `10` | | +| readinessProbe.successThreshold | int | `1` | | +| readinessProbe.timeoutSeconds | int | `1` | | +| replicaCount | int | `1` | | +| resources.limits | object | `{}` | | +| resources.requests | object | `{}` | | +| secrets | object | `{}` | | +| tolerations | list | `[]` | | +| workloadApi | object | `{}` | | + diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore b/airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore new file mode 100644 index 00000000..50af0317 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore @@ -0,0 +1,22 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml b/airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml new file mode 100644 index 00000000..39edbb3c --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + category: Infrastructure +apiVersion: v2 +appVersion: 1.17.1 +description: A Library Helm Chart for grouping common logic between bitnami charts. + This chart is not deployable by itself. +home: https://github.com/bitnami/charts/tree/master/bitnami/common +icon: https://bitnami.com/downloads/logos/bitnami-mark.png +keywords: +- common +- helper +- template +- function +- bitnami +maintainers: +- name: Bitnami + url: https://github.com/bitnami/charts +name: common +sources: +- https://github.com/bitnami/charts +- https://www.bitnami.com/ +type: library +version: 1.17.1 diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/README.md b/airbyte-v1-notused/charts/workload-launcher/charts/common/README.md new file mode 100644 index 00000000..a2ecd604 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/README.md @@ -0,0 +1,350 @@ +# Bitnami Common Library Chart + +A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. + +## TL;DR + +```yaml +dependencies: + - name: common + version: 1.x.x + repository: https://charts.bitnami.com/bitnami +``` + +```bash +$ helm dependency update +``` + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "common.names.fullname" . }} +data: + myvalue: "Hello World" +``` + +## Introduction + +This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. + +Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ + +## Parameters + +The following table lists the helpers available in the library which are scoped in different sections. + +### Affinities + +| Helper identifier | Description | Expected Input | +|-------------------------------|------------------------------------------------------|------------------------------------------------| +| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | +| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | +| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | + +### Capabilities + +| Helper identifier | Description | Expected Input | +|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| +| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | +| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | +| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | +| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | +| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | +| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | +| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | +| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | +| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | +| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | +| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | +| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | + +### Errors + +| Helper identifier | Description | Expected Input | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | + +### Images + +| Helper identifier | Description | Expected Input | +|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | +| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | +| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | + +### Ingress + +| Helper identifier | Description | Expected Input | +|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | +| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | +| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | +| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | + +### Labels + +| Helper identifier | Description | Expected Input | +|-----------------------------|-----------------------------------------------------------------------------|-------------------| +| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | +| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | + +### Names + +| Helper identifier | Description | Expected Input | +|-----------------------------------|-----------------------------------------------------------------------|-------------------| +| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | +| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | +| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | +| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | +| `common.names.chart` | Chart name plus version | `.` Chart context | + +### Secrets + +| Helper identifier | Description | Expected Input | +|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | +| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | +| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | +| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | + +### Storage + +| Helper identifier | Description | Expected Input | +|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | + +### TplValues + +| Helper identifier | Description | Expected Input | +|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | + +### Utils + +| Helper identifier | Description | Expected Input | +|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| +| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | +| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | +| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | +| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | + +### Validations + +| Helper identifier | Description | Expected Input | +|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | +| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | +| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | +| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | +| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | +| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | +| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | +| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | + +### Warnings + +| Helper identifier | Description | Expected Input | +|------------------------------|----------------------------------|------------------------------------------------------------| +| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | + +## Special input schemas + +### ImageRoot + +```yaml +registry: + type: string + description: Docker registry where the image is located + example: docker.io + +repository: + type: string + description: Repository and image name + example: bitnami/nginx + +tag: + type: string + description: image tag + example: 1.16.1-debian-10-r63 + +pullPolicy: + type: string + description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + +pullSecrets: + type: array + items: + type: string + description: Optionally specify an array of imagePullSecrets (evaluated as templates). + +debug: + type: boolean + description: Set to true if you would like to see extra information on logs + example: false + +## An instance would be: +# registry: docker.io +# repository: bitnami/nginx +# tag: 1.16.1-debian-10-r63 +# pullPolicy: IfNotPresent +# debug: false +``` + +### Persistence + +```yaml +enabled: + type: boolean + description: Whether enable persistence. + example: true + +storageClass: + type: string + description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. + example: "-" + +accessMode: + type: string + description: Access mode for the Persistent Volume Storage. + example: ReadWriteOnce + +size: + type: string + description: Size the Persistent Volume Storage. + example: 8Gi + +path: + type: string + description: Path to be persisted. + example: /bitnami + +## An instance would be: +# enabled: true +# storageClass: "-" +# accessMode: ReadWriteOnce +# size: 8Gi +# path: /bitnami +``` + +### ExistingSecret + +```yaml +name: + type: string + description: Name of the existing secret. + example: mySecret +keyMapping: + description: Mapping between the expected key name and the name of the key in the existing secret. + type: object + +## An instance would be: +# name: mySecret +# keyMapping: +# password: myPasswordKey +``` + +#### Example of use + +When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. + +```yaml +# templates/secret.yaml +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "common.names.fullname" . }} + labels: + app: {{ include "common.names.fullname" . }} +type: Opaque +data: + password: {{ .Values.password | b64enc | quote }} + +# templates/dpl.yaml +--- +... + env: + - name: PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} + key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} +... + +# values.yaml +--- +name: mySecret +keyMapping: + password: myPasswordKey +``` + +### ValidateValue + +#### NOTES.txt + +```console +{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} + +{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} +``` + +If we force those values to be empty we will see some alerts + +```console +$ helm install test mychart --set path.to.value00="",path.to.value01="" + 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: + + export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) + + 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: + + export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) +``` + +## Upgrading + +### To 1.0.0 + +[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. + +**What changes were introduced in this major version?** + +- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. +- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. +- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts + +**Considerations when upgrading to this version** + +- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues +- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore +- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 + +**Useful links** + +- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ +- https://helm.sh/docs/topics/v2_v3_migration/ +- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ + +## License + +Copyright © 2022 Bitnami + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl new file mode 100644 index 00000000..2387be26 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl @@ -0,0 +1,102 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return a soft nodeAffinity definition +{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.soft" -}} +preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} + weight: 1 +{{- end -}} + +{{/* +Return a hard nodeAffinity definition +{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes.hard" -}} +requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: {{ .key }} + operator: In + values: + {{- range .values }} + - {{ . | quote }} + {{- end }} +{{- end -}} + +{{/* +Return a nodeAffinity definition +{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.nodes" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.nodes.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.nodes.hard" . -}} + {{- end -}} +{{- end -}} + +{{/* +Return a soft podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.soft" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname + weight: 1 +{{- end -}} + +{{/* +Return a hard podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} +*/}} +{{- define "common.affinities.pods.hard" -}} +{{- $component := default "" .component -}} +{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} +requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} + {{- if not (empty $component) }} + {{ printf "app.kubernetes.io/component: %s" $component }} + {{- end }} + {{- range $key, $value := $extraMatchLabels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + namespaces: + - {{ include "common.names.namespace" .context | quote }} + topologyKey: kubernetes.io/hostname +{{- end -}} + +{{/* +Return a podAffinity/podAntiAffinity definition +{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} +*/}} +{{- define "common.affinities.pods" -}} + {{- if eq .type "soft" }} + {{- include "common.affinities.pods.soft" . -}} + {{- else if eq .type "hard" }} + {{- include "common.affinities.pods.hard" . -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl new file mode 100644 index 00000000..9d9b7600 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl @@ -0,0 +1,154 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Return the target Kubernetes version +*/}} +{{- define "common.capabilities.kubeVersion" -}} +{{- if .Values.global }} + {{- if .Values.global.kubeVersion }} + {{- .Values.global.kubeVersion -}} + {{- else }} + {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} + {{- end -}} +{{- else }} +{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for poddisruptionbudget. +*/}} +{{- define "common.capabilities.policy.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "policy/v1beta1" -}} +{{- else -}} +{{- print "policy/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for networkpolicy. +*/}} +{{- define "common.capabilities.networkPolicy.apiVersion" -}} +{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for cronjob. +*/}} +{{- define "common.capabilities.cronjob.apiVersion" -}} +{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "batch/v1beta1" -}} +{{- else -}} +{{- print "batch/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for deployment. +*/}} +{{- define "common.capabilities.deployment.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for statefulset. +*/}} +{{- define "common.capabilities.statefulset.apiVersion" -}} +{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apps/v1beta1" -}} +{{- else -}} +{{- print "apps/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for ingress. +*/}} +{{- define "common.capabilities.ingress.apiVersion" -}} +{{- if .Values.ingress -}} +{{- if .Values.ingress.apiVersion -}} +{{- .Values.ingress.apiVersion -}} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end }} +{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "extensions/v1beta1" -}} +{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "networking.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "networking.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for RBAC resources. +*/}} +{{- define "common.capabilities.rbac.apiVersion" -}} +{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "rbac.authorization.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "rbac.authorization.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for CRDs. +*/}} +{{- define "common.capabilities.crd.apiVersion" -}} +{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiextensions.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiextensions.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for APIService. +*/}} +{{- define "common.capabilities.apiService.apiVersion" -}} +{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "apiregistration.k8s.io/v1beta1" -}} +{{- else -}} +{{- print "apiregistration.k8s.io/v1" -}} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiVersion for Horizontal Pod Autoscaler. +*/}} +{{- define "common.capabilities.hpa.apiVersion" -}} +{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} +{{- if .beta2 -}} +{{- print "autoscaling/v2beta2" -}} +{{- else -}} +{{- print "autoscaling/v2beta1" -}} +{{- end -}} +{{- else -}} +{{- print "autoscaling/v2" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the used Helm version is 3.3+. +A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. +This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. +**To be removed when the catalog's minimun Helm version is 3.3** +*/}} +{{- define "common.capabilities.supportsHelmVersion" -}} +{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl new file mode 100644 index 00000000..a79cc2e3 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Through error when upgrading using empty passwords values that must not be empty. + +Usage: +{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} +{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} +{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} + +Required password params: + - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. + - context - Context - Required. Parent context. +*/}} +{{- define "common.errors.upgrade.passwords.empty" -}} + {{- $validationErrors := join "" .validationErrors -}} + {{- if and $validationErrors .context.Release.IsUpgrade -}} + {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} + {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} + {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} + {{- $errorString = print $errorString "\n%s" -}} + {{- printf $errorString $validationErrors | fail -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl new file mode 100644 index 00000000..42ffbc72 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper image name +{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} +*/}} +{{- define "common.images.image" -}} +{{- $registryName := .imageRoot.registry -}} +{{- $repositoryName := .imageRoot.repository -}} +{{- $tag := .imageRoot.tag | toString -}} +{{- if .global }} + {{- if .global.imageRegistry }} + {{- $registryName = .global.imageRegistry -}} + {{- end -}} +{{- end -}} +{{- if $registryName }} +{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} +{{- else -}} +{{- printf "%s:%s" $repositoryName $tag -}} +{{- end -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) +{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} +*/}} +{{- define "common.images.pullSecrets" -}} + {{- $pullSecrets := list }} + + {{- if .global }} + {{- range .global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets . -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names evaluating values as templates +{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} +*/}} +{{- define "common.images.renderPullSecrets" -}} + {{- $pullSecrets := list }} + {{- $context := .context }} + + {{- if $context.Values.global }} + {{- range $context.Values.global.imagePullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- range .images -}} + {{- range .pullSecrets -}} + {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} + {{- end -}} + {{- end -}} + + {{- if (not (empty $pullSecrets)) }} +imagePullSecrets: + {{- range $pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl new file mode 100644 index 00000000..8caf73a6 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl @@ -0,0 +1,68 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Generate backend entry that is compatible with all Kubernetes API versions. + +Usage: +{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} + +Params: + - serviceName - String. Name of an existing service backend + - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.ingress.backend" -}} +{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} +{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} +serviceName: {{ .serviceName }} +servicePort: {{ .servicePort }} +{{- else -}} +service: + name: {{ .serviceName }} + port: + {{- if typeIs "string" .servicePort }} + name: {{ .servicePort }} + {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} + number: {{ .servicePort | int }} + {{- end }} +{{- end -}} +{{- end -}} + +{{/* +Print "true" if the API pathType field is supported +Usage: +{{ include "common.ingress.supportsPathType" . }} +*/}} +{{- define "common.ingress.supportsPathType" -}} +{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Returns true if the ingressClassname field is supported +Usage: +{{ include "common.ingress.supportsIngressClassname" . }} +*/}} +{{- define "common.ingress.supportsIngressClassname" -}} +{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if cert-manager required annotations for TLS signed +certificates are set in the Ingress annotations +Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations +Usage: +{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} +*/}} +{{- define "common.ingress.certManagerRequest" -}} +{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl new file mode 100644 index 00000000..252066c7 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl @@ -0,0 +1,18 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Kubernetes standard labels +*/}} +{{- define "common.labels.standard" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +helm.sh/chart: {{ include "common.names.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector +*/}} +{{- define "common.labels.matchLabels" -}} +app.kubernetes.io/name: {{ include "common.names.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl new file mode 100644 index 00000000..1bdac8b7 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl @@ -0,0 +1,70 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "common.names.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "common.names.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "common.names.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified dependency name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Usage: +{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} +*/}} +{{- define "common.names.dependency.fullname" -}} +{{- if .chartValues.fullnameOverride -}} +{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .chartName .chartValues.nameOverride -}} +{{- if contains $name .context.Release.Name -}} +{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts. +*/}} +{{- define "common.names.namespace" -}} +{{- if .Values.namespaceOverride -}} +{{- .Values.namespaceOverride -}} +{{- else -}} +{{- .Release.Namespace -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified app name adding the installation's namespace. +*/}} +{{- define "common.names.fullname.namespace" -}} +{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl new file mode 100644 index 00000000..a53fb44f --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl @@ -0,0 +1,140 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Generate secret name. + +Usage: +{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. + - context - Dict - Required. The context for the template evaluation. +*/}} +{{- define "common.secrets.name" -}} +{{- $name := (include "common.names.fullname" .context) -}} + +{{- if .defaultNameSuffix -}} +{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- with .existingSecret -}} +{{- if not (typeIs "string" .) -}} +{{- with .name -}} +{{- $name = . -}} +{{- end -}} +{{- else -}} +{{- $name = . -}} +{{- end -}} +{{- end -}} + +{{- printf "%s" $name -}} +{{- end -}} + +{{/* +Generate secret key. + +Usage: +{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} + +Params: + - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user + to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. + +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret + - key - String - Required. Name of the key in the secret. +*/}} +{{- define "common.secrets.key" -}} +{{- $key := .key -}} + +{{- if .existingSecret -}} + {{- if not (typeIs "string" .existingSecret) -}} + {{- if .existingSecret.keyMapping -}} + {{- $key = index .existingSecret.keyMapping $.key -}} + {{- end -}} + {{- end }} +{{- end -}} + +{{- printf "%s" $key -}} +{{- end -}} + +{{/* +Generate secret password or retrieve one if already created. + +Usage: +{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - key - String - Required - Name of the key in the secret. + - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. + - length - int - Optional - Length of the generated random password. + - strong - Boolean - Optional - Whether to add symbols to the generated random password. + - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. + - context - Context - Required - Parent context. + +The order in which this function returns a secret password: + 1. Already existing 'Secret' resource + (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) + 2. Password provided via the values.yaml + (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) + 3. Randomly generated secret password + (A new random secret password with the length specified in the 'length' parameter will be generated and returned) + +*/}} +{{- define "common.secrets.passwords.manage" -}} + +{{- $password := "" }} +{{- $subchart := "" }} +{{- $chartName := default "" .chartName }} +{{- $passwordLength := default 10 .length }} +{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} +{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} +{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} +{{- if $secretData }} + {{- if hasKey $secretData .key }} + {{- $password = index $secretData .key }} + {{- else }} + {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} + {{- end -}} +{{- else if $providedPasswordValue }} + {{- $password = $providedPasswordValue | toString | b64enc | quote }} +{{- else }} + + {{- if .context.Values.enabled }} + {{- $subchart = $chartName }} + {{- end -}} + + {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} + {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} + {{- $passwordValidationErrors := list $requiredPasswordError -}} + {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} + + {{- if .strong }} + {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} + {{- $password = randAscii $passwordLength }} + {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} + {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} + {{- else }} + {{- $password = randAlphaNum $passwordLength | b64enc | quote }} + {{- end }} +{{- end -}} +{{- printf "%s" $password -}} +{{- end -}} + +{{/* +Returns whether a previous generated secret already exists + +Usage: +{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} + +Params: + - secret - String - Required - Name of the 'Secret' resource where the password is stored. + - context - Context - Required - Parent context. +*/}} +{{- define "common.secrets.exists" -}} +{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} +{{- if $secret }} + {{- true -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl new file mode 100644 index 00000000..60e2a844 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl @@ -0,0 +1,23 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Return the proper Storage Class +{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} +*/}} +{{- define "common.storage.class" -}} + +{{- $storageClass := .persistence.storageClass -}} +{{- if .global -}} + {{- if .global.storageClass -}} + {{- $storageClass = .global.storageClass -}} + {{- end -}} +{{- end -}} + +{{- if $storageClass -}} + {{- if (eq "-" $storageClass) -}} + {{- printf "storageClassName: \"\"" -}} + {{- else }} + {{- printf "storageClassName: %s" $storageClass -}} + {{- end -}} +{{- end -}} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl new file mode 100644 index 00000000..2db16685 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl @@ -0,0 +1,13 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Renders a value that contains template. +Usage: +{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} +*/}} +{{- define "common.tplvalues.render" -}} + {{- if typeIs "string" .value }} + {{- tpl .value .context }} + {{- else }} + {{- tpl (.value | toYaml) .context }} + {{- end }} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl new file mode 100644 index 00000000..8c22b2a3 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Print instructions to get a secret value. +Usage: +{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} +*/}} +{{- define "common.utils.secret.getvalue" -}} +{{- $varname := include "common.utils.fieldToEnvVar" . -}} +export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) +{{- end -}} + +{{/* +Build env var name given a field +Usage: +{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} +*/}} +{{- define "common.utils.fieldToEnvVar" -}} + {{- $fieldNameSplit := splitList "-" .field -}} + {{- $upperCaseFieldNameSplit := list -}} + + {{- range $fieldNameSplit -}} + {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} + {{- end -}} + + {{ join "_" $upperCaseFieldNameSplit }} +{{- end -}} + +{{/* +Gets a value from .Values given +Usage: +{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} +*/}} +{{- define "common.utils.getValueFromKey" -}} +{{- $splitKey := splitList "." .key -}} +{{- $value := "" -}} +{{- $latestObj := $.context.Values -}} +{{- range $splitKey -}} + {{- if not $latestObj -}} + {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} + {{- end -}} + {{- $value = ( index $latestObj . ) -}} + {{- $latestObj = $value -}} +{{- end -}} +{{- printf "%v" (default "" $value) -}} +{{- end -}} + +{{/* +Returns first .Values key with a defined value or first of the list if all non-defined +Usage: +{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} +*/}} +{{- define "common.utils.getKeyFromList" -}} +{{- $key := first .keys -}} +{{- $reverseKeys := reverse .keys }} +{{- range $reverseKeys }} + {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} + {{- if $value -}} + {{- $key = . }} + {{- end -}} +{{- end -}} +{{- printf "%s" $key -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl new file mode 100644 index 00000000..ae10fa41 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl @@ -0,0 +1,14 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Warning about using rolling tag. +Usage: +{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} +*/}} +{{- define "common.warnings.rollingTag" -}} + +{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} +WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. ++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ +{{- end }} + +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl new file mode 100644 index 00000000..ded1ae3b --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl @@ -0,0 +1,72 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Cassandra required passwords are not empty. + +Usage: +{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.cassandra.passwords" -}} + {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} + {{- $enabled := include "common.cassandra.values.enabled" . -}} + {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} + {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.dbUser.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled cassandra. + +Usage: +{{ include "common.cassandra.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.cassandra.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.cassandra.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key dbUser + +Usage: +{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false +*/}} +{{- define "common.cassandra.values.key.dbUser" -}} + {{- if .subchart -}} + cassandra.dbUser + {{- else -}} + dbUser + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl new file mode 100644 index 00000000..b6906ff7 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MariaDB required passwords are not empty. + +Usage: +{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mariadb.passwords" -}} + {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mariadb.values.enabled" . -}} + {{- $architecture := include "common.mariadb.values.architecture" . -}} + {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mariadb. + +Usage: +{{ include "common.mariadb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mariadb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mariadb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mariadb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false +*/}} +{{- define "common.mariadb.values.key.auth" -}} + {{- if .subchart -}} + mariadb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl new file mode 100644 index 00000000..f820ec10 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MongoDB® required passwords are not empty. + +Usage: +{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mongodb.passwords" -}} + {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mongodb.values.enabled" . -}} + {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} + {{- $architecture := include "common.mongodb.values.architecture" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} + {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} + + {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} + {{- if and $valueUsername $valueDatabase -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replicaset") -}} + {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mongodb. + +Usage: +{{ include "common.mongodb.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mongodb.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mongodb.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.key.auth" -}} + {{- if .subchart -}} + mongodb.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false +*/}} +{{- define "common.mongodb.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mongodb.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl new file mode 100644 index 00000000..74472a06 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate MySQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.mysql.passwords" -}} + {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} + {{- $enabled := include "common.mysql.values.enabled" . -}} + {{- $architecture := include "common.mysql.values.architecture" . -}} + {{- $authPrefix := include "common.mysql.values.key.auth" . -}} + {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} + {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} + {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} + {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} + + {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} + {{- if not (empty $valueUsername) -}} + {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} + {{- end -}} + + {{- if (eq $architecture "replication") -}} + {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.auth.existingSecret" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.auth.existingSecret | quote -}} + {{- else -}} + {{- .context.Values.auth.existingSecret | quote -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled mysql. + +Usage: +{{ include "common.mysql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.mysql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.mysql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for architecture + +Usage: +{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.architecture" -}} + {{- if .subchart -}} + {{- .context.Values.mysql.architecture -}} + {{- else -}} + {{- .context.Values.architecture -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key auth + +Usage: +{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false +*/}} +{{- define "common.mysql.values.key.auth" -}} + {{- if .subchart -}} + mysql.auth + {{- else -}} + auth + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl new file mode 100644 index 00000000..164ec0d0 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate PostgreSQL required passwords are not empty. + +Usage: +{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.postgresql.passwords" -}} + {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} + {{- $enabled := include "common.postgresql.values.enabled" . -}} + {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} + {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} + + {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} + {{- if (eq $enabledReplication "true") -}} + {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to decide whether evaluate global values. + +Usage: +{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} +Params: + - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" +*/}} +{{- define "common.postgresql.values.use.global" -}} + {{- if .context.Values.global -}} + {{- if .context.Values.global.postgresql -}} + {{- index .context.Values.global.postgresql .key | quote -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for existingSecret. + +Usage: +{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.existingSecret" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} + + {{- if .subchart -}} + {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} + {{- else -}} + {{- default (.context.Values.existingSecret | quote) $globalValue -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled postgresql. + +Usage: +{{ include "common.postgresql.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.postgresql.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key postgressPassword. + +Usage: +{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.postgressPassword" -}} + {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} + + {{- if not $globalValue -}} + {{- if .subchart -}} + postgresql.postgresqlPassword + {{- else -}} + postgresqlPassword + {{- end -}} + {{- else -}} + global.postgresql.postgresqlPassword + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled.replication. + +Usage: +{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.enabled.replication" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.postgresql.replication.enabled -}} + {{- else -}} + {{- printf "%v" .context.Values.replication.enabled -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for the key replication.password. + +Usage: +{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false +*/}} +{{- define "common.postgresql.values.key.replicationPassword" -}} + {{- if .subchart -}} + postgresql.replication.password + {{- else -}} + replication.password + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl new file mode 100644 index 00000000..dcccfc1a --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl @@ -0,0 +1,76 @@ + +{{/* vim: set filetype=mustache: */}} +{{/* +Validate Redis® required passwords are not empty. + +Usage: +{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} +Params: + - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.validations.values.redis.passwords" -}} + {{- $enabled := include "common.redis.values.enabled" . -}} + {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} + {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} + + {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} + {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} + + {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} + {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} + + {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} + {{- $requiredPasswords := list -}} + + {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} + {{- if eq $useAuth "true" -}} + {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} + {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} + {{- end -}} + + {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right value for enabled redis. + +Usage: +{{ include "common.redis.values.enabled" (dict "context" $) }} +*/}} +{{- define "common.redis.values.enabled" -}} + {{- if .subchart -}} + {{- printf "%v" .context.Values.redis.enabled -}} + {{- else -}} + {{- printf "%v" (not .context.Values.enabled) -}} + {{- end -}} +{{- end -}} + +{{/* +Auxiliary function to get the right prefix path for the values + +Usage: +{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} +Params: + - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false +*/}} +{{- define "common.redis.values.keys.prefix" -}} + {{- if .subchart -}}redis.{{- else -}}{{- end -}} +{{- end -}} + +{{/* +Checks whether the redis chart's includes the standarizations (version >= 14) + +Usage: +{{ include "common.redis.values.standarized.version" (dict "context" $) }} +*/}} +{{- define "common.redis.values.standarized.version" -}} + + {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} + {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} + + {{- if $standarizedAuthValues -}} + {{- true -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl new file mode 100644 index 00000000..9a814cf4 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl @@ -0,0 +1,46 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Validate values must not be empty. + +Usage: +{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} +{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} +{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" +*/}} +{{- define "common.validations.values.multiple.empty" -}} + {{- range .required -}} + {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} + {{- end -}} +{{- end -}} + +{{/* +Validate a value must not be empty. + +Usage: +{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} + +Validate value params: + - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" + - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" + - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" + - subchart - String - Optional - Name of the subchart that the validated password is part of. +*/}} +{{- define "common.validations.values.single.empty" -}} + {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} + {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} + + {{- if not $value -}} + {{- $varname := "my-value" -}} + {{- $getCurrentValue := "" -}} + {{- if and .secret .field -}} + {{- $varname = include "common.utils.fieldToEnvVar" . -}} + {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} + {{- end -}} + {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} + {{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml b/airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml new file mode 100644 index 00000000..f2df68e5 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml @@ -0,0 +1,5 @@ +## bitnami/common +## It is required by CI/CD tools and processes. +## @skip exampleValue +## +exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl b/airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl new file mode 100644 index 00000000..933c125b --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl @@ -0,0 +1,258 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get azureKeyVault clientId or default +*/}} +{{- define "airbyte.azureKeyVaultClientIdSecretKey" -}} +{{- $azureKeyVaultClientIdSecretKey := . -}} +{{- if $azureKeyVaultClientIdSecretKey -}} + {{- printf "%s" $azureKeyVaultClientIdSecretKey -}} +{{- else -}} + {{- printf "azure-key-vault-client-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get azureKeyVault clientSecret or default +*/}} +{{- define "airbyte.azureKeyVaultClientSecretSecretKey" -}} +{{- $azureKeyVaultClientSecretSecretKey := . -}} +{{- if $azureKeyVaultClientSecretSecretKey -}} + {{- printf "%s" $azureKeyVaultClientSecretSecretKey -}} +{{- else -}} + {{- printf "azure-key-vault-client-secret" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl b/airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml b/airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml new file mode 100644 index 00000000..533d08f4 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml @@ -0,0 +1,557 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "common.names.fullname" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + {{- if .Values.extraLabels }} + {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "airbyte.selectorLabels" . | nindent 6 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} + {{- end }} + strategy: + type: RollingUpdate + template: + metadata: + labels: + {{- include "airbyte.selectorLabels" . | nindent 8 }} + {{- if .Values.extraSelectorLabels }} + {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} + {{- end }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: + {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.global.serviceAccountName }} + automountServiceAccountToken: true + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- toYaml .Values.extraInitContainers | nindent 6 }} + {{- end }} + containers: + - name: airbyte-workload-launcher-container + image: {{ include "imageUrl" (list .Values.image $) }} + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + {{- if .Values.debug.enabled }} + - name: JAVA_TOOL_OPTIONS + value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" + {{- end}} + {{- if eq .Values.global.deploymentMode "oss" }} + - name: AIRBYTE_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AIRBYTE_VERSION + - name: DATA_PLANE_ID + value: "local" + - name: PUB_SUB_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: PUB_SUB_ENABLED + - name: PUB_SUB_TOPIC_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: PUB_SUB_TOPIC_NAME + - name: CONFIG_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIG_ROOT + {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} + - name: CONTAINER_ORCHESTRATOR_SECRET_MOUNT_PATH + value: "/secrets/gcs-log-creds" + - name: CONTAINER_ORCHESTRATOR_SECRET_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + {{- end }} + + {{- include "airbyte.database.envs" . | nindent 8 }} + {{- include "airbyte.logging.envs" . | nindent 8 }} + - name: MICROMETER_METRICS_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_ENABLED + - name: MICROMETER_METRICS_STATSD_FLAVOR + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MICROMETER_METRICS_STATSD_FLAVOR + - name: SEGMENT_WRITE_KEY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SEGMENT_WRITE_KEY + - name: STATSD_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_HOST + - name: STATSD_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STATSD_PORT + - name: TRACKING_STRATEGY + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TRACKING_STRATEGY + - name: WORKSPACE_DOCKER_MOUNT + value: workspace + - name: WORKSPACE_ROOT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKSPACE_ROOT + - name: WEBAPP_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WEBAPP_URL + - name: WORKLOAD_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_API_HOST + - name: TEMPORAL_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_HOST + - name: TEMPORAL_WORKER_PORTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: TEMPORAL_WORKER_PORTS + - name: JOB_KUBE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: JOB_KUBE_SERVICEACCOUNT + value: {{ .Values.global.serviceAccountName }} + {{- if $.Values.global.jobs.kube.annotations }} + - name: JOB_KUBE_ANNOTATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_ANNOTATIONS + {{- end }} + {{- if $.Values.global.jobs.kube.labels }} + - name: JOB_KUBE_LABELS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_LABELS + {{- end }} + {{- if $.Values.global.jobs.kube.nodeSelector }} + - name: JOB_KUBE_NODE_SELECTORS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_NODE_SELECTORS + {{- end }} + {{- if $.Values.global.jobs.kube.tolerations }} + - name: JOB_KUBE_TOLERATIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_TOLERATIONS + {{- end }} + - name: CONNECTOR_SIDECAR_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONNECTOR_SIDECAR_IMAGE + - name: WORKLOAD_INIT_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_INIT_IMAGE + - name: CONTAINER_ORCHESTRATOR_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONTAINER_ORCHESTRATOR_IMAGE + - name: JOB_KUBE_BUSYBOX_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_BUSYBOX_IMAGE + - name: JOB_KUBE_CURL_IMAGE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_CURL_IMAGE + {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} + - name: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + {{- end }} + - name: JOB_MAIN_CONTAINER_CPU_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_REQUEST + - name: JOB_MAIN_CONTAINER_CPU_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_CPU_LIMIT + - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_REQUEST + - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_MAIN_CONTAINER_MEMORY_LIMIT + - name: JOB_KUBE_LOCAL_VOLUME_ENABLED + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOB_KUBE_LOCAL_VOLUME_ENABLED + - name: KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS + - name: WORKLOAD_API_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: WORKLOAD_API_BEARER_TOKEN_SECRET_NAME + value: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} + - name: WORKLOAD_API_BEARER_TOKEN_SECRET_KEY + value: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} + - name: INTERNAL_API_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INTERNAL_API_HOST + - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION + - name: METRIC_CLIENT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: METRIC_CLIENT + - name: OTEL_COLLECTOR_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OTEL_COLLECTOR_ENDPOINT + - name: ACTIVITY_MAX_ATTEMPT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_ATTEMPT + - name: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS + - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS + - name: SHOULD_RUN_NOTIFY_WORKFLOWS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: SHOULD_RUN_NOTIFY_WORKFLOWS + - name: MICRONAUT_ENVIRONMENTS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: LAUNCHER_MICRONAUT_ENVIRONMENTS + - name: WORKLOAD_LAUNCHER_PARALLELISM + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: WORKLOAD_LAUNCHER_PARALLELISM + - name: FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT + - name: FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} + # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just + # splitting into two separate blocks for readability. + - name: AIRBYTE_API_AUTH_HEADER_NAME + value: "X-Airbyte-Auth" + - name: AIRBYTE_API_AUTH_HEADER_VALUE + value: "Internal worker" + {{- end }} + + # SECRETS MANAGER + - name: SECRET_PERSISTENCE + value: {{ include "airbyte.secretPersistence" . }} + # Values for AwsSecretsManager + {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID_REF_KEY + value: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} + + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY_REF_KEY + value: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} + + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} + - name: AWS_SECRET_MANAGER_REGION + value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} + {{- end }} + + {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} + - name: AWS_SECRET_MANAGER_SECRET_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} + {{- end }} + {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} + - name: AWS_KMS_KEY_ARN + value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} + {{- end }} + + # Values for Azure Key Vault + {{- if (((.Values.global).secretsManager).azureKeyVault) }} + + - name: AB_AZURE_KEY_VAULT_VAULT_URL + value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} + + - name: AB_AZURE_KEY_VAULT_TENANT_ID + value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_ID_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AB_AZURE_KEY_VAULT_CLIENT_ID_REF_REF_KEY + value: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} + + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET_REF_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET_REF_REF_KEY + value: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} + + {{- end }} + + {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} + - name: AB_AZURE_KEY_VAULT_TAGS + value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} + {{- end }} + + # Values for googleSecretManager secrets + {{- if (((.Values.global).secretsManager).googleSecretManager) }} + - name: SECRET_STORE_GCP_PROJECT_ID + value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} + - name: SECRET_STORE_GCP_CREDENTIALS + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + - name: SECRET_STORE_GCP_SECRET_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: SECRET_STORE_GCP_SECRET_KEY + value: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} + {{- end }} + + # Values for vault secrets + {{- if (((.Values.global).secretsManager).vault) }} + - name: VAULT_ADDRESS + value: {{ (((.Values.global).secretsManager).vault).address }} + - name: VAULT_PREFIX + value: {{ (((.Values.global).secretsManager).vault).prefix }} + - name: VAULT_AUTH_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + - name: VAULT_AUTH_TOKEN_REF_NAME + value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} + - name: VAULT_AUTH_TOKEN_REF_KEY + value: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} + {{- end }} + + # Storage + {{- include "airbyte.storage.envs" . | nindent 8 }} + + {{- end }} + + # Values from secret + {{- if .Values.secrets }} + {{- range $k, $v := .Values.secrets }} + - name: {{ $k }} + valueFrom: + secretKeyRef: + name: workload-launcher-secrets + key: {{ $k }} + {{- end }} + {{- end }} + + # Values from env + {{- if or .Values.env_vars .Values.global.env_vars }} + {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} + - name: {{ $k }} + value: {{ $v | quote }} + {{- end }} + {{- end }} + + # Values from extraEnv for more compability(if you want to use external secret source or other stuff) + {{- if .Values.extraEnv }} + {{- toYaml .Values.extraEnv | nindent 8 }} + {{- end }} + + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /health/liveness + port: heartbeat + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /health/readiness + port: heartbeat + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + ports: + {{- if .Values.debug.enabled }} + - name: debug + containerPort: {{ .Values.debug.remoteDebugPort }} + protocol: TCP + {{- end}} + - name: heartbeat + containerPort: 8016 # for heartbeat server + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 10 }} + {{- end }} + {{- if .Values.containerSecurityContext }} + securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} + {{- end }} + volumeMounts: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + mountPath: /storage + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + mountPath: /secrets/gcs-log-creds + readOnly: true + {{- end }} + {{- if .Values.extraVolumeMounts }} +{{- toYaml .Values.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.global.extraVolumeMounts }} +{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} + {{- end }} + {{- if .Values.extraContainers }} + {{ toYaml .Values.extraContainers | nindent 6 }} + {{- end }} + {{- if .Values.global.extraContainers }} + {{ toYaml .Values.global.extraContainers | nindent 6 }} + {{- end }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + {{- if eq (lower .Values.global.storage.type) "local" }} + - name: airbyte-storage + persistentVolumeClaim: + claimName: airbyte-storage-pvc + {{- end }} + {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} + - name: gcs-log-creds-volume + secret: + secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} + {{- end }} + {{- if .Values.extraVolumes }} +{{- toYaml .Values.extraVolumes | nindent 6 }} + {{- end }} + {{- if .Values.global.extraVolumes }} +{{- toYaml .Values.global.extraVolumes | nindent 6 }} + {{- end }} diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml b/airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml new file mode 100644 index 00000000..c49cec64 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml @@ -0,0 +1,18 @@ +# Create dataplane secrets only for the local deployment + {{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: workload-launcher-secrets + namespace: {{ .Values.jobs_namespace }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} + {{- end }} diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml b/airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml new file mode 100644 index 00000000..c72f6bfe --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml @@ -0,0 +1,17 @@ +# Create secrets only for the local deployment +{{- if .Values.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: workload-launcher-secrets + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" +type: Opaque +data: + {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} + {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} + {{- end }} +{{- end }} diff --git a/airbyte-v1-notused/charts/workload-launcher/values.yaml b/airbyte-v1-notused/charts/workload-launcher/values.yaml new file mode 100644 index 00000000..486760a5 --- /dev/null +++ b/airbyte-v1-notused/charts/workload-launcher/values.yaml @@ -0,0 +1,294 @@ +global: + + serviceAccountName: &service-account-name "airbyte-admin" + edition: community + credVolumeOverride: "" + secretName: "" + extraContainers: [] + ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment + extraSelectorLabels: {} + ## extraLabels [object] - use to specify own additional labels for deployment + extraLabels: {} + database: + secretName: "" + secretValue: "" + + storage: + type: minio + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "" + + jobs: + ## Jobs resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## jobs.resources.limits [object] The resources limits for jobs + ## jobs.resources.requests [object] The requested resources for jobs + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + + kube: + ## JOB_KUBE_ANNOTATIONS + ## pod annotations of the sync job and the default pod annotations fallback for others jobs + ## jobs.kube.annotations [object] key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + ## jobs.kube.labels [object] key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## any boolean values should be quoted to ensure the value is passed through as a string, eg: + ## - key: airbyte-server + ## operator: Equal + ## value: "true" + ## effect: NoSchedule + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + ## image pull secret to use for job pod + ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod + main_container_image_pull_secret: "" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + ## busybox image used by the job pod + ## jobs.kube.images.busybox [string] busybox image used by the job pod + busybox: "" + ## JOB_KUBE_CURL_IMAGE + ## curl image used by the job pod + ## jobs.kube.images.curl [string] curl image used by the job pod + curl: "" + +enabled: true +## workload-launcher.replicaCount Number of workload launcher replicas +replicaCount: 1 + +## workload-launcher.image.repository The repository to use for the airbyte workload launcher image. +## workload-launcher.image.pullPolicy the pull policy to use for the airbyte workload launcher image +## workload-launcher.image.tag The airbyte workload launcher image tag. Defaults to the chart's AppVersion +image: + repository: airbyte/workload-launcher + pullPolicy: IfNotPresent + +## workload-launcher.podAnnotations [object] Add extra annotations to the workload launcher pod(s) +## +podAnnotations: {} + +## workload-launcher.podLabels [object] Add extra labels to the workload launcher pod(s) +## +podLabels: {} + +## workload-launcher.containerSecurityContext Security context for the container +## Examples: +## containerSecurityContext: +## runAsNonRoot: true +## runAsUser: 1000 +## readOnlyRootFilesystem: true +containerSecurityContext: {} + +## Configure extra options for the workload launcher containers' liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## workload-launcher.livenessProbe.enabled Enable livenessProbe on the workload launcher +## workload-launcher.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe +## workload-launcher.livenessProbe.periodSeconds Period seconds for livenessProbe +## workload-launcher.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe +## workload-launcher.livenessProbe.failureThreshold Failure threshold for livenessProbe +## workload-launcher.livenessProbe.successThreshold Success threshold for livenessProbe +## +livenessProbe: + enabled: true + initialDelaySeconds: 50 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## workload-launcher.readinessProbe.enabled Enable readinessProbe on the workload launcher +## workload-launcher.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe +## workload-launcher.readinessProbe.periodSeconds Period seconds for readinessProbe +## workload-launcher.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe +## workload-launcher.readinessProbe.failureThreshold Failure threshold for readinessProbe +## workload-launcher.readinessProbe.successThreshold Success threshold for readinessProbe +## +readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 3 + successThreshold: 1 + +## workload launcher resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## We usually recommend not to specify default resources and to leave this as a conscious +## choice for the user. This also increases chances charts run on environments with little +## resources, such as Minikube. If you do want to specify resources, uncomment the following +## lines, adjust them as necessary, and remove the curly braces after 'resources:'. +## workload-launcher.resources.limits [object] The resources limits for the workload launcher container +## workload-launcher.resources.requests [object] The requested resources for the workload launcher container +resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + requests: {} + +## workload-launcher.nodeSelector [object] Node labels for pod assignment +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} + +## workload-launcher.tolerations [array] Tolerations for workload launcher pod assignment. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + +## workload-launcher.affinity [object] Affinity and anti-affinity for workload launcher pod assignment. +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} + +## workload-launcher.log.level The log level to log at. +log: + level: "INFO" + + + +## workload-launcher.extraVolumeMounts [array] Additional volumeMounts for workload launcher container(s). +## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumeMounts: +## - name: tmpdir +## mountPath: /tmp +## +extraVolumeMounts: [] + +## workload-launcher.extraVolumes [array] Additional volumes for workload launcher pod(s). +## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): +## extraVolumes: +## - name: tmpdir +## emptyDir: {} +## +extraVolumes: [] + +## extraContainer [array] Additional container for server pod(s) +## Example: +# extraContainers: +# - name: otel_collector +# image: somerepo/someimage:sometag +# args: [ +# "--important-args" +# ] +# ports: +# - containerPort: 443 +# volumeMounts: +# - name: volumeMountCool +# mountPath: /some/path +# readOnly: true +extraContainers: [] + +## extraInitContainers [array] Additional init containers for server pod(s) +## Example: +# extraInitContainers: +# - name: sleepy +# image: alpine +# command: ['sleep', '60'] + +extraInitContainers: [] + +## extraEnv [array] Supply extra env variables to main container using full notation +## Example: (With default env vars and values taken from generated config map) +# extraEnv: +# - name: AIRBYTE_VERSION +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: AIRBYTE_VERSION +# - name: API_URL +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: API_URL +# - name: TRACKING_STRATEGY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: TRACKING_STRATEGY +# - name: FULLSTORY +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: FULLSTORY +# - name: INTERNAL_API_HOST +# valueFrom: +# configMapKeyRef: +# name: airbyte-env +# key: INTERNAL_API_HOST +## +extraEnv: [] +## secrets [object] Supply additional secrets to container +## Example: +## secrets: +## DATABASE_PASSWORD: strong-password +## DATABASE_USER: my-db-user +secrets: {} + +## env_vars [object] Supply extra env variables to main container using simplified notation +## Example with default values for workload launcher: +# env_vars: +# AIRBYTE_VERSION: 0.40.4 + +# # Workspace storage for running jobs (logs, etc) +# WORKSPACE_ROOT: /workspace +# WORKSPACE_DOCKER_MOUNT: airbyte_workspace + +# # Miscellaneous +# TRACKING_STRATEGY: segment +# WEBAPP_URL: airbyte-webapp-svc:80 +# INTERNAL_API_HOST: http://airbyte-server-svc:8001 +env_vars: {} + +## extraSelectorLabels [object] - use to specify own additional selector labels for deployment +extraSelectorLabels: {} +## extraLabels [object] - use to specify own additional labels for deployment +extraLabels: {} + +## workloadApi: +## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored +## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored +workloadApi: {} + +debug: + enabled: false + remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/templates/NOTES.txt b/airbyte-v1-notused/templates/NOTES.txt new file mode 100644 index 00000000..6487ae65 --- /dev/null +++ b/airbyte-v1-notused/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.webapp.ingress.enabled }} +{{- range $host := .Values.webapp.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.webapp.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.webapp.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "airbyte.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.webapp.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "airbyte.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "airbyte.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.webapp.service.port }} +{{- else if contains "ClusterIP" .Values.webapp.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name=webapp" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/airbyte-v1-notused/templates/_database.tpl b/airbyte-v1-notused/templates/_database.tpl new file mode 100644 index 00000000..fd0e5ef8 --- /dev/null +++ b/airbyte-v1-notused/templates/_database.tpl @@ -0,0 +1,234 @@ +{{/* +Database Configuration +*/}} + +{{/* +Renders the database host +*/}} +{{- define "airbyte.database.host" }} + {{- if .Values.postgresql.enabled }} + {{- printf "%s" "airbyte-db-svc" }} + {{- else if .Values.global.database.host }} + {{- .Values.global.database.host }} + {{- else }} + {{ $host := .Values.global.database.host | required "You must set `global.database.host` when using an external database" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database host +*/}} +{{- define "airbyte.database.host.env" }} +- name: DATABASE_HOST + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_HOST +{{- end }} + +{{/* +Renders the database port +*/}} +{{- define "airbyte.database.port" }} + {{- if .Values.postgresql.enabled }} + {{- printf "%s" "5432" }} + {{- else if .Values.global.database.port }} + {{- .Values.global.database.port }} + {{- else }} + {{ $port := .Values.global.database.port | required "You must set `global.database.port` when using an external database" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database port +*/}} +{{- define "airbyte.database.port.env" }} +- name: DATABASE_PORT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_PORT +{{- end }} + +{{/* +Renders the database name +*/}} +{{- define "airbyte.database.name" }} + {{- if .Values.postgresql.enabled }} + {{- .Values.postgresql.postgresqlDatabase }} + {{- else if .Values.global.database.database }} + {{- .Values.global.database.database }} + {{- else }} + {{ $database := .Values.global.database.database | required "You must set `global.database.database` when using an external database" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database name +*/}} +{{- define "airbyte.database.name.env" }} +- name: DATABASE_DB + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_DB +{{- end }} + +{{/* +Renders the database user +*/}} +{{- define "airbyte.database.user" }} + {{- if .Values.postgresql.enabled }} + {{- .Values.postgresql.postgresqlUsername }} + {{- else if .Values.global.database.user }} + {{- .Values.global.database.user }} + {{- else }} + {{- if .Values.global.database.userSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- else }} + {{ $user := .Values.global.database.user | required "You must set `global.database.user` when using an external database" }} + {{- end }} + {{- end }} +{{- end }} + +{{/* +Renders the name of the secret where the database user will be referenced +*/}} +{{- define "airbyte.database.userSecretKey" }} + {{- if .Values.global.database.userSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- .Values.global.database.userSecretKey }} + {{- else }} + {{- printf "%s" "DATABASE_USER" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database user +*/}} +{{- define "airbyte.database.user.env" }} +- name: DATABASE_USER + valueFrom: + secretKeyRef: + {{- if .Values.global.database.userSecretKey }} + name: {{ .Values.global.database.secretName }} + {{- else }} + name: {{ .Release.Name }}-airbyte-secrets + {{- end }} + key: {{ include "airbyte.database.userSecretKey" .}} +{{- end }} + +{{/* +Renders the database password +*/}} +{{- define "airbyte.database.password" }} + {{- if .Values.postgresql.enabled }} + {{- .Values.postgresql.postgresqlPassword }} + {{- else if .Values.global.database.password }} + {{- .Values.global.database.password }} + {{- else }} + {{- if .Values.global.database.passwordSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- else }} + {{ $password := .Values.global.database.password | required "You must set `global.database.password` when using an external database" }} + {{- end }} + {{- end }} +{{- end }} + +{{/* +Renders the name of the secret where the database password will be referenced +*/}} +{{- define "airbyte.database.passwordSecretKey" }} + {{- if .Values.global.database.passwordSecretKey }} + {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} + {{- .Values.global.database.passwordSecretKey }} + {{- else }} + {{- printf "%s" "DATABASE_PASSWORD" }} + {{- end }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database password +*/}} +{{- define "airbyte.database.password.env" }} +- name: DATABASE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ include "airbyte.database.passwordSecretKey" . }} +{{- end }} + + +{{/* +Renders the database url (JDBC) +*/}} +{{- define "airbyte.database.url" }} +{{- $host := (include "airbyte.database.host" .) }} +{{- $dbName := (include "airbyte.database.name" .) }} +{{- $port := (include "airbyte.database.port" . ) }} +{{- printf "jdbc:postgresql://%s:%s/%s" $host $port $dbName }} +{{- end }} + +{{/* +Renders an environment variable definition that provides the database url (JDBC) +*/}} +{{- define "airbyte.database.url.env" }} +- name: DATABASE_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_URL +{{- end }} + +{{/* +Renders the name of the secret containing database credentials +*/}} +{{- define "airbyte.database.secretName" }} + {{- if .Values.global.database.secretName }} + {{- .Values.global.database.secretName | quote }} + {{- else }} + {{ .Release.Name }}-airbyte-secrets + {{- end }} +{{- end }} + +{{/* +Renders all of the common environment variables which provide database credentials +*/}} +{{- define "airbyte.database.envs" }} +{{ include "airbyte.database.host.env" . }} +{{ include "airbyte.database.port.env" . }} +{{ include "airbyte.database.name.env" . }} +{{ include "airbyte.database.user.env" . }} +{{ include "airbyte.database.password.env" . }} +{{ include "airbyte.database.url.env" . }} +{{- end }} + +{{/* +Renders a set of database secrets to be included in the shared Airbyte secret +*/}} +{{- define "airbyte.database.secrets" }} +{{ $user := (include "airbyte.database.user" .)}} +{{- if not (empty $user) }} +DATABASE_USER: {{ $user }} +{{- end }} +{{ $password := (include "airbyte.database.password" .)}} +{{- if not (empty $password) }} +DATABASE_PASSWORD: {{ $password }} +{{- end}} +{{- end }} + +{{/* +Renders a set of database configuration variables to be included in the shared Airbyte config map +*/}} +{{- define "airbyte.database.configVars" }} +DATABASE_HOST: {{ include "airbyte.database.host" . }} +DATABASE_PORT: {{ include "airbyte.database.port" . | quote }} +DATABASE_DB: {{ include "airbyte.database.name" . }} +DATABASE_URL: {{ include "airbyte.database.url" . }} +{{- if .Values.global.database.user }} +DATABASE_USER: {{ include "airbyte.database.user" . }} +{{- end}} +{{- if .Values.global.database.password }} +DATABASE_PASSWORD: {{ include "airbyte.database.password" . }} +{{- end}} +{{- end }} diff --git a/airbyte-v1-notused/templates/_enterprise.tpl b/airbyte-v1-notused/templates/_enterprise.tpl new file mode 100644 index 00000000..8e74d5aa --- /dev/null +++ b/airbyte-v1-notused/templates/_enterprise.tpl @@ -0,0 +1,83 @@ +{{/* +Enteprise Configuration +*/}} + +{{- define "airbyte.enterprise.license" -}} +{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) }} +{{- $secretName := .Values.global.enterprise.secretName | required "You must set `global.enterprise.secretName` when `global.edition` is 'enterprise'" }} +{{- $secretKey := .Values.global.enterprise.licenseKeySecretKey | required "You must set `global.enterprise.licenseKeySecretKey` when `global.edition` is 'enterprise'" }} +- name: AIRBYTE_LICENSE_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.global.enterprise.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.enterprise.licenseKeySecretKey }} +{{- end }} +{{- end }} + +{{- define "airbyte.enterprise.instanceAdmin" -}} +{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) }} +{{- $auth := .Values.global.auth | required "You must set `global.auth` when `global.edition` is 'enterprise'"}} +{{- $authInstanceAdminSecretName := .Values.global.auth.instanceAdmin.secretName | required "You must set `global.auth.instanceAdmin.secretName` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminFirstName := .Values.global.auth.instanceAdmin.firstName | required "You must set `global.auth.instanceAdmin.firstName` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminLastName := .Values.global.auth.instanceAdmin.lastName | required "You must set `global.auth.instanceAdmin.lastName` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminEmailSecretKey := .Values.global.auth.instanceAdmin.emailSecretKey | required "You must set `global.auth.instanceAdmin.emailSecretKey` when `global.edition` is 'enterprise'" }} +{{- $authInstanceAdminPasswordSecretKey := .Values.global.auth.instanceAdmin.passwordSecretKey | required "You must set `global.auth.instanceAdmin.passwordSecretKey` when `global.edition` is 'enterprise'" }} +- name: INITIAL_USER_FIRST_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INITIAL_USER_FIRST_NAME +- name: INITIAL_USER_LAST_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: INITIAL_USER_LAST_NAME +- name: INITIAL_USER_EMAIL + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.instanceAdmin.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.instanceAdmin.emailSecretKey }} +- name: INITIAL_USER_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.instanceAdmin.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.instanceAdmin.passwordSecretKey }} +{{- end }} +{{- end }} + +{{- define "airbyte.enterprise.identityProvider" -}} +{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) .Values.global.auth.identityProvider }} +{{- $authIdentityProviderSecretName := .Values.global.auth.identityProvider.secretName | required "You must set `global.auth.identityProvider.secretName` when enabling SSO" }} +{{- $authIdentityProviderType := .Values.global.auth.identityProvider.type | required "You must set `global.auth.identityProvider.type` when enabling SSO "}} +{{- $authIdentityProviderOIDC := .Values.global.auth.identityProvider.oidc | required "You must set `global.auth.identityProvider.oidc` when enabling SSO" }} +{{- $authIdentityProviderOIDCDomain := .Values.global.auth.identityProvider.oidc.domain | required "You must set `global.auth.identityProvider.oidc.domain` when enabling SSO" }} +{{- $authIdentityProviderOIDCAppName := .Values.global.auth.identityProvider.oidc.appName | required "You must set `global.auth.identityProvider.oidc.appName` when enabling SSO" }} +{{- $authIdentityProviderOIDCClientIdSecretKey := .Values.global.auth.identityProvider.oidc.clientIdSecretKey | required "You must set `global.auth.identityProvider.oidc.clientIdSecretKey` when enabling SSO" }} +{{- $authIdentityProviderOIDCClientSecretSecretKey := .Values.global.auth.identityProvider.oidc.clientSecretSecretKey | required "You must set `global.auth.identityProvider.oidc.clientSecretSecretKey` when enabling SSO" }} +- name: IDENTITY_PROVIDER_TYPE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: IDENTITY_PROVIDER_TYPE +- name: OIDC_DOMAIN + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OIDC_DOMAIN +- name: OIDC_APP_NAME + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: OIDC_APP_NAME +- name: OIDC_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.identityProvider.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.identityProvider.oidc.clientIdSecretKey }} +- name: OIDC_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.global.auth.identityProvider.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} + key: {{ .Values.global.auth.identityProvider.oidc.clientSecretSecretKey }} +{{- end }} +{{- end }} diff --git a/airbyte-v1-notused/templates/_helpers.tpl b/airbyte-v1-notused/templates/_helpers.tpl new file mode 100644 index 00000000..d99db7f4 --- /dev/null +++ b/airbyte-v1-notused/templates/_helpers.tpl @@ -0,0 +1,350 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "airbyte.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "airbyte.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "airbyte.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "airbyte.labels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "airbyte.selectorLabels" -}} +app.kubernetes.io/name: {{ include "airbyte.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + + +{{/* +Common DB labels +*/}} +{{- define "airbyte.databaseLabels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.databaseSelectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector DB labels +*/}} +{{- define "airbyte.databaseSelectorLabels" -}} +app.kubernetes.io/name: {{ printf "%s-db" .Release.Name }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Common DB labels +*/}} +{{- define "airbyte.minioLabels" -}} +helm.sh/chart: {{ include "airbyte.chart" . }} +{{ include "airbyte.minioSelectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector DB labels +*/}} +{{- define "airbyte.minioSelectorLabels" -}} +app.kubernetes.io/name: {{ printf "%s-minio" .Release.Name }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "airbyte.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "airbyte.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Add environment variables to configure minio +*/}} +{{- define "airbyte.storage.minio.endpoint" -}} +{{- if ((((.Values.global).storage).minio).endpoint) }} + {{- .Values.global.storage.minio.endpoint -}} +{{- else -}} + {{- printf "http://airbyte-minio-svc:9000" -}} +{{- end -}} +{{- end -}} + +{{- define "airbyte.s3PathStyleAccess" -}} +{{- ternary "true" "" (eq (lower (default "" .Values.global.storage.type)) "minio") -}} +{{- end -}} + +{{/* +Returns the GCP credentials path +*/}} +{{- define "airbyte.gcpLogCredentialsPath" -}} +{{- if ((((.Values.global).storage).gcs).credentialsPath) }} + {{- printf "%s" .Values.global.storage.gcs.credentialsPath -}} +{{- else -}} + {{- printf "%s" "/secrets/gcs-log-creds/gcp.json" -}} +{{- end -}} +{{- end -}} + +{{/* +Construct comma separated list of key/value pairs from object (useful for ENV var values) +*/}} +{{- define "airbyte.flattenMap" -}} +{{- $kvList := list -}} +{{- range $key, $value := . -}} +{{- $kvList = printf "%s=%s" $key $value | mustAppend $kvList -}} +{{- end -}} +{{ join "," $kvList }} +{{- end -}} + +{{/* +Construct semi-colon delimited list of comma separated key/value pairs from array of objects (useful for ENV var values) +*/}} +{{- define "airbyte.flattenArrayMap" -}} +{{- $mapList := list -}} +{{- range $element := . -}} +{{- $mapList = include "airbyte.flattenMap" $element | mustAppend $mapList -}} +{{- end -}} +{{ join ";" $mapList }} +{{- end -}} + +## DEFAULT HELM VALUES +# Secret Manager Defaults +{{/* +Define secret persistence +*/}} +{{- define "airbyte.secretPersistence" -}} +{{- if (((.Values.global).secretsManager).type) }} + {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} +{{- else }} + {{- printf "" }} +{{- end }} +{{- end }} + +{{/* +Get secret store name or default +*/}} +{{- define "airbyte.secretStoreName" -}} +{{- $secretStoreName := . -}} +{{- if $secretStoreName -}} + {{- printf "%s" $secretStoreName -}} +{{- else -}} + {{- printf "airbyte-config-secrets" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager access key id secret key or default +*/}} +{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} +{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} +{{- if $awsSecretManagerAccessKeyIdSecretKey -}} + {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get awsSecretManager secret access key secret key or default +*/}} +{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} +{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} +{{- if $awsSecretManagerSecretAccessKeySecretKey -}} + {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "aws-secret-manager-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get googleSecretManager credentials secret key or default +*/}} +{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} +{{- $googleSecretManagerCredentialsSecretKey := . -}} +{{- if $googleSecretManagerCredentialsSecretKey -}} + {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} +{{- else -}} + {{- printf "google-secret-manager-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Get vault auth token secret key or default +*/}} +{{- define "airbyte.vaultAuthTokenSecretKey" -}} +{{- $vaultAuthTokenSecretKey := . -}} +{{- if $vaultAuthTokenSecretKey -}} + {{- printf "%s" $vaultAuthTokenSecretKey -}} +{{- else -}} + {{- printf "vault-auth-token" -}} +{{- end -}} +{{- end -}} + + +# Storage Defaults +{{/* +Get storage type or default +*/}} +{{- define "airbyte.storageType" -}} +{{- $storageType := . -}} +{{- if $storageType -}} + {{- printf "%s" $storageType -}} +{{- else -}} + {{- printf "local" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket log or default +*/}} +{{- define "airbyte.storageBucketLog" -}} +{{- $storageBucketLog := . -}} +{{- if $storageBucketLog -}} + {{- printf "%s" $storageBucketLog -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket state or default +*/}} +{{- define "airbyte.storageBucketState" -}} +{{- $storageBucketState := . -}} +{{- if $storageBucketState -}} + {{- printf "%s" $storageBucketState -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get storage bucket workload output or default +*/}} +{{- define "airbyte.storageBucketWorkloadOutput" -}} +{{- $storageBucketWorkloadOutput := . -}} +{{- if $storageBucketWorkloadOutput -}} + {{- printf "%s" $storageBucketWorkloadOutput -}} +{{- else -}} + {{- printf "airbyte-storage" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 access key id secret key or default +*/}} +{{- define "airbyte.s3AccessKeyIdSecretKey" -}} +{{- $s3AccessKeyIdSecretKey := . -}} +{{- if $s3AccessKeyIdSecretKey -}} + {{- printf "%s" $s3AccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "s3-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get s3 secret access key secret key or default +*/}} +{{- define "airbyte.s3SecretAccessKeySecretKey" -}} +{{- $s3SecretAccessKeySecretKey := . -}} +{{- if $s3SecretAccessKeySecretKey -}} + {{- printf "%s" $s3SecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "s3-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio access key id secret key or default +*/}} +{{- define "airbyte.minioAccessKeyIdSecretKey" -}} +{{- $minioAccessKeyIdSecretKey := . -}} +{{- if $minioAccessKeyIdSecretKey -}} + {{- printf "%s" $minioAccessKeyIdSecretKey -}} +{{- else -}} + {{- printf "minio-access-key-id" -}} +{{- end -}} +{{- end -}} + +{{/* +Get minio secret access key secret key or default +*/}} +{{- define "airbyte.minioSecretAccessKeySecretKey" -}} +{{- $minioSecretAccessKeySecretKey := . -}} +{{- if $minioSecretAccessKeySecretKey -}} + {{- printf "%s" $minioSecretAccessKeySecretKey -}} +{{- else -}} + {{- printf "minio-secret-access-key" -}} +{{- end -}} +{{- end -}} + +{{/* +Get gcs credentials secret key or default +*/}} +{{- define "airbyte.gcsCredentialsSecretKey" -}} +{{- $gcsCredentialsSecretKey := . -}} +{{- if $gcsCredentialsSecretKey -}} + {{- printf "%s" $gcsCredentialsSecretKey -}} +{{- else -}} + {{- printf "gcs-credentials" -}} +{{- end -}} +{{- end -}} + +{{/* +Convert tags to a comma-separated list of key=value pairs. +*/}} +{{- define "airbyte.tagsToString" -}} +{{- $result := list -}} +{{- range . -}} + {{- $key := .key -}} + {{- $value := .value -}} + {{- if eq (typeOf $value) "bool" -}} + {{- $value = ternary "true" "false" $value -}} + {{- end -}} + {{- $result = append $result (printf "%s=%s" $key $value) -}} +{{- end -}} +{{- join "," $result -}} +{{- end -}} diff --git a/airbyte-v1-notused/templates/_images.tpl b/airbyte-v1-notused/templates/_images.tpl new file mode 100644 index 00000000..6c32ec44 --- /dev/null +++ b/airbyte-v1-notused/templates/_images.tpl @@ -0,0 +1,17 @@ +{{- define "imageUrl" -}} +{{- $img := index . 0 -}} +{{- $root := index . 1 -}} + +{{- $reg := $root.Values.global.image.registry -}} +{{/* ensure the registry has a trailing slash, if set */}} +{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} + +{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} +{{- if (eq (typeOf $img) "string") -}} +{{- printf "%s%s" $reg (tpl $img $root) | quote -}} +{{- else -}} +{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} +{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} +{{- end -}} + +{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/templates/_keycloak.tpl b/airbyte-v1-notused/templates/_keycloak.tpl new file mode 100644 index 00000000..ac0545db --- /dev/null +++ b/airbyte-v1-notused/templates/_keycloak.tpl @@ -0,0 +1,44 @@ +{{/* +Keycloak Configuration +*/}} + +{{- define "airbyte.keycloak.database.user.env" }} +- name: KEYCLOAK_DATABASE_USERNAME + valueFrom: + secretKeyRef: + {{- if .Values.global.database.userSecretKey }} + name: {{ .Values.global.database.secretName }} + {{- else }} + name: {{ .Release.Name }}-airbyte-secrets + {{- end }} + key: {{ include "airbyte.database.userSecretKey" .}} +{{- end }} + +{{- define "airbyte.keycloak.database.password.env" }} +- name: KEYCLOAK_DATABASE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ include "airbyte.database.passwordSecretKey" . }} +{{- end }} + +{{- define "airbyte.keycloak.database.url" }} +{{ $host := (include "airbyte.database.host" .) }} +{{ $dbName := (include "airbyte.database.name" .) }} +{{ $port := (include "airbyte.database.port" . ) }} +{{- printf "jdbc:postgresql://%s:%s/%s?currentSchema=keycloak" $host $port $dbName }} +{{- end }} + +{{- define "airbyte.keycloak.database.url.env" }} +- name: KEYCLOAK_DATABASE_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: KEYCLOAK_DATABASE_URL +{{- end }} + +{{- define "airbyte.keycloak.database.envs" }} +{{ include "airbyte.keycloak.database.user.env" . }} +{{ include "airbyte.keycloak.database.password.env" . }} +{{ include "airbyte.keycloak.database.url.env" . }} +{{- end }} diff --git a/airbyte-v1-notused/templates/_logging.tpl b/airbyte-v1-notused/templates/_logging.tpl new file mode 100644 index 00000000..f1382739 --- /dev/null +++ b/airbyte-v1-notused/templates/_logging.tpl @@ -0,0 +1,10 @@ +{{/* +Common logging configs +*/}} +{{- define "airbyte.logging.envs" }} +- name: LOG_LEVEL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: LOG_LEVEL +{{- end }} diff --git a/airbyte-v1-notused/templates/_storage.tpl b/airbyte-v1-notused/templates/_storage.tpl new file mode 100644 index 00000000..70819063 --- /dev/null +++ b/airbyte-v1-notused/templates/_storage.tpl @@ -0,0 +1,243 @@ +{{/* +Storage configs +*/}} + +{{/* +Returns the provider name +*/}} +{{- define "airbyte.storage.provider" }} +{{- if .Values.global.storage.type }} + {{- printf "%s" (lower .Values.global.storage.type) }} +{{- else }} + {{- printf "minio" }} +{{- end }} +{{- end }} + +{{/* +Returns the storage provider secret name +*/}} +{{- define "airbyte.storage.secretName" }} +{{- if .Values.global.storage.secretName }} + {{- printf "%s" .Values.global.storage.secretName }} +{{- else if .Values.global.storage.storageSecretName }} + {{- printf "%s" .Values.global.storage.storageSecretName }} +{{- else -}} + {{/* GCS has its own default secret we create */}} + {{- if eq (include "airbyte.storage.provider" .) "gcs" }} + {{- printf "%s-gcs-log-creds" .Release.Name }} + {{- else }} + {{- printf "%s-airbyte-secrets" .Release.Name }} + {{- end }} +{{- end }} +{{- end }} + +{{/* +Returns azure environment variables. +*/}} +{{- define "airbyte.storage.azure.envs" }} +{{- if .Values.global.storage.azure.connectionString }} +- name: AZURE_STORAGE_CONNECTION_STRING + value: {{ .Values.global.storage.azure.connectionString }} +{{- end }} +{{- if .Values.global.storage.azure.connectionStringSecretKey }} +- name: AZURE_STORAGE_CONNECTION_STRING + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.azure.connectionStringSecretKey }} +{{- end }} +{{- end }} + +{{/* +Returns azure secrets +*/}} +{{- define "airbyte.storage.azure.secrets" }} +{{- if .Values.global.storage.azure }} +AZURE_STORAGE_CONNECTION_STRING: {{ .Values.global.storage.azure.connectionString | default "" }} +{{- end }} +{{- end }} + +{{/* +Returns S3 environment variables. +*/}} +{{- define "airbyte.storage.s3.envs" }} +{{- if eq .Values.global.storage.s3.authenticationType "credentials" }} +- name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.s3.accessKeyIdSecretKey | default "s3-access-key-id" }} +- name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.s3.secretAccessKeySecretKey | default "s3-secret-access-key" }} +{{- end }} +{{- if .Values.global.storage.s3.region }} +- name: AWS_DEFAULT_REGION + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: AWS_DEFAULT_REGION +{{- end }} +{{- end}} + +{{/* +Returns S3 secrets +*/}} +{{- define "airbyte.storage.s3.secrets" }} +{{- if and (.Values.global.storage.s3) (eq .Values.global.storage.s3.authenticationType "credentials") }} +AWS_ACCESS_KEY_ID: {{ .Values.global.storage.s3.accessKeyId | default "" }} +AWS_SECRET_ACCESS_KEY: {{ .Values.global.storage.s3.secretAccessKey | default "" }} +{{- end }} +{{- end }} + +{{/* +Returns GCS environment variables. +*/}} +{{- define "airbyte.storage.gcs.envs" }} +- name: GOOGLE_APPLICATION_CREDENTIALS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: GOOGLE_APPLICATION_CREDENTIALS +{{- end}} + +{{/* +Returns GCS secrets. +*/}} +{{- define "airbyte.storage.gcs.secrets" }} +{{- if .Values.global.storage.gcs }} +gcp.json: {{ .Values.global.storage.gcs.credentialsJson }} +{{- end }} +{{- end}} + +{{/* +Returns Minio environment variables. +*/}} +{{- define "airbyte.storage.minio.envs" }} +{{- if .Values.global.storage.minio }} +- name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.minio.accessKeyIdSecretKey | default "MINIO_ACCESS_KEY_ID" }} +- name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: {{ .Values.global.storage.minio.secretAccessKeySecretKey | default "MINIO_SECRET_ACCESS_KEY" }} +{{- else }} +- name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: "MINIO_ACCESS_KEY_ID" +- name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.storage.secretName" . }} + key: "MINIO_SECRET_ACCESS_KEY" +{{- end }} +- name: MINIO_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MINIO_ENDPOINT +{{- end }} + +{{- define "airbyte.storage.minio.secrets" }} +{{- if .Values.global.storage.minio }} +MINIO_ACCESS_KEY_ID: {{ .Values.global.storage.minio.accessKeyId | default "minio" | quote }} +MINIO_SECRET_ACCESS_KEY: {{ .Values.global.storage.minio.secretAccessKey | default "minio123" | quote }} +{{- else }} +MINIO_ACCESS_KEY_ID: "minio" +MINIO_SECRET_ACCESS_KEY: "minio123" +{{- end }} +{{- end }} + +{{/* +Returns storage config environment variables. +*/}} +{{- define "airbyte.storage.envs" }} +{{- $storageProvider := (include "airbyte.storage.provider" .) }} +- name: S3_PATH_STYLE_ACCESS + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: S3_PATH_STYLE_ACCESS +- name: STORAGE_TYPE + value: {{ upper $storageProvider }} +- name: STORAGE_BUCKET_ACTIVITY_PAYLOAD + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_ACTIVITY_PAYLOAD +- name: STORAGE_BUCKET_LOG + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_LOG +- name: STORAGE_BUCKET_STATE + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_STATE +- name: STORAGE_BUCKET_WORKLOAD_OUTPUT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: STORAGE_BUCKET_WORKLOAD_OUTPUT +{{/* S3 */}} +{{- if eq $storageProvider "s3" }} +{{- include "airbyte.storage.s3.envs" . }} +{{- end }} + +{{/* GCS */}} +{{- if eq $storageProvider "gcs" }} +{{- include "airbyte.storage.gcs.envs" . }} +{{- end }} + +{{/* MINIO */}} +{{- if eq $storageProvider "minio" }} +{{- include "airbyte.storage.minio.envs" . }} +{{- end }} + +{{/* AZURE */}} +{{- if eq $storageProvider "azure" }} +{{- include "airbyte.storage.azure.envs" . }} +{{- end }} + +{{- end }} + +{{/* +Returns storage config variables. +*/}} +{{- define "airbyte.storage.configVars" }} +{{- end }} + +{{/* +Returns storage config secrets. +*/}} +{{- define "airbyte.storage.secrets" }} +{{- $storageProvider := (include "airbyte.storage.provider" .) }} +{{/* S3 */}} +{{- if eq $storageProvider "s3" }} +{{- include "airbyte.storage.s3.secrets" . }} +{{- end }} + +{{/* GCS */}} +{{- if eq $storageProvider "gcs" }} +{{- include "airbyte.storage.gcs.secrets" . }} +{{- end }} + +{{/* MINIO */}} +{{- if eq $storageProvider "minio" }} +{{- include "airbyte.storage.minio.secrets" . }} +{{- end }} + +{{/* AZURE */}} +{{- if eq $storageProvider "azure" }} +{{- include "airbyte.storage.azure.secrets" . }} +{{- end }} +{{- end }} diff --git a/airbyte-v1-notused/templates/_temporal.tpl b/airbyte-v1-notused/templates/_temporal.tpl new file mode 100644 index 00000000..c4e213c9 --- /dev/null +++ b/airbyte-v1-notused/templates/_temporal.tpl @@ -0,0 +1,58 @@ +{{/* +Temporal Configuration +*/}} + +{{- define "airbyte.temporal.database.host.env" }} +- name: POSTGRES_SEEDS + valueFrom: + {{- if .Values.global.database.hostSecretKey }} + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ .Values.global.database.hostSecretKey }} + {{- else }} + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_HOST + {{- end }} +{{- end }} + +{{- define "airbyte.temporal.database.port.env" }} +- name: DB_PORT + valueFrom: + {{- if .Values.global.database.portSecretKey }} + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ .Values.global.database.portSecretKey }} + {{- else }} + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: DATABASE_PORT + {{- end }} +{{- end }} + +{{- define "airbyte.temporal.database.user.env" }} +- name: POSTGRES_USER + valueFrom: + secretKeyRef: + {{- if .Values.global.database.userSecretKey }} + name: {{ .Values.global.database.secretName }} + {{- else }} + name: {{ .Release.Name }}-airbyte-secrets + {{- end }} + key: {{ include "airbyte.database.userSecretKey" .}} +{{- end }} + +{{- define "airbyte.temporal.database.password.env" }} +- name: POSTGRES_PWD + valueFrom: + secretKeyRef: + name: {{ include "airbyte.database.secretName" . }} + key: {{ include "airbyte.database.passwordSecretKey" . }} +{{- end }} + +{{- define "airbyte.temporal.database.envs" }} +{{ include "airbyte.temporal.database.host.env" . }} +{{ include "airbyte.temporal.database.port.env" . }} +{{ include "airbyte.temporal.database.user.env" . }} +{{ include "airbyte.temporal.database.password.env" . }} +{{- end }} diff --git a/airbyte-v1-notused/templates/airbyte-db.yaml b/airbyte-v1-notused/templates/airbyte-db.yaml new file mode 100644 index 00000000..91cbd658 --- /dev/null +++ b/airbyte-v1-notused/templates/airbyte-db.yaml @@ -0,0 +1,85 @@ +{{- if .Values.postgresql.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: airbyte-db-svc + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" + labels: + {{ include "airbyte.databaseLabels" . | nindent 4 }} +spec: + type: ClusterIP + ports: + - port: 5432 + protocol: TCP + selector: + {{ include "airbyte.databaseSelectorLabels" . | nindent 4 }} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airbyte-db + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" + labels: + {{ include "airbyte.databaseLabels" . | nindent 4 }} +spec: + replicas: 1 + serviceName: airbyte-db-svc + selector: + matchLabels: + {{ include "airbyte.databaseSelectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{ include "airbyte.databaseSelectorLabels" . | nindent 8 }} + spec: + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: airbyte-db-container + image: {{ include "imageUrl" (list .Values.postgresql.image $) }} + env: + - name: POSTGRES_DB + value: {{ .Values.postgresql.postgresqlDatabase }} + - name: POSTGRES_PASSWORD + value: {{ .Values.postgresql.postgresqlPassword }} + - name: POSTGRES_USER + value: {{ .Values.postgresql.postgresqlUsername }} + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + ports: + - containerPort: 5432 + securityContext: {{- toYaml .Values.postgresql.containerSecurityContext | nindent 12 }} + volumeMounts: + - name: airbyte-volume-db + mountPath: /var/lib/postgresql/data + {{- with .Values.postgresql.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.postgresql.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.postgresql.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: {{- toYaml .Values.postgresql.podSecurityContext | nindent 8 }} + + volumeClaimTemplates: + - metadata: + name: airbyte-volume-db + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 500Mi +{{- end }} diff --git a/airbyte-v1-notused/templates/airbyte-yml-secret.yaml b/airbyte-v1-notused/templates/airbyte-yml-secret.yaml new file mode 100644 index 00000000..eb6574e6 --- /dev/null +++ b/airbyte-v1-notused/templates/airbyte-yml-secret.yaml @@ -0,0 +1,19 @@ +{{- if .Values.global.airbyteYml }} +# The Secret that contains the airbyte.yml content. For this to work helm must be started with +# --set-file global.airbyteYml=/airbyte.yml +# For Airbyte Enterprise our installation script automatically specifies this, for Community +# users will need to specify it, if they want to use the airbyte.yml config file. +# If nothing is specified we'll assume an empty config +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-airbyte-yml + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + labels: + {{- include "airbyte.labels" . | nindent 4 }} +type: Opaque +data: + fileContents: "{{ .Values.global.airbyteYml | default "" | nindent 4 | b64enc }}" +{{- end }} diff --git a/airbyte-v1-notused/templates/env-configmap.yaml b/airbyte-v1-notused/templates/env-configmap.yaml new file mode 100644 index 00000000..bfbeea2b --- /dev/null +++ b/airbyte-v1-notused/templates/env-configmap.yaml @@ -0,0 +1,160 @@ +{{- $airbyteYmlDict := (default "" .Values.global.airbyteYml | fromYaml) }} +# default to empty dict if airbyteYml is undefined +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-airbyte-env + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + labels: + {{- include "airbyte.labels" . | nindent 4 }} +data: + AIRBYTE_VERSION: {{ .Values.version | default .Chart.AppVersion }} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + AIRBYTE_EDITION: "pro" + {{- else }} + AIRBYTE_EDITION: "community" + {{- end }} + + {{- if $airbyteYmlDict }} + AIRBYTE_URL: {{ (index $airbyteYmlDict "webapp-url") | quote }} + {{- else}} + AIRBYTE_URL: {{ .Values.global.airbyteUrl | quote }} + {{- end }} + + AIRBYTE_SERVER_HOST: {{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} + API_URL: {{ .Values.webapp.api.url }} + CONNECTOR_BUILDER_API_URL: {{ index .Values.webapp "connector-builder-server" "url" | quote }} + CONFIG_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} # temporary solution for oss kube deploys for airbyte api server until that server is wrapped into the config server + CONFIG_ROOT: /configs + CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: "0.35.15.001" + DATA_DOCKER_MOUNT: airbyte_data + DB_DOCKER_MOUNT: airbyte_db + {{- include "airbyte.database.configVars" . | nindent 2 }} + KEYCLOAK_DATABASE_URL: {{ include "airbyte.keycloak.database.url" . | quote }} + GOOGLE_APPLICATION_CREDENTIALS: {{ include "airbyte.gcpLogCredentialsPath" . | quote }} + INTERNAL_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} + WORKLOAD_API_HOST: http://{{ .Release.Name }}-workload-api-server-svc:{{ index .Values "workload-api-server" "service" "port" }} + + + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + INITIAL_USER_FIRST_NAME: {{ .Values.global.auth.instanceAdmin.firstName }} + INITIAL_USER_LAST_NAME: {{ .Values.global.auth.instanceAdmin.lastName }} + {{- if .Values.global.auth.identityProvider }} + IDENTITY_PROVIDER_TYPE: {{ .Values.global.auth.identityProvider.type }} + OIDC_DOMAIN: {{ .Values.global.auth.identityProvider.oidc.domain }} + OIDC_APP_NAME: {{ .Values.global.auth.identityProvider.oidc.appName }} + {{- end }} + KEYCLOAK_INTERNAL_HOST: {{ .Release.Name }}-airbyte-keycloak-svc:{{ .Values.keycloak.service.port }} + KEYCLOAK_PORT: {{ .Values.keycloak.service.port | quote }} + + {{- if $airbyteYmlDict }} + KEYCLOAK_HOSTNAME_URL: {{ printf "%s/auth" (index $airbyteYmlDict "webapp-url") | quote }} + {{- else }} + KEYCLOAK_HOSTNAME_URL: {{ printf "%s/auth" .Values.global.airbyteUrl | quote }} + {{- end }} + + KEYCLOAK_JAVA_OPTS_APPEND: -Djgroups.dns.query={{ .Release.Name }}-airbyte-keycloak-headless-svc + {{- else }} + KEYCLOAK_INTERNAL_HOST: localhost # just a placeholder so that nginx template is valid - shouldn't be used when edition isn't "pro" + {{- end }} + + CONNECTOR_BUILDER_API_HOST: {{ .Release.Name }}-airbyte-connector-builder-server-svc:{{ index .Values "connector-builder-server" "service" "port" }} + + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + {{- if $airbyteYmlDict }} + AIRBYTE_API_HOST: {{ printf "%s/api/public" (index $airbyteYmlDict "webapp-url") | quote }} + {{- else }} + AIRBYTE_API_HOST: {{ printf "%s/api/public" .Values.global.airbyteUrl | quote }} + {{- end }} + {{- else if (eq .Values.global.edition "community")}} + AIRBYTE_API_HOST: http://localhost:{{ .Values.server.service.port }}/api/public + {{- else }} + AIRBYTE_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }}/api/public + {{- end }} + + {{- if $.Values.global.jobs.kube.annotations }} + JOB_KUBE_ANNOTATIONS: {{ $.Values.global.jobs.kube.annotations | include "airbyte.flattenMap" | quote }} + {{- end }} + + {{- if $.Values.global.jobs.kube.labels }} + JOB_KUBE_LABELS: {{ $.Values.global.jobs.kube.labels | include "airbyte.flattenMap" | quote }} + {{- end }} + + {{- if $.Values.global.jobs.kube.nodeSelector }} + JOB_KUBE_NODE_SELECTORS: {{ $.Values.global.jobs.kube.nodeSelector | include "airbyte.flattenMap" | quote }} + {{- end }} + + {{- if $.Values.global.jobs.kube.tolerations }} + JOB_KUBE_TOLERATIONS: {{ $.Values.global.jobs.kube.tolerations | include "airbyte.flattenArrayMap" | quote }} + {{- end }} + + JOB_KUBE_BUSYBOX_IMAGE: {{ include "imageUrl" (list $.Values.global.jobs.kube.images.busybox $) }} + JOB_KUBE_CURL_IMAGE: {{ include "imageUrl" (list $.Values.global.jobs.kube.images.curl $) }} + {{ $workloadLauncher := (index .Values "workload-launcher") }} + CONTAINER_ORCHESTRATOR_IMAGE: {{ include "imageUrl" (list $workloadLauncher.containerOrchestrator.image $) }} + WORKLOAD_INIT_IMAGE: {{ include "imageUrl" (list $workloadLauncher.workloadInit.image $) }} + CONNECTOR_SIDECAR_IMAGE: {{ include "imageUrl" (list $workloadLauncher.connectorSidecar.image $) }} + + JOB_MAIN_CONTAINER_CPU_LIMIT: {{ ((.Values.global.jobs.resources | default dict).limits | default dict).cpu | default "" | quote }} + JOB_MAIN_CONTAINER_CPU_REQUEST: {{ ((.Values.global.jobs.resources | default dict).requests | default dict).cpu | default "" | quote }} + JOB_MAIN_CONTAINER_MEMORY_LIMIT: {{ ((.Values.global.jobs.resources | default dict).limits | default dict).memory | default "" | quote }} + JOB_MAIN_CONTAINER_MEMORY_REQUEST: {{ ((.Values.global.jobs.resources | default dict).requests | default dict).memory | default "" | quote }} + + {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} + JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET: {{ $.Values.global.jobs.kube.main_container_image_pull_secret }} + {{- end }} + JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: "0.29.15.001" + + JOB_KUBE_LOCAL_VOLUME_ENABLED: {{ .Values.global.jobs.local.volume.enabled | quote }} + + LOG_LEVEL: {{ default "INFO" (((.Values.global).logging).level) }} + MICROMETER_METRICS_ENABLED: "false" + MICROMETER_METRICS_STATSD_FLAVOR: "datadog" + RUN_DATABASE_MIGRATION_ON_STARTUP: {{ index .Values "airbyte-bootloader" "runDatabaseMigrationsOnStartup" | default "true" | quote }} + SEGMENT_WRITE_KEY: 7UDdp5K55CyiGgsauOr2pNNujGvmhaeu + # Storage start + STORAGE_TYPE: {{ (((.Values.global).storage).type) | default "minio" | quote }} + STORAGE_BUCKET_ACTIVITY_PAYLOAD: {{ ((((.Values.global).storage).bucket).activityPayload) | default "airbyte-storage" | quote }} + STORAGE_BUCKET_LOG: {{ ((((.Values.global).storage).bucket).log) | default "airbyte-storage" | quote }} + STORAGE_BUCKET_STATE: {{ ((((.Values.global).storage).bucket).state) | default "airbyte-storage" | quote }} + STORAGE_BUCKET_WORKLOAD_OUTPUT: {{ ((((.Values.global).storage).bucket).workloadOutput) | default "airbyte-storage" | quote }} + + {{- with .Values.global.storage.s3 }} + AWS_DEFAULT_REGION: {{ .region | default "" | quote }} + {{- end}} + + MINIO_ENDPOINT: {{ include "airbyte.storage.minio.endpoint" . | quote }} + S3_PATH_STYLE_ACCESS: {{ include "airbyte.s3PathStyleAccess" . | quote }} + # Storage end + STATSD_HOST: "localhost" + STATSD_PORT: "8125" + TEMPORAL_HOST: {{ .Release.Name }}-temporal:{{ .Values.temporal.service.port }} + TEMPORAL_WORKER_PORTS: 9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040 + TRACKING_STRATEGY: segment + WEBAPP_URL: {{ .Values.webapp.url | default (printf "http://%s-airbyte-webapp-svc:%d" .Release.Name (.Values.webapp.service.port | int)) }} + WORKER_ENVIRONMENT: kubernetes + WORKSPACE_DOCKER_MOUNT: airbyte_workspace + WORKSPACE_ROOT: /workspace + METRIC_CLIENT: {{ .Values.global.metrics.metricClient | default "" | quote }} + OTEL_COLLECTOR_ENDPOINT: {{ .Values.global.metrics.otelCollectorEndpoint | default "" | quote }} + ACTIVITY_MAX_ATTEMPT: {{ .Values.worker.activityMaxAttempt | default "" | quote }} + ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS: {{ .Values.worker.activityInitialDelayBetweenAttemptsSeconds | default "" | quote }} + ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS: {{ .Values.worker.activityMaxDelayBetweenAttemptsSeconds | default "" | quote }} + WORKFLOW_FAILURE_RESTART_DELAY_SECONDS: "" + FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT: 5G + FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST: 5G + + LAUNCHER_MICRONAUT_ENVIRONMENTS: "control-plane,oss" + WORKERS_MICRONAUT_ENVIRONMENTS: "control-plane" + CRON_MICRONAUT_ENVIRONMENTS: "control-plane" + SERVER_MICRONAUT_ENVIRONMENTS: "control-plane" + SHOULD_RUN_NOTIFY_WORKFLOWS: "true" + MAX_NOTIFY_WORKERS: {{ .Values.worker.maxNotifyWorkers | default "5" | quote }} + KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS: "" + WORKLOAD_LAUNCHER_PARALLELISM: "10" + CONNECTOR_BUILDER_SERVER_API_HOST: http://{{ .Release.Name }}-airbyte-connector-builder-server-svc:{{ index .Values "connector-builder-server" "service" "port" }} + PUB_SUB_ENABLED: "false" + PUB_SUB_TOPIC_NAME: "" + ENTERPRISE_SOURCE_STUBS_URL: {{ .Values.server.env_vars.ENTERPRISE_SOURCE_STUBS_URL | default "https://connectors.airbyte.com/files/resources/connector_stubs/v0/connector_stubs.json" }} diff --git a/airbyte-v1-notused/templates/gcs-log-creds-secret.yaml b/airbyte-v1-notused/templates/gcs-log-creds-secret.yaml new file mode 100644 index 00000000..92214675 --- /dev/null +++ b/airbyte-v1-notused/templates/gcs-log-creds-secret.yaml @@ -0,0 +1,18 @@ +{{- if and + (eq .Values.global.deploymentMode "oss") + (eq (lower (default "" .Values.global.storage.type)) "gcs") + (not .Values.global.storage.secretName) + (not .Values.global.storage.storageSecretName) +}} +{{- $gcsConfig := required "You must set 'global.storage.gcs' when setting 'global.storage.type' to 'gcs'" .Values.global.storage.gcs }} +{{- $credentialsJson := required "You must set 'global.storage.gcs.credentialsJson' when 'global.storage.secretName' is not set" .Values.global.storage.gcs.credentialsJson }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-gcs-log-creds + labels: + {{- include "airbyte.labels" . | nindent 4 }} +type: Opaque +data: + gcp.json: {{ $credentialsJson | default "" | quote }} +{{- end }} diff --git a/airbyte-v1-notused/templates/minio.yaml b/airbyte-v1-notused/templates/minio.yaml new file mode 100644 index 00000000..a47ea4e2 --- /dev/null +++ b/airbyte-v1-notused/templates/minio.yaml @@ -0,0 +1,185 @@ +{{- if (eq (lower (default "" .Values.global.storage.type)) "minio")}} +apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 +kind: StatefulSet +metadata: + # This name uniquely identifies the Deployment + name: airbyte-minio + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" + labels: + {{ include "airbyte.minioLabels" . | nindent 4 }} +spec: + selector: + matchLabels: + {{ include "airbyte.minioSelectorLabels" . | nindent 6 }} + serviceName: airbyte-minio-svc + volumeClaimTemplates: + - metadata: + name: airbyte-minio-pv-claim + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: {{ .Values.minio.storage.volumeClaimValue }} + template: + metadata: + labels: + # Label is used as selector in the service. + {{ include "airbyte.minioSelectorLabels" . | nindent 8 }} + spec: + # Refer to the PVC created earlier + securityContext: + fsGroup: 1000 + containers: + - name: airbyte-minio + image: {{ include "imageUrl" (list .Values.minio.image $) }} + args: + - server + - /storage + env: + # Minio access key and secret key. This must match the S3_ACCESS_KEY_ID and S3_SECRET_ACCESS_KEY declared in /dev/.env. + - name: MINIO_ROOT_USER + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_ACCESS_KEY_ID + - name: MINIO_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_SECRET_ACCESS_KEY + ports: + - containerPort: 9000 + resources: + requests: + memory: "1024Mi" + cpu: "200m" + limits: + memory: "1024Mi" + cpu: "200m" + # Mount the volume into the pod + securityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + volumeMounts: + - name: airbyte-minio-pv-claim # must match the volume name, above + mountPath: "/storage" + {{- with .Values.minio.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.minio.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.minio.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + +--- +apiVersion: v1 +kind: Service +metadata: + name: airbyte-minio-svc + labels: + {{ include "airbyte.minioLabels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-1" +spec: + ports: + - port: 9000 + targetPort: 9000 + protocol: TCP + selector: + {{ include "airbyte.minioSelectorLabels" . | nindent 4 }} +--- +# This pod creates the state-storage bucket in the minio server, +# which the local cloud deployment requires to store its state. +apiVersion: v1 +kind: Pod +metadata: + name: airbyte-minio-create-bucket + annotations: + "helm.sh/hook": post-install, post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation +spec: + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + restartPolicy: OnFailure + securityContext: + fsGroup: 1000 + containers: + - name: minio-mc + image: {{ include "imageUrl" (list .Values.minio.mcImage $) }} + command: ["/bin/sh", "-c", + "until (/usr/bin/mc config host add myminio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY) do echo '...waiting...' && sleep 1; done; + /usr/bin/mc mb --ignore-existing myminio/state-storage; + /usr/bin/mc policy set public myminio/state-storage; + /usr/bin/mc mb --ignore-existing myminio/airbyte-dev-logs; + /usr/bin/mc policy set public myminio/airbyte-dev-logs;"] + securityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + env: + {{- if and (eq (lower (default "" .Values.global.storage.type)) "minio") (((.Values.global).storage).minio) }} + - name: MINIO_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + key: {{ include "airbyte.minioAccessKeyIdSecretKey" .Values.global.storage.minio.accessKeyIdSecretKey }} + - name: MINIO_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} + key: {{ include "airbyte.minioSecretAccessKeySecretKey" .Values.global.storage.minio.secretAccessKeySecretKey }} + {{- else }} + # this is for the internally deployed minio + - name: MINIO_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_ACCESS_KEY_ID + - name: MINIO_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-airbyte-secrets + key: MINIO_SECRET_ACCESS_KEY + {{- end }} + - name: MINIO_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: MINIO_ENDPOINT +{{- end }} diff --git a/airbyte-v1-notused/templates/secret.yaml b/airbyte-v1-notused/templates/secret.yaml new file mode 100644 index 00000000..7d4230d0 --- /dev/null +++ b/airbyte-v1-notused/templates/secret.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Release.Name }}-airbyte-secrets + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-1" + labels: + {{- include "airbyte.labels" . | nindent 4 }} +type: Opaque +stringData: + {{- include "airbyte.database.secrets" . | nindent 2 }} + {{- include "airbyte.storage.secrets" . | nindent 2 }} + {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} + KEYCLOAK_ADMIN_USER: {{ .Values.keycloak.auth.adminUsername | quote }} + KEYCLOAK_ADMIN_PASSWORD: {{ .Values.keycloak.auth.adminPassword | quote }} + {{- end }} + WORKLOAD_API_BEARER_TOKEN: {{ index ".Values.workload-api.bearerToken" | quote }} diff --git a/airbyte-v1-notused/templates/serviceaccount.yaml b/airbyte-v1-notused/templates/serviceaccount.yaml new file mode 100644 index 00000000..7f7acd85 --- /dev/null +++ b/airbyte-v1-notused/templates/serviceaccount.yaml @@ -0,0 +1,77 @@ +{{- if eq .Values.global.deploymentMode "oss" }} +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "airbyte.serviceAccountName" . }} + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-10" + {{- with .Values.serviceAccount.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ include "airbyte.serviceAccountName" . }}-role + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-5" +rules: + - apiGroups: ["*"] +{{- if eq .Values.global.edition "community" }} + resources: ["jobs", "pods", "pods/log", "pods/exec", "pods/attach", "secrets"] +{{- else }} + resources: ["jobs", "pods", "pods/log", "pods/exec", "pods/attach"] +{{- end }} + verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # over-permission for now +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ include "airbyte.serviceAccountName" . }}-binding + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + helm.sh/hook: pre-install + helm.sh/hook-weight: "-3" +roleRef: + apiGroup: "" + kind: Role + name: {{ include "airbyte.serviceAccountName" . }}-role +subjects: + - kind: ServiceAccount + name: {{ include "airbyte.serviceAccountName" . }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + {{- include "airbyte.labels" . | nindent 4 }} + name: node-viewer +rules: + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + {{- include "airbyte.labels" . | nindent 4 }} + name: {{ include "airbyte.serviceAccountName" . }}-admin-node-viewer +subjects: + - kind: ServiceAccount + name: {{ include "airbyte.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: node-viewer + apiGroup: rbac.authorization.k8s.io +{{- end }} +{{- end }} diff --git a/airbyte-v1-notused/templates/tests/test-webapp.yaml b/airbyte-v1-notused/templates/tests/test-webapp.yaml new file mode 100644 index 00000000..8b33ae24 --- /dev/null +++ b/airbyte-v1-notused/templates/tests/test-webapp.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "common.names.fullname" . }}-test-connection" + labels: + {{- include "airbyte.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + {{- if .Values.global.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.global.imagePullSecrets }} + {{- printf "- name: %s" .name | nindent 8 }} + {{- end }} + {{- end }} + containers: + - name: wget + image: {{ include "imageUrl" (list .Values.testWebapp.image $) }} + command: ['wget'] + args: ['{{ .Release.Name }}-airbyte-webapp-svc:{{ .Values.webapp.service.port }}'] + resources: + requests: + memory: "64Mi" + cpu: "100m" + limits: + memory: "128Mi" + cpu: "200m" + restartPolicy: Never diff --git a/airbyte-v1-notused/values.yaml b/airbyte-v1-notused/values.yaml new file mode 100644 index 00000000..cf9fbdd0 --- /dev/null +++ b/airbyte-v1-notused/values.yaml @@ -0,0 +1,2313 @@ +### Airbyte V1 Helm Chart + + +# Global params that are overwritten with umbrella chart +global: + # -- Service Account name override + serviceAccountName: &service-account-name "airbyte-admin" + # -- Deployment mode, whether or not render the default env vars and volumes in deployment spec + deploymentMode: "oss" + # -- Edition; "community" or "pro" + edition: "community" + + airbyteYml: "" + + enterprise: + # -- Secret name where an Airbyte license key is stored + secretName: "airbyte-v1-airbyte-secrets" + # -- The key within `licenseKeySecretName` where the Airbyte license key is stored + licenseKeySecretKey: "license-key" + + # -- The URL where Airbyte will be reached; This should match your Ingress host + airbyteUrl: "" + + # Docker image config that will apply to all images. + image: + # Docker registry to pull platform images from, e.g. http://my-registry:8000/ + registry: "" + # Image tag to use for airbyte images. + # Does not include non-airbyte images such as busybox, temporal, minio, etc. + tag: "1.2.0" + + # Docker image pull secret + imagePullSecrets: + - name: regcred + + # -- Auth configuration + auth: + # -- Whether auth is enabled + enabled: true + # -- Admin user configuration + instanceAdmin: + # -- Secret name where the instanceAdmin configuration is stored + secretName: "airbyte-v1-airbyte-secrets" + # -- The first name of the initial user + firstName: "" + # -- The last name of the initial user + lastName: "" + # -- The key within `emailSecretName` where the initial user's email is stored + emailSecretKey: "instance-admin-email" + # -- The key within `passwordSecretName` where the initial user's password is stored + passwordSecretKey: "instance-admin-password" + + # -- Environment variables + env_vars: {} + + # -- Database configuration + database: + type: "external" # "external" + + # -- Secret name where database credentials are stored + secretName: "airbyte-v1-airbyte-secrets" # e.g. "airbyte-v1-airbyte-secrets" + + # -- The database host + # -- Value will be overriden by TF + host: "airbyte-host" + + # -- The database port + # -- Value will be overriden by TF + port: "3306" + + # -- The database name + database: "airbyte-v1" + + # -- The database user + user: "rds_admin" + + # -- The database password + password: "pwd" + + storage: + # -- The storage backend type. Supports s3, gcs, azure, minio (default) + type: s3 # default storage used + # -- Secret name where storage provider credentials are stored + storageSecretName: "airbyte-v1-airbyte-secrets" + + # S3 + bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. + log: b-multitenantdev-dev-airbyte-v1-logs + state: b-multitenantdev-dev-airbyte-v1-logs + workloadOutput: b-multitenantdev-dev-airbyte-v1-logs + s3: + region: "us-east-1" ## e.g. us-east-1 + authenticationType: credentials ## Use "credentials" or "instanceProfile" + + metrics: + # -- The metric client to configure globally. Supports "otel" + metricClient: "" + # -- The open-telemetry-collector endpoint that metrics will be sent to + otelCollectorEndpoint: "" + + # Jobs resource requests and limits, see http://kubernetes.io/docs/user-guide/compute-resources/ + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. + jobs: + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- Job resource requests + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- Job resource limits + limits: {} + + local: + volume: + enabled: false + + kube: + ## JOB_KUBE_ANNOTATIONS + # pod annotations of the sync job and the default pod annotations fallback for others jobs + # -- key/value annotations applied to kube jobs + annotations: {} + + ## JOB_KUBE_LABELS + ## pod labels of the sync job and the default pod labels fallback for others jobs + # -- key/value labels applied to kube jobs + labels: {} + + ## JOB_KUBE_NODE_SELECTORS + ## pod node selector of the sync job and the default pod node selector fallback for others jobs + # -- Node labels for pod assignment + nodeSelector: {} + + ## JOB_KUBE_TOLERATIONS + # -- Node tolerations for pod assignment + # Any boolean values should be quoted to ensure the value is passed through as a string. + tolerations: [] + + ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET + # -- image pull secret to use for job pod + main_container_image_pull_secret: "regcred" + + images: + ## JOB_KUBE_BUSYBOX_IMAGE + # -- busybox image used by the job pod + busybox: "busybox:1.35" + ## JOB_KUBE_CURL_IMAGE + # -- curl image used by the job pod + curl: "curlimages/curl:8.1.1" + +## @section Common Parameters + +# -- String to partially override airbyte.fullname template with a string (will prepend the release name) +nameOverride: "" +# -- String to fully override airbyte.fullname template with a string +fullnameOverride: "" + +# Pods Service Account, see https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ +serviceAccount: + # -- Specifies whether a ServiceAccount should be created + create: true + # -- Annotations for service account. Evaluated as a template. Only used if `create` is `true`. + annotations: {} + # -- Name of the service account to use. If not set and create is true, a name is generated using the fullname template. + name: *service-account-name + +# -- Sets the AIRBYTE_VERSION environment variable. Defaults to Chart.AppVersion. +## If changing the image tags below, you should probably also update this. +version: "" + +## @section Webapp Parameters + +webapp: + enabled: true + # -- Number of webapp replicas + replicaCount: 1 + + ## webapp.image.repository + ## webapp.image.pullPolicy + ## webapp.image.tag The airbyte webapp image tag. Defaults to the chart's AppVersion + image: + # -- The repository to use for the airbyte webapp image + repository: airbyte/webapp + # -- The pull policy to use for the airbyte webapp image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the webapp pods + podAnnotations: {} + + # -- webapp.podLabels [object] Add extra labels to the webapp pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=101(nginx) + fsGroup: 101 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=101(nginx) + runAsUser: 101 + # gid=101(nginx) + runAsGroup: 101 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Configure extra options for the webapp containers' liveness and readiness probes, + ## see https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + livenessProbe: + # -- Enable livenessProbe on the webapp + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the webapp + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + service: + # -- The service type to use for the webapp service + type: ClusterIP + # -- The service port to expose the webapp on + port: 80 + # -- Annotations for the webapp service resource + annotations: {} + + ## Web app resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the Web container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the Web container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Configure the ingress resource that allows you to access the Airbyte installation. + ## ref: http://kubernetes.io/docs/user-guide/ingress/ + ingress: + # -- Set to true to enable ingress record generation + enabled: true + # -- Specifies ingressClassName for clusters >= 1.18+ + className: "nginx" + # -- Ingress annotations done as key:value pairs + annotations: {} + # kubernetes.io/tls-acme: "true" + # -- The list of hostnames to be covered with this ingress record. + hosts: + - host: + paths: + - path: / + pathType: ImplementationSpecific + # -- Custom ingress TLS configuration + tls: [] + + api: + # -- The webapp API url + url: /api/v1/ + + connector-builder-server: + url: /connector-builder-api + + fullstory: + # -- Whether or not to enable fullstory + enabled: false + + ## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: var-run + ## mountPath: /var/run/ + ## - name: var-cache-nginx + ## mountPath: /var/cache/nginx + ## - mountPath: /etc/nginx/conf.d + ## name: nginx-conf-d + ## + # -- Additional volumeMounts for webapp containers + extraVolumeMounts: [] + + ## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: var-run + ## emptyDir: {} + ## - name: var-cache-nginx + ## emptyDir: {} + ## - name: nginx-conf-d + ## emptyDir: {} + # -- Additional volumes for webapp pods + extraVolumes: [] + + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for server pods + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for server pods + extraInitContainers: [] + + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + +## @section Pod Sweeper parameters + +pod-sweeper: + enabled: true + image: + # -- The image repository to use for the pod sweeper + repository: bitnami/kubectl + # -- The pull policy for the pod sweeper image + pullPolicy: IfNotPresent + # -- The pod sweeper image tag to use + tag: 1.28.9 + + # -- Add extra annotations to the podSweeper pod + podAnnotations: {} + + # -- Add extra labels to the podSweeper pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1001(anon) + fsGroup: 1001 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1001(anon) + runAsUser: 1001 + # gid=1001(anon) + runAsGroup: 1001 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the podSweeper + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 5 + # -- Period seconds for livenessProbe + periodSeconds: 30 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the podSweeper + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 5 + # -- Period seconds for readinessProbe + periodSeconds: 30 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## Pod Sweeper app resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the podSweeper container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the podSweeper container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for pod assignment, see https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Examples: + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for podSweeper container(s). + extraVolumeMounts: [] + + ## Examples: + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for podSweeper pod(s). + extraVolumes: [] + +## @section Server parameters + +server: + enabled: true + # -- Number of server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte server image. + repository: airbyte/server + # -- the pull policy to use for the airbyte server image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the server pods + podAnnotations: {} + + # -- Add extra labels to the server pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Configure extra options for the server containers' liveness and readiness probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the server container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for server pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for server pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at + level: "INFO" + + ## Examples (when using `server.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for server containers + extraVolumeMounts: [] + + ## Examples (when using `server.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for server pods + extraVolumes: [] + + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for server pods + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for server pods + extraInitContainers: [] + + ## Example: (With default env vars and values taken from generated config map) + # extraEnv: + # - name: AIRBYTE_VERSION + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: AIRBYTE_VERSION + # - name: API_URL + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: API_URL + # - name: TRACKING_STRATEGY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: TRACKING_STRATEGY + # - name: FULLSTORY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: FULLSTORY + # - name: INTERNAL_API_HOST + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: INTERNAL_API_HOST + ## + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + +## @section Worker Parameters + +worker: + enabled: true + # -- Number of worker replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte worker image. + repository: airbyte/worker + # -- the pull policy to use for the airbyte worker image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the worker pods + podAnnotations: {} + + # -- Add extra labels to the worker pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the worker + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the worker + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## worker resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + #! -- The resources limits for the worker container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the worker container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for worker pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + #! -- The log level to log at. + level: "INFO" + + ## Example: + ## + ## extraEnv: + ## - name: JOB_KUBE_TOLERATIONS + ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" + # -- Additional env vars for worker pods + extraEnv: [] + + ## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for worker containers + extraVolumeMounts: [] + + ## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for worker pods + extraVolumes: [] + # -- Additional container for worker pods + extraContainers: [] + + hpa: + enabled: false + + debug: + enabled: false + + ## current no exist documentations + activityMaxAttempt: "" + activityInitialDelayBetweenAttemptsSeconds: "" + activityMaxDelayBetweenAttemptsSeconds: "" + maxNotifyWorkers: 5 + +## @section Workload Launcher Parameters + +workload-launcher: + enabled: true + # -- Number of workload launcher replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte workload launcher image. + repository: airbyte/workload-launcher + # -- The pull policy to use for the airbyte workload launcher image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the workload launcher pods + podAnnotations: {} + + # -- Add extra labels to the workload launcher pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the workload launcher + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the workload launcher + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## workload launcher resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the workload launcher container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the workload launcher container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for workload launcher pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # Affinity and anti-affinity for workload launcher pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at + level: "INFO" + + ## Example: + ## + ## extraEnv: + ## - name: JOB_KUBE_TOLERATIONS + ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" + # -- Additional env vars for workload launcher pods + extraEnv: [] + + ## Examples (when using `workload launcher.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for workload launcher containers + extraVolumeMounts: [] + + ## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for workload launcher pods + extraVolumes: [] + + extraContainers: [] + + hpa: + enabled: false + + debug: + enabled: false + + containerOrchestrator: + # -- Enable or disable Orchestrator + enabled: true + # -- Orchestrator image + # This is a template string that will be passed to the "tpl" helper. + image: "airbyte/container-orchestrator:{{ default .Chart.AppVersion .Values.global.image.tag }}" + + connectorSidecar: + # -- Connector Sidecar image + # This is a template string that will be passed to the "tpl" helper. + image: "airbyte/connector-sidecar:{{ default .Chart.AppVersion .Values.global.image.tag }}" + + workloadInit: + # -- Workload init image + # This is a template string that will be passed to the "tpl" helper. + image: "airbyte/workload-init-container:{{ default .Chart.AppVersion .Values.global.image.tag }}" + + ## current no exist documentations + activityMaxAttempt: "" + activityInitialDelayBetweenAttemptsSeconds: "" + activityMaxDelayBetweenAttemptsSeconds: "" + + maxNotifyWorkers: 5 + +## @section Rollout Worker Parameters + +connector-rollout-worker: + enabled: false + # -- Number of connector rollout worker replicas + replicaCount: 2 + + image: + # -- The repository to use for the airbyte connector rollout worker image. + repository: airbyte/connector-rollout-worker + # -- The pull policy to use for the airbyte connector rollout worker image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the connector rollout worker pods + podAnnotations: {} + + # -- Add extra labels to the connector rollout worker pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the connector rollout worker + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the connector rollout worker + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## connector rollout worker resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the connector rollout worker container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the connector rollout worker container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for connector rollout worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # Affinity and anti-affinity for connector rollout worker pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at + level: "INFO" + ## Example: + ## + ## extraEnv: + ## - name: JOB_KUBE_TOLERATIONS + ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" + # -- Additional env vars for connector rollout worker pods + extraEnv: [] + + ## Examples (when using `connector rollout worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for connector rollout worker containers + extraVolumeMounts: [] + + ## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for connector rollout worker pods + extraVolumes: [] + + extraContainers: [] + + hpa: + enabled: false + + debug: + enabled: false + + containerOrchestrator: + # -- Enable or disable Orchestrator + enabled: true + # -- Orchestrator image + image: "" + + ## current no exist documentations + activityMaxAttempt: "" + activityInitialDelayBetweenAttemptsSeconds: "" + activityMaxDelayBetweenAttemptsSeconds: "" + + maxNotifyWorkers: 5 + +## @section Metrics parameters +metrics: + enabled: false + + # -- Number of metrics-reporter replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte metrics-reporter image. + repository: airbyte/metrics-reporter + # -- The pull policy to use for the airbyte metrics-reporter image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the metrics-reporter pod + podAnnotations: {} + + # -- Add extra labels to the metrics-reporter pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## metrics-reporter app resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the metrics-reporter container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the metrics-reporter container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for metrics-reporter pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for metrics-reporter pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Example: + ## + ## extraEnv: + ## - name: SAMPLE_ENV_VAR + ## value: "key=sample-value" + # -- Additional env vars for metrics-reporter pods + extraEnv: [] + + ## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for metrics-reporter containers + extraVolumeMounts: [] + + ## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for metrics-reporter pods + extraVolumes: [] + + extraContainers: [] + + secrets: {} + + env_vars: {} + +## @section Bootloader Parameters + +airbyte-bootloader: + enabled: true + image: + # -- The repository to use for the airbyte bootloader image. + repository: airbyte/bootloader + # -- The pull policy to use for the airbyte bootloader image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the bootloader pod + podAnnotations: {} + + # -- Add extra labels to the bootloader pod + podLabels: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + ## Bootloader resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the airbyte bootloader image + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the airbyte bootloader image + limits: {} + + # -- Affinity and anti-affinity for bootloader pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Example: (With default env vars and values taken from generated config map) + ## extraEnv: + ## - name: AIRBYTE_VERSION + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: AIRBYTE_VERSION + ## - name: DATABASE_HOST + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: DATABASE_HOST + ## - name: DATABASE_PORT + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: DATABASE_PORT + ## - name: DATABASE_PASSWORD + ## valueFrom: + ## secretKeyRef: + ## name: airbyte-secrets + ## key: DATABASE_PASSWORD + ## - name: DATABASE_URL + ## valueFrom: + ## configMapKeyRef: + ## name: airbyte-env + ## key: DATABASE_URL + ## - name: DATABASE_USER + ## valueFrom: + ## secretKeyRef: + ## name: airbyte-secrets + ## key: DATABASE_USER + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for server pod(s) + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for server pods + extraInitContainers: [] + + ## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for server containers + extraVolumeMounts: [] + + ## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for server pods + extraVolumes: [] + +## @section Temporal parameters +## TODO: Move to consuming temporal from a dedicated helm chart + +temporal: + enabled: true + # -- The number of temporal replicas to deploy + replicaCount: 1 + + image: + # -- The temporal image repository to use + repository: temporalio/auto-setup + # -- The pull policy for the temporal image + pullPolicy: IfNotPresent + # -- The temporal image tag to use + tag: "1.23.0" + + service: + # -- The Kubernetes Service Type + type: ClusterIP + # -- The temporal port and exposed kubernetes port + port: 7233 + + # -- Add extra annotations to the temporal pod + podAnnotations: {} + + # -- Add extra labels to the temporal pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(temporal) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(temporal) + runAsUser: 1000 + # gid=1000(temporal) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraInitContainers: + ## - name: config-loader + ## image: temporalio/auto-setup:1.23 + ## command: + ## - /bin/sh + ## - -c + ## - >- + ## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; + ## volumeMounts: + ## - name: config + ## mountPath: /config + # -- Additional InitContainers to initialize the pod + extraInitContainers: [] + + livenessProbe: + # -- Enable livenessProbe on the temporal + enabled: false + + readinessProbe: + # -- Enable readinessProbe on the temporal + enabled: false + + # -- Node labels for temporal pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for temporal pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for temporal pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Example: + ## + ## extraEnv: + ## - name: SAMPLE_ENV_VAR + ## value: "key=sample-value" + # -- Additional env vars for temporal pod(s). + extraEnv: [] + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + ## - name: config + ## mountPath: /etc/temporal/config + # -- Additional volumeMounts for temporal containers + extraVolumeMounts: [] + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + ## - name: config + ## emptyDir: {} + # -- Additional volumes for temporal pods + extraVolumes: [] + + ## Temporal resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for temporal pods + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for temporal pods + limits: {} + + extraContainers: [] + +## @section Temporal parameters +## TODO: Move to consuming temporal from a dedicated helm chart + +temporal-ui: + enabled: false + # -- The number of temporal-ui replicas to deploy + replicaCount: 1 + + image: + # -- The temporal-ui image repository to use + repository: temporalio/ui + # -- The pull policy for the temporal-ui image + pullPolicy: IfNotPresent + tag: "2.30.1" + + service: + # -- The Kubernetes Service Type + type: ClusterIP + # -- The temporal-ui port and exposed kubernetes port + port: 8088 + + # -- Add extra annotations to the temporal-ui pod + podAnnotations: {} + + # -- Add extra labels to the temporal-ui pod + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # gid=1000(temporal-ui) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: false + # uid=1000(temporal-ui) + runAsUser: 0 + # gid=1000(temporal-ui) + runAsGroup: 0 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraInitContainers: + ## - name: config-loader + ## image: temporalio/ui:2.30.1 + ## command: + ## - /bin/sh + ## - -c + ## - >- + ## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; + ## volumeMounts: + ## - name: config + ## mountPath: /config + # -- Additional InitContainers to initialize the pod + extraInitContainers: [] + + livenessProbe: + # -- Enable livenessProbe on the temporal-ui + enabled: false + + readinessProbe: + # -- Enable readinessProbe on the temporal-ui + enabled: false + + # -- Node labels for temporal-ui pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for temporal-ui pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for temporal-ui pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + ## Example: + ## + ## extraEnv: + ## - name: SAMPLE_ENV_VAR + ## value: "key=sample-value" + # -- Additional env vars for temporal-ui pod(s). + extraEnv: [] + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + ## - name: config + ## mountPath: /etc/temporal/config + # -- Additional volumeMounts for temporal containers + extraVolumeMounts: [] + + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + ## - name: config + ## emptyDir: {} + # -- Additional volumes for temporal-ui pods + extraVolumes: [] + + ## Temporal UI resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for temporal-ui pods + requests: {} + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for temporal-ui pods + limits: {} + + extraContainers: [] + +## @section Airbyte Database parameters + +# PostgreSQL chart configuration, see https://github.com/bitnami/charts/blob/master/bitnami/postgresql/values.yaml +postgresql: + # -- Switch to enable or disable the PostgreSQL helm chart + enabled: false + + ## image.repository Repository for airbyte-db statefulset + image: + repository: airbyte/db + # -- Airbyte Postgresql username + postgresqlUsername: airbyte + # -- Airbyte Postgresql password + postgresqlPassword: airbyte + # -- Airbyte Postgresql database + postgresqlDatabase: db-airbyte + # fullnameOverride: *db-hostname + ## This secret is used in case of postgresql.enabled=true and we would like to specify password for newly created postgresql instance + # -- Name of an existing secret containing the PostgreSQL password ('postgresql-password' key) + existingSecret: "" + podSecurityContext: + # gid=70(postgres) + fsGroup: 70 + containerSecurityContext: + # -- Ensures the container will run with a non-root user + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=70(postgres) + runAsUser: 70 + # gid=70(postgres) + runAsGroup: 70 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + commonAnnotations: + # -- It will determine when the hook should be rendered + helm.sh/hook: pre-install + # -- The order in which the hooks are executed. If weight is lower, it has higher priority + helm.sh/hook-weight: "-1" + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for postgresql pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for postgresql pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +# External PostgreSQL configuration, All of these values are only used when postgresql.enabled is set to false +externalDatabase: + # -- Database host + host: "" + # -- non-root Username for Airbyte Database + user: "" + # -- Database password + password: "" + # -- Name of an existing secret resource containing the DB password + existingSecret: "" + # -- Name of an existing secret key containing the DB password + existingSecretPasswordKey: "" + # -- Database name + database: "" + # -- Database port number + port: "" + # -- Database full JDBC URL (ex: jdbc:postgresql://host:port/db?parameters) + jdbcUrl: "" + + +minio: + image: + # -- Minio image used by Minio helm chart + repository: minio/minio + # -- Minio tag image + tag: latest + + mcImage: + repository: minio/minio + tag: latest + + storage: + volumeClaimValue: 500Mi + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + # -- Tolerations for minio pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + + # -- Affinity and anti-affinity for minio pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +## @section cron parameters +cron: + enabled: true + # -- Number of cron replicas + replicaCount: 1 + image: + # -- The repository to use for the airbyte cron image. + repository: airbyte/cron + # -- The pull policy to use for the airbyte cron image + pullPolicy: IfNotPresent + + # -- Add extra annotations to the cron pods + podAnnotations: {} + + # -- Add extra labels to the cron pods + podLabels: {} + + # -- Security context for the container + podSecurityContext: + # uid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the cron + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 1 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the cron + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 1 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## cron resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the cron container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the cron container + requests: {} + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for cron pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for cron pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + log: + # -- The log level to log at. + level: "INFO" + + ## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumeMounts: + ## - name: tmpdir + ## mountPath: /tmp + # -- Additional volumeMounts for cron containers + extraVolumeMounts: [] + + ## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): + ## extraVolumes: + ## - name: tmpdir + ## emptyDir: {} + # -- Additional volumes for cron pods + extraVolumes: [] + + ## Example: + # extraContainers: + # - name: otel_collector + # image: somerepo/someimage:sometag + # args: [ + # "--important-args" + # ] + # ports: + # - containerPort: 443 + # volumeMounts: + # - name: volumeMountCool + # mountPath: /some/path + # readOnly: true + # -- Additional container for cron pods + extraContainers: [] + + ## Example: + # extraInitContainers: + # - name: sleepy + # image: alpine + # command: ['sleep', '60'] + # -- Additional init containers for cron pods + extraInitContainers: [] + + ## Example: (With default env vars and values taken from generated config map) + # extraEnv: + # - name: AIRBYTE_VERSION + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: AIRBYTE_VERSION + # - name: API_URL + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: API_URL + # - name: TRACKING_STRATEGY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: TRACKING_STRATEGY + # - name: FULLSTORY + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: FULLSTORY + # - name: INTERNAL_API_HOST + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: INTERNAL_API_HOST + # -- Supply extra env variables to main container using full notation + extraEnv: [] + ## Example: + ## secrets: + ## DATABASE_PASSWORD: strong-password + ## DATABASE_USER: my-db-user + # -- Supply additional secrets to container + secrets: {} + ## Example: + ## env_vars: + ## DATABASE_HOST: airbyte-db + ## DATABASE_PORT: 5432 + # -- Supply extra env variables to main container using simplified notation + env_vars: {} + +connector-builder-server: + enabled: true + # -- Number of connector-builder-server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte connector-builder-server image. + repository: airbyte/connector-builder-server + # -- The pull policy to use for the airbyte connector-builder-server image + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## connector-builder-server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the connector-builder-server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the connector-builder-server container + requests: {} + + log: + # -- The log level to log at. + level: "INFO" + + env_vars: {} + service: + port: 80 + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +keycloak: + enabled: false + env_vars: {} + + auth: + adminUsername: airbyteAdmin + adminPassword: keycloak123 + + image: + repository: airbyte/keycloak + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=0(root) + fsGroup: 0 + + initContainers: + initDb: + image: "postgres:13-alpine" + + initContainerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=70(postgres) + runAsUser: 70 + # gid=70(postgres) + runAsGroup: 70 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(keycloak) + runAsUser: 1000 + # gid=0(root) + runAsGroup: 0 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +keycloak-setup: + enabled: false + env_vars: {} + + image: + repository: airbyte/keycloak-setup + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + initContainerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # gid=100(curl_user) + runAsUser: 100 + # gid=101(curl_group) + runAsGroup: 101 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + initContainers: + keycloakReadinessCheck: + image: "curlimages/curl:8.1.1" + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + +workload-api-server: + enabled: true + + bearerToken: token + + # -- workload-api-server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte-workload-api-server image. + repository: airbyte/workload-api-server + # -- The pull policy to use for the airbyte-workload-api-server image + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## airbyte-workload-api-server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the airbyte-workload-api-server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the airbyte-workload-api-server container + requests: {} + + log: + # -- The log level at which to log + level: "INFO" + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + env_vars: {} + service: + port: 8007 + + # Configure the ingress resource that allows you to access the Airbyte Workload API, see http://kubernetes.io/docs/user-guide/ingress/ + ingress: + # -- Set to true to enable ingress record generation + enabled: false + # -- Specifies ingressClassName for clusters >= 1.18+ + className: "" + # -- Ingress annotations done as key:value pairs + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + # -- The list of hostnames to be covered with this ingress record + hosts: [] + # - host: localhost + # paths: + # - path: / + # pathType: ImplementationSpecific + # -- Custom ingress TLS configuration + tls: [] + # - secretName: chart-example-tls + # hosts: + # - localhost + +featureflag-server: + enabled: false + + # -- workload-api-server replicas + replicaCount: 1 + + image: + # -- The repository to use for the airbyte-workload-api-server image. + repository: airbyte/featureflag-server + # -- The pull policy to use for the airbyte-workload-api-server image + pullPolicy: IfNotPresent + + # -- Security context for the container + podSecurityContext: + # gid=1000(airbyte) + fsGroup: 1000 + + containerSecurityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + # uid=1000(airbyte) + runAsUser: 1000 + # gid=1000(airbyte) + runAsGroup: 1000 + readOnlyRootFilesystem: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: RuntimeDefault + + livenessProbe: + # -- Enable livenessProbe on the server + enabled: true + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 30 + # -- Period seconds for livenessProbe + periodSeconds: 10 + # -- Timeout seconds for livenessProbe + timeoutSeconds: 10 + # -- Failure threshold for livenessProbe + failureThreshold: 3 + # -- Success threshold for livenessProbe + successThreshold: 1 + + readinessProbe: + # -- Enable readinessProbe on the server + enabled: true + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 10 + # -- Period seconds for readinessProbe + periodSeconds: 10 + # -- Timeout seconds for readinessProbe + timeoutSeconds: 10 + # -- Failure threshold for readinessProbe + failureThreshold: 3 + # -- Success threshold for readinessProbe + successThreshold: 1 + + ## airbyte-workload-api-server resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + resources: + ## Example: + ## limits: + ## cpu: 200m + ## memory: 1Gi + # -- The resources limits for the airbyte-workload-api-server container + limits: {} + ## Examples: + ## requests: + ## memory: 256Mi + ## cpu: 250m + # -- The requested resources for the airbyte-workload-api-server container + requests: {} + + log: + # -- The log level at which to log + level: "INFO" + + # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ + nodeSelector: {} + + # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # -- Affinity and anti-affinity for webapp pod assignment, see + # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + + env_vars: {} + service: + port: 8007 + + # Configure the ingress resource that allows you to access the Airbyte Workload API, see http://kubernetes.io/docs/user-guide/ingress/ + ingress: + # -- Set to true to enable ingress record generation + enabled: false + # -- Specifies ingressClassName for clusters >= 1.18+ + className: "" + # -- Ingress annotations done as key:value pairs + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + # -- The list of hostnames to be covered with this ingress record + hosts: [] + # - host: localhost + # paths: + # - path: / + # pathType: ImplementationSpecific + # -- Custom ingress TLS configuration + tls: [] + # - secretName: chart-example-tls + # hosts: + # - localhost + +testWebapp: + image: + repository: busybox + tag: latest diff --git a/helm/airbyte-v1/Chart.lock b/helm/airbyte-v1/Chart.lock index 1eb0e17d..c0718a1b 100644 --- a/helm/airbyte-v1/Chart.lock +++ b/helm/airbyte-v1/Chart.lock @@ -4,48 +4,48 @@ dependencies: version: 1.17.1 - name: airbyte-bootloader repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: temporal repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: temporal-ui repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: webapp repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: server repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: worker repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: workload-api-server repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: workload-launcher repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: pod-sweeper repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: metrics repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: cron repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: connector-builder-server repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: connector-rollout-worker repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: keycloak repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - name: keycloak-setup repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 -generated: "2024-11-07T16:46:04.022416291Z" + version: 1.3.0 +digest: sha256:f0a8ad517d58f33d56b16654e9b868a981e7dbac7af214473a8f486dc5a2e563 +generated: "2024-12-09T21:59:21.985259637Z" diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index f5114848..17b7630f 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 dependencies: - name: common repository: https://charts.bitnami.com/bitnami @@ -9,64 +9,64 @@ dependencies: - condition: airbyte-bootloader.enabled name: airbyte-bootloader repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: temporal.enabled name: temporal repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: temporal-ui.enabled name: temporal-ui repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: webapp.enabled name: webapp repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: server.enabled name: server repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: worker.enabled name: worker repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: workload-api-server.enabled name: workload-api-server repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: workload-launcher.enabled name: workload-launcher repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: pod-sweeper.enabled name: pod-sweeper repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: metrics.enabled name: metrics repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: cron.enabled name: cron repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: connector-builder-server.enabled name: connector-builder-server repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: connector-rollout-worker.enabled name: connector-rollout-worker repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: keycloak.enabled name: keycloak repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 - condition: keycloak-setup.enabled name: keycloak-setup repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 + version: 1.3.0 description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.0.2" +version: "v1.3.0" diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock new file mode 100644 index 00000000..fb39f2dc --- /dev/null +++ b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:11.238826963Z" diff --git a/helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml index fafc79c4..1c903e66 100644 --- a/helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml +++ b/helm/airbyte-v1/charts/airbyte-bootloader/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-bootloader name: airbyte-bootloader type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/connector-builder-server/Chart.lock b/helm/airbyte-v1/charts/connector-builder-server/Chart.lock new file mode 100644 index 00000000..746fb41b --- /dev/null +++ b/helm/airbyte-v1/charts/connector-builder-server/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:15.123937677Z" diff --git a/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml b/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml index 47813507..a4e8f766 100644 --- a/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml +++ b/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-connector-builder-server name: connector-builder-server type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock new file mode 100644 index 00000000..9778a41b --- /dev/null +++ b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-12-09T21:57:06.251315255Z" diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml index 38d167fd..4c69c7f3 100644 --- a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml +++ b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-connector-rollout-worker name: connector-rollout-worker type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/cron/Chart.lock b/helm/airbyte-v1/charts/cron/Chart.lock new file mode 100644 index 00000000..435017d8 --- /dev/null +++ b/helm/airbyte-v1/charts/cron/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-25T16:47:38.253767-04:00" diff --git a/helm/airbyte-v1/charts/cron/Chart.yaml b/helm/airbyte-v1/charts/cron/Chart.yaml index 6db7eefd..09559008 100644 --- a/helm/airbyte-v1/charts/cron/Chart.yaml +++ b/helm/airbyte-v1/charts/cron/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-cron name: cron type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/keycloak-setup/Chart.lock b/helm/airbyte-v1/charts/keycloak-setup/Chart.lock new file mode 100644 index 00000000..991eab27 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak-setup/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-12-09T21:57:21.272173303Z" diff --git a/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml b/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml index a4eff29e..cab564c4 100644 --- a/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml +++ b/helm/airbyte-v1/charts/keycloak-setup/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-keycloak-setup name: keycloak-setup type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/keycloak/Chart.lock b/helm/airbyte-v1/charts/keycloak/Chart.lock new file mode 100644 index 00000000..cdb6f491 --- /dev/null +++ b/helm/airbyte-v1/charts/keycloak/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-12-09T21:57:13.706413758Z" diff --git a/helm/airbyte-v1/charts/keycloak/Chart.yaml b/helm/airbyte-v1/charts/keycloak/Chart.yaml index 5641e569..6be65627 100644 --- a/helm/airbyte-v1/charts/keycloak/Chart.yaml +++ b/helm/airbyte-v1/charts/keycloak/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 dependencies: - name: common repository: https://charts.bitnami.com/bitnami @@ -9,4 +9,4 @@ dependencies: description: Helm chart to deploy airbyte-keycloak name: keycloak type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/metrics/Chart.lock b/helm/airbyte-v1/charts/metrics/Chart.lock new file mode 100644 index 00000000..017faffa --- /dev/null +++ b/helm/airbyte-v1/charts/metrics/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-08-31T12:09:18.473209+01:00" diff --git a/helm/airbyte-v1/charts/metrics/Chart.yaml b/helm/airbyte-v1/charts/metrics/Chart.yaml index 84bf0611..a5127075 100644 --- a/helm/airbyte-v1/charts/metrics/Chart.yaml +++ b/helm/airbyte-v1/charts/metrics/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-metrics name: metrics type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/pod-sweeper/Chart.lock b/helm/airbyte-v1/charts/pod-sweeper/Chart.lock new file mode 100644 index 00000000..5fdb23f1 --- /dev/null +++ b/helm/airbyte-v1/charts/pod-sweeper/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:27.057672332Z" diff --git a/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml b/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml index 919123a9..bc63323e 100644 --- a/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml +++ b/helm/airbyte-v1/charts/pod-sweeper/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-pod-sweeper name: pod-sweeper type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/server/Chart.lock b/helm/airbyte-v1/charts/server/Chart.lock new file mode 100644 index 00000000..746fb41b --- /dev/null +++ b/helm/airbyte-v1/charts/server/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:15.123937677Z" diff --git a/helm/airbyte-v1/charts/server/Chart.yaml b/helm/airbyte-v1/charts/server/Chart.yaml index e5ada841..f3dbb6e0 100644 --- a/helm/airbyte-v1/charts/server/Chart.yaml +++ b/helm/airbyte-v1/charts/server/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-server name: server type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/temporal-ui/Chart.lock b/helm/airbyte-v1/charts/temporal-ui/Chart.lock new file mode 100644 index 00000000..19b1aca9 --- /dev/null +++ b/helm/airbyte-v1/charts/temporal-ui/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-12-09T21:57:43.35443455Z" diff --git a/helm/airbyte-v1/charts/temporal-ui/Chart.yaml b/helm/airbyte-v1/charts/temporal-ui/Chart.yaml index 590c8b4b..9e6cdc0b 100644 --- a/helm/airbyte-v1/charts/temporal-ui/Chart.yaml +++ b/helm/airbyte-v1/charts/temporal-ui/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-temporal-ui name: temporal-ui type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/temporal/Chart.lock b/helm/airbyte-v1/charts/temporal/Chart.lock new file mode 100644 index 00000000..4deb970e --- /dev/null +++ b/helm/airbyte-v1/charts/temporal/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:19.234598793Z" diff --git a/helm/airbyte-v1/charts/temporal/Chart.yaml b/helm/airbyte-v1/charts/temporal/Chart.yaml index 468bee38..f0d84631 100644 --- a/helm/airbyte-v1/charts/temporal/Chart.yaml +++ b/helm/airbyte-v1/charts/temporal/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-temporal name: temporal type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/temporal/templates/deployment.yaml b/helm/airbyte-v1/charts/temporal/templates/deployment.yaml index 83643ecd..8db977aa 100644 --- a/helm/airbyte-v1/charts/temporal/templates/deployment.yaml +++ b/helm/airbyte-v1/charts/temporal/templates/deployment.yaml @@ -71,15 +71,13 @@ spec: {{- if eq .Values.global.database.type "external" }} # Assume an external database requires SSL. - name: POSTGRES_TLS_ENABLED - value: "false" + value: "true" - name: POSTGRES_TLS_DISABLE_HOST_VERIFICATION - value: "false" + value: "true" - name: SQL_TLS_ENABLED - value: "false" + value: "true" - name: SQL_TLS_DISABLE_HOST_VERIFICATION - value: "false" - - name: SQL_SSL_MODE - value: "disable" + value: "true" {{- end }} {{- if .Values.extraEnv }} diff --git a/helm/airbyte-v1/charts/webapp/Chart.lock b/helm/airbyte-v1/charts/webapp/Chart.lock new file mode 100644 index 00000000..6d8b135d --- /dev/null +++ b/helm/airbyte-v1/charts/webapp/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:23.164183749Z" diff --git a/helm/airbyte-v1/charts/webapp/Chart.yaml b/helm/airbyte-v1/charts/webapp/Chart.yaml index 61c9c6d9..7cd62e56 100644 --- a/helm/airbyte-v1/charts/webapp/Chart.yaml +++ b/helm/airbyte-v1/charts/webapp/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-webapp name: webapp type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/worker/Chart.lock b/helm/airbyte-v1/charts/worker/Chart.lock new file mode 100644 index 00000000..7000cfe2 --- /dev/null +++ b/helm/airbyte-v1/charts/worker/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2022-10-17T18:35:31.130386898Z" diff --git a/helm/airbyte-v1/charts/worker/Chart.yaml b/helm/airbyte-v1/charts/worker/Chart.yaml index 7af3b504..1625f982 100644 --- a/helm/airbyte-v1/charts/worker/Chart.yaml +++ b/helm/airbyte-v1/charts/worker/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-worker name: worker type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/workload-api-server/Chart.lock b/helm/airbyte-v1/charts/workload-api-server/Chart.lock new file mode 100644 index 00000000..d174ec61 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-api-server/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2023-11-02T09:27:52.217541-07:00" diff --git a/helm/airbyte-v1/charts/workload-api-server/Chart.yaml b/helm/airbyte-v1/charts/workload-api-server/Chart.yaml index f63ba3ff..b7dc7d1f 100644 --- a/helm/airbyte-v1/charts/workload-api-server/Chart.yaml +++ b/helm/airbyte-v1/charts/workload-api-server/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy the workload-api service name: workload-api-server type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/workload-launcher/Chart.lock b/helm/airbyte-v1/charts/workload-launcher/Chart.lock new file mode 100644 index 00000000..13ffbcf4 --- /dev/null +++ b/helm/airbyte-v1/charts/workload-launcher/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.17.1 +digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 +generated: "2024-12-09T21:57:35.922522213Z" diff --git a/helm/airbyte-v1/charts/workload-launcher/Chart.yaml b/helm/airbyte-v1/charts/workload-launcher/Chart.yaml index 3f26dadb..83cd8391 100644 --- a/helm/airbyte-v1/charts/workload-launcher/Chart.yaml +++ b/helm/airbyte-v1/charts/workload-launcher/Chart.yaml @@ -1,6 +1,12 @@ apiVersion: v2 -appVersion: 1.2.0 +appVersion: 1.3.0 +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x description: Helm chart to deploy airbyte-workload-launcher name: workload-launcher type: application -version: 1.2.0 +version: 1.3.0 diff --git a/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml b/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml index 533d08f4..ce0dfa93 100644 --- a/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml +++ b/helm/airbyte-v1/charts/workload-launcher/templates/deployment.yaml @@ -16,7 +16,7 @@ spec: {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} {{- end }} strategy: - type: RollingUpdate + type: Recreate template: metadata: labels: diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml index bfbeea2b..99f85ae9 100644 --- a/helm/airbyte-v1/templates/env-configmap.yaml +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -1,5 +1,4 @@ -{{- $airbyteYmlDict := (default "" .Values.global.airbyteYml | fromYaml) }} -# default to empty dict if airbyteYml is undefined +{{- $airbyteYmlDict := (default "" .Values.global.airbyteYml | fromYaml) }} # default to empty dict if airbyteYml is undefined apiVersion: v1 kind: ConfigMap metadata: diff --git a/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml index 92214675..acdc1f93 100644 --- a/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml +++ b/helm/airbyte-v1/templates/gcs-log-creds-secret.yaml @@ -4,8 +4,8 @@ (not .Values.global.storage.secretName) (not .Values.global.storage.storageSecretName) }} -{{- $gcsConfig := required "You must set 'global.storage.gcs' when setting 'global.storage.type' to 'gcs'" .Values.global.storage.gcs }} -{{- $credentialsJson := required "You must set 'global.storage.gcs.credentialsJson' when 'global.storage.secretName' is not set" .Values.global.storage.gcs.credentialsJson }} +{{ $gcsConfig := required "You must set 'global.storage.gcs' when setting 'global.storage.type' to 'gcs'" .Values.global.storage.gcs }} +{{ $credentialsJson := required "You must set 'global.storage.gcs.credentialsJson' when 'global.storage.secretName' is not set" .Values.global.storage.gcs.credentialsJson }} apiVersion: v1 kind: Secret metadata: @@ -14,5 +14,5 @@ metadata: {{- include "airbyte.labels" . | nindent 4 }} type: Opaque data: - gcp.json: {{ $credentialsJson | default "" | quote }} + gcp.json: {{ $credentialsJson | default "" | quote }} {{- end }} diff --git a/helm/airbyte-v1/templates/minio.yaml b/helm/airbyte-v1/templates/minio.yaml index a47ea4e2..4c6bd8cb 100644 --- a/helm/airbyte-v1/templates/minio.yaml +++ b/helm/airbyte-v1/templates/minio.yaml @@ -53,11 +53,11 @@ spec: - containerPort: 9000 resources: requests: - memory: "1024Mi" - cpu: "200m" + memory: {{ .Values.minio.resources.requests.memory }} + cpu: {{ .Values.minio.resources.requests.cpu }} limits: - memory: "1024Mi" - cpu: "200m" + memory: {{ .Values.minio.resources.limits.memory }} + cpu: {{ .Values.minio.resources.limits.cpu }} # Mount the volume into the pod securityContext: allowPrivilegeEscalation: false diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index cf9fbdd0..57f115cb 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -14,7 +14,7 @@ global: enterprise: # -- Secret name where an Airbyte license key is stored - secretName: "airbyte-v1-airbyte-secrets" + secretName: "airbyte-config-secrets" # -- The key within `licenseKeySecretName` where the Airbyte license key is stored licenseKeySecretKey: "license-key" @@ -27,11 +27,11 @@ global: registry: "" # Image tag to use for airbyte images. # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "1.2.0" + tag: "1.3.0" # Docker image pull secret imagePullSecrets: - - name: regcred + - name: regcred # -- Auth configuration auth: @@ -40,7 +40,7 @@ global: # -- Admin user configuration instanceAdmin: # -- Secret name where the instanceAdmin configuration is stored - secretName: "airbyte-v1-airbyte-secrets" + secretName: "airbyte-config-secrets" # -- The first name of the initial user firstName: "" # -- The last name of the initial user @@ -49,6 +49,23 @@ global: emailSecretKey: "instance-admin-email" # -- The key within `passwordSecretName` where the initial user's password is stored passwordSecretKey: "instance-admin-password" + + # -- SSO Identify Provider configuration; (requires Enterprise) + #identityProvider: + # # -- Secret name where the OIDC configuration is stored + # secretName: "airbyte-config-secrets" + # # -- The identity provider type (e.g. oidc) + # type: "" + # # -- OIDC configuration (required if `auth.identityProvider.type` is "oidc") + # oidc: + # # -- OIDC application domain + # domain: "" + # # -- OIDC application name + # appName: "" + # # -- The key within `clientIdSecretName` where the OIDC client id is stored + # clientIdSecretKey: "client-id" + # # -- The key within `clientSecretSecretName` where the OIDC client secret is stored + # clientSecretSecretKey: "client-secret" # -- Environment variables env_vars: {} @@ -58,14 +75,12 @@ global: type: "external" # "external" # -- Secret name where database credentials are stored - secretName: "airbyte-v1-airbyte-secrets" # e.g. "airbyte-v1-airbyte-secrets" + secretName: "airbyte-config-secrets" # -- The database host - # -- Value will be overriden by TF host: "airbyte-host" # -- The database port - # -- Value will be overriden by TF port: "3306" # -- The database name @@ -73,15 +88,21 @@ global: # -- The database user user: "rds_admin" + # -- The key within `secretName` where the user is stored + #userSecretKey: "" # e.g. "database-user" # -- The database password password: "pwd" + # -- The key within `secretName` where the password is stored + #passwordSecretKey: "" # e.g."database-password" + + storage: # -- The storage backend type. Supports s3, gcs, azure, minio (default) type: s3 # default storage used # -- Secret name where storage provider credentials are stored - storageSecretName: "airbyte-v1-airbyte-secrets" + storageSecretName: "airbyte-config-secrets" # S3 bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. @@ -92,6 +113,25 @@ global: region: "us-east-1" ## e.g. us-east-1 authenticationType: credentials ## Use "credentials" or "instanceProfile" + # GCS + #bucket: ## GCS bucket names that you've created. We recommend storing the following all in one bucket. + # log: airbyte-bucket + # state: airbyte-bucket + # workloadOutput: airbyte-bucket + #gcs: + # projectId: + # credentialsJson: /secrets/gcs-log-creds/gcp.json + + # Azure + #bucket: ## Azure Blob Storage container names that you've created. We recommend storing the following all in one bucket. + # log: airbyte-bucket + # state: airbyte-bucket + # workloadOutput: airbyte-bucket + #azure: + # # one of the following: connectionString, connectionStringSecretKey + # connectionString: + # connectionStringSecretKey: + metrics: # -- The metric client to configure globally. Supports "otel" metricClient: "" @@ -144,7 +184,7 @@ global: ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET # -- image pull secret to use for job pod - main_container_image_pull_secret: "regcred" + main_container_image_pull_secret: "" images: ## JOB_KUBE_BUSYBOX_IMAGE @@ -198,16 +238,13 @@ webapp: # -- Security context for the container podSecurityContext: - # gid=101(nginx) - fsGroup: 101 + fsGroup: 1000 containerSecurityContext: allowPrivilegeEscalation: false runAsNonRoot: true - # uid=101(nginx) - runAsUser: 101 - # gid=101(nginx) - runAsGroup: 101 + runAsUser: 1000 + runAsGroup: 1000 readOnlyRootFilesystem: false capabilities: drop: ["ALL"] @@ -291,6 +328,7 @@ webapp: className: "nginx" # -- Ingress annotations done as key:value pairs annotations: {} + # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" # -- The list of hostnames to be covered with this ingress record. hosts: @@ -300,6 +338,9 @@ webapp: pathType: ImplementationSpecific # -- Custom ingress TLS configuration tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local api: # -- The webapp API url @@ -359,6 +400,32 @@ webapp: # -- Additional init containers for server pods extraInitContainers: [] + ## Example: (With default env vars and values taken from generated config map) + # extraEnv: + # - name: POSTGRES_USER + # valueFrom: + # secretKeyRef: + # name: airbyte-secrets + # key: DATABASE_USER + # - name: POSTGRES_PWD + # valueFrom: + # secretKeyRef: + # name: airbyte-secrets + # key: DATABASE_PASSWORD + # - name: DYNAMIC_CONFIG_FILE_PATH + # value: "config/dynamicconfig/development.yaml" + # - name: DB + # value: "postgresql" + # - name: DB_PORT + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: DATABASE_PORT + # - name: POSTGRES_SEEDS + # valueFrom: + # configMapKeyRef: + # name: airbyte-env + # key: DATABASE_HOST # -- Supply extra env variables to main container using full notation extraEnv: [] ## Example: @@ -395,16 +462,13 @@ pod-sweeper: # -- Security context for the container podSecurityContext: - # gid=1001(anon) - fsGroup: 1001 + fsGroup: 1000 containerSecurityContext: allowPrivilegeEscalation: false runAsNonRoot: true - # uid=1001(anon) - runAsUser: 1001 - # gid=1001(anon) - runAsGroup: 1001 + runAsUser: 1000 + runAsGroup: 1000 readOnlyRootFilesystem: false capabilities: drop: ["ALL"] @@ -957,7 +1021,7 @@ workload-launcher: connector-rollout-worker: enabled: false # -- Number of connector rollout worker replicas - replicaCount: 2 + replicaCount: 1 image: # -- The repository to use for the airbyte connector rollout worker image. @@ -1050,6 +1114,7 @@ connector-rollout-worker: log: # -- The log level to log at level: "INFO" + ## Example: ## ## extraEnv: @@ -1423,6 +1488,7 @@ temporal: ## value: "key=sample-value" # -- Additional env vars for temporal pod(s). extraEnv: [] + ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): ## extraVolumeMounts: ## - name: tmpdir @@ -1594,7 +1660,7 @@ temporal-ui: # PostgreSQL chart configuration, see https://github.com/bitnami/charts/blob/master/bitnami/postgresql/values.yaml postgresql: # -- Switch to enable or disable the PostgreSQL helm chart - enabled: false + enabled: true ## image.repository Repository for airbyte-db statefulset image: @@ -1657,19 +1723,18 @@ externalDatabase: database: "" # -- Database port number port: "" - # -- Database full JDBC URL (ex: jdbc:postgresql://host:port/db?parameters) + # -- Database full JDBL URL (ex: jdbc:postgresql://host:port/db?parameters) jdbcUrl: "" - minio: image: - # -- Minio image used by Minio helm chart + # -- Minio image used by Minio helm chart repository: minio/minio # -- Minio tag image - tag: latest + tag: RELEASE.2023-11-20T22-40-07Z mcImage: - repository: minio/minio + repository: airbyte/mc tag: latest storage: @@ -1687,6 +1752,13 @@ minio: # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity affinity: {} + resources: + requests: + memory: 1Gi + cpu: 250m + limits: + cpu: 300m + memory: 2Gi ## @section cron parameters cron: enabled: true @@ -1973,8 +2045,7 @@ keycloak: # -- Security context for the container podSecurityContext: - # gid=0(root) - fsGroup: 0 + fsGroup: 1000 initContainers: initDb: @@ -1983,10 +2054,8 @@ keycloak: initContainerSecurityContext: allowPrivilegeEscalation: false runAsNonRoot: true - # uid=70(postgres) - runAsUser: 70 - # gid=70(postgres) - runAsGroup: 70 + runAsUser: 1000 + runAsGroup: 1000 readOnlyRootFilesystem: false capabilities: drop: ["ALL"] @@ -1996,10 +2065,8 @@ keycloak: containerSecurityContext: allowPrivilegeEscalation: false runAsNonRoot: true - # uid=1000(keycloak) runAsUser: 1000 - # gid=0(root) - runAsGroup: 0 + runAsGroup: 1000 readOnlyRootFilesystem: false capabilities: drop: ["ALL"] @@ -2032,10 +2099,8 @@ keycloak-setup: initContainerSecurityContext: allowPrivilegeEscalation: false runAsNonRoot: true - # gid=100(curl_user) - runAsUser: 100 - # gid=101(curl_group) - runAsGroup: 101 + runAsUser: 1000 + runAsGroup: 1000 readOnlyRootFilesystem: false capabilities: drop: ["ALL"] @@ -2179,7 +2244,7 @@ workload-api-server: # kubernetes.io/tls-acme: "true" # -- The list of hostnames to be covered with this ingress record hosts: [] - # - host: localhost + # - host: chart-example.local # paths: # - path: / # pathType: ImplementationSpecific @@ -2187,7 +2252,7 @@ workload-api-server: tls: [] # - secretName: chart-example-tls # hosts: - # - localhost + # - chart-example.local featureflag-server: enabled: false @@ -2297,7 +2362,7 @@ featureflag-server: # kubernetes.io/tls-acme: "true" # -- The list of hostnames to be covered with this ingress record hosts: [] - # - host: localhost + # - host: chart-example.local # paths: # - path: / # pathType: ImplementationSpecific @@ -2305,7 +2370,7 @@ featureflag-server: tls: [] # - secretName: chart-example-tls # hosts: - # - localhost + # - chart-example.local testWebapp: image: From b334dc2657c4111fe3df8cd4842485b757f0d1f2 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Mon, 30 Dec 2024 10:16:48 +0100 Subject: [PATCH 50/69] update kube secret --- helm/airbyte-v1/values.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 57f115cb..d8f01d7f 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -14,7 +14,7 @@ global: enterprise: # -- Secret name where an Airbyte license key is stored - secretName: "airbyte-config-secrets" + secretName: "airbyte-v1-airbyte-secrets" # -- The key within `licenseKeySecretName` where the Airbyte license key is stored licenseKeySecretKey: "license-key" @@ -40,7 +40,7 @@ global: # -- Admin user configuration instanceAdmin: # -- Secret name where the instanceAdmin configuration is stored - secretName: "airbyte-config-secrets" + secretName: "airbyte-v1-airbyte-secrets" # -- The first name of the initial user firstName: "" # -- The last name of the initial user @@ -53,7 +53,7 @@ global: # -- SSO Identify Provider configuration; (requires Enterprise) #identityProvider: # # -- Secret name where the OIDC configuration is stored - # secretName: "airbyte-config-secrets" + # secretName: "airbyte-v1-airbyte-secrets" # # -- The identity provider type (e.g. oidc) # type: "" # # -- OIDC configuration (required if `auth.identityProvider.type` is "oidc") @@ -75,7 +75,7 @@ global: type: "external" # "external" # -- Secret name where database credentials are stored - secretName: "airbyte-config-secrets" + secretName: "airbyte-v1-airbyte-secrets" # -- The database host host: "airbyte-host" @@ -102,7 +102,7 @@ global: # -- The storage backend type. Supports s3, gcs, azure, minio (default) type: s3 # default storage used # -- Secret name where storage provider credentials are stored - storageSecretName: "airbyte-config-secrets" + storageSecretName: "airbyte-v1-airbyte-secrets" # S3 bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. From b896d22613e52875d43d963db92e0ad341e7240c Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Mon, 30 Dec 2024 10:23:12 +0100 Subject: [PATCH 51/69] update helm chart airbyte v1.3.1 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 17b7630f..3ccdbf9c 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.0" +version: "v1.3.1" From 88bacdc65747bb07a2e8e670e0a72743cfe53503 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Mon, 30 Dec 2024 10:34:58 +0100 Subject: [PATCH 52/69] update helm chart airbyte v1.3.2 --- helm/airbyte-v1/templates/_database.tpl | 2 +- helm/airbyte-v1/values.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/templates/_database.tpl b/helm/airbyte-v1/templates/_database.tpl index fd0e5ef8..3e8d567d 100644 --- a/helm/airbyte-v1/templates/_database.tpl +++ b/helm/airbyte-v1/templates/_database.tpl @@ -25,7 +25,7 @@ Renders an environment variable definition that provides the database host name: {{ .Release.Name }}-airbyte-env key: DATABASE_HOST {{- end }} - + {{/* Renders the database port */}} diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index d8f01d7f..5564fdf7 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -1660,7 +1660,7 @@ temporal-ui: # PostgreSQL chart configuration, see https://github.com/bitnami/charts/blob/master/bitnami/postgresql/values.yaml postgresql: # -- Switch to enable or disable the PostgreSQL helm chart - enabled: true + enabled: false ## image.repository Repository for airbyte-db statefulset image: From ffa25b6baabd9411c405949def951ce93b5222e6 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Mon, 30 Dec 2024 10:38:18 +0100 Subject: [PATCH 53/69] update helm chart airbyte v1.3.2 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 3ccdbf9c..ad5b3320 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.1" +version: "v1.3.2" From f53fcdd261e3690a621ff58e250be30f1f287e91 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Wed, 8 Jan 2025 11:02:54 +0100 Subject: [PATCH 54/69] Add blotout vars to configmap --- helm/airbyte-v1/Chart.yaml | 2 +- helm/airbyte-v1/templates/env-configmap.yaml | 8 +++++++- helm/airbyte-v1/values.yaml | 10 ++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index ad5b3320..ac8a7481 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.2" +version: "v1.3.3" diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml index 99f85ae9..41a5ca76 100644 --- a/helm/airbyte-v1/templates/env-configmap.yaml +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -1,4 +1,5 @@ -{{- $airbyteYmlDict := (default "" .Values.global.airbyteYml | fromYaml) }} # default to empty dict if airbyteYml is undefined +{{- $airbyteYmlDict := (default "" .Values.global.airbyteYml | fromYaml) }} +# default to empty dict if airbyteYml is undefined apiVersion: v1 kind: ConfigMap metadata: @@ -22,6 +23,11 @@ data: AIRBYTE_URL: {{ .Values.global.airbyteUrl | quote }} {{- end }} + BLOTOUT_AUTH_ENDPOINT: {{ .Values.global.blotout_auth_endpoint | default "" | quote }} + BLOTOUT_BASE_URL: {{ .Values.global.blotout_base_url | default "" }} + AWS_SECRET_ACCESS_KEY: {{ .Values.global.aws_secret_key | default "" }} + AWS_ACCESS_KEY_ID: {{ .Values.global.aws_access_key | default "" | quote }} + AIRBYTE_SERVER_HOST: {{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} API_URL: {{ .Values.webapp.api.url }} CONNECTOR_BUILDER_API_URL: {{ index .Values.webapp "connector-builder-server" "url" | quote }} diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 5564fdf7..5c0cb8f7 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -10,6 +10,13 @@ global: # -- Edition; "community" or "pro" edition: "community" + # --AWS keys + aws_access_key: "" + aws_secret_key: "" + # -- Blotout configuration + blotout_auth_endpoint: "/api/v1/auth/validation" + blotout_base_url: "" + # -- Airbyte configuration airbyteYml: "" enterprise: @@ -112,6 +119,9 @@ global: s3: region: "us-east-1" ## e.g. us-east-1 authenticationType: credentials ## Use "credentials" or "instanceProfile" + accessKeyIdSecretKey: "" + secretAccessKeySecretKey: "" + # GCS #bucket: ## GCS bucket names that you've created. We recommend storing the following all in one bucket. From fc807c04c8b6de8f512d3ab6a34b66d76d4230f6 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Wed, 8 Jan 2025 13:00:50 +0100 Subject: [PATCH 55/69] Add vars for aws keys --- helm/airbyte-v1/values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 5c0cb8f7..1338d8f6 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -119,8 +119,8 @@ global: s3: region: "us-east-1" ## e.g. us-east-1 authenticationType: credentials ## Use "credentials" or "instanceProfile" - accessKeyIdSecretKey: "" - secretAccessKeySecretKey: "" + accessKeyId: "" + secretAccessKey: "" # GCS From 8cccebcd28ebe9fe3ce35601365f79f7c35b94b2 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Wed, 8 Jan 2025 13:32:54 +0100 Subject: [PATCH 56/69] Add more vars to cmp of airbyte-v1 --- helm/airbyte-v1/Chart.yaml | 2 +- helm/airbyte-v1/templates/env-configmap.yaml | 10 ++++++++++ helm/airbyte-v1/values.yaml | 7 ++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index ac8a7481..82c4f2a5 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.3" +version: "v1.3.4" diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml index 41a5ca76..bf615ae8 100644 --- a/helm/airbyte-v1/templates/env-configmap.yaml +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -23,10 +23,20 @@ data: AIRBYTE_URL: {{ .Values.global.airbyteUrl | quote }} {{- end }} +### Env vars requested by the Blotout team BLOTOUT_AUTH_ENDPOINT: {{ .Values.global.blotout_auth_endpoint | default "" | quote }} BLOTOUT_BASE_URL: {{ .Values.global.blotout_base_url | default "" }} AWS_SECRET_ACCESS_KEY: {{ .Values.global.aws_secret_key | default "" }} AWS_ACCESS_KEY_ID: {{ .Values.global.aws_access_key | default "" | quote }} + JOB_MAIN_CONTAINER_CPU_REQUEST: {{ .Values.global.resource_cpu_request | default "0.5" }} + JOB_MAIN_CONTAINER_CPU_LIMIT: {{ .Values.global.resource_cpu_limit | default "2" }} + JOB_MAIN_CONTAINER_MEMORY_REQUEST: {{ .Values.global.resource_memory_request | default "1Gi" }} + JOB_MAIN_CONTAINER_MEMORY_LIMIT: {{ .Values.global.resource_memory_limit | default "2Gi" }} + SECRET_PERSISTENCE: {{ .Values.global.secret_persistence | default "" }} + S3_PATH_STYLE_ACCESS: {{ .Values.global.s3_path_style_access | default "" }} + +##################################################### + AIRBYTE_SERVER_HOST: {{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} API_URL: {{ .Values.webapp.api.url }} diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 1338d8f6..665f47c2 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -13,9 +13,14 @@ global: # --AWS keys aws_access_key: "" aws_secret_key: "" - # -- Blotout configuration + # -- Blotout required configuration blotout_auth_endpoint: "/api/v1/auth/validation" blotout_base_url: "" + resource_cpu_limit: "2" + resource_cpu_request: "0.5" + resource_memory_limit: "6Gi" + resource_memory_request: "1Gi" + # -- Airbyte configuration airbyteYml: "" From 548b8ac481256c414a888e59720eedeb0d91f7b0 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Wed, 8 Jan 2025 20:23:19 +0100 Subject: [PATCH 57/69] Cleanup unused airbyte-v1 dir --- airbyte-1.3.0.tgz | Bin 346882 -> 0 bytes airbyte-v1-notused/.helmignore | 26 - airbyte-v1-notused/Chart.lock | 51 - airbyte-v1-notused/Chart.yaml | 72 - .../charts/airbyte-bootloader-1.2.0.tgz | Bin 19006 -> 0 bytes .../charts/airbyte-bootloader/.gitignore | 2 - .../charts/airbyte-bootloader/Chart.yaml | 6 - .../charts/airbyte-bootloader/README.md | 47 - .../airbyte-bootloader/templates/_helpers.tpl | 51 - .../airbyte-bootloader/templates/_images.tpl | 17 - .../templates/bootloader-secrets.yaml | 18 - .../airbyte-bootloader/templates/pod.yaml | 130 - .../charts/airbyte-bootloader/values.yaml | 189 -- airbyte-v1-notused/charts/common-1.17.1.tgz | Bin 14611 -> 0 bytes airbyte-v1-notused/charts/common/.helmignore | 22 - airbyte-v1-notused/charts/common/Chart.yaml | 23 - airbyte-v1-notused/charts/common/README.md | 350 --- .../charts/common/templates/_affinities.tpl | 102 - .../charts/common/templates/_capabilities.tpl | 154 -- .../charts/common/templates/_errors.tpl | 23 - .../charts/common/templates/_images.tpl | 75 - .../charts/common/templates/_ingress.tpl | 68 - .../charts/common/templates/_labels.tpl | 18 - .../charts/common/templates/_names.tpl | 70 - .../charts/common/templates/_secrets.tpl | 140 - .../charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../charts/common/templates/_utils.tpl | 62 - .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 - .../common/templates/validations/_mariadb.tpl | 103 - .../common/templates/validations/_mongodb.tpl | 108 - .../common/templates/validations/_mysql.tpl | 103 - .../templates/validations/_postgresql.tpl | 129 - .../common/templates/validations/_redis.tpl | 76 - .../templates/validations/_validations.tpl | 46 - airbyte-v1-notused/charts/common/values.yaml | 5 - .../charts/connector-builder-server-1.2.0.tgz | Bin 19500 -> 0 bytes .../connector-builder-server/.gitignore | 2 - .../connector-builder-server/Chart.yaml | 6 - .../charts/connector-builder-server/README.md | 64 - .../templates/_helpers.tpl | 59 - .../templates/_images.tpl | 17 - .../templates/deployment.yaml | 179 -- .../templates/secrets.yaml | 17 - .../templates/service.yaml | 20 - .../connector-builder-server/values.yaml | 192 -- .../charts/connector-rollout-worker-1.2.0.tgz | Bin 20393 -> 0 bytes .../connector-rollout-worker/Chart.yaml | 6 - .../charts/connector-rollout-worker/README.md | 60 - .../charts/common/.helmignore | 22 - .../charts/common/Chart.yaml | 23 - .../charts/common/README.md | 350 --- .../charts/common/templates/_affinities.tpl | 102 - .../charts/common/templates/_capabilities.tpl | 154 -- .../charts/common/templates/_errors.tpl | 23 - .../charts/common/templates/_images.tpl | 75 - .../charts/common/templates/_ingress.tpl | 68 - .../charts/common/templates/_labels.tpl | 18 - .../charts/common/templates/_names.tpl | 70 - .../charts/common/templates/_secrets.tpl | 140 - .../charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../charts/common/templates/_utils.tpl | 62 - .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 - .../common/templates/validations/_mariadb.tpl | 103 - .../common/templates/validations/_mongodb.tpl | 108 - .../common/templates/validations/_mysql.tpl | 103 - .../templates/validations/_postgresql.tpl | 129 - .../common/templates/validations/_redis.tpl | 76 - .../templates/validations/_validations.tpl | 46 - .../charts/common/values.yaml | 5 - .../templates/_helpers.tpl | 51 - .../templates/_images.tpl | 17 - .../templates/deployment.yaml | 216 -- .../templates/secrets.yaml | 17 - .../connector-rollout-worker/values.yaml | 273 -- airbyte-v1-notused/charts/cron-1.2.0.tgz | Bin 19551 -> 0 bytes airbyte-v1-notused/charts/cron/Chart.yaml | 6 - airbyte-v1-notused/charts/cron/README.md | 62 - .../charts/cron/charts/common/.helmignore | 22 - .../charts/cron/charts/common/Chart.yaml | 23 - .../charts/cron/charts/common/README.md | 350 --- .../charts/common/templates/_affinities.tpl | 102 - .../charts/common/templates/_capabilities.tpl | 154 -- .../cron/charts/common/templates/_errors.tpl | 23 - .../cron/charts/common/templates/_images.tpl | 75 - .../cron/charts/common/templates/_ingress.tpl | 68 - .../cron/charts/common/templates/_labels.tpl | 18 - .../cron/charts/common/templates/_names.tpl | 70 - .../cron/charts/common/templates/_secrets.tpl | 140 - .../cron/charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../cron/charts/common/templates/_utils.tpl | 62 - .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 - .../common/templates/validations/_mariadb.tpl | 103 - .../common/templates/validations/_mongodb.tpl | 108 - .../common/templates/validations/_mysql.tpl | 103 - .../templates/validations/_postgresql.tpl | 129 - .../common/templates/validations/_redis.tpl | 76 - .../templates/validations/_validations.tpl | 46 - .../charts/cron/charts/common/values.yaml | 5 - .../charts/cron/templates/_helpers.tpl | 59 - .../charts/cron/templates/_images.tpl | 17 - .../charts/cron/templates/cron-secrets.yaml | 18 - .../charts/cron/templates/deployment.yaml | 187 -- airbyte-v1-notused/charts/cron/values.yaml | 233 -- airbyte-v1-notused/charts/keycloak-1.2.0.tgz | Bin 20269 -> 0 bytes .../charts/keycloak-setup-1.2.0.tgz | Bin 18955 -> 0 bytes .../charts/keycloak-setup/.gitignore | 2 - .../charts/keycloak-setup/Chart.yaml | 6 - .../charts/keycloak-setup/README.md | 48 - .../keycloak-setup/templates/_helpers.tpl | 51 - .../keycloak-setup/templates/_images.tpl | 17 - .../charts/keycloak-setup/templates/job.yaml | 143 - .../charts/keycloak-setup/values.yaml | 190 -- airbyte-v1-notused/charts/keycloak/.gitignore | 2 - airbyte-v1-notused/charts/keycloak/Chart.yaml | 12 - airbyte-v1-notused/charts/keycloak/README.md | 71 - .../charts/keycloak/templates/_helpers.tpl | 51 - .../charts/keycloak/templates/_images.tpl | 17 - .../charts/keycloak/templates/service.yaml | 60 - .../keycloak/templates/statefulset.yaml | 193 -- .../charts/keycloak/values.yaml | 245 -- airbyte-v1-notused/charts/metrics-1.2.0.tgz | Bin 18104 -> 0 bytes airbyte-v1-notused/charts/metrics/.helmignore | 25 - airbyte-v1-notused/charts/metrics/Chart.yaml | 6 - airbyte-v1-notused/charts/metrics/README.md | 40 - .../charts/metrics/charts/common/.helmignore | 22 - .../charts/metrics/charts/common/Chart.yaml | 23 - .../charts/metrics/charts/common/README.md | 350 --- .../charts/common/templates/_affinities.tpl | 102 - .../charts/common/templates/_capabilities.tpl | 154 -- .../charts/common/templates/_errors.tpl | 23 - .../charts/common/templates/_images.tpl | 75 - .../charts/common/templates/_ingress.tpl | 68 - .../charts/common/templates/_labels.tpl | 18 - .../charts/common/templates/_names.tpl | 70 - .../charts/common/templates/_secrets.tpl | 140 - .../charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../charts/common/templates/_utils.tpl | 62 - .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 - .../common/templates/validations/_mariadb.tpl | 103 - .../common/templates/validations/_mongodb.tpl | 108 - .../common/templates/validations/_mysql.tpl | 103 - .../templates/validations/_postgresql.tpl | 129 - .../common/templates/validations/_redis.tpl | 76 - .../templates/validations/_validations.tpl | 46 - .../charts/metrics/charts/common/values.yaml | 5 - .../charts/metrics/templates/_helpers.tpl | 39 - .../charts/metrics/templates/_images.tpl | 17 - .../charts/metrics/templates/deployment.yaml | 124 - airbyte-v1-notused/charts/metrics/values.yaml | 110 - .../charts/pod-sweeper-1.2.0.tgz | Bin 19381 -> 0 bytes .../charts/pod-sweeper/.gitignore | 2 - .../charts/pod-sweeper/Chart.yaml | 6 - .../charts/pod-sweeper/README.md | 71 - .../charts/pod-sweeper/templates/_helpers.tpl | 59 - .../charts/pod-sweeper/templates/_images.tpl | 17 - .../pod-sweeper/templates/configmap.yaml | 73 - .../pod-sweeper/templates/deployment.yaml | 105 - .../charts/pod-sweeper/values.yaml | 120 - airbyte-v1-notused/charts/server-1.2.0.tgz | Bin 22346 -> 0 bytes airbyte-v1-notused/charts/server/.gitignore | 2 - airbyte-v1-notused/charts/server/Chart.yaml | 6 - airbyte-v1-notused/charts/server/README.md | 68 - .../charts/server/templates/_helpers.tpl | 242 -- .../charts/server/templates/_images.tpl | 17 - .../charts/server/templates/deployment.yaml | 453 ---- .../charts/server/templates/secrets.yaml | 17 - .../charts/server/templates/service.yaml | 23 - airbyte-v1-notused/charts/server/values.yaml | 220 -- airbyte-v1-notused/charts/temporal-1.2.0.tgz | Bin 19894 -> 0 bytes .../charts/temporal-ui-1.2.0.tgz | Bin 18280 -> 0 bytes .../charts/temporal-ui/Chart.yaml | 6 - .../temporal-ui/charts/common/.helmignore | 22 - .../temporal-ui/charts/common/Chart.yaml | 23 - .../temporal-ui/charts/common/README.md | 350 --- .../charts/common/templates/_affinities.tpl | 102 - .../charts/common/templates/_capabilities.tpl | 154 -- .../charts/common/templates/_errors.tpl | 23 - .../charts/common/templates/_images.tpl | 75 - .../charts/common/templates/_ingress.tpl | 68 - .../charts/common/templates/_labels.tpl | 18 - .../charts/common/templates/_names.tpl | 70 - .../charts/common/templates/_secrets.tpl | 140 - .../charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../charts/common/templates/_utils.tpl | 62 - .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 - .../common/templates/validations/_mariadb.tpl | 103 - .../common/templates/validations/_mongodb.tpl | 108 - .../common/templates/validations/_mysql.tpl | 103 - .../templates/validations/_postgresql.tpl | 129 - .../common/templates/validations/_redis.tpl | 76 - .../templates/validations/_validations.tpl | 46 - .../temporal-ui/charts/common/values.yaml | 5 - .../charts/temporal-ui/templates/_helpers.tpl | 51 - .../charts/temporal-ui/templates/_images.tpl | 17 - .../temporal-ui/templates/deployment.yaml | 124 - .../charts/temporal-ui/templates/service.yaml | 20 - .../charts/temporal-ui/values.yaml | 194 -- airbyte-v1-notused/charts/temporal/.gitignore | 2 - airbyte-v1-notused/charts/temporal/Chart.yaml | 6 - airbyte-v1-notused/charts/temporal/README.md | 62 - .../charts/temporal/templates/_helpers.tpl | 59 - .../charts/temporal/templates/_images.tpl | 17 - .../charts/temporal/templates/configmap.yaml | 54 - .../charts/temporal/templates/deployment.yaml | 162 -- .../charts/temporal/templates/secrets.yaml | 17 - .../charts/temporal/templates/service.yaml | 18 - .../charts/temporal/values.yaml | 193 -- airbyte-v1-notused/charts/webapp-1.2.0.tgz | Bin 20452 -> 0 bytes airbyte-v1-notused/charts/webapp/.gitignore | 2 - airbyte-v1-notused/charts/webapp/Chart.yaml | 6 - airbyte-v1-notused/charts/webapp/README.md | 69 - .../charts/webapp/templates/_helpers.tpl | 60 - .../charts/webapp/templates/_images.tpl | 17 - .../charts/webapp/templates/deployment.yaml | 172 -- .../charts/webapp/templates/ingress.yaml | 62 - .../charts/webapp/templates/secrets.yaml | 17 - .../charts/webapp/templates/service.yaml | 29 - airbyte-v1-notused/charts/webapp/values.yaml | 261 -- airbyte-v1-notused/charts/worker-1.2.0.tgz | Bin 22793 -> 0 bytes airbyte-v1-notused/charts/worker/.gitignore | 2 - airbyte-v1-notused/charts/worker/Chart.yaml | 6 - airbyte-v1-notused/charts/worker/README.md | 72 - .../charts/worker/templates/_helpers.tpl | 242 -- .../charts/worker/templates/_images.tpl | 17 - .../charts/worker/templates/deployment.yaml | 500 ---- .../charts/worker/templates/secrets.yaml | 17 - airbyte-v1-notused/charts/worker/values.yaml | 294 --- .../charts/workload-api-server-1.2.0.tgz | Bin 20958 -> 0 bytes .../charts/workload-api-server/.gitignore | 2 - .../charts/workload-api-server/Chart.yaml | 6 - .../charts/workload-api-server/README.md | 85 - .../templates/_helpers.tpl | 59 - .../workload-api-server/templates/_images.tpl | 17 - .../templates/deployment.yaml | 208 -- .../templates/secrets.yaml | 17 - .../templates/service.yaml | 22 - .../charts/workload-api-server/values.yaml | 281 -- .../charts/workload-launcher-1.2.0.tgz | Bin 23369 -> 0 bytes .../charts/workload-launcher/.helmignore | 23 - .../charts/workload-launcher/Chart.yaml | 6 - .../charts/workload-launcher/README.md | 71 - .../charts/common/.helmignore | 22 - .../charts/common/Chart.yaml | 23 - .../workload-launcher/charts/common/README.md | 350 --- .../charts/common/templates/_affinities.tpl | 102 - .../charts/common/templates/_capabilities.tpl | 154 -- .../charts/common/templates/_errors.tpl | 23 - .../charts/common/templates/_images.tpl | 75 - .../charts/common/templates/_ingress.tpl | 68 - .../charts/common/templates/_labels.tpl | 18 - .../charts/common/templates/_names.tpl | 70 - .../charts/common/templates/_secrets.tpl | 140 - .../charts/common/templates/_storage.tpl | 23 - .../charts/common/templates/_tplvalues.tpl | 13 - .../charts/common/templates/_utils.tpl | 62 - .../charts/common/templates/_warnings.tpl | 14 - .../templates/validations/_cassandra.tpl | 72 - .../common/templates/validations/_mariadb.tpl | 103 - .../common/templates/validations/_mongodb.tpl | 108 - .../common/templates/validations/_mysql.tpl | 103 - .../templates/validations/_postgresql.tpl | 129 - .../common/templates/validations/_redis.tpl | 76 - .../templates/validations/_validations.tpl | 46 - .../charts/common/values.yaml | 5 - .../workload-launcher/templates/_helpers.tpl | 258 -- .../workload-launcher/templates/_images.tpl | 17 - .../templates/deployment.yaml | 557 ---- .../templates/jobs-secrets.yaml | 18 - .../workload-launcher/templates/secrets.yaml | 17 - .../charts/workload-launcher/values.yaml | 294 --- airbyte-v1-notused/templates/NOTES.txt | 22 - airbyte-v1-notused/templates/_database.tpl | 234 -- airbyte-v1-notused/templates/_enterprise.tpl | 83 - airbyte-v1-notused/templates/_helpers.tpl | 350 --- airbyte-v1-notused/templates/_images.tpl | 17 - airbyte-v1-notused/templates/_keycloak.tpl | 44 - airbyte-v1-notused/templates/_logging.tpl | 10 - airbyte-v1-notused/templates/_storage.tpl | 243 -- airbyte-v1-notused/templates/_temporal.tpl | 58 - airbyte-v1-notused/templates/airbyte-db.yaml | 85 - .../templates/airbyte-yml-secret.yaml | 19 - .../templates/env-configmap.yaml | 160 -- .../templates/gcs-log-creds-secret.yaml | 18 - airbyte-v1-notused/templates/minio.yaml | 185 -- airbyte-v1-notused/templates/secret.yaml | 18 - .../templates/serviceaccount.yaml | 77 - .../templates/tests/test-webapp.yaml | 29 - airbyte-v1-notused/values.yaml | 2313 ----------------- 298 files changed, 24921 deletions(-) delete mode 100644 airbyte-1.3.0.tgz delete mode 100644 airbyte-v1-notused/.helmignore delete mode 100644 airbyte-v1-notused/Chart.lock delete mode 100644 airbyte-v1-notused/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/.gitignore delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/README.md delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/bootloader-secrets.yaml delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/templates/pod.yaml delete mode 100644 airbyte-v1-notused/charts/airbyte-bootloader/values.yaml delete mode 100644 airbyte-v1-notused/charts/common-1.17.1.tgz delete mode 100644 airbyte-v1-notused/charts/common/.helmignore delete mode 100644 airbyte-v1-notused/charts/common/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/common/README.md delete mode 100644 airbyte-v1-notused/charts/common/templates/_affinities.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_capabilities.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_errors.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_ingress.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_labels.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_names.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_secrets.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_storage.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_tplvalues.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_utils.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/_warnings.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/validations/_redis.tpl delete mode 100644 airbyte-v1-notused/charts/common/templates/validations/_validations.tpl delete mode 100644 airbyte-v1-notused/charts/common/values.yaml delete mode 100644 airbyte-v1-notused/charts/connector-builder-server-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/.gitignore delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/README.md delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml delete mode 100644 airbyte-v1-notused/charts/connector-builder-server/values.yaml delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/README.md delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/connector-rollout-worker/values.yaml delete mode 100644 airbyte-v1-notused/charts/cron-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/cron/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/cron/README.md delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/.helmignore delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/README.md delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl delete mode 100644 airbyte-v1-notused/charts/cron/charts/common/values.yaml delete mode 100644 airbyte-v1-notused/charts/cron/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/cron/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml delete mode 100644 airbyte-v1-notused/charts/cron/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/cron/values.yaml delete mode 100644 airbyte-v1-notused/charts/keycloak-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/keycloak-setup-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/keycloak-setup/.gitignore delete mode 100644 airbyte-v1-notused/charts/keycloak-setup/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/keycloak-setup/README.md delete mode 100644 airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml delete mode 100644 airbyte-v1-notused/charts/keycloak-setup/values.yaml delete mode 100644 airbyte-v1-notused/charts/keycloak/.gitignore delete mode 100644 airbyte-v1-notused/charts/keycloak/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/keycloak/README.md delete mode 100644 airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/keycloak/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/keycloak/templates/service.yaml delete mode 100644 airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml delete mode 100644 airbyte-v1-notused/charts/keycloak/values.yaml delete mode 100644 airbyte-v1-notused/charts/metrics-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/metrics/.helmignore delete mode 100644 airbyte-v1-notused/charts/metrics/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/metrics/README.md delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/.helmignore delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/README.md delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/charts/common/values.yaml delete mode 100644 airbyte-v1-notused/charts/metrics/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/metrics/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/metrics/values.yaml delete mode 100644 airbyte-v1-notused/charts/pod-sweeper-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/.gitignore delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/README.md delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/pod-sweeper/values.yaml delete mode 100644 airbyte-v1-notused/charts/server-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/server/.gitignore delete mode 100644 airbyte-v1-notused/charts/server/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/server/README.md delete mode 100644 airbyte-v1-notused/charts/server/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/server/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/server/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/server/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/server/templates/service.yaml delete mode 100644 airbyte-v1-notused/charts/server/values.yaml delete mode 100644 airbyte-v1-notused/charts/temporal-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/temporal-ui-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/temporal-ui/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/README.md delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml delete mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/temporal-ui/templates/service.yaml delete mode 100644 airbyte-v1-notused/charts/temporal-ui/values.yaml delete mode 100644 airbyte-v1-notused/charts/temporal/.gitignore delete mode 100644 airbyte-v1-notused/charts/temporal/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/temporal/README.md delete mode 100644 airbyte-v1-notused/charts/temporal/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/temporal/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/temporal/templates/configmap.yaml delete mode 100644 airbyte-v1-notused/charts/temporal/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/temporal/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/temporal/templates/service.yaml delete mode 100644 airbyte-v1-notused/charts/temporal/values.yaml delete mode 100644 airbyte-v1-notused/charts/webapp-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/webapp/.gitignore delete mode 100644 airbyte-v1-notused/charts/webapp/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/webapp/README.md delete mode 100644 airbyte-v1-notused/charts/webapp/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/webapp/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/webapp/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/webapp/templates/ingress.yaml delete mode 100644 airbyte-v1-notused/charts/webapp/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/webapp/templates/service.yaml delete mode 100644 airbyte-v1-notused/charts/webapp/values.yaml delete mode 100644 airbyte-v1-notused/charts/worker-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/worker/.gitignore delete mode 100644 airbyte-v1-notused/charts/worker/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/worker/README.md delete mode 100644 airbyte-v1-notused/charts/worker/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/worker/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/worker/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/worker/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/worker/values.yaml delete mode 100644 airbyte-v1-notused/charts/workload-api-server-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/workload-api-server/.gitignore delete mode 100644 airbyte-v1-notused/charts/workload-api-server/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/workload-api-server/README.md delete mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/workload-api-server/templates/service.yaml delete mode 100644 airbyte-v1-notused/charts/workload-api-server/values.yaml delete mode 100644 airbyte-v1-notused/charts/workload-launcher-1.2.0.tgz delete mode 100644 airbyte-v1-notused/charts/workload-launcher/.helmignore delete mode 100644 airbyte-v1-notused/charts/workload-launcher/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/workload-launcher/README.md delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/README.md delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml delete mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl delete mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml delete mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml delete mode 100644 airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml delete mode 100644 airbyte-v1-notused/charts/workload-launcher/values.yaml delete mode 100644 airbyte-v1-notused/templates/NOTES.txt delete mode 100644 airbyte-v1-notused/templates/_database.tpl delete mode 100644 airbyte-v1-notused/templates/_enterprise.tpl delete mode 100644 airbyte-v1-notused/templates/_helpers.tpl delete mode 100644 airbyte-v1-notused/templates/_images.tpl delete mode 100644 airbyte-v1-notused/templates/_keycloak.tpl delete mode 100644 airbyte-v1-notused/templates/_logging.tpl delete mode 100644 airbyte-v1-notused/templates/_storage.tpl delete mode 100644 airbyte-v1-notused/templates/_temporal.tpl delete mode 100644 airbyte-v1-notused/templates/airbyte-db.yaml delete mode 100644 airbyte-v1-notused/templates/airbyte-yml-secret.yaml delete mode 100644 airbyte-v1-notused/templates/env-configmap.yaml delete mode 100644 airbyte-v1-notused/templates/gcs-log-creds-secret.yaml delete mode 100644 airbyte-v1-notused/templates/minio.yaml delete mode 100644 airbyte-v1-notused/templates/secret.yaml delete mode 100644 airbyte-v1-notused/templates/serviceaccount.yaml delete mode 100644 airbyte-v1-notused/templates/tests/test-webapp.yaml delete mode 100644 airbyte-v1-notused/values.yaml diff --git a/airbyte-1.3.0.tgz b/airbyte-1.3.0.tgz deleted file mode 100644 index f1bd28eaf72c1f64d6db79c03b34b7db5e582e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346882 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

g&<(kCVrf8V}B2q*2>i8Cm5~bi3UZdci zr(sYQz!Bx8l~_wnOD?lh-Dn-RmmJ%T2^uHr&=Yz8QH?%4Qel3DsP$E@)h>P?KjcpL z)YkOibJta}`$usw2}TdRr8*#=>`6z$%X9N;E8+5@dql|=m=QeIg0{OKCQ?xJ+yDI1 z*Ry?n^XL4R+xNkv4(R>&`2M&GE2~YkMD}1GML`V22Ib*35qbD-KKG+RG&Q2@vu0%W+TPH@Ss zqtHSA3i2tox-Z$&c34s%1+LAs?x8QPOi47Q0JpS&rUXI(nnHv$33~wzc)%Kl&TJXo zm#S{NUP~OTGwQ!DThQ|{O)oeHUqWgs6(c|wJbF?$%kUZkdE)tBvUEBhs*s=*O!N)9 zwp5&$e|Ag}_)657Z9lxfv=zl7uM1sTVZ;jK9xmd-!V(=PgKumB6sy71eX2j`x24C#__V?n7^62V#=HDaw;SqC%zQk2nDuHQ7`kE^Lf?l~# zH>#AKl-_TnUzhKlt^KTmMYO-nNe(VDPHDMww&u+Mu2g;9@gGeA8*gnrJ++Did&^b% zylQeVJfy5&fapXM*JZGC@}T7~vrVSmgC1k~he2xOTGJ}jParpZ2pQ=>cowJXxa|)d z2K6E(qnqr*u76@1vy#dHeW!{0L;!uVYm@pf0^h-1Jt!ec9No(8*KStQ9xYOAvDF@3b5O$65HO1Ubejn;A%*-KT#i)~~PeG}yDio@(v zXOUzLOOGj;{ja-7A`7B*1R<5ABZJb)RY!p3IU@)Dof!v>O{j6eExF)PX$$jSZ-ap# zCP6HkeJD;t-LAPt0T-?ftt!G0>7vz;u-_7X7$MRHv zVKb^*>|MDw>?mgWhe#g_%Em*)#V)aBIn1%ZACl)aeVL~>!BB2qE@^X8YTPFY6e?H#&b)33&m*#dL2A0WL7In$5ZEFO_vNagK{(v@mLVc_FqPdyafmBd%sm`}&&px;CwFXbfY% zlS#OetsUCe@w}tA3>NY0T9zZ6Ny~ z@XY4iQx33P`v&i-pI(aBX;r{VyC%8(d_9Ax%pBgi( zm1M}JN7{J$NUYTrkaJS)&X1((<-KHis8oMusrgMS{#(8t21C*>>>l}|XFa+8nHEWW zYcQ*H|PBj{D}##@!NjwabNe| ze8ZR7lk)hlzzRL!bKAS;X2<97md~@rr*GJ=SRhxfwtYp=`btS@gQ9KGJim=HJEPsDM36Sl zlHaf=lOi$>38}k|3oRWF|92)U+dQ!}SL}9(PsCC{`c_FiDYL9twF$%9adG^_7<08$ z{I?=PAx;W8DjNe>&p}iX;4U!x!5lT64?zX)r074!EO=3aLPwTT(h}V7@guLxN!|(z z3$g|UakMeNjRGBMY3RO0NH>4br0io7Tt&RATCXXF=hQ3M174%5oYA! z(F*fbB?1iThJ4-}+0Mgr;b*+kz;s5#0YCqaelRLe`! zqx-TiV)Pa*x+>#oI=aCQFp9WZTM4llgQ-lsPqoT!f5 zONlC{oWJWQKYn&6fi_ZznjLgX|9(IGq1U53-2zw%?gJykdkWSsHG!;$?Ht7JGTB6< z;xn-@p>N7I}0{axK?sffxGIJanTJ~rvUBP8xV99~`!h~(woEkuZu zmdfaLL{lMl3{&r+ffWVy{hU!nt8bdxpQ-=)>&=%0-8U}Fz+%xSd(XdKx!qcP`OqV| z3T0T`J$*PXa`^5BXnz&>krzDbkF0hRQ}Tn=6`d41+TfbD0bP4=3UQ3C%2Wbqd>Kij z02B!cM=4dduZB!szFu4>M1;w5)q@WZWebmVYGr %-d|1k9hPA+?wpmM*F;*MR}9 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 z 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 z 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ξ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¬x3pv`iVFWT5>A_fnVw{T2L2;S&Y(hp`w__N}CvYR{kO5-NFfcig za!o{$b{Um7)vs!(e6`naX>91IXv5HzO1z8mTgx@9Sjo-i9<3?aV!4zpR`avPi}l)^ zxv`-TGg&N><`qRDV;~!Gp*f22=q2q4IZdR;qlDN^4GN{qS!)FTKla|ezik{z6#bu{ z0!w91tc*!Xw&V18Pj-*vc&2^3llaOyW@}6o9HiJ#JUMuy|w-Nzt$#`y8SGhbYT&hXi2aMAXTGG@OghyehG!4EZL* zQ6VPx6`Ffw_gqVh$O0}h| zek}4-lp-_ax7N}jx@~1can|om*VKN3uBM4-Z_hgD6rvi_{H{QtBc@*ZFs|~Dr<-C0ua|8raHP zREBI;JXm@}x3YWWMc-!^qU}3~3&}K)L{eJj zHa#pVcR%{$&FFtA3UPBHh!*?5{oQ`QZ2!0anE&x^9%mf|@R^wI+j0L@l=NV9zY?5g zwXghqGmWq6;dYe06=W`_mQ~f3)5ta&+!Y$RLUZOPvTUg#nQ{VB{4W%KK$JD8=n9Ql zRs5N%z)hg)Yv(QU0&t$_Zl9hy-MHmTbi`RZltz{<+v zdMmK1kzk0Kt$bVwRhbI09Z7c4rO{J>@;yU`DW9x9pPGc*VN4l1T?xzwq0P547v>nc zi6vnH+szu(Z0rJl)3xUNiYhzH{;Wi83vB1?lFhp9;uhT4@yd2`cJDvF;<`-@r8d|_ zXLbFdu$uCzzKt77W~$K#sd7>$p2{U@1Ti)Gr7jTuAe=-#pE#jy-3K zQGYZ+!4=DHVI;mK{IbQT%wUu$e$H&*YE6PI%`<@icnJo3-KA%umhHF!{nxfkUYBJrr-7n{pgndQrp z{>oQwldPW^GiVmc>-ROA+|b)#v%L+n-j-qcnm9d`_P7=|bwjA8KrT%KNUX!&jIv(I zaWT!xsQaVY*APNRaiV=nA9=u>jGqEVkx-!B7W6e9{b3VX}DS?VnC zZT+iadTbh)5OP@GMYG+*5`2ArRH=;7ex@BO2u$tN!*D#VhzmIl``JV{%0)UyeocDm z<=ESd%1p}ng{!@NOpRl4%P9(4m*jNr*=2KX*!uanXzq5=lthh6>%c1x&lHsjaINuK ziexduL`ondf0ad9Tsvi*<+_R5^A*?RT&Y-UGcZd><+`@s$#-+%r)!)rtvA)%?pfuY z`^gMu9;0G8=%cJqWQ_PxN-2tSrK0PW6*n*rvz8S~8veE@Pj%ObrwT&bj zz{q77aFL74fhwX%`{1|ux7b)C{)PP(*GM|5a|OAWIgJ6o+hFKb)BvdFpZcwn&IuFQ16wdKVB-z&P}U6qb`lKKs@?gTM+V9)?`ABLDACP&CEkm{7EQ zA1(ZU|M^Zi|L@N8-N7UOe-}>&oI);kDkf-K&8#?fVlYf`6pCFufx#6VBj!6Da52FQ zurx^sy7W8RbhD)1eD_%GU%|C$$* zaZmhX{$#Vbmp3$o!Bv__*@rpLe0H5U&-@|0a-R8onmEt?uhRh^AjKqQ;N%TNBO`cF^mIqV;QXH7XBQKl>P-(yPBL~JRFnm|OxH~>S$uaVerG$5*;?>LjT| ztep@gC=O8^V5GTsakd`l_T)LQRjCJH;D7PI7^@q?Feh|=01V)|6WymDkZDi<7M;l+ zhmcL2CqRG?vX187{WBzQc20~2S8I27Eo09gTCBQl8( z%pavuq--JOjkc*Zoh#M|xId#PBH$yTQRpflIvsElb4tQgUPCyJ+@uvFl29_kAz}a; zoEr_E7*~QQ1J@HAOh5o*!2(J3zjSn%p@<|PM%Q{iKq?q(MGckt@0vpbOkoVii29E6 zsxX~}4&;vi>6dhfV3M%BwJZI`57DfrNG3!{MCMb$913PtH81}pBOodBNVSh+5JV~C zh-%U~rAUh340FUB#{;528Y7Mv82E#~{nhbQ1H1l?-~X$sBjiFP+7MVoU__#bT#IpY zIE;|Ia#gnq277P@aU{QKVM$ZJMyoU#2}pvZFcsp_2uVhlp+E^OqT3EQ9F1^{ITnC^ z6Htkh4~Hn`c!UuJ_VW$AMl7IMN>*U$=NmZwlAu6HSSN9k^7abOH*fLN_I*>;zB%8( zrCud4!;~MBP>6eE#4o`&aE5qFV*r780mL_r)VY!waUHt8flJ#Y`S0)Exmq{DjH=Fk zb$I5AfB(zvUV??7Odt&lpokZD4N5{ngOmzZ5)v9ndg6D?aUEnCC;^!!Bt|jM0Lt|$ zmqk)(1VtgGf|c6?MJ}i#n7|>9mRwRbi)F1fw)|7K8rv7#&6m<9I7>&9*a&KPkaf1g&tT^3H=!fG(C3@1$RIifQh zpmq19!_yPf!Y$7GB!M@i&z}j!{~|Gm5jZ6wI7~TV0gT$%hgJ7atxpruND){ACsU>{ zSlymT8A^&Sv-~XF^>_ce8ZMjRlq}RSrG&1;Jl#6iw5exhS!lUdSK!}nopIaLb31_A zO94qb^V4KZVTf{X1$Bcb_P!Giu5lCr6th(NWYoHxjPVS`N_BmWi-N4#U+ZwqmmBQMOO}SXkiTbaWlN9F)Qlv9VqX@{7QUh3> z0Zluy$QdEr&4eCfu*4@w^#xqxQ2pd`8!&{xrxR1{_pOdBLkZ#C%;=bLn#$0DKByT$ zl17p8Nnn??19(k>D?}9yf-^M6jMF*LZVYeX6fv+BqJ*LVaugnj0}2$opePOzJwpbcRKiF>mw$sgVQw$7pSvT+sRO=7l1XszO#aO0lWt$&l-43B-lhw2x z_i<$3-EOn7XEoK#eH`vT3`3DWg$1bv>mdxTP#j*?Oab_ZHg^KhEKE)EK-U5&77J6| z)re!CsAYV3dXjOs#t@AVH+y$Vq`}z`Qde)rqRUSPG_x&=zGK31fQr{0 zN(1I&(i=u(+}r67{?_Zi=na1A!329&ZRX+F8+e2Lp0%ydV-CM$*9rk*pbn`4G`sT)D7Yp`ZGn0=X_NKshJ!gYI*wN5x_VmT)X;+b#n3RIbe7k>vDL619?o# zn>obIwVhe7cJ*xeTQ3{fGNW0{3)XC5cY;*O3;YU)D7r0ap{eUNt~54#YPDTfL=r2; z@hU88tgPz@Qvj$6E8$?V+DAhmjiS^XiS0uD0-Q+3nZ)2y>Fs@%pulG+LIEeVSWCzh zmuwak%Umu}=txd=IreZ9f>+e2&_FK2#{Vzw^Lb|6Z; zn;}YZSZu0|CW>|+MJ?qKMT+4ucVVK~9Q>KWNK9M^V3J7K7OGK~gFyb9zyKBQ8xEt0 zTx%CgWfz;3(_tlv8gz&j5Xx#eutBkK&@^@cL&@!_LzZzEMRE&%$}CuygFsGg*=ht~UlK#x@be{dRbsTn8ax(O3cZ(~u!Uf%p(3eFMmg4Ju;%LzbE%fDA0E(%B-0Hg>w+q||#bZ8k!JrRZ z#wm%%d4MXh|LblFzjGqq2CDuxP<17*r^+50u~Eq{B=g;>qdqyK?6Po;XksQnkWe&} zCheIQnL({VpQ`VJR`k_dV*N;uIfpr+aEvx*gLyxP?&d5v@8{Gj5VM*RKZqc+)$_J~ zUQZj4s+F8t6Tzl2j^Y5-ZJ%_EydCsK{DvdBmydyVMTK=MY451_p2Q8)nSx;b~AOk z6y2$EVPPhe7BoDGiXpHvEwnH$W_0?k?8GxKi&w1WVU)bZ6^qLAy;0y6vq z1zb-E=1j$(hkUZqFs=##Ow?biFkiL9_yx_yAb!Qnb{Sw`gel|J5Cp{1aR+KA{7?^- zP+eBbgOXX6Y5__h!J&Y<-eTC+O;@~7JT{k?vYkkOl|JN|_zkhSJ2Yj~Q^|OZS z!~Js(_uc;kdhCs*B_xM^`MgAsncF0~0$;XNa40{%Nhq32eVT3St6w44XCWhs^885* z0?4GUZJt{W-%lsAN99`DU zpDEHD91NUrK=s)I0h>UbxD9RyMS6R_8B+^PcB0gX6B|vF*$w@tEA4XA!Nu zezk#>2Nq4D2KK&>J_W_y9)404^AXY*$K!TA%n~}68>vNF6$wiS?KhI^ZK}T3Sn(-| zA{>t|;8>je8d(4iNy>Ft9bE!&IF_4y=FfAvx_^(;>45VD1sFyEOANALf~JsJo@An_ zJbV$=J}n0h0DPXH1JNLk#|{8tK3xaK5ylj^!jme$B+NiWqz{k-0Qv%_NrVnSC~Ntc zIF1#Gsimv4tfVC5+;hrqSx0Q@#bX?QaU2fEZOy87I2_x}4E({qKkz~{#4z>-eUI+% zI!=;Ck#fauYg8h8GzU;Mf0|XyvL;A{_S3`Y8qV2MfJZqT0%uR9lMsKpt@0l*#AWf5 z(Obe#DPkz*PZd1cP%H-sQVQn|0GJ~c&vr4SCLC)t2h0E+t407B<=`79t*ty~bitp= zcbpInQw!Zgm0Y5N8Z{QPBBUg#gDRLZ`}8Ld6DS_9Usa6N0u6 zV`b(S2S_(IL$%&& z?&htGTIRYstW}7afRll6E)W{1IAaVGv9T2(c0Jc|U=Se2-jEQrfqN)Rf+-2})Rm2J z7dkpaF#Jd{NAKhWF#NC9&d%|_&sM(0 z1||uP<+f31OTW)T0jf4N7jT8<+RnGe7+ZYAaT5>yktqTkPZ1Lh zT*Fu{%CV@eoCK)4*G~vzScZ|9t8TR!G^VVK4d&;w+sSwGp2n4Y?|EK*Btwmr^}`qf z?Mk6eD3~P6S5;H^E`fihC<}*}&&JoUmOX`L{J(+W{vL{hEcyTU?@nRRVG`vd_I+Om ztVZ$dz%iVp2`zbgcz*uz-Pvm=XEJBz;`hL@c~6B(nYwIL{IURDwxw+ra=gjPvoXWp z6CH!xey-4bVUJf(Iun0 zmpgc3milMWL@CmHbF_LVTX*P7LMR7TGcTWPU8O@5@JLoR*&n>zFU2_a0{&nm z7T~>fzxra&^DR33?urc#GPJ)3ys+!kpo+?cQJTNW@tJ@6byE^!A^gtzpY~^?HC7Ka1Eu;=u`?wBOGHkL1FH%J;r>J z4rQ!hLA*MKaEEcoQ|6J8$0x|svBA6BfKM<3Q}_p=cAO^VO2x#0H4Bsbu})w-MogTK z5ms?{#rHhQtzKnPMBqeh3xp;lbIQoW%Z?D_DHTnHp$a{#hPtbGDA|fwiJIw^W<6O~ zdISJ-hN6)Wt02uBtPIMI-~H-4&a-D9rOl%T{2EaNu#QEHbpDVs68`hqGsp43sj)xT zubDyzX7+fchh32+xddCr$xEPNI0r+*C#uqp9Nw1RaI;-J?i*tH-5m|#69WlYwUa&G`*K~o`^5{ac;+Et1mf!#|xT$!@kb3E`~ zU_tRgI=b*>1*X}qUjSiX-@*@X)14lMs#>lBqrr>kSO`raNEx$V&!@NOvcU! z6Ue|&aPNd_>(nTjz#-x|kPAw(xDzrZV-zDX^Ve`*P_>$f(Nb4&Ef$-R;(Qo#6!dIb@eLIpW?BaJTnGPz-(6#%X@}KX#^r1Uok}srf1P(A>KPrIiVOvtVaJ`;N#_49POlxaS{z503qcx(Ivwg^0)q)MEo=i5({RV{gDp|O)t}t%zdM3nrf@Dv zFO@b&n5h+wz62urFrQsjL}WIPE%0iMd^+;`4( za2V5hroES{SR8-|#^V%@5g3yhQkMh?qEpP&0SV*KiSQJg_!O1l_^T%#Ddqpre|keg zctl``XfNOA*Ud4}mj7pOuv5(cF?jJ}(0|PTaTiaK5prOXe8>}M?E3vu%8g3GjTLii z0Knl`r|!`2ysWKK>W+ejP;T^rVS<(73{~*7+`Yl?GQx zSw2N%JjU@@!2&rPLWX>+Z8I|SO*daxUis##f9)FCebW`1t6M&)@zM<`qzX=_iq`{> zL@+=T5`~DK7d|^>)ExlAm}BGR07$*JfkRz2RX&?nA9UU@H*13(fUn;jdENDS25I)^ z7f#`k@?J*b?Wf-z06HD@;ao=;)3M4vsXNu*fu}@9lG&4x>sSV4()Mg7GMR~`R?JFb zx-GV@0Ww{$+U3HYtR9?>F=$fOIDyR9ro6c2{e@r_=b|HMVmCA20qU2+dZ%I%#fh{W z5fjWugidumsjZO7lYJurPv>4{vGP;D-|y*Mb;gKA&!RTilD0xRLY&l@sU>5;0vR|+ z>5$BoQA}d5SQfA}m;lJYFlF;0`LZo9MhS({HkjfVlWl-_pzcJafsE@qj#IKm=x8+f zIfEdzhSr}JurkYn1|mOMbPHBvxy_AITS-Lfzn5#xYD^&PVnI=5YiAp1Wv=p1892-Y zAt#$}n;A0arX^v3W}6`imP~V%N0-d#`7jK%36vdtQp00GosiJ!bev){nvzxX<&~1R z9AzN}8yhXGj1Dk?48#VdGM^mj_yOkcJm7$yl&pr6n?tYz@kdiz@}r>oG(Kc+Nqj~K zw@6HXc+U_$0E2$NZ{8vpzKf%|DE@aGAvR|mO?Ab_zOs?UBt&M%$&vL|97fjOk&sZF zaCj^|>qW&gG|IW)V(?z61WXyC-Z;e}>WMBqwf9LqV5j5Qz2>lR5@nk0Ptp+YcW`07 z6OddJdWFgW$#p|pAPPtvphTu`6?uHO-Y)gy2jo zFQLkJ8M6SBR6-U^h~Qrgr3y%VWl9bsCU4Rxf(%I~1{p_LXRV~EG)A;SEHK4A;~TV%s8xSX{^So?trqKlcMoRuuR(khJU0?ex8c&Yx@-I`j}#T$8d_r@l2m6Mv-xNa`x(< z7ssDJ9G{(^ynCz958HxEzX7_zH!v|4T-g_6zGZ}C6wmCB($K25BLl_j!;8aLhv&zi ze|~pc28V7Ta*x%%Vp`hS^2;2^8v<>NRdlplb- zyu0ZJ48!Oxfmz-JG1+T zL#MErio-uY8^WQ-WI&@bKp?CkdUAMbze;`#cu_sm(8=)!lN z^|afA3gib|vq34J6)*oPB{*Lh49E+Xy5tz(n_x8J0POF|pLnVwxdYd8fo==MAyB># zy=TtyNidv`NVP4?bJ2qs0|P@8K(W-MH-eSvCC|g80%}WTfU&&B3~UXRCi?Z;b5T|v z3<(OlzH>4vB*e(Wz6N=+2$M;4s8jYzwUiQsCA5u*&0U}ja;+Tr=3|CWU8M2*GWd>I z*3J_N`@zfQCp3pK!-8tWKT{}Dbq$<_mn#C7P#p6SaR0)*zc9Ddmg;nQ@~Zz?AUbO{ zr9wj6Q9`C>RFj7)C3ouuv#J9^cnw3bv8;X@tIcnKB6(p5+`qcO{p_y3grq%(K2Mq< zRNobd#$HuIU34TX4aiqrR==~tNthK>)U1Y>U$cmBFiHHPb}KU{`TDh{isj#D4Y}Hi zN+S?@L*)^dQH{QOtwq^+@u+V`T6vUSEeKTyz~V0I*F$ccRf}-j%Si*h?*6~h`L8b< zS3LgP&i}#AV6S}s5Be`2&;Pr4Y>JlC`<_Pm9`yuI$Koi!afrSEAN2Dtln`!z8W?Xy z@eRpZvP>}zuWxRR^>w*wuJ_DD@lpOz`r||%n4Cf^W23MLvdOmCJQ(62TaU80mtac@ zR&=iZ-pY5^o(s0@EwbmzBHb?7QtpcSFV8G}#U<#=a={gt0LBs=uUDzDbNIqY}@w$Ptoi_a7EZY0s&l_^7TJhuEz^TCLdLJg27 zk(!<-Din;_3qAYP%w~&2IU@mq5n=(7HRTO?^Bm=0EBkI8Tn8CwvTe%{Kz3dMFAj5p z(SO|cTKJ#%tg`>-FOAB1Ijg`n``;J4W%+M!@A;$s|D8M?lV8uM`AHnjvpd*`1TeC7 z4<%W|RFb^QDuE-aq*RI#Av-FwN>Rp0egm;Mcw!FrROAE8bVfB`_}2*`R|g=W$kRS? z+v2x&bE}l}t`Qzj_yKUe0QEo$zk%!22cHn2Q5cUAcyhH3p3KC?Iz@CW1)^(;IjZ2N zw82_vQ)2~BuE6*2ia#8QCcl3dFK2lu3-J9r`1)0B>fgV+?$@s<4rOhN1uXor?EJ5? z{u2_eWd_`0|GV>i?|Etc5BByR?f>uOX^i=DO2Ul=d|7od>lz~~4oR*(%@++P|Af;B zY&9%CyHaTZTA#X2-Dj(+0!?mdmjzuZjIbePkXwik;?^`*2)WS)*2Z_dzS}TZ+iG!B zBevUIVc0A|L6c3j6$+@?qCMLuts&ZMuO0nPmMy={DO#NYOEqGu7>3zgZ%M_E)>@fi z@6^tA;SY+$rp1k^>030D=BK4$70euEy^;yy4Q8;=cEkMrR0DYlMBDmNelHjx-UL9q z<@MpqOtjRB%PpgB09n@N`e4;v#VcYh-J`3TdY@cWyRzyE-3Nsx^V``fx8UU_BEY_| zx6h4S&7fiu8Mu^HwjIi<6i)L1xYio4n2dk_?$!nJ(zru^mX~VDMa3nIxxkL2)nr7L znNBoC0;?Dffx;6vY*$$|tr<58cuSe#Sr$hn^> zySJa;z5RTCad>v|{`3bMZ~J(%TKT;^Or`&l$;@k;AC?J8eA%i}6H>RfYCA~90(ZOR zGNKn>ds5UA+N;lp?=OD-e13d%c6{;q=8>%jWQH9yDWSjM@kh3=1Q?lDth zNvIl#^@bF>CehuH(r!RI8z7i9rvC<0U)P&`qi4UX2%?$0CyHk!dGx1BZA&Ty@&r-v zDeH9Y`dR3$R#|43D65hd6!-F@R4R-%5tFo56K6jrj%cyR8eG&NyoetZ&&tRlH0Mi= z-Cp@*HSb#x*Q5qmq1iSBt1q(_a$5l*#1fn#qQI=X5|DKQf+$uIN}9%1>L+*R$!g_JJ9Rzg6>7Vz;I?jD1ykOv zWYKE6ZP0}_)&ix`Yci|ADsG8YU>aLl2BtdXlm$gwf7VoRWxbfKTwA8YhVpIwE`z{? zgw3eiZx*VJQM4>DGbYLHB(qq8zHcS(f~Q^o?~gIZ4qDapO|PYz|QZhAEE1OW#ps^NFf;E6@42PuYcF-`{`X4_@RET=8`5vx&5s_A%)V zVK_!TUEI^9Ju9FvjQ*4Hd4yh$BFH`VX9_9mf`9vTQ4Yx0(uFARS;d#>fB(8dl4`wjfp_4Ow6VfC&d(P29zocm9%Hs#l|;d5BCjRe*Jz4zNut?3z*v4 z@TMMMX=Z zNK>ad`&m=MTy)gLzxrkj8NY!`*KMhxVqdjXDc+_O3KPaE<=dvOQ8;KG=MuAEmt1Z# z3MM;Cpw6gm+M27}Oc$DMj1QLgSGoTxG+>7xD%YX*)??MF#x%-n7A|}n##Xx4Z!WbM zv=dA`K;5=ES}$uA#60*4%A7|EIsGqhzgU&~5hr{TJoHx|CL_%u#&ccqVqPrxWiwUY2;w@xUmJWl$a`3xDlQAM#t@ScLH-ZB!imZF zsZ#dI=p6aqW@}QZh#t3&2lK4D{w;4%E$`!2kI!OAOE5tP%2!djM4us^QkkcgjJT8tv!I63MN%5T)#aL+0GUhUDdfTASY`FeZSIxPfH9Hquh6_`HDChx2!6V3Ou&i;8J0=8 zj(b?LZ}emrb+!jJSF^^de^B}UdKaIA|;sViWX1)9a z&E2+7?vbyGOw&Ipq zZwpq~#unGzFe0j_4e%k>Nx3;T#9HBPT*&6-zZ=N^0o0btZ5n_U|Np_x^K$&B{r>a4 zNBRFQo;BouK0$y(I!4?MrKoQQ8kb{%TEvc{?~iI@9I9LL#b(A<8+O43r99i3SO*m} zf9JstZ8(3)YiH5;Ob3lE+w0Z}U3l{zmXb|m>Wn0zB%xS_!OSl1Ojer^Gn&eKx?viQ zQC)=3x;aycnEbrG!pt!=ogsQerU|47xc__L?+m=YTRrQW>A)`qyaKN3vNszH5r+e} zKDJf4th+H>#fV=MdZh=x9F}yQ(-o2R;>Nf_UpR`THe)$_X+Uv2_OE_Yu@*Oox`2}S z4>DX5X{PjD($-KgXv?9>6x|$pa$~6_F=SO(8cBn_J0~ibBy6LIVjOZbN+Y)PHf7hi zOH}Eh-v^R#Jf?`TB@tvwHy|equb_%8_++(^m0F^RVV3WQVCy^n+l@P}+fFyK3qNA* zuFtNsSBFQIap7{SiVk70!hUn}^ImnB@(H2%U($eUB@`~IzByDLoxNTbfdLIyz~9YD z4<Rp}w8tZNjjXw+0CNYN*I3*!C zOgUizj1XNCtCIw-z>)5*iq1^GX`iqHb2}AWX~=Or?#*^&krw1uDm0vs8SKrarrUER??7n5_XNtz?i&X5|;h$B^ z&PEu(_wQNy3E8sDhN$DKULj>5Ys%sn{O?_VSDZdFDKU-#1TKy_q9Yg}iIEXWNJsw$}Ct5>%qc|`*myf zsqg*m_wKV#|KIoDpMC%S#06Ug^nh=GlXK;F(9NBtCHX9(w)@tV{datBp#PN=xJ)*H zHviAT-k==+`Ni&||M#6d%jtjRHh(dpBppxG&Z9OO6;xELW0f^c-NTu(cIPaNEtu8MrXE4H{WCo5!2mQXvE>JvA^FmBp*7&012>G(fV$8)~j%C6dKW~7ROZt+rE@C0YZZa9m7l|TxW^_2(8y#WvCqrfvhvY`)t6#$TtRa!f$ z$&7vSyc0Z!%m#s_wXz~T%)vE@pK`z_lw6xb(&W`dUpVlLDBM3hkuYkU9=rtZZ?TDEb`Flu z&fc9JfPa!yt;d9t84eMclazuWr4kGI`YkPTm7PO%?lyP&QnQkUm+o&dC_irrM{09G zGZgE5lid6~n8yGk&Ri$`xH$xuoa?&q5yIf9?0;BMY>RN*zI8a zT5Z!^K(0w%yhOCD9I(7Xw}b8GZ#&(bs*5%%%aC{hDvQaq-V36X;Hj{T%@n8|6Pgkh zc!juvg&tl4m?UD}3UB>dLM;AONSmVvRj8)FBzFV|9)T^}a@1<3E9avv?L(ns*^3oB z)Nf1Sup#;+zPa&im>r#?g_dNWtrXia30WNy>E7Hf z|8M`rqyG0!o>lCB{~`4j9DyMWuEdH!u{e^X0tYh{x|-u*q@#txD6$QN4^L0b?Gv+A zztuBJ)0OTe+f8)LEUgLEU-e)5+bN+u|EB*c>nBewZKTy^rik=aI6jrx6@9@>9f2>>U=E_XX`mHCMf%CE+Ng5&e#bOH!DCZlat9s*6sVj z%a)t)Ivcdw3vohat`)oSI%}nFwN$fdk?O#jd36lfq>z6X6Iu8!XSOT{>2HNRdF2KH zNJLwW(y`eFm5)zN$F*v*g|Aj-Wd zjNw?`NazbKD_EM`JuiMe2Mmv66gr{;9^pW+MlzPRI8Lz==rm&N>dqM&gJMsc)|XyeR2Z4G>}Jhz}%b4#hVstIJj zpgAZs?UoS{L@DEls;dwxw)v&1WyP)i>e0HS_PGK7uf29}tp6VjD*XT6{`2RL{Qq4% zE9n0%UY>CnhmeLk%Wva$ph?6OS9?I!3A-h?uyq!h%(apz7gUkob)9N|CT*2sbL^yo z_2t#p5_-dVv4%Fft=H&j=Wm_3hs4_H$7cx&e5QTmZJ&2}?ayXGu|ykg3r_PlMenMp zdfY#M^ydcqzoMS@?Y~w3v%g!;|GxM9(f;plo)z~0<1dNWp#(=8YXylkG?o#e8@DNY zkMZ&%+7(*XmAgrnSsG4d5;uxv6nRe5H~{;*@+Y32r=t=60$i`k(<>m4D1uxArNES# zT(wpJGG%H$oadmcGpua@`ar2(dU`U4w>=Q`JImz&D3a0Kf%{h%xS!qi2L&_4jnXKZ zgFjOk;Sm;sNs`FH`p!qBT9@Uy=tDrxG81%0rpVUHnMS#bR~3V8tvfwSi@mp{Ll@ zvP-9I_gY*+wO?<%lxkbu^pZM^B64k8)#h=Yw3#ze=n0W>X`7}I$6j724+|iDg#t1i zO6yY-KfnD@)^Vb0HrVWI;||+gqJY{04i(%h>^4nDopj{VHp#ZZ@Kcr}aoGc=4ihDU zsOTxnN0i@fDr1M^>aIjRcfkMMfdAK7Rc?C!JJ{>*mF+*D_g_55f4-Av1^z#~{?)mM z)v>wY+%yDII4aGB>bdrBsZ%=_%ZMXY9wcJ_P^-lS?sT60Ty()(YRUu0g%`cd_vBro zyh7C-senfD9mu`{Hdci4y_E_9jPVS`MyyB~qB_c6#%)**qoRm88cB?NAddlcqky^D z_|@&8@r~K~BV}A)9%sn!$|^$`TwOyN<`?iXd$cbh_$!V_j_o@(9TBlQ^1-)8!h037m;x%n;4;SZ6q8VrRFb z@Ix^yY}to)P~%s-<92}?p?J(EE*SLX91<~y(vF}g#TR}rG$7N9ze2IVE0F9{HIq-X z$U@+Hf+$iJ-v-B+0mg|S_eE==)N;*YP$?{IL;+9w)c$YP*nbpTD{o82)6dwI*KAAM z0Quts!G^IvqYT5Y4?f~30tpVTzz9>umG3X&h-#xiy*@+Lm;zPJ3Gk$iQNCXanAI0O z(y^w^5KtJ0WSSvPHKV2zc;FQw5rT2CsgDyRy*4=!q9b7Q>5!=Vxh0y;H5fIFPH8@r zB1dk`(tnmg9OfzP6mw(rPb?j3{dt>@GVm%+%8r;fLPP0_szaSfMVZMmr@f?QN5$1F zh<6~42ep8+bErb4YJ=K3839;B!lEyd#vw>!0Y!E-U}(=^_bJmgb80Y3y$n`$w*Yxf zH+lRPN$ir4^1dKrnIkZGdWGf-yWu84ilS^eXPA{w;(SROouNV{3cC&fJ3ctgeA~@X zXBd_jNsc_RVdl$~8K4b%ifeTt{L=PQF3@brLVF9aSqFjA3Dgx*v|S!I(rYwBsxDYN z=v^P2$)yp^t<_ROmmcvUh|#rKNmY#M>C?-eB`8q39X*7n>ci8*-k|`>I~HTh!D~JK ztH(}uFh0p3J9r6P*BqWt%-Sry&bNYc@crzADQX(lyO>pe&b_yQm0>8BNTL)M!t~7P~!Njp|>{yl%UH@V+*z%aJ9mB%j z)%3iE97<^`BIGJffIAb%x8c>F)GA|@B2mw8S7xjRmd~Tru+740^D+Cgo#>}X4u%=4 zFa5P9inQUeYC~62EfE(u1a;C~h z*HG4SW&H+*`+F!3?DPTlxGg`!lJk^F-fkl{TTn0URn+A5^Te24o?6SZ96P0+;tVTk z&}YJ?NHn?z4A+9FhDdD>v@$3%0K!_)U#g?>s&n(9CUl4j$x;u9C8caC1WYq5wd=X) zt>tS@tTg%OoMt20ipVvhU`w14hfy+tV9@QVKi{TPL~#HHU9goVNww5B9Y^J}+q7E`a-gT<}dWZH!a!eA&ix$xF&!8WVYm z!h&OybTo=k?b55?bSeWEhV=*Iq^gTa0||I73K z{^R}Mojj|@f3af}oGTIl(&wjk|JF1ThyuCeNfw? zABTu$+C-(S%~Z37Fcuk7)&vRx#YiDFM}bmGENd58?V_}USMKj-xq>9$`FIkUFLqFw zy6jbRfAs&jlV^qXublaDtm5TM z&s$EwSjh86y4H7k%{zdi8GTJTMqID^#bUh)daU2dI-YsC5W^)So+ zF352_`v9rQ)QP?%gmRt9RWmVf5D%f?n3>@s+M^o}T*n!{4fVC&2+ zytv6sCDdOlt*J`Gxz!PZ4+tw#-FR z4os0ktPd|uwK{cNrjVV9`OEJfRTbGHSfHC#x4j03)~#>BCIb+vOKOd%Ttd>^Cjv2v zJzaVkl54)CEZOZ`q4}UlhtgVSRZ1-MSGM-j!!G8OZycV`PV_y9m&#|Ls@w zzdL)6`M>YvS%LrmsOB5MAxXJT_(Dk(NiQroUc~liq@v4T!103c-)DsIMZ0}%Yqri5 z#v$0sG!w2dI(C5-(7UT+ik72ye^YnCf5&kMT#x?tTlm)}-`E81Jl{WXRk+cQhi7k3 z-u~kNoaLhjA>t_DC@MSIiN@k6UEwm z4$cS;tJv1L!4jFEOd5uvc!nv7mD_|g&Th^?p>cyKGf60<0iTT1;^|&I(Tiu5bS&M) z;}P=T_7Vd-OaPY{;w^85I8cEokzyY zQwBk*(iB!wd@W-um6K7{V3Tsl1b)qoxr`BiQDRum1f=L)qRT0>k9@Eu#5zUV_QTk~ zXHaMA59VoTRlml{tj;ps&kWP^o{ZBRWO-de1zLUZT1kBeYP^kSxK$O}(`9Gy3k5CBmX6mu_fN6R%fp zK9tqw-t2DmlfL|9n0A(!1zT0vJR@dc3vgf1If|XH!PL7><9$=S8;f`~-z(wVJ_-y6 zk?{&TEbxP0efA()=DfVh>ZY^!<%+@8_FIeWs7wk@;#+x{}0a>g(oU$|q|JeWkYQ zMLtM_3Fau^DXqO!D+6Q|FSnHPNwer!YDXNjqC$h%ct!|s5FM%Y$u0C+(~dZPjhTtn zMyg-8)^8VI7uP>SNrVGQB2B}omZ-M+KtlV;d2h(DV{ZCQkEOP>GOqa7kW?&h(*HGq|W^3A8N0GB+GaFXpm_e*C z?`x`Xnp(M`0>?D_z|}YQcDl+MD=>ApsJywwo9&NKGNP&GrU69??Eh&Vm=v_@Ar0Z`)AyjOuK_RqQjZEsyVOQ_`XZK+Ker%NtD^s2na5cjf>(i_ykX+R!zZ_6?po725X=4-eSv2h8w*U<^+ zW`Atmn;ygp^S-X`t)Z2h>fUs-4_x=Qw1%dMgT74-&4%Ti#xb<1X{-gchMMM9RicYT zk{@?!Zmt(KQ+E4$(fd}-+{v>k{hv$&(BKH#X8-lPlK=O`VDRYwc_+_W`oH=4|NHCa z6@P_H68Eq6lY_if%P-l(Evfm+$XrdyCu?s+#b>v)ro~qQn6>S_>{cGFy&kQ-suI3j z(fZ3o-?YP!` zHl+Va2;*al>Xkq(_Fsejvi@hcKX~;2yPIbn{m-eI?AuTRS#oShCUr>!SMJY85Mf z@vyl^ZA!IREoPg={A%%Lxwd9)Y$(J`6^f#IMPtaC$d#zjp2d9jih6{aF3R(<0NJZ5 z6c!TaQZsP7>V?H4dq|3g_1NbS1vo@mjyog(6DOih7Np@^bmmowEoI0z8IB4uxv$XN zBO}jzTXe29Ce4?T#dY3)1Fg!yi(?J7Il@Ytc;lh6cmzdux+KIj@ zA-}bj4$*BZ8;Y}jZ@Q-T6Ld9AM0mV5!$3 zb&JDUAWt{;v1-E`R#jO;T#;hdQ(7%(=!Tjrd$Jz3`pPIfDlFlOQ_#Rx-l8&Ov*N+h zBf6E{BQN?syAW;PK_stSU78E%7T9Ynsj!U2oKAI>swLw_(yp9B^*!FgPGU2w>un`P zcJ~LS;@a_SZg;a0z2Z(+ZndSU4exh$Z^`;wUaf5V1CvYRm|94tfh3aBGPmhrQMvok zA8$ziOHqg$6G61t|LyPg`(^vT{$u{fyLp^-6u@UK(fvwrn$^DY^UXBA zs)yTA_EwO&oLW{@TTUa}XmD3(xWLs*bC2 zAvNo;x!^GA9Bk#rZ!#rPX&i2y5k&hBi|ehxsz!n# zX14NiB~)c9#C9avMVCfT0m}Cb9j1J;`h02$(wJornvr9JXwu@VEW5+Ao$=SXC_=@W`HI&+57oFAhhr(*g zr}{Q-D4D57AEe4jop>sjq!Gl_=$FQ{)X3YXmhj6KpE83{ruaFtfvYtMwlvQG{^KPW>~)u(iCVVf2J~Oso~7)vPadLDt(cEMF6+r_vtR;-+p0)fC93X#k0J*qc$-D>*JEI;}M) zh7*xc$79_Tjx7$wpTlWX@OI3Fy#{?s&Q>()Q|kL=V2ol!AxB|vc{fX)1-`9+RZNdf z0~10H>$_;Sdsu?6&yOmVG1||xV+Db!oq8CK#}#oQr(r*v=tj9n=g6-~FTEUln^Bob zIlpkVw~wiDEN(ePLFStg~DYOKk>b>8M=S);sxbF8p+j6Q=d1dfPp#+;cyf!OUY+ zEC+p*6^e`zKT0V@ajsN!-Lm2a#$mQ|=pCb^KQTQuVNF)LAjk3S1EjW*WCIwv3-{KlcM|G|s7c-|Z;CCAgy^0zD)%?@Hu&32+Elbc0!w@|6 zJi!(TaqHz1QC#l=0ty(1zL3Il(#U7udS?(=!NkLmYgXm|{RxVucpMXomhPj4|L;HF zDd+#)*?;lkk^jGorvpwQ7dsUbw5=vq96K=>rZ@`4E}p>P3XT!;oesE|UCS2y#5r$7cQ>#-Y;zF&Zl?=`E$2(AKEn-?~0{7e{kIVp&sw z1QJ9+gk$78{_FG4=i-oaI^alBBKUB04njLdhQ};Es<& z1beC+C4V^nj0Ge_y&p&`vFiFiJ3f5<=GdQxEA+8={qOf*3|^Gie}DHe{?DB}9qv59cfb}9(^s^?M zjwsWW`tLC%X(F~1MNA+fV;q1X;@3!QI2sUD&v%?o2VDI6@2}4s=koGWaMn(U5)_9h z4lvT(yEt19bbIog*Q(S5Fz~Oa%uqxU5Tk27A0QQswW5Z~{CCYE0j4m9V?=$&c~zLsLI-lk z|MW{bL@-HM-rALZQkV+yXoMuA%TS<%7SU}79F9gf#vBVkzX_qg zXF?(z%DGXM(CsKxz zqRT8l3wQn9zpjSMW;i7abxbLtD=|;E&NXf7Sy>iZuGJOzw_9i2Huc;Np!QNglFs}z z8B-Xd+*?82;EBEOgoA4wMF7Ptl|C7@E+=C=L$Oj_UnBWOH7PhssI(A1I2nP<{LWC3 z_@!Yb)m|_w zZ0uQ0HFF<_`wzoViN9IQ9nKV83T=>+_hyFWI$1fEcJls*x{FA)j2#6Le_} z@RZ`1Gvi631&l-&G-hDgl|KqMu$F2>jtBlMLaLtVqX;r4PWHuRY7Vd2Z&mpzIX&MjtSSUK4P6*{CW-;9>=;I9^pV9)AD8xadT~F z)~j7TTmII|2DZ#-7W0BNTiBf-Rq_JA!Xb)oOIm2^dW|cM&7N9qmlcu3igCOOiyABI zI>HnHs=`V*SgiKZ5J;maHAiB*P`>~tl5r+6xKw(3pCu^p8H!NA2`$zVGQ}mE1;sL# zixfJNQ(cZd+!ST3f6cWi%4nkrWp$x8?i$zyn#J}ITgJd+Ly797d7cf}b)A*5x3OQ(L*aRJCMRNtCkn zc*#X8Q%j$V*X9k^1Spuu_#! z;WgY;IZlS&{KWZno{pqHvpbzi@pgF%2>ujiW{_wh8L1pzjLJvx}Sz zecIjP3axNKcO&#=(S)V=dY?F2G(rn~`4xa->Mv{1mw5>h3Mk?fqZyL6<9GyML=g<< zAdn|V=-YC9!LiKKQ74NS0o-o5Js$h_`{NzYSDf$?K`Ihem8v@(am)x9X@*&M3PqTqBy82@oU{&7?_t=0#>u zYtX0a`=Awl^_Eya(qqnHPAD9s&Dmhy&!M|H%gy^a^$NtSro;~-$ZYkzt)JJ^2Bc~w zr`ANUX^f*dK=m7?RiNfdnVGlV$KZ+{B+!f693Dwn|GDUkX3X8y&1O-LGrK!KnF^_Xt9 zGofNc(Vr=bc{DebgM!d;`Q%cZnnD`URQsOec5Tt^-WF|)(3emz+#<fZ^hS^jx-yA?ie*^Q988gHozML$hkSJyC7<0)T`om;s$5u@ z38e)MPoiQ7tV|0njEfnaek(ii%*)~xYk3$YZ*j$<@_a8CQ8LYxLzjRI|3CrP6M{KY z@#i6*tTc?PLI4x>*DB0c?J#~pb1{ftF|%C;7#Ly7xHSX;v2@&l+6h0@LnTy~)$*WZ zmL(e=ftbXeDQyp<%2Z#W`JgyB$x7D^Pw!eEa^L?oO#JWPT!C769OpI>6LM{iP3tK2!MPA-KG>n9e&6bta4T}0UC=Ur#W+Wob@OM6GzSL* zCmc|Hwm`rpP%yB{wo>L4mL`{3Ae~j_Z!^)gE|){qgM8ZNuM}d5>8nraC~T8clZCCE zp*NzH*RM+P-PfPiDtD&g^zv1=Ak^t)zIHN83bTNe%1p{iL!@ly1w2v(hq<;8Vt~Xt z!qS|i3IQoYKtrLWCUXO*&~!`tQQQ0#B1y4Kr@Z3)$xOfpqI;|n+z zC%;A(fJ2gU9acw|0343xCZGB9T(0il<8(UUJV6155x^3IESR7vWR@qHXetk1M72-L zfdc@aC+I*lh~u#XK$uV0fpLT}#jWt9$}b5s5E1DEQ1MPh2{ z>MScM2|4$ivRl>>n|kpW$6p+W!*N@)svQo;b~6Kiulq*0_? zvD+Gz$R5oBRL!4e6|<}fQlb6yFuI0w_7vbz4u`PKt?(E#z|`{&lz3tXYw5~OeMa7HrZE!L&wC8&6Hn6*SE2EaV zt`2JzVkY2ZAe;+?1}e@N!$fRs1&CeGbsQK3h_N>$L~Y<6%93D8!aQ|lBix0K&JYYg zQq0jiIROm+tF^Op{4caZ4?q0_J5B=mq^;dk9WQ#APh?nVDGN2Xh@1`Ss7db>rbFSi z11!Xr5YPb<0}|+tylJw!&1kl01(uVo3{uxJN;{sjF&;Cvfc9XgbKUwCn!kZbf@8UD z6x!17vrvGlP0a;dp}Ds6tue+HA936Sgo0mPzAZ$yiprOP+5tAO9RM<}QWP>tntnm^ z43z?xa=-$xRP0nAwI{la%?%ie8J1yD+rXAc4$Ju4)Heh6m0LN3rL<83_mWy&M zYAYuJs_yj@!WfoeB<8AHZ3c}gD`SKC`RsP`oxG=UCEt6VS0BkxV`cp?hCsVgs1ph% z$?{dz6uwK~pDD`1A?CC3^{Zu1p&9>gV7R}B;vh@@|NXmD7<8CK`G|er*8!_hJUeg< zCuu@Uo*tf`e|&fL+R2&BnYs8qaBSXFp;D$U8x_ASK$mT4n}r;2vhr-q@b^T=Ah(|@ zG+)@`l@;TB*$&MGbe1CT`*(>yr(*}emuM}msN&*pTTP&#gx3q~?YoQPbDw`v`&2+; zMj~{RR3rWV-6k9957tOGvShxI))aF$PCO##=42#xq!FQkI5`Q+?t9d6ry^*GJxfN) zKuB$6FhZ2G!nEnQs@h)z2>usL=Q@9Y47y&Ls+X?2UBc!|*OfH?v{ZD-sP5$so|vWn zSu|0K^xhn;-pSS-`jQaJfz`~*CtFwP5CuGvl}+{sFZW9^jy*Xw0FQt_7>NaVFWs-c z*zD_9V( zjv?G(9P*TTWaRM)@^ozQ?l#~P%)k`>L8u+4Nx4!nF<{NY^MX=VOFb9A5D~ zk8-P5nG_K?5!(Wx3CWx?^6;`F1bIqDQ(>q=&#IyBDjrIP0BeD=(7JaB64&-H7j(1Dpf zUg=?1WJxZ;mT~eDXc*4HknoABv?GVNYjAHhBxY6xZkEF@wz*SnQw0VFB#!1?AAI^5 zQM5SdwF!1DNB|~S4@w!6b*0=Jz*x{!2&P10DVKJYB1mBO(hgUqto9raycbwde2|VV zd|82Mw(A$b8o@t%9bMX!z)9)ks#C%QSFs2BRu7yo#Z0H z85t?!I?<{I%{iM$O{KERNY8SGkp3fz5KNS6y>7N;d&>Mae#*f}Y+Nv&1I$>8*z#Q} z9$l{@O{XkCF{GGeAx*P*0FV`HhXgUvz1gtLYJ~Az%wrBlJ_=6~ywMp-~!v2*+1U(Sqq&^jL`Z&Qne(h7s#g#K`~8-n+lIZ8Hg@ zzw@ua(&-mFuSrS1rrOPZpX0cFeVW)lw%eR;+Y>`1B(bIlmVo4F2RVH2pB zhFg9Ytg`~H{N!%@yTkZp0_U9drrhQzB4S3P&jCvLj1TZ6jU#bvR-1(c;XA)d0C+$l zpX3ZnwY$ku08$|(FnaVmotv8*A95^xoQ*oMC`CH&j}MPdE{?n{wr&5M#E6i5gB;Ao z-WZ5r?C=J#)nk+)v8qQ2xXB{QvyBiuq&F}_P8boIMT04|2&Axz2rvt<#W(@(!38+J zaKYPyi{pz;=i~9^KTm(Y1RoF1&ks&6kB=_E={Yz&J$ZM0d3<_u0ZxAa2PeORpN>!7 zZ2}YtMc(I>$CJPrh$ehH_niwF97Z*+wf9^V8wDVS$!H2k2#oLyiA#bMWs``A4H71y z6GxLs#iuBB$6r42NFo2n4I02S?c{6wDsoIT<^S2<-?H<6^mcc;&-p(d<*@}J2d3#S zc>;}XzgtMTQA)V6WNr-rC>+Vu9rB&0VHHw$SQw z<$~wMnAshBYRZ2b&!YJs+W^-yi;odZ!zP!`I*MZTE&j@B40VFL)hx;rD14 z!QNgM?T7I7-uGQcdn@;W%fukB*Y$e)m%Z2h?cM&?w%^;^>Al|G-}(N(+~*nI;;Ekh zhB9{rZ7iPuTixyMZgKwa?L5!_M|p(XGux15Ji~(^z|(|^3*R(`0UF~tMA?P)nP1?k z%PVpJhzW532vpK5bz|%RL$N1c@C*M#;V6qT(g(l&;Q+9(`lZGiTUA6#PwJG%Qq)uGAPl9!j~QxFq9l<{ zakx%4oV7K_hQjAkp^@U0&Edy7tX>^xV}_bg1GO?;$ebUC(sN$@&Ry;05a}9DZU{j7 z>_;6e{*le6X>veLaB_|@HMm!P_?e)r4|?5hSG`3rJWb*`EB-?iBQhrxO=QK|wp0g2 zM#5>POs<60Dbd}KG}3U$OAtphl!(BXA#Xk6ztRj35MeMgG|WXqJEE=7j6rfuI)Q50 zOL6Gw28{QrAx}5riAFkWMrGZs8Y@-pjD7LtG60SenXb?HsGh`kD(X8O#1!&sha1%dwVSc>&l)=4uV81$(uI)sn$l!)wW6C3ueg zrZtoG9-hgh$n5~kKr_G7d5ZYvEnjfEwW1gx7iU?d3JkvzGQsc{6!Tko;Y_Tc;G_zG zxg#GG;wYC<&t;k3GgJHQsn9UXC2WFn35^Kh|ExcCli!}ToN^;du55BYpUz=7{Qsm z7=a>}ZbE_xPdR467&B@pA~8&S;idv(!f)v_1PS5}Qanbx%!r#!xuLTWzJ-X(l{lg_ zMxxUakxeZXe~6NZ_1{-leIeGDj;bF>}sGn#^T&3r8W6W;3Izk0D^Sd2V33lM8BD!373j{KSmBv<@G5tm;Lxp zg>1i6eQS5`LsV#Hmp7y96vfg6he(}X^WLA}5Si!D6o&v35{)=VvHIr?5}Gk}SQDN& zNAv5;wKd0VwS*GIvA&o8jk^*20WOVq453``Ht_P>h>ihH0+iBRdK8zcY#^xzlhDhX z=cpRkaFv3IDOAa2^MitV!`K`qH1c$r6`@UnF$$+~l#Dzyiv&ppEG`8z%68UNqr5{F z8mvp|?+Ov#$SII7o?JNq*(4`?aiCb*h>L4sbT%PuCm3BbpVyo@0E~bI(@L+ zCz1KF6|Mo!LKV3pvUeh#2tYXXx|6INv2$k#>9gGhs#|X9l(38 zwRphezx!gF^Q0euAL9VV{5#-ghhk0ShSt(MLH-6h{YW1iv#Q#PM6yEQFgYVO8#MK4 zRd%)rV#@)&Eh`jz%=U2dL66sa2m&i z;%u(xgmUn~nG!nWw9rKz{a3|!TG097T{xFOf#5y*))-g4KQJ4&IBjSVAjc|NvB*P zfWa7f(toSEA}`W0ig;ELL<8}W?<#(%z=$^Z7mt1M*cYeViQ>j$lvpqh#jWrWiQhnX zZX5hA5_@|ade>Jd5U;AVVQD{B6sd|P|++lx+ckC|;N3tBuMhs{9i#@LAMH64-j|7avFE_!j~smZi>moMC3^u)wXGN46J`-o4PtLN@(J^s2n2THIf#ld4z3w zg)@QahN8_;GP4PCc6xF72v3lVKnMU z|5Nn~%}|U}E~(GqBzA4cZwoN;NHfKPpUzItFYCLnFFBhifRb5#?^P2e(q9}My}Nke z*8h2WajDm1#)E9)uz4c~Etiw!ys<7?MG=ZCFFyEwLzJgF-v>%V-j}iMb@;qOImVZL zFqwPdz++d-H;~Mx7kpRUpqXg$5vvG%!2;wZnx(+8beMuAx1vrC41c! z`)V)Pi`VN7dDW3_uOg5$a3#-3pJgxq%GXI>7>{xdO;vI~B`?u}|>`pffhii9d$ovS?WA_CS2!aC#K z$ptIRw~Q188@_Wqv=XA_VgG|XS(wTsKj4=Fp}0B_G9|~hmaw@CydrKi)U;F|H9cjK z+V5@X9TN@b1;@Srru~5CIBF^gApW@^k*KTiv|cWWT$)7*9Rl||;(bTl0xZ#Jd-kgS z(_%VfG`Vaq{b(Q&BP!WLl;V5Uf>D(L!MvKTm{b;jE3chfZl?qT1l)hP!2RSdKZUqG zuiQ=RF%;hgippP!V{Hc#D0IjdO_skCOAgQl1viT>=C()d8%$H*RyJyL;xAt+su=Md zj4qdtb zY)45b*ij+P3g=%_kElxkihqTZ7_3iFHsUAKn=GQJvQlBSGd^w9H7|v1cJ`Ov5!`LW z3O{Fgn((^nWFR_jr0-YJ;VNlSJ~ib??d4(Ks;E*>>KbKR(Wg+oicWTsje681#ej~w zCy8Ki5qn~b9(SO~YcufOGBkM{s+7>vbg9HR_h+%f`B_w{Nl58h(dXO>kXAsqwkVbn zG!27wG1I!JdN7wq+ia*A_X6f>s*2mnvS*_)apg#sOVv`rvc%Md3YL=h=)47g>8_X1 zHLWyt8OvDmKFFHT?~kjt!OU4JH-WqdmKyH;Q8cAwGg!7RU;JXvhzuqp)E=0sretk( zTg-KaQsLQtDlh6+l?6!Nr-BJb4neM=i=Z^`5A_E*j!!O+&QA{B zKQYb?_$agwPft#c4lhs7KfV3=`2D-1^G^q7$4`uU3!I8h~VOs@ZO0Crh{p#ALnl>iYC1G%uZ?VessdyGq?;D6#ciLG3Y!h+CmzjA(cRzwC zYtA9gM99(rPf{pi->*l7*qekqxT7pLRs+&M24?_sJA6W?!{NrllOt=cfMk`d!-_SF zU`}0A)eh_ikdlkEdT5Yd;NTijn^%Ru<(SgccwOn?Y6v;aF7VbE7u;fN0ok6(7Kox3 zZ7qy~PqGE1>|k39rsO_s0V@0N)&eT|H7|9-ukkB4DwN%o)x*a0$I@^M({Fwan``8)-W5A)$wmZ!)=x@7bYihJ>y$ye*d?~8oEQ6Rc zBT;%8?kB(>t>jQB@FT)0P6{+ zV4a}J3}uJx;Flrb{^y&X-+S$KUEm)=c@~Ti@qd~Qki5_Ke~hU7b7Mnot-L)Ba16;$ zXkKd9j0oT^@R4^7kS{*5UJ^v_4z0fbx|M3fWo{8wCe8P4Nh3{Gb0dHR(HopyN6E;) zel6^9d%00jO>;XdZEk=l?AeA)W)*h4Pk2;(yR0CJFkX-W9;z)Da&Er2g#s(jJ;fG{ zJTFoSluu^l2v*5RLRGf^DE!E#F>36Cg`5hF!CK;pSxYGLAT0S&Q3cAV=r#Xl zA6iu?4F;b51qw+4P3}=aHWqNpizV14fAZ)Z3Ju;&1uBIT5_<+PxJF4>)V?;Ya;-2e zwxtaNimjQ;M6F_6se)%gsWw--l->f6@bI$&uG$()IGG+VmDrwCEnyXS$l^kM(A;Ek zEDA5Hcb})0UY?)(K27q!$`<;7@_%=~w_lR~d(Zh_9_3jB($h`dpy4E*>(F^TERyMY zU4KirT;kx;McRD?u##A%eAmVpU-vG<$G>_0i}Tt8 z&i~%-UdjHu+ueSi|Bvx3$oVbe%vPSB+DS#FgHctS*?S(0?z3{JLlxE1Y5`BG1y_A% zf5IwVR-^!OZg_|F-3NZ0}-7q4vuyIdt$YnZr1FRQIB=XyaHZD_d zDiKy6D^EJM@%qws*$b`rt8KC$!ydcJs=vbaM9?S3FnkMRm;@+0K9k&Ly{jZ^Rkd$c zX0BfU{ZT}tQGzqHiZ+_$zg~B*l>cvM>v{cujAuDXKh^X9{OI7_ha-OyuB45I`MX zO=Ycc{_Qs{1a|$seZRM#XKjuqBcF_UoE$&GodFC-s3VJevb1L;5r^^rCUhR7H^UfG zkNh=-8QK8<_S+#7TFiUt<2j9Zbb%FaLX|f;t9jyC&U`(>eySA z4vPP!6Rm1g$~bryiq5Te%mKH`|NRzReffF?ZUNxmWd!A0hnE6zK zRriv&V1O}$e#PV7=AWgtYF+h`JqdRYxdm6h{b3gphMjd^OD-;T1*M$22%UmRyQpZv z_NT7V-1wuSL^(QjPD>tcT9=eUwUyM*9#6Mewh&%s`5K&Eo2u9jHCACvNU40QK`;9Q z*NsH|S)-vwYnoIzBU%+|6Eo(JN`6Zg05fk}u})?#RYn~<5u8!0;=Z$n4&{r(8afoM z5b8M8zGkZ&SMxTpvOu*7cFp?IU<}Nf3M*V%L5ytN9v=a^0E6{dKogfC{0-SSxgnseI8eU6Cth`tvch{8XR+ zZ>z> zQSSGyoI&2|g!(+mOk=+sD{sHfaOSnBnU}e_xv|cb@(wf>Bk2@V`#&}7K0hmX+N}RF zz{Uf`|LS&odnNnto!;~M|0vJe8YnD-Yir<`FSeP`VDTu&hsT}6cYtCXizFv$hM6FX z2+v~lf5>%|0+~yTpWj7liTt-(nmo=~&r8QQ^R$`&Ml@Kd^NW^>2-`6K_x5&+^M8A5 z=Q;l0qdYv|=`5P`x$nX-iV@rN-%J=;f-&j?6+pW4$~i}Lnk4`Nf`^o=19T2e9wL<| z?Qkl>0vcSyY7w6S(2<(1(cA^@52vTDjM_w0%pUjc!MV%+{V!JrXe~wIUfcq!l4fX# zvJ8dqrtIu^p_6hR^9yeI`sgzXrd)OvMjpHpN^;|19=`ABbDAMS>@a7Zj{M+Xqq%KG zi&J(W#Tk>Qi!l;Nzhn_DO}k|Zse++yy;XaKy{@ul>lLG|n&UWzS$MB;WB?v^97PMP zirS9a52LBDxE#c@T}li!jMU{X<7-jTQz(G zpz=q`p$dLk2CArGK~2J{IK`zEFvX#we}^kRX|()!q&O_BhXJ0XI6(>3W5F*PKIHL3 zUE3nc_+p2*YdKB^3fgr~BVlF&ab4i&A9UFg5=Ir?rwvd>^zKV@PIWe^tw^F5meCq0 zL|x^ByIvd%VIJsDEb>Y!Zq&vaupJ3yAaPBbjbc$9zOS6(L01wn{S3-4^2aEyGcT^u zd=tD7NsIe$Dh8#9(F?J_$w)o&(yd}SDmBc5{H8EK*1B064Okb?$y#oR;uObtH2;aM zzBYYSTID6Twbe~dYmY;rx0AR<~?fgED&l&cd%j2Ye}g{=Pkx8(UhFx@QMY5*3W|9icy z-JRn3e|P8E|Km}fJDmUN7)k#IGnJma9jKj-7Ux{&4!V^&?t~RgjSGP^kuhMH1s9a^ zOxu6M#rBJpy|B)aSV2(@)Iv7rt&zI!{w=gRo3PP=X`10Qi+CDDeR0R{-%=cg5y__f zo^CJ=N2n^pW7U|Y+=|H0;aMYBaLxXYp1;-ex^8)|ujd25knje$qDd9u!L811Q!MMQ zj8-x(h3t4cD#4U-n1%5#8^zPs-PRIBVCZ;;US`$e`WO-DklG$TcM<_xeMZ;-KS}#*(jmIRF?D|s>Nf|h{BapV%tR_w& ze#wGQ1_WKIMUk2qLXX6-)eV1t?}lq*7~OXjex}-E?_K9_4-O4u$ab?T8^B^Sh@Xh5J0mj-zwO+@bu{1_EY6dj|kZIxBuZg z2jB+I0mUE~qu{!x^bHi&o>4+G98Loif@wmdSQps#xBadRFJYai85l|BO>i@gf^nXf z9wq>WVIRE@@~S1pC=Y04vD7`R&V!Jv%$WqtNr*ZcmD zjaR?@zhD1&_4Vru7pz<40k?qS3t`D`gwW*dvxwWCT37Zz@mW&;%eijZY~T&{U)#N% zUP1r6wX^jc|KU-dcKTnw%wLW(JROb2$|DvU5lV~A<0)bPihH;e62i^lrELtLV@Lr5 z$rrEz66Jiy`I*2G>WhoY8H}Tl3j;^2fo|7|Gb~r7ybzI=H9l)NMm`5=XaD<&-y)@u zj(v)Kg;lrf0#|r2=|4_*)>}d>3sL07GPE#Eq&EiF(PFWY}l9DOeQ#2cEhSckira3WcZ|FYrq3?EAW)heCUJs3;{eeN=w%- z!UPAt-!YkkXM>NpwX$Hnh=LoOyrh7RGkl{qN!G5q2=&0B{wr_q3}z^ys!+Xv*hJF& z`mRVSe)0Y%juL)RU#5b2ISG@nqP~(Cb?~iY^0UChx_@}Vag;RezX9&=$=Sih#mCe0 zcNgI3{QUI14}Qf{F(1^1H15_n`bLV9)=T&I1QeeW zOp#a|&)zer5gqtngV<{^J1xRxJPR?Ccifziw^s?LEtXkMS%a{~21BG{Y%d0C_H5 zX)II{KP0d4|G8it2x)`=Jja+CxxS_RL&r#_=XJ&Hy%H(vc4NB*EvHGv(p)90@O7KM z`eYVX!7eI`>qr>70)?YODfY%V(wh35YC{Gy>GQe5NEv^XyYQx_My=I>@pm*V05g?6 zL*RZ#I^U5#H+{2;73speU9UFckQA5&72BxvBy+vP!8OXjF=q(fXAx1D2T&qlJw$1S z0!UHV=UE?Zz7QF~&8*r|ZL_g}UDLdHfoVxGm2`=3dzA3@4wQ}wb(zOKD@l~q!W#h7l#QG9)~{ql`{lr1{)q|L-(wOcP>^3u#$Ija{Ag$?Xo zflo7&%dhHS$JXQ^&or11v?@_=TqcLKvfK(LNa#pCP5P;Of{kxw znmu}VzM;wb)Z*I8pJnBL6-#TG13;tv-z&y{-`d@K*8e`rvyA=kk6dp-k;>8oP{Ot( zuE2?i$jD8jK`f&M!#Fk#gb&V+)$J28RlnsuO7fU&MXx4C{u>v#@~ix1B)iGK$zMhN zqg<-q zv`92i%%2%r zz$l?Mw2l1RFvgJX?G(SO=JFg>R)ZooTYWO9>QmjBFe#uJ69c4W09yxiRxo~_!T4F; zFr%==!k})W&mS}_aSf2bsAOIgU2Ok{Yl%EiVSf;e}xvM`hM@zv&D z^gJ#=TavEj>WdAKmM8CnQ&$r=KpFKWFo7d}BOx!e%z%b$^}Kw40Z24TQ0TA<(J%^_ zn8ai0v+Xnz2Rca@v$}JRhIv>ovo*F-g*YIcDH}JHBDAxn2h=mcG!HI={Xu{}7hxUq zvz`H|MjKZV*>&-GZb7T+mQpNLD)*|D9<@k_K*V?yS0Nc&=37iwDJUZnE1 zaRyybg@2cI%I)zB<|L@jWmQpLEG?lonATPbnP-_t}$L-M7l!rx_mWJ;wLM4Izw3&@x%@^n9UXGnyp`Cy)-F7~jd4#*9qeCg?Z$7E--BjRtJ+l9wx zhXDfaKV0B`a_`O?hX1=OYr(d3nm(V3-qaf==)RnOeF0 z)F_TEJVd-uLeX(Vz`7*WyORr6mTSUN6m0m;@le@<2_V|Y-k^PyE4Vn_xfwk}UShkL z=B!}pAgTC7ebl_-6)BNGZOB}#(%-;x*WkJ5r0^X?gpsiH!$W~3@QFDLEtL`hNR7a7b(aZj;u>xgOmy{A$o)KyQZgE+=Frd4eo=SiA5V?mw} z3759XG^UZ47s|r|a9^PSPX^rjRK?G4-jrpWsEP$vf300%>q}UqwP+~tUShSW+v>O@ zm$XSX4TfKmoQQ2Vm?}yX7^0-7EN)T$MqL>*9M{HD-17+X-;(mb%>1&-``_M9cc*0k zxx4oq|M^j#CFFm7{VSM2Zkr4CO~owMR;eyjFQk7==*G& zM@u41^RjQLSBnD0b>|w*TP-_0h~zz19T9}`8gV;j_jze~oTcR&&8uAkPYj(C zE2LHoUbT6G^U>5?$^i7=h#>FQ#I2Y&cBt9X%&}|OW{qWtti=y7O_ig7VR^}Lc>|&( zM4uPcdZCf7H=b;qZVE*6Y|~DhI0G4?S%hYY@fP<}j57qoIS9D09=4j5xyz)uRWZ!F zEQeQhY_?}1aHYp$_=_DDw&+9KtMIGcayNh*qhv(KF6edn7-BYt+>XFL#an+bG$50c zzr?Y?vsm_}7|EA9vJki#qYMd)Z$;yX075Zi_eFD|0J&l^h!hqkp@7GIYX3t3`%fEM zaamHHe#)-AVp-Y*$RG8Y7)JhzHHBRte2n54q)~7UhEYbS@cl&;Wzr~6&d*Q)6R3(Y z0Uoz8%GXPVv-l!=I+DB@f(#}ho@l}eFk(1?2i{^FBbeBrK8_Lh+N78r9RZn723XwB zwE&%KFe(I{!gvTp4quwN|15z~n5VE4!i~~Dk?BC{&zpRdfmd=;cG$S#Eaa}JGSmrI zl&LIp(o32*WY1>Cygjx(hzYFsp%Ryh1#10x2w(*Zv$pUw3BfdBSm>((#e0gnFNv&~ zbAwXqXM_};s8qF6rLsftj!P$JwB2wIm^C_uxhJutR z+;9Nc^1+$*ZC72LMX)$Ya^kTCGoP+RA+5+`&(($abK6foLG_e{<`Q6v4veH@C@W0S zX0hK$&QVQNS+KIx+deqwQzM=mv!y^T+2aF{pc^%l$`qBuC#OA0Q6O|XvI{T8hnLpc zArQ(NW_`=iYux_J+m7BCUuewwZ-DEn&GUttn}yf;Qcw)OuRo}w3b0(ojPkuM@MZUP zVaWrEvwjjHN^u{Z(kLeW2+^O={D%xr*s5-(;2|#X3roMTf#t`Qx@Lb-aqMdw<|SCu zKN$ix-=-`3u&{M8JntZd{InHgd_7HpJ7e3olGR^SDr1ErQI78hPa+QtpGO0*DZ)wf zG4r#T=*MOUC5%;<{!$S|TFF=yAr~%l0sD9NJMy~=LX1R=E4jSs&0Ku{J#kg{M5~M4 z?WGlP&3GElRC(`e${Mb$w_vchgOb2ZA7J*|@G~qpPpOpMCSmo2dSlL_I%IxyY zn4ZPhDb*aOL`g+H6*h&F(N$=;21XT3YI>j*QQ-j)?iBr{+$*mz z%cX8*9F@cYGZ!u$e5Z8TW_9zBgJe8 z(hSWaJSAmm0h(ebX>)26C7aHQPj*mSQgCk)R#b02dz-x97FpgMpF{6GKg-_#QJldM zTB-kMueVps|FX5a`+WcRD9`foU(6T<7lIuC_xY(@za_r}tU&H~qQi6XOYsU_yiuTS zFqlG9`SDJE;5c%nuL0b*K6>TIEk$jv3<^-HX6Eg(TYR&)(!whezE+oO$xrL(FMbVV z71=1LmDL_@mJv>mzq`M?W}F36u4t+&1et2gYJ2m%nS6WClIwpS>S2i;pke**?sbdy zAKSg{-t+qZ7|&Ace-ffhYZHaCR;y+elPof%tOyhW>_{OMTY*qYw6%*YH&Ix@OZRuP zTtSkrd^C;K7c;0#RrWBm%DO+(DwJR0B;Kg5{SCzxS#tghCE$wvKf2vg{O7HmXaA2! zd6t;}!kIrxM7(_Nc}p=EvGcq-UCTSY`V~O%kG!TFAu8wn;$yuEdMw}aI-Yvja$Trt zSf8+GFjF=^)j0F^F7Z(^`vqnyQz!bI;*82nt^&ZA5!3kR&-?(46%G+lpgwy}muU}no3kHy&y&d53Aa_M2&D&`d zhX5rrFoT)6J`?68P}to!j$DBXV%XGBOy-`x2yPyW0w_Zb%D-?Es5Fka)`PG=cuZ&} z@5&AvHMpAa5EAr5sVdhtdd1jS#Wu`Mq83^n4y&%jIuHs=A8b?z#QbNjyR3y$W0yhm zt#_E=iP|j12sVz~!iyViDj|L?HK$5|bFCHYjl9M(M$mV2yBj(8n!2Tuy^aCLtGK91h1q?EW)TvW_$Z-KCe0!65WM`3yp(!M5G6n*BYv^? zMkWsdK1JXSSXUQGIWjhf7$4rKYE|kut&p9u@yqWXMHLPaEYQu0+g?ROTxJ$64)WbDO#RA>rw!}M(qM;zshD5BJ6ov1my-^B8F4${?7DG=-%UUu|rqa+cBn>y$$(@T)fFQbzptiJ_edi0xe>%L%iO zyt69AdWNL!hq8g!SZnnM@g%mQU1eofWtr}4!}Po*xTL$2_k}0+MYrs%RW+6UM*u4S?X@B zNn{1{x=o1Xda&}hYWv3g0;YKl;4u!;QocL|x59+dv`MTqNn8+tVfs0WBbdz%2LYke z=201<(U>Zg8_o(Ie+w74#;Kwrhb&mGo?zK%MB7rZ`8kRP#}rM0bC_ao6@BcKzPn(F zun1&pK&u*fIdk)_EI0OQb*moq_Jg6|v={|bRaieFs$&aiZ|NM_%2#9RU8V89FWr?z zycqALXl`x=N`la`f(#4%&Cfow6AfctoMlzRX@7Y(^L&2pbN-vaEP~;nSryoD{@dT% zD#m}@?QTDx{~qPJ%lYpE8~Ar`SAP0a4E4>N{ZvP5Pk!9{`F^K9)yBh|`6@`d)QL~k zm*C)(j_-WvE5NEg^1&<^M-&BgnpIw^6%jIu7a>jQxc=x^fWtOgR-xwDc#bixIXY&> zC)aAV0uI}Lm6?eFV=7-a)^9$(F0Ox$(l`n@i_~?eT%rv18$A*iN2&H$Y!$3O8cQDW z*buMybZlW@_l6^BGRj>XaZ3zWbwaicBh3tJ77iO_1NT)cArz&{L|&;HqG)e#c3&hA zGFKnhm<#R#BGgQ(dhV+z-+~GAS`R>`Dx4Nm>|aHZ(`E-;nJ#CA!ay6m@1V?4U@PF= zMUm4I%!<`GsuN3$`yEv{bx`i9z)@hoarKS4oGvrRETQfJl{XJK-K;L$XP%im(lQgP zrrwGbb8P-DF|xUs{kI&|9Q}q7HCM^15i{REts3q=`X8K(@cs2az3$HTc1i!U`|SVm zD9@erKWyONz5QPq8vXm~l|YiKz8xiy+1q+ekU;yMx*)Tu2T}-?$-A6FNY-D8Ldb?y zqYzrG#<4-vsBs#VN`+3!W%$TSi}EV$pCGeE{v3&_S3ee3NQ1xzzm&sKrDDbCTVsRSl}cPVPL3ejLM4|kOHIl+S+WJwi}D^p)YBoQSEzxLh&=1w+6o)1)4g%w zYp{}IV+*|Rq7#r{|K7Sc*@-2_{jR#V8YuVGy-Bd&xbCgBhNez}en<_?iqAQa{czU%T@8pA8e(@F_NX=Iy=5k6tUV9}fJ`>U%Exs&d?riU6 zLV33Kdbai|pYZvN{ufYcJ+-ZuwQ_z_TBRqp^b!pCZ0Gefx~9fGZ*`icRc-vuIN#-j z#ex34bxgbqtw;N=`lU)3_th?Opx?M|skIWLUUYj%6~@C%uX}4Q#Ju{O+jCWm(SN(q zY_B5JtKqk8$931|9{QgY6FSOJvl6Jm{;RiF(*Nx4J^TMX&T|+2&zTtbhfo3;JoU|J zf^wYd)j@fg`{{&?wjM??R88Qev_l4ndxn9jfK;g>(x*#Z-aLLaLuISIdP{OeM?)LN zS!scFQFUvTiWT49Y@Se?QZ80W+4^ICxp@7#wqkCqD8x(|3tPP+DP#=fQe0?`Vm^Ad z9-*R%;&?0|_Oc3vh0NJ%1Rhqsu()U6lA_^m;&X_CC`3BP9b$;F9Z@C=l6WrK^UBON zCCFD9j;xs6*J$qHp{Kqr+Sh86=JUwnGVi~_R%GCf5{b3i!U~Ic?WVH02evp}IK`{L*T~qT8x|}AW8J@Ax2}0GT`CWoRi;XlJ%vPV2 zRUq^A;+Pt^RO^s7?CvZ$PuI4wEZ`NZs*El!$uW0RS}g!{PtBD%Sl_n#N+~-^BH@xl zP$O18pfY5&$Ai{AdXUv4FZ#2-5N%#TxU5{BnhW?Am~$*GiHvqmr>aWjl1VLVmv*7* z79U_GF@@E;EhVz&zJdiN!-@@)GzW|!JNHLy$# zOQeNqZt}yTa!;c_zK8xdLt)e^5k!Oi-`;k&TeSb%ea`>*IFEA|1@Ji=`G;};6-@Qb z=zcjm^=e=K`Fd*UHsx z?7)i3;%Y0fvXNjI5mWiN6sfcdv6)C_(bnX#u>6^zgDD*^Kc13>n{k{HbhZ?l--I^b z$Xu9H=suQ&7Pad&sJibAf7P^<`)rk+VSiTOwgt9xX32Wpw!H+`HoUZ*oZ0%{Uvb@} zh7t?xqP@C$Q&>*vCo=)`n^ZZ89Z%$vR0lE9`_`1^8X389KHwQ^Wl~7}wqHNY zqK-Lci%EYtM!_}Fw=kUE9Dfe+B~cV5LY`9#xR{e*UCIpLKi`1f&PMBzs1!Ty!T*); z3}u(O^QcAL-oDnCkhwO*Ug*}yUaSF`7W9sLM-kh_;zu;BYu=o(jJ+Es<5QoX{_f8` z&j02{w@?evaQ@%f+b*8}clUR8p3nb}@!aM3FOS2l3_s`(Q2DGcWOrVkPwYdS47**n zxU3gNKArTJzjEu&`r4R5ib!6!E5+oR)_SXLt*2XSBl6WrdLr#{C2gv@P)>nd7zU6U zo4x8~wUXmT)67sX`XBr+kSu)2wQyN4EXeZEzRjM2W{|rSk>tV`IAVYtdNomiWqR#TJiQ4lSSLa+QL~7MBLr3MhrrybS^TW@Ea>6v; zlyAFdrF-rdGpIdA*>sRwnN?(j=;1WWP?9SZUAL&Xfk~)W4!L3!^e3vNI;!zXm-r}| z{Q@)7NU{cv{0svw^W$_AZ05RVZ1E{nQc1>7)+x$WUF`zgKIcK z#CO)fb&v?@Y;Fh(@E;Q`v06Y@C(c$ zJSE`x-4Sv8G{b+QfI5B@BG?h-GW@6G&q#nn)cG4}CECpY^P_`zACCM^eZkMgX6w-HU?BvP~CeKg3J)N;sJz;O=1Z~sK`#D4w9`k2y`^gA84 zGx%iO32{I=6sJ)@I6A&i2;6gva-JsY>mGp8whZtgLP@i73wIeV`DR zjmS3r08cvdZ`K%ZaRABKc>x&uKsP)G)0D}nx)jF?rqM5|-C57Mj*_qs*a9SnV~EYt~fHW55yl%<5<{2@*8bcYcdz25pe&B;uwREIEzD9AhEUvjuV>UaLTVC z9EUH`LJ&zaJc~j^08}(r$~@Mu6lDb5jH6%-0+=unh^zm(qr(ivI0Xs1k>dfTOt2Q* zP#XUYwMl>pOyCG*zT>>LhSO?*ulT?HG#wzArX+`UE#LSdnso%rgeZ;ie8Pl7CaenZ z{3jj)&Y6b-ew2V9o)U^O$vS5l;>T|iQA8Za1FXF)K@<_t^LyX_!|?=wZGX$}{zKGZ z=R(9_Fe)N2#Bq#oSidP8#E4(HidzLmJvf6=%)iOQlH`6#R&Fv9;1u!0R2U71hzq&| z1>(@cnq312!(o&}G-8O}GOXCn7lkOH(J(?8FrQoS4v`>>_{j>ies00h=M)9(gms*x zQ`%g?x%C!5P2X2l?bf*kS8|p>O({RYAv^BjA-w{(;2hCumH-IY3&6ffqRz#cF{&ch zEx0mGl7Bcob){~CC{>;N_Tb!Q|NfV|aRnBlGKN`bp~7A~HYzC&6;Vo5NpYw!>9D^O z8dYJYQ3>!Q#R*ENMkv>-T-mHri;5shi7F3=3ZGDiFolCCZaJkYCd-}XSo^1HHa1VV z`%k4+G+>T)V9?oT%eUMHuZrE3qt8}I3Nv=@H`bW8mU}%q9IT>^hOIH zBK+J=5Z&+@pZHf|D*%!)KrNm@hLb<>z|VK>t13KUnr1l7BCZA1Mft9zAlzZxm%uaM z`--Tx#nXWBfOrxLDH={=f{KW?#nXiFaCk-u_iMSwxGMh}?m*0C@l0_X1@kIY+v3S~G89a+h|VRjhrlyI^af|w zXJvHT;wd34hvU+C!Zf--*(?gsUDu_9vttF}0mpru!h7=PKXDfQH%=&w!5I$0!IWYW zz_>|#Sa$uC`ZRVLv5{4H5@8AxiQ5x?hT=z;S-ux;``iCmj+XU!auMn%%W$@o@butP z)2g1O&qD2>E+M}?xZt*`=V1^vrvl=9=1^Rr5^fuhxi`e4|6=vTcBU>|MdY&@R8QS(vev2+7>ewyaUW2qGG{Fs~@ z@i7tqtCS?!zJdhn45x7ncuB4SERTTX9bV)dW9sTdk1|-IVa)InakOB!unkS9L^<3I$h6-2Wj&4Nyiuh#SOn^w$&-n#)xsqUv)1tL4dy zM*x!qQ|ao%=E>#z3qYb#BFja?DB#;PznMc+UE8VoYF5|N-*{OgmMP6*Ua(>bdlaH_ zS>Qb!p!lIq3w2H3;Ywq*yH?X>Ma-$99IrxKV`W@Nr~*J#Sc(RV)jkpfZWJZPh%Fc5 zFF-LDoN)rKgx=mKDGGdoViZuE*|pf2;)=`yyUf)hg$|cg+lhy(;*7grbFGRqns`E3 zU5JId0(VAcwmc+;@v`=dWTSPZmIGGebcV7l3T;qLJYm~?*jmcN3<-fp-G#AYbMV&` z#%$n10MnG?wor}Q4g>yg3Ik-_Hyp$qlVK&X=yZq{Fv@Z?Fi|mRP}g?= zLoV%!O_op?$9xHXNeo=uVZevBbayFg@ut#vO7130E}EJ0^tpI$-g8d=4NqN5K8qKY zdoCz{!}HaWk2xEJVZFI78pp5VdMK^%7mtk+rAnc~E2ODnoD8}6vHj~}I^_P$?qsh2 zG<6|d8FpmV|6_ek0VFaSM}=B!72H=M-!+=+iyTcp>27h2mbjq17x{EFVSaplN*XQd zp+Ua<3P1?;R~6*bUP3qn8KPN)W{BI4M?(PP48d>?0={#EzIl$f9Lqczb<(B~aHZ8` z_=|0RrHHKB?z!c6TkZyMW0Z{O*af{Va0$(DGRgx~vGrdzWBr{o@g@-UH-V_jWj#^$ zKph*!`2}m=tt#&0BTBBUYeW?@0fIC`Gj7tZy~q@475PMcA2gD$+7j#U^r(H9;tY<^ z>TEEdX474r<>u4udKNQ_A@PG45>q{I>gVOK0j^rfxiw{C8lfl&Q1wD-6sWjTIm^HP zvA$-Mt+`g=9CVqAu(Yd^<-TF5ZAIeNH!N70d`Qz+2h~eLlnGX3e-Z5>&7E1JQdiEyCJBJPdA z1$1E&0for0q&b*i*(#s=Wj6V8Hwr$xT3ybM?wN35Au5y>R5FQ(A+R(rGzc!Lck(T7 z#8WTrE7oE+3f|&EM5Xy!FwF2oD~GNC9{h;{DhDK@M8uzmbi7nIuB`wj;@2|5S7kST zLUY!M_YpB&1_&5N8KFiO7{=Uj2TCXWP<9n(vaCE0a$%W^;W0>X;;GVRH_AfwHJbPA z&T&z?s(W(P`X%@Mzk`YY)0?Y(!+ZNtu z$z`pAL;1;lLeX5w-E31{{jzht4jEye=Z_N*K*Dux^W3^|({Mc$#)zZbCSr_l)V67C zr9QY|hnZi@&{BV_uc>e=yq_DOVf^ekM^{zjr;5}E2Ls0xWO8qTfQ%s%V1;cZ&ne7J zE_EQCWyWtc(Y3DHk?Na#n#QjXVu{GBPwpsevQwRfEgzu|49dH=h4}7wAJ(#TCh_$0 zS+^k6=~X^=v?Ya_Ktg54&q@O%Z08w1Tm=_VX(2=aPGp3oIi3mvObG%K3wdf%H-Lgn z540XNjh_`sifEnklHo<6V^@`M^=j#{Gg9uZWB|)!XXJ={ z+5t4uy*$b&HjG~(hr%6f-BVy)4U{kN*tV^cG`4NqYHX{q&BnITB#mvWNgA6?8aKwd zr{6boXXf5{KQHHH@3q(ZuirY!Pi8$ZI?yKJMhCvxL{3NbzVWz$WL)SZw9GL4@1u@u zF8mrQTHhVh$CMAAhs`Q)ylY+T*YBL!1|KtY@lrtzOqRR;V$sxbq5Ge--@G?x5^FvS z4StGFQEetE51&0UvQ3tf6pIyq?U}u&(cY1%e!@>Upu;yDMBjL(ZUiIR1*DmJn8S1ZFEQ3}BV%NfpU z;SGx3Z^?Rt-EJ`?hKNw5nlm7o>Ae7yPs~Zp%$Bw&{O9#AV_WK(kY>uk!Fd( zC}Jc8Hbye5oojE1(8Ap*g1`i(7qpf1&V6RBrwS&#a?y~>VLD(bIwYbwikT;UvzWF0 zJYq}i97V?43H{6Qp;Xz1*Cf202z+_Dzm%M&*=w}nPSwaJw zo-N`R`Yivf1hKyL6Tw>{N7c*6nZwm{nrz~pu*;WY*_3{r93r2DJZN3xj_yA_<+)YL zHTL4ZIZiZFkT~5Y5=96YxN#5p9ebzfETGX1Qrl=)a(MStrwp_sS`a7)uc^p#*+XC` zX7Qp~^jAN{{fF9?gvukKcuI1eViGb0Qrj4}wZu>0B1oH~iq(a{s9vr{N12L&Qu5!g zU&h8=)MUmKo#)KEPep~2ilAj9v-O8(V?2fn8+3=rPeEt3265oN!SF!y{IGi~pRm@t zt95`*Z)QYQTbY+<&u?ZUQEv^hw4!x`e~IN*Tgei%hax8|WjhIl==KlTjiw6GtRek% z*lGqT2o#ymRDC#f%2w=G8=Qjobp7JvzPC8{IS;{E%sKAzt8M9q|E4+R);95v`0vx) zKQcdGZbwT$trDTG#c&Mk_IoNR{P9m*y_A4LZneCT!H0`3LmH(k87APu*VcTo1ET?k zOc)%a?uxD;ir=Q!2r)3L7A}VVqSns_Eb;*$JJehfR z*?E0r_%Em;Ax6ni^hlR;^t-Vfqr-(KUhnk>Z=Tsfm;&No!6!wWd@=1k+B$RCB7UU1 z_Cs?gy~Zg$f!p9wqvMybJg$&Px`QZooq;$X3#2_xG4ebNR8&Desr)$P-bVOS9tsnX z#*u|zA=|Eo{?iojS8X%Pj6*YhH6x1V>Hh6Ya-=oO79dfW$%x1!-{?6xJ~V}bUb+|; zj3AEwMa$hoe_VwKAtzex^vF`M6R-w}rW&$O&aX9~z^?;HAR(ry5K16xgg81&MF5TUcaP6__DPd-GbWuRr2iWne5Vj+%|)9?1( zhPrLz)FUZ+ zTw$@sluz@-9{kFJ>!W#x=4oQDTcgRnQjm~U%hRiNuAT8*$|#v}_Dv?0 zxcruI=JM8lR;)c#$Z}waZ|W`veo+tU2E&lxI{cJekdlliunZeBV4uS}H3x-U!5UR^ zmCPtMEFexI?idT~x+u$3VV0JNa~lgcWQ$ZvoT}T72$n-m;UQ!5K?F5@S&m%R;#)3m?D( zz~zXHaBSXondD(RAJKXp>=2JKWAdETavyO?qocDE_@k&yTKNUh+7LyXHLri7g4=o4 zgy@Gvc&4(_soqjdhe$#I1TU2A{My{yd`dF=bzr{~EeZJH6X@sd?&@;r(CF}bLM0V; zNO)+%^e`#{WfsXDR7X;R6s;*J*RP19n(q*{OWqTV?>ZPY|A|1MN|G#GQzA$=h;bC& z8I`I3CLD2_#DK`yo{uz<8R+wJNB!jO91!5_>f`4Qt~58W_iLi-VCrD;E28rYBoEIs z_M5xkts`ck4Bf3zg+M;ktO&>6M#q)G_%2JeOI^=N^(q}0tAdm|kC;iAm5c#KDP4|) zgnbeVd>&7>1ig@C75~R=v^2uAFhnkuKuXZqVqf7jC0$NY?bn8fsgq3WNnmrc;WTjZ z{PH3HE>K|93{eb4VbS;&ieMw4Ey=Yc)!A%flK@PGC#8!2kY9O-zVz}NN0?s`YAV_% zEGrSV2JNwy1hLlR=5BFxd4#z<)@FX-Qpw%*oa>$N=)nE01IG;T;v(f)uR?&7NL z@$umiIQ5R3+4C5axk25|@cRyFKjs)=tpn+`;$SGO z>;?n2r2NQx6T5Y#rNgQJ^-;~jpC&~n`w3g}Ff0@@(S6G*3Htjp+$@@Di;6l6)?Zpu04 z-ItzS#948Qx;8T1Ws(@&5y|B9?P@Zg6c88-7evKmi!UWGa=kruMal>8L?B?)*+_Ti za^8+ntys39zS2cs(}-}OWdv+OgrV0sZ}g6~3DMw?uzAALs@L<4ij(~mzyB9xyZPEB zGCaqvT(8O=K=6Ku4@dQZ(OT&MHtC=m#uvG0{NWg34)&R&w-!KSKc^5%eZlvU5(Meb z;>_WjIT*YxeP-^U;-or+ekfabyBhlihB&N<1C33bUG6v42LL4xws3u^h;vV48JW*5~Z{nNQs|0UMM zJA2qo>n)N_%3O&qdpxGap(;NbDRfaGO9h@mErkIG%7=sK7Grn;iJD^GVq8D*sexk% zQUY%p3E53`EL_CkvO*GzkzMB`U0p*n1eB}c8EaxzrknjeLmEoCB!`BMiEPa$xW z32jCM{aioCauaR^6$jskH;YCU^?G>yZI=z+j_atkMQRw0;?J{-giV}81vN#EUcw6+ zHTrp9gJXtR?Nx_{aGdR;#2-xqn=`CxB=2c&)Bi@Mt;!65$TY9Azhs&v+W$kQ$s1|< z%nr{VHH9X1VwoPTbj~z_$=^wU69mSJK{_(_6REq1C542&QO_p}gMo?iU4+&-dKK>| z%!f^B^^j7+R^GmJC&yC1RSdQnSNFDbJ(AONG*9I$czmyD^6Fl{CHE z{k>|Sp=lVvZu9eqneKR$e6V7x62W{S3E(=-cb7#@v3l zO$H)wpfqqju@;Br3mDK{e99{|O`X7m%KS!QHQ1k{q$X9z1}6A1S^;VdHJzEcd$=%n zz;ATPC~$Sfj%?fXsAvK?>W@hHjxl<)ez5Y=xMmhVsRx-gLhwLHyRaP7B>uMk-z~7# zAEI1o&FC&iW5S0(pX%t|`n{ufo`ds)+1b`Np62IrlNozI!C@XQ6_&NAq77McV#1we z9l3!zImirDaLoLFC@{-r7ZwL@0xlh237I$*zBXxyQJYkv_Dt8hEFKq-3T9UCQa23cY6m}J{yF0M(Af5hjUVQxFxxMA_+X6e zB=9s-#%`$}YJkKgdQKnAOh>wPB5L*=GT5;br@$V8mp@Yr&m%X#qCY2YdK$*pX^qe? z-nWFTb#_`xPE0?IUQEfyk7rGMGo`|E4R)qkDCuRc?+UU+(Cv_ISW0>APr z`(dDr3|H7p)f7g&?tm~Y?RJpW>eCDK&;3tJ3-KRI3zZ^?^dCzL8)RwWvKnV1IP+gt zAL8w%Uy#XyJ+wX-EJ#SW!q%Taz{e7&hF^)Fq%8`;N8F*quXYPqFn$w41Fd_S)8byn zo0xx@xMPV9T7Qcx`_w=Qvb4kwJ}wVK(vC0%BnKj{h*0ao@O)NR$dqx4*rHL)CyfFU zaDBo5rLXRXj{g?ivO4|0d6?rLe~Jcyo!1xc0v3mQF5_X^P(L4D{kQsgh!NwNyJr}qpHS`a^uETBf;%0yN{GMJ?ZN@ zY~OCs;F0Zq3_)MgdOZV%FL)1w+eyT43=1oNYx4eVrPM7F@3n4v%hTa5>nz;0To`%N zi}nw-Iop7hbx^uJl9$9D>YF=t#gCDpMEe4{hhEVkwQZxF@_Vossh(D^F~f)&!2(vq z7yG`3ReQFYYx~%}DJg)~84*@Z4?{=ay2jUhC&pT5Ak~Mcd|#khFW?LrL}{(K!9FW* zkGJ6fLF~r1R)aOLtp~K4`UxmFYQ}`@XA(HO@5k$nt|+B|6_tYK4ShpS_KuR77l<|0q<+CgOzq zNkAZ(Nk9zSx!NVYuuk@+KWx!=zYuVuY_NFl#b?aR59XR4CRXGl0%PWG&jTGRe*Pr* zKJek@q)(jD#gY%`EoH{nPJT9z?o{K!o%VZ?|;r^FehfsK=M65_w4EvqAt zv}J92KgegGYF4OGlAGsgVX34`6YP*cnSzMicloBwS)J)qd;{*G-m#ZZ8llbfy zxi!3?;t#nvb)xi}Pby_JzDaiB2rdjFdJEj^#X3^+992sr)4qSs1`I&=P>U=#5i@Ia zXMy!B;@s`p3FaLdjMxfAqj3%uQ@DMr91|vNVi&hok`6VPanrL2}KUoY1)L_|Mj(MJ1u8;JDruY#gpt# zDd=Vhk-#DpTVSrR9T9PLKs#2mIFz@Tm2ldn*H|!To~borwKE_&%c9tv8`O`So*Jl_T3mcAP?~Fh^c4u+nG~lHMt_P-HW@LI^|o(AF05TYDabbBkB{G#(!i8%>CG%yvN|ZZ$`9^-!lg>RP`DW`+vY~AyHsd{TBX^K zVP?PkaUB4q8euA)8%?JNLMT+i%nTC|_6p%17sPZOFQ7{Az-PgZ$<5&MP$CHt=f-L~ zAW}3jh#7wRO;_4gtz%9Fsk*|d&1L@hBQ4<|mDU(()iaAXkeP6ixM>-^%xZyiUvfF9~4)85q3IRNC=mbroFt-HBk%-9K@Yr_O#vxb$ z^QDi&aqqu=V=G?SIb1&}}$;OM3@ooNsVk-r#YS`+{vU+|s#uo1Nrz%W)YKf;h+y2)}$=y@%389~lyvLrV1+k&-; z5Wpw*`uffox}7ffg`18b-iEZ@Xs&KnqH)+%3%$lY&Egb(X-~6qBob+NrQvLozF9A* z!FV8pnU3c4TzlpHRucZx^6@nCL14x+^QNCR574Wt?78nw07!bIn{*eB>Q=TTU8htZ zpf?9GQ6#V_B18?vJh0E{VFQs9BI(nsA2RV?rzppTnXWJ3G|YqRb9<<#D%3JdjAcnF zF&8toSzQw4G1*k7m)_dBs{0-3dmiwEuJ~`VNiTma`#7*cKL$8vBnSe_y?>e)`kS7{ zIHlkXp@oC}5a5>QNLKA@@SaUaD+_WPO9MeWJ~$P?R^^T7zySB_%b{dp_^WxTp|>5z z4WJi@cz*zbB0|g3W1fE%Cmi>G6{iyykn~s(*Ktxxx;G0JLAjJXBB;C0{v)RUDG-w{ zaUsVPsY?1Idl1PXDDd^72`{9p2wrQOJ*Lg(pdZebq*zxR(Z_~aqFL%G!L4onkOBr- z*}ngPg?F|t>(2v@%%jZ3xuq3XFXJ(NuZN?)gf&bXTPu4zw(3udUK8>*7NP*LS{Fx* zFEz!YI6t@;K!8)K8o6C;h5iwx3u1k*A1J#*0saILZf@bDFYhFYU3C{1vs@kOm4{=GRD^g7qVn~$ z+%9Zg-XhsdA4|#klXdvGwj-@A-}`+Fmuzk1P9SSEU9L<`mOkxF4Pj(MrD)e`wK!S~ zc{W8+(;kzihK0sl$!F?et=dYGo=Mc2bK6qaW=?-d=sscsnNv@_Wl-&BwF==rZ=?oW zc{5mMkwL77nwu#58HZ%-%$|m^)QZB-h%V(Gu-`wIDmw+I8SZUu*SNzw{rc+tez7q( zsHvAY$LnYsNe?xR9sj9l&P`93bVByUR_L&kTQ)#iL6Tp@HXmvK-u|wg>;;y9 zv*{U3YPKF7pSJ=1WZxeOgS^84yfU7Hs_i3Is=<=^6`!4DfFy|tp9oY7b|gabMVVv=@ng0rnJs0DYXUT;BUKtjr*> z(g)&^od^vVe8zG|4ef zF29~E^N)`E(2-?qp9Xo+g9(m-+uO0AqX@ohfzv=AW>i#fc4XRDfy!ByIJAvFs5Eh( zKJYFeu|@4)bx$A`KE;C{PIz>1iH@P1kh^+wtSCw9z=cZdFz&O0t;;^Z%nA@;-b7h_7US3R$zrY1R&PR4K{03(0S)IHvcL^kqQ`WXg)eWm>ZvK|2^sU zHAar^p+%7&mB!^$)607PUA<@XjpO`uE87S>|IL2t#G+&**5{2;!r5cCKMl~)EkoIr zx5ic9W;D{}-#>pRb|V^NLDnLWhS_x-Q~lmwU3pRY&XWC7&ycG0y=T;mBi&8PDLi=5 zY?P)8l89CR(j01JSJ!deK$~hKRj}cOR$ol>cFLA7sk?p=)6rcYYT2A`4~)sjbKlO6kLq`zZ^xo<9MGG24&x+{PwGeN zmO>es6Rd4T$q23eNb;j}8ZS!NMGR-4oKXS{QuA)ETD__QHMUCN$pngmz|LWd2S>oN z2&1{%HbE7lmQ&I4T9{R^QVJHW&G@3pX)J#l95bA3_Kk0+C{CP;W<+8&D<*tJ4^cj+ zE0kh6o#5bCsB$=-z;j=I|F)CV$Cocc*9hQ=!IasX`46yBgT3m+8|^wjbqVV}OE|fF zq2%9AkZYQK4jKN^!B#hK74x}%##)*=+8QshJBL)FKAbaUR@vo^pX57LHobpAH>U}N z9=}>u@i}E8x_Ae1cpO4q^ip8Jl>&7MY(t_-m{?4NuEam^)9YXONgNFjCk>z|r3T5N z1pB9OF~zI7|JqOJ)SrZrhP1ff4knSc87u5`!%3?=cYIeyYKAC>R-3kJ%psv{4hj_TM{U_JlxngV&4QL~cL&g|%6NYwkY38?MJBp^uA_O8KuCkEl!v(@({ zPuv;NN?`dM@0pvk%&F+x1Cm+xKG~frSW{+1GSj#7i!Xxsiv4`5>?|ph`n#S)F9!mQ zYm87Jg}jR7mEU zYb-E<8~2`TmtQ4QO~J^V2Q!P^;rxdIY{R-lJYZ!2%iOo$2%+HnJ|-1(U;@nCbFy%N zxa(5@_*WJbT3rK9g1P(_tm@`4SOFI2mg7)S{FAwvU(AA!V>_L50ndHLfxZv-=a{he zdWYb~U?UlW>V-M5&bzRs zb-LOH0~LGZb`eMD`rAlUf$Mbgphzj3UwWhL4R`Me6GQ@pCgXK!(C6V;oBK}yX!qQG z{TA6K&t=I<#DqT$-92uZ#hKM&_Yj{kW$(_rD5{=DUaxrKo+bUW5RQ+i;zDCyD1jJ6#s;~Dze59e6{g3iMiyB_Od^`Go^&UxlIC^> zsc_fuB@dMROJLPfzZ>!OjTS!TevTR54=SgFah6d3f`0oX1F%)+2kn8j7`OD#y?O>~iy<5O%9`kWXJ1YBP5 z#Az&bvXD&Nx|)w;7{19DrF_r$7L$g5irVLc z-jnnIxH;7v^k!vk2zqkagCE*tl{Tu#z9r=j08fGx$x4wwPM}AZWJqa`Ncp7L7Qa$D zUZu&Xwh?YHwo8eb6^%&2AgudlW_mqeb5xBJlL)FZX#)V&u@ z%Yhrejtv|(D!-e$ATo%Lb8NGhAD%{oHUo+1h%wL9@H@4-?Q6mz!M=w5MV@Lv$P+Vz zTK(@-O~nA&OZa4GI4;F0RY--5L}?GTaU%5^)9sk#z)?tOfwTR)`f*?sF$K9rY=VFd zyNk}nj9X?m2m8<2vv6@!NMG&U#p%P_8ot#=&b7HkibKdcxh2Ak3G%v6Z4vNlo!HjX zxHdnOw=muN(ri4hww@zs&c$Qx>;knifMsQ4x&Po!JAg?bKY!xOj;{|+Bk(=zoRJO! z@^t4Le(>j3Y8PlF8HpEm0u%~-Mm(ux8!|udfMUmjsHzvnE7g<|bA~UR$wlR*G#UYE zffG&w+o>NkK>9PLG&+}sNiwnFGLu<1CuG$SC$SWhHA^(LeW*QPYn5& zKA06`vow&Yp7=7Y12vhtyI~<4EHV9H;Q55kj_0#XWhtBxpC?SKZ5S-jX9NGgCEzbYf64MG>F4Sjfqc^;n~|5 zK{o5Eh0|mwjZPKTz{Rj|R|@7J+L>N6$1S3l+wG-fsAxc1wv^Y8m+%xH);-S#Nz=4^ zcXmNdwnrx=8mS2vSu__$K_Xw^P*KD)FFTmI%#UlG8F|m9Z^ob*byBwqde`@+rhNe6FTwZ2@VMm)JssAWII1s43CG=32s zwl+E7|6)%If3YXskBr_fhEw3{d(+#_`6I~@@YNe<9!S_EP{e{_LNIQ?-!c_!j-qK$ z3vNMc&v>x(%0AU2V{x+oo2LQ+$aJ2%aezDBXq;!#UEHms2jRuiY$sE)VH=8>WlOI1yNhJ>mSTJvsh&?a8Jzv(N_T)x;?Sh(w#Q=8P8rlc4`E z^i=jgp{Ml!4n2K@Pt00M4?E?xg^vYB3PH>o6Yu)Dre9$#g%Mh+azF-}vmiv0^Jh}Q zU)8RFP8hfw$2LocLC%GuBkjXSIstmV#~n56vK27Nx; z7+HXm7YfVwe5qZ}30LadcsLHn!X?Et7cgvdJWNbJ`g7oe;qB*lRXu03ZNX4hO%1xA zaT<~*N2P}Obbv{}qyhU|g?rDvpSTrn&TO=?3#YmG>}^W~fe1^DpZbE z(*8nE9?Dfibc1dG4SE6tK~J(c3-dFGN2cKI4M~Z#kdFS<`zPE^lWa;FBM>!xKkL8U zQ-AuQ$ARU|{B3>7!DBO7ew``@W=L69X}Fb80h<~DN%e<1P8(f=zV;~6*s@`i@1^L6 zzV3(iuicDZ;Dzv&AoE(_n!bEyXzG&Ymj?87#Lrx{EvB*%9MWzqWS za*K6{8Q4P9@GX?(L6__37>Zk^h$vC79Yi+i!ZaA)_B~aeN9{lI(dn5JId8hUC&6C0 z+gOlq5uaEPeoY_Xy>Z4xdbf1b5mp0>EtHmj1Z5ft@KQ^XfNuv9Nwc?hZBnpAsQ-)y z$eC)C0!$gY@QF|AubLf57^7Kcrg}Z>>K^A2Aan~+V_sviJSOjP1Q@HK&Lw;29=#l8 zH9LJ~uYO9ruckI)%^Ka08sdD|#%4zyW2tO4;6TTm&mw2H=y`ghO<@1yJi&mRrxO>O zj)Jlyn3-yj^Mw5WI#0hz|99ufi$yl|U+0Mz%#^5b?#@Xh!4tVaEDo5*g0;GXKEv zX6u#9w;*|@Ipp? z^`?J}B}N3}h1&$LJPcvSSVEOP9^&W?35q4S8V_^Vm9WIG$DAjYxv7G3A_rW?lxR1a zCKrq{0<(P=dlWsS5&7%@&!s^zW^DmIY0W%n76Z0E2Y}I1{37vYbVhtEzCp_Cie3;`ln|v^PDA4{$=n zC?*abSR~}g*+9|+SA(*;V?~s8p`EQL{eh35R$RCNZZZaWvfgIs;XyFCPc;!ehBNKg zi4p#tB2iHLWPi><_!(+h9Vc5p2*AgZl2BBeR8;r5FFCg)yRyl|qQXnid7wgygWXa- z*q~`Fl1!@2mL?5AAE~V53wq$5dYa?r$Dk_LwTP3Ya!ccCeJQq^=qi~3H}a4-B5Nf@#H3V4xLS?Zu+=GcLZwV%KGS|+`16C zfQ{a?+K*B-d8i#n2Fsn<_z;lC`YS_Z z6;Z!a&1xAeelegwX}+jCl9jDxdCK5e7F>(F zW|SMC*`P!zF-H>Z+rSRYx5P}15IXf5uuP{qQZqIODNjm&m8WRZi2qcca6!rwOU!lz zNO{UN4txhGPdvcAAm+cy6EyQW#GJCx+iz+>a>h3rB7CbM)3EI^Zx3f$a9EFbJs(Li@YSx;InFGt)3qghkpwD&W z`aj6i#l74EDYH?pw*m0#K-c;`5i-@*p;+ao?Q-qsXrG8w>|n7VVnFF<1~j?oR?p-k z8UzOKUmuRy3^KQAi8RSCpJCFfCP^%{*8Y_1h2Ns`M0YN?^cA&JFw6xO;TTK+OIASI zX~0d><0;UEc@E;vnCC9CF)CwD&6x!xVdqn!-3I~Zn7oooDRI>Uy%LLPhNz^=Y)BpUnrdv=;jORV@{bd>4xE~DT`y)}i zz__8R>|KnaZO}d-b5O&e0R9ex?)N33biD{PtGz894ZF566nCN|cxn;Mk#Re`21dBS zx#%h?31;?0SJRLbay^Ye2-Leq^<+!DBP*9yBeL7q%JB5ap=yRk_^`nrkXs1BnZT@b zCcC1gRf~DQbK-LEVlH{ska$Y&$9<_Bxu`yzY<24Xj-N62QbuO@l&8EMTk*NRx04gB z^miBG`N#n$ylIFlh@F{4id$+EMq@z-S_Vs0gTI9&7t!G5{je5U(vH!*;qpJi1=2vs z)97F1i4FJ{dCDhu2IE?mR7;4PAs>x|)U1;uuE1_m=L&e_9b=jz~w%&Zv zG)( zRF#`2d~gMVjSE`M?{S-2bXHPz0dTt(_#3r6h^vlx7G}hdvo1)HP`W#tcZHxD1Duz8emhp=x@= zCYpf<`UkV-wXJK5v3r!Wp!ApjRN$Eey$z*AuIl3edU4zDlAF*#tWj|1%|9!~p?yNn zVx!I{Bip@{gYf|Z-8_Q4?>?jkhdr?1#p9rUO^yN;H$-IMd*|HtH#Xxw&$b{e-p_fj zVo-lDwT~B&N~1h5M}GLBD7oOJRx!GTQVWRUb0dl0a45KZ+N5cB@$`p5kR?pTNDB)g zyuRUKthXPrsB4#+NGR&^-W2qYNr3n=Tex{S5tCJI`nXv96t+Q*lb|9dhKS9o<4cf53A%&)!0{0s0g*Zf^sH%2hvuI~ z^_R;K>Op~|I`BHX-J|K5uBO%1n&rAL^BbrUA&Z}}6f{lWqbd_-ih9c2%o&X1tGv=i zeKk87V!c_n5f?T$5mKRwETHjmo^lHOEolixyLqOnBNjhyt&g9dY9HUYgKgkKMOFVI zPre;(>QTV4;A%wm(L{{wjn{);@7kJ66)7xF~; zwSn-Qo7DJZrB6f_>m^t6tW%vyHR2_nBs#W4!}n7w!cWq8>cn>Ys1-lHR+ewRL&+TY z7WmSe7(<$QNe)9Y>_ge%;%)Z3y^hpj#qL?-cADZ?7Z)>^u~1^ipwi53AWJ+fTUK+< zANxq3#nk8=Wn3eC(J$uRN%ipi8u&{2lx_*jJj@k!DldXPbhiZ-FXKS1ZhQ$}V}Cny z)nHXbp$^sVy{{Y)FtN`z*gvTolADogUf%<(IGPm<>B~Wa> z`VH_H)(w@2Y&o5j;VN0(v4Al1_ZGS^dmT=MqGwwoLWy{S3e_r&Q;i{IalIP_3@|Hs!qXWJfd-E3lX9IZcm(&NXUDyhf@8y)p13-#=uTOL<;+R$x)4W|O&oknSoX1!X7ODD)y~y?Z9T50xaZ@Sg-ER# zP;1ZVom3e{#TCk-3HU{I8rZe5;q!3{8lBClz4Wae0UtfzV}u#L4iDA5d(&Pm-Nv># zOWXERu;QxU-mKfH-ee`Ee}8I9(p}%43cIzwxVOI06xzGPfA15ix}R?~`Z@WmXp=^= z`a_;&w4`Azd&M%8Mn3D6i7}Sz-6IEgyMFU6(47CZ;#}MH2Yu5f&EgBzjGW z7x${EoUsPWO8XXVC)xT_YwIB%hM7jDYR5XY#{IRN8Ax08$q{;he&94SZiDcO)^t2) zcqYKiv__jMJTBNE3UNktT6*p$r3Qy8Q6lfKkwy_q2Csg6|5i2b@#AlOHI7fTLa^hg zkfm;$kB z`PyY1EuCRI?zCsYZzI13$;)Xf)GPoc#G!)F71v15@h#?2j_PYBi7%nQva`MBM>x=D zuH)jB(5ks+t{{-~>`T{7T3xVeao1Q8m#b2SWS>`&? zp57wgrQ#9m^(`fH@XS>{n(;DV%)nr+;J(h0rU=*ISBwgwNS#j)yS{w7@h$ya>kezz z(nD3Sg{=++K*8-R>2aDb-usQ-eIEc}Fh&9m`61A^tH)^JqXC!+ya~vkWkc9S;$>pN}zf4&p9wN!W5fA~%WADGajDsr|O?l>$ZG2GZ5M9GL% zMv;nHVOg{NmX2?u>J->7dm8wv?u2$}428nsK- ztj--ypmmk44$VCEx07>=kK5$Ax{hn%0+a@9G>}@VjuACKmkJY50wYfK@sykrgd?9) z>0&U*=c=F$re(hYEMTs$U<-lW8(*mCM-s4~`Y`f~ezSRzv{Y_vtQ0!uSBn2V zLXc!5nz6|r1CmgL2Tcv{j^iwTZ?WK$zP$bE5w;Tq=I9p`L0j_xg?Ba>^MS8(uRUXT zK!1TLBH)orX4)R?J2-v8efaO$sk>*1_5O1Mp7n4Rc*q9)Vp@Bz; z5yKt&b^O+I8r7HcCDov|a=AjIO}-y)gf1KldgEg2lLgLG`GX`YXmM2m3{dM>ynR^| zZcyN)Nn!TAqQ&fIa8;JC3|^w#Sa@!vpx}JV2}KrVA4QKl|BaSgmK?9JS1b2pRV%X+ ztEA{bYVNc_vpo|sp)e`!%)3(dplS&eal7ZEhH5_8%4tE7jHRH$6TJB;BOBnNLw!k? zDW_7fz{O)WO{`RlnB83?!R#zgfL8d;Jq@$`rrd8ska5dRI7{q;b+SBkbF!9#QX;X5 zL(-*Q!#%fnA7(Vzi1#o?b-ti7{j747!Eo=u`vttbJlPzX;29sr;AqUk7z@3&2WaA;{l_w6cPl>=UyRY^6Li{KEr9h)civ6FYwvy~_P z3>3;oc18i{SHT@Pu$J0yM1xy_wZ_oS_XSf*bkD-H6GTEKeUf#SgC{e?lH5FoRv^0{ z0}WXr05N396|Ni8J3~CD_Ca{@VQGKLRTO3HG_IKqQFBKYkajay%;|!m%E%DR4n4Y8 zG76a1Xjaz1q;p{hB1`1a!T`U#OOhP#0-;}sov!EHbN<1dHhz=d(`Jos@D_sqacT-H z@RvEsl6L$$%kBi`#5X6vC(AeY0i1<-0$W70g39d{q9JCMy}25%AZA8F+r&9id-EO3 z!61dTe&zom_lX-+pSRmUVj{EXCyn-sBW=>l(=% z{;RqNAOTll5Vd;Crq2y?bU?_2_R0AV3QZn-agyvDl0~rdNOH74*)~fog(>2M(|66f z356)B{%8Ie3M8R@4g{j$;Ze|Ds7*|0oUyn&pIOq8r|^!<0jH)zhY0vOjrcu%TQbaK?^xfM~QeX=s> zzuXP_*X7M5(82v1fCt9>^ zm@v_sWy0Xl{~qx#N!b-aFOx`vf<^f1@W5Ygifu`NO{$DRRFY{M=GrsaGDF`|30It2 z>FQN^4etSk$pcrCu3r7Q=@aMJy0B(*qt9TSP}Qr9*3NRh31LdKw^Yd3z;@8_&SH}xZ0U{q#7dIIlQV|@p~ z8CUBon%;v{vMwnR28h+Mw}!H!I-fUj|I2rBj{L`WvP2h^l-Ss}5o_lc7|MKYsb#rD z82mhJfHmh1_KrY>+kdyeyoWA>KA?M6A~|p9Oai@Z-8y=Ax_^)H_eW6DMZz^=EsXj0 zwBiBj5$-g>ThRHe#ce!2yv!vVILh#*tVFn@m^6FTaur31>4q67bIMp@{6vo~5ZZ@x zeFq$GvbC3-5>T( z=uhM9v+7+(DM2X8vR$VrojJ3?RnTBnU+4_)z$D5RhYG{*1*MR-&)gtD#u(5mDQ}L1 z{p9>Ef6Exix(nlc1soO6XL#UG;0B?03CPc0pfz<_+W4FPjUr;P?r%|Ag5VxhtqDAYOa%xC!3 zbMx1_?Uj}+=RHc! zy9c@AVFD-V(SSF|Cq4%B3Z@8%fBLaJNOcsg7SXsi$cU|RbQfOhl?iJc@~lEjY4>Vl zjh4)?kr-~V(dDVfNhW?SqT%`YNG9iNjIbPIOzjoU!komDTf|(T7wI;UsAo&h!Udpx z%co-tV1!RqWV1+RkJIJX*4JjoaM7GOIQynOAOWF@s+Pw*LrQ2cjpl0S`j-#UL^_o^ ziqDYZXCWK-g2oq(=8$eRx3llTEMM_t5PviYsjWp{J-M|eO}qO37cyyeg7TaECW(Hb z0Gp^KlSW!(^(<&@Iz2NHXsn5BSq*XywT1&TD6B*i12&RKfy2UwIg*l_UBz*YmYzbu zfmxhpIY*4wKs4p0e&nQCP@7|5ao2aoMb4h#v{7%5y7H;$NEI<2eaP0)$@X|f$iT`* z6vX2iKMJT#8tGV69j4)b>rM#uVcXl}uy;R#$?TI%R*Ws8ZP*^K*jDZ_zUwO6Q4`h2 zu&4JOYhzn*+=e!GqQHAVUdR5n^@>D1FuTH@5Wmo7gsvT4!zi=DSuM==9Bh4W{FN#} ziw2g^32!oDzMFs`Zo3NxOfwvCY5W^^0`vO^cM?bKP5VFMPJzcPlg9r$?gaiH+(`_G zJ4yeaaHnJ%@~MgBd-HNWznOv@`k9HFzl*1h}MA>B8U|63e5V*beu{o*JfX$3L_3CS?C(JJ~J)>|8|tYdaDCV>=;cpZ&*n z3c+eG)QR%_p3NfA%TEz^{5VHq;15X>`gQ?#XT?nV-;S5v*br%;QnVopIR6e0*eu_e zPP|!t>~|{_818v%wim-316s10)_3{Wt@s5<`Otk-Lf*n1aHJyIcnPmSy4J5L^V%IA zbO%tS0QksG-DPw$AU zYR0DC3W=*Bj0(rlWs8tkmYnN1hHu2?E6tf&2vH{ziJ9kKDgw+Ah>lCrGj*`&3ov3$ z3DwxrC4wVqlU`qsZPSP)w$s1hP6}&8L(B9s7@iSj>}=55dW{Aq4@I&?zgOxL6sk6o zy^FQPaCn%T#gHN#d_0YHV$WD>Dz!tbcLhG(FMW*!#yVj^{)cvIeE`x<#R6;?3zp?{ z@5@C8ZxfswoNHF1&R0HoTsAS+Ppy`AvD?Buju8xPTys=6YM$%SdY@`o;-G^6R3Z6L zky@^rb1&lZKQHqe(Y_QP(9w;o8_r_HxKn&a#b*-2733Jgt+e7R4I$37p8!|WIR z_!aqAZ7uGb<>>cYE{gIg5YQnO%EeQ#p-kRu!Lv}}@%nw$^t2NpCI%N)J}}mJJ+<{q zajnW;q2}H#9wuoGH-&m_V&@$IrR)dsw(b@F_QuV-*5Kpb9%V#?JpkYPcUT!IMTFPu zCfWFJJ+?f`j9+j_M1;hOjp%?4s9c~Bdd)_p$s1hA= z!#F$Db_=W0KO85J*olF%Q=grEX)Bu$AG zRBqrj$<@I1%H;?l<%cx{S)+(!_yk-y!2{_em!I2I8$Bq*K3 z>k=Egk`&Tf=+q(-h&usKC>lNJ9c{9j9lC{SU}|QeX)vfWIu7y*p-J*Pty3^`>dPV4 z81W7LrvwkYDZ%GWN&gpil0NZHsd1oG>&B2!!bzy#jlB9u)&xOv6gSf()B;oF-jC^i zI_c2g?5k*Q0%bx!j9>vHtsuD_vjmIUlNuE~+KW*>Tll#H8aRX2G7A!ZTL~_hh`iG4 z9I7-D_qTMAnU;cNa1*)`9OMmwS}OEOsNcqm^xE}bvXkEF|Hw`)gb9N$E)^nsm9Vve zB75Ty3(s#p`a6hoB%w_kHyvl&_7y3nN))vw<>|Q3UcMa^)K4V=wGx`$Un5xw|~)2Q8Q2| zdKowqD7yH-qUwxAx-9LyBz0PZNGkNGU9$yR(4VG-B#-@%&aS9$0YoNb!q3Mr%6~y6 z)*#lfPjq%oD?MkO@)!-dTqaA>dEyalFhfK4qy$+^ARfhXS<#GJ8?|tF>le-hcO*i) zhd`}`pA$16&A zM2FzGnu)HJ9bT8Uni2?a;hY4)_4xfHwm~5HfhvLIJp&HevF4n!>*|I)8+Rmbh&>z! zJoE>wX7HBo?rbS@4s(};vdJvRQ{j*@y(>i^kg~Lpz}`a3eI3iFIq^_C5^PXkyKjz+ zEoz!VNhheR={Jx$WlH+eWR4yob~$NrnQfzR%~AF0gn9J5v12HR5sE`2rB~fUv~t`{ zrr1Zb6D$(XU=T#=NEVPbmg5xXVQYBmAl1za>deH%h@{LY^DTelR^!|@J4HRg3k)xVKIb<#uHPUpxwT=ypv+hK8UzDn zcdlWDg~nJ0(I>+)E%6wHgk_p4dC&GI75>>{hUB+-wjD{6=#Dh>guhKZxIZziB2@~m zax+igiJG>eVDN0G_mkLA&}4996{Vv%ZQ1IpA67tQzaUexeiQeH)MJOA_dB)1E%G@M z%-k!$i|L5FF?0PDm3ve`5G9@W@oRbem+cg+0<@i=6}TLJg5FsT)7M-g+h1oC6ZkmW zgZ!(1%Km_qEAXTB*b9o--)$8P8g|_WX|r&nicBbg7VSX}?O{bE_=_;H(10QcF63Pw z(l==|6X&5Pf91l}pC@L3HotfRq^z*73)0=2w}%l|#7cr^H&|!fPn`NAkOO!Pj8#f} zw@DEGJ_E(4&SIjEE8-cVD9OIRUnDa&p4K$br4tx00!H=MBRAVAI}|8e6Q+~NUXOhb zzlA|<6%a3q9GdDqQL;Z`IFNvdUi%ri0AW)R%h!F0B9vW*po$VX*IZoFB^3=*kK6=NU?Lg@;#w12`TBr#(&fu#-O3rC&r{L{pY*VUQnVnA2`YJ(K&fOX;Qmsp z;vm??EP%-XT_`>=^Ye(vy;af~kt;0)n|#O+3Mw;Rtc-BGM^DTL90gwswLQyYC%i)? zoE8imoIs+v9@_tvSNhLK;R@XPgvfW?@PBdvF7v5)kB-G)vCgwoaadA6)*@ z1Br~fEcro+i3mwga&WkMGh`DL!xF5rBDEsf=bj*mtG~cwVQlmnHLbY@Jx51bCCG2W z8dKU%ve!6SEpXONiMF{|59O1KNu`(A9^r|QMCx4+N5C#EE=`9d?7lX$u6?tw{j)>K zS%)|9-zsuY58o0==F^%*{i7v}|EdzxKrQHvGTgx8nWIJyzJ$a4mv-VP;YKtPZB-F< zGBfk@Pb&-Y=q}VV4tkYD6N6fR_zCm{Z#b3;|lW6JKtjs zs2oSNm=CxlNdKXoo|FbHx)Z3SFrxoWJ2l)R!-62w9H!(NRk?rDf)k`Gg%D5pyt>-h z&_Q-)_>mjmO0E=b+xLU#JAV(KyT@wlCx1K&=_?dZW>n7~?19xiM#Gvh8Zl!vWE01n z@Kg(YQcp<-qv-EKl9qT#Y}TlfMwn=ZScWl92)RQtj?QO+8W9=P89I3h)EWT-J^_&Y zMEbe}`TBVT2Eonnj;`)+Z-?iHmk(&UpAbk20MPB++}>?48jR@fS=a>XAQcq(7x!y7 zCNoEzrS|1*7d6|{5SY;tgm@I3JzBI32v})qQdE3k++H3-UKq2Wc#+WIc9{IvtAH|r z7M^UrFW0;WSsI~9Hfg4 zh~S=N`E}xrE@Dk$=g>ULUD&pUaHC=_=tQ?Y;fg!PPtJlP!e~up&+FK#t=9;mysiMO z902N*1C~RH)z{56Kl3!eAK>)0GuC{4W+z+tCDX72JBUi=N}R~L>DAOmEVvWU@qTB9 z+`HaOa$GzSM zoOtzVWCOZ<5?%q3E1BM=EWWM2P-qwDY6ZuxVL@y0E;kKlct_-KUoAf zE@ASN4$oT%HsD4jAlQDJNg7OQ+zIa;I6i)692|3?n<0vp$S* zKim&d4UMC#r?QagM&*)8qO|QCk&2oPwsIV}bBBAdqFMlGN;!miKq-WEymPn1oW?Ep zXzf%3f9cCUj#Z|Q6weAnR;$!kK^3!@ml^)`5%)}jwILVhCxa+w&)38#wG6J1)RPls zXOSeOo=+^s;9IJ@5_rVW<=@rMrx1&^;a_S9E!J1o@i$X7eLN4el&1~cb5Jq_X(2g! znaD}q%G3Ff98q9<>im}E;O5r^w$w`g)@cA*Q(?4b_Z*SVm~Jv`5jC5Ksa2D(+F?mPJTnr&*$a*#jYsBxxjKk z=vNuTd|PFs-O*OE!SMslq(@csOm2P;|Cg)R$J5K{`DO836%I7bj_bz5bbXT|wwBs2 zHx0K%s2>%5RE3@T26;U{dTE?%f)GZMdJA5{a#X&c>SH~uf8Ngr+rh$0_^LhrhUNdA zpoQ5Lm0&_lDJ)AIULtFqm9;3UhXZXNKjw~vIm&M4UTJ?}Mvw%G2E~@kG#}58%r$s_ zgPxB9oEWm@z`~DhgxUbJH2rO(k(oo&p-6$ql>wK_GK>?J02ntk^;gc4>nQ4e1x1V) zuXx|ZFnBWoGQSI;{UqP8G3muGxArE^DoUCcYKBr44q_CjZ;%3jFYoK?YC|DoOagmM z!wZvC#tBzaUmjl>-eeO3IxU1h$mnB2L->Lk=>$FGUTW}FEb;tXqa?nZVw&d=5h?Le zt2h;?eox=WSWPnk?Z-D6Nm}XsVHa3LbKg}v(L<8M&$Q&6>IR<`qC$o$u@SPF3=4?} z4YOF-CsI8;10@}k4J;gHjhM4P?=fv=qFJX+9QoZp#hWQ<)MXt-2XtM*7ps5tU^s=H zpz_WIEyUuB?Hbv6kxZq;YdH}=@ZRU_t@?C8Nkt34DVV_h<X9w6TQ?oct64?~D~UKGEIi=&LAk4Fv&Z{(X>PsWGG8ta4DwE|oIHnB7}q7n zAcY8KpXE3waiLV7SqF#6&0pEty4toI=hz9CdOpoKMY{H1K276C+`KYg{CZY4|KLq_ zYF^y&DrB4x?G&fRu9)C|FG0crj8oh(@KaQ9_x5Mvv1|ByDkyd$zxC)V^oX%=$CTjG zf2rV*vXNuRnU1Wts%9jV&J_|ch0fx#b}7k8AZGDFDshW7!K4y9`U-z(B=3WgrGs@`X$KA z7sMK?Ujj43l$3A~7>It01aV1;4)LNR?q73FHcdf;=v0WueG*Uy&4x$~W1$+-Y@Kxsd2c*xWXZ7Seg^LPgp|R@oKn#(N z!*q~gN-KDvoN%iVnBwId|LPTpqG-F9%TjZ3a@|!!&8=He*$B=?eYc`WTx}27CD!jA zu!r=^9$|P!-0nr;G5>|^k#~==eV5W19$-&^v%#antw$v8BF|dqMtEVpe;(dOe?yAa zE=NyRW8JnY63IWM|{?xKL zYa})zSs^Q@7JB{Myi?iIsCY$fLQae+{?bM_dT?2kP8*WFNr}q5+VmA70n!>6AG`dI zbHp59mhz&SsZFhwNX53W+i|f4MTEG(kr6j8;SGE^#BD2h)@8fLt`Qh<&qFcGXfl2P z8Ib#8ZvDNF8n}2Nnn{oU`tG-zoBQQ@?D`$i@s(C$Q=o4MS4S2zfZ!OrRptI&H~5^V zSE@7LYaTpjkRngV-GJG*{-IjI4cb3uh&qWf}z@vm#c^Fy0_ z1zhV^!GUKruTz%O0%B37(5));-LZB(>><@l^u+Mu9&TBh^zc@DfIAxc#rLe2o zcJ^N=spky7&j=3ctp3s(OBVtKyI_KR-R`$B-~oX=hMhreQ4#&aIl_{&6>OC^lP2KQ zcMg)mO)Yf4>NakNEDbM-J;i89a-4>yC-dG)e8oKdJl$T- z|K7c%+!<_U&}zD-t_XKLXN+OL8?w2C1WlD@#|Hyr@fZpMPUqODdZv}I9;CZcvvg3p zxu}bdQ>giEbTOxBV9cy6kkL0G`On=aKW_de;O~;lJA^irBM6hqXK4M_!|)#i2je2= zBilr&n4+*E*^7nN8INQIxv?jLQp~DHAZJ3SUCNS{z_IUbwkaiiV=x!0+)06bY z5KHulzxB|-j*xJWmk$6QRBle5ZXfpoPoP5Nq#-}C;tdG%3j(|YZn;i=>2L%}?I&0D z0YnlqzVq~a@8$mC`+oNK<8WbTmZ{+(X})(d)y?}eo+=k_zl%euhFwvo!AtuOH)Fz; ziYij$5V2UpnnjaX_vxcP-};*Wn1asx4xi^JHL7B~Cx?|4+@>L*@BZiWPeVZ0yYb0u z$>)t9U%*$#XDvJPpQ;tFR>mRyNKvHqH;qvSr~3w9@Vn3&nCF8A>3F!_#wCiUfo&!L zuDmFfz-~KIVxuAf2yHaYGc!G4g}#JX5Mys)IRZ?i*;Xw^=B zF?Zd_u&b#n*9{8HTENvR)Z;hac_~F{D4YuK2PYH4B39|Vi5@SyDm24f@pg29kY9+@{+c)KmHfj=0j65)i@bQol%go!L_c9< zq-3@YQ<#egsp za9nfI3eGi6>AbNg)~N?vrmZ&7r_1>mmP+EMkf~aTripvpz}F8I42qs+SUc}yXN`<0 zAX8HJ0fHonLqc4>ADDYUgfu|)25vjA6+9E3yQ!DY#uY0e-rdyAZd-vuSSm#kei8)( zS-UK}vdQ^qsWdJzJjNnCEYVH%O{<2um@(5-37f8RX0;59tH+%uW=>Jht4T}7$u&O3ZsYXR4?|9GmJbN>qE9(b z@{kFTMqCTp;7>zwL%mSbXOR{(?`+#NoRi}fbzQ9(I?k*lLVAR170~%;hIOnFw&3!j zPA2oW12yF1eajp~&IA2^-D%UWuEC-0%oS&fsj}E>GmLwgC7GHz%wD0U<#~<7snpBg zAOJka+ZefSj8XDMqRi^@LlHNh@kat>sRjSVlcpfE;!=1_*+_L9Klraf69eHD4)u96 z2KXYiM9!jy_!=(u$t>o!Gc8aVL=QKNn%`i~@l2Z+Cn$%;yvWk`_Ta;m9-!Si?OXLJ z6)qXj)9>@${i$wu;2n|MwJcanqV97y!skhTyEybR6O88 zhXqDibX;im0C0uxhf;}QPcpF5ptB$TWY{VOT-e9W9hry4tEUw`jm&k!Qo>I)465eG zv`&rTts9SEz!na&ToSff96ZYzM{)T*EgVfuRHkhMIl}q}9o(7+wFI`sO?*QLJ36t390@a`wPPgM^r!Wg;RHf`<(=oJc(0o2!)&BhATqf;sY;`V*-|ImyRhn+~Uz;=jd=GI7kx`GyLMI#J**k~>g==t&GsEg;JGd~eG zA%|L_k6@|jOG#U=+$k+epB$}@B8xhvcGV)*L4tG|B>NCQ{|Qk ztj*(XMhvyx)a>RBf9O+y312fLhE}8z+|^t~^Q*&(ZW)ti{&7kRYzJjh;&9!Gs?l() zofy{PRfZFD?3zaUWnyMcMXpFL_>#x_&L++xc!u@zgM1N0A(^IBb#p`!;gk^yf-=!U z1V?nWZ{qW%a6IYI&me@{q2!(@AhA4;HeYgR>3dUNs>0zb>(|6ImM0tJJM?{Y*Q>9; zvq`~ahJ1jk4^Hxx1|w40lTG=ZuXPr^0{`tJsN&jb`r`VXA2{wssylq39a-B88z&>t zI%;XSPz$Jck>t{!OiY{QmBnAGSN;zDG(37W7P3}%?8RKn6SD3m5ai#t)!nYhHrd=_ z4W*%Bln->u9BMkeI6D98kgGUG)MMNfg_s2O8jYK$C#OX&oLZ3U<7Z+dH8}J~sU~cCjNz`Fp?9ySy9KKIBYD zv}W0b|H0q7nSgyF$8iw<&+2%8wi?!#H_VS$>S&m^w~;lx8vxlEWMV!;>$ltzthm=1fb~!v$Z1Mw13(f%3^lD%WYLoFdj~ z3CAq}tRC>;y;aP2p>6ju`|F!2aq`BaWuVh=_8u+^p7zgdTB5=e4Fr?zEbN}`nDXm! zb*wY-CU!mq*$wkjBKIKkbiCaCwF)_r&FvHT_OGM1k!+s$3P#>$Wp+rHsxE7Byx7*O z>AMn@#=4%a@LG`omk~4A3i+zK{Icw%c^jUwh1}?Qk8}8T_gpc2<=13Ba=8ybj$w~c zUMtHWGov(AZ9_7~iPcA}Q;!8jc4!<-4csC)nM-xVwX;8TI%$Y$2<+GwNw{l0OV57y_}a$z_U&=iwKSATTjpGq_GRbW6|HI5JW=Ik3*lJF)#>(? z$MGKaBa~RdBAJ480naJETjjjZpul^T*arW?K>J#sB=%{p|bV&)U^A4{`7TU&R2F z0WCC7!1K=)pGCmVm`XeCJ*gNuk? za^?)kO1z8zUR!hth6QZOP$}MbAd3bKF6w|99W<{j1L+PO*#axvK@=@IAUrU$kc(hW zQVJm^(!f5ti6=qVFF{IZ0j_dehm%UD zZBKDy3f_^$FXZV?AjXn^v>b4D+Livo+@l}h(0~Id1AP2nu(S=;P5C>T2np&9i3ZRS zZZxOi6pUsOa5BCYKtN&+3#eph$uXP?DsYE^4x=2?Ny%8*L5^2?4nUkk&?^IPCJJVi z1@H{~7M}pNr+Osb6MVcp`@5{T*G_~U!;L~$%L7=9Oo2^!gW+m)QdVY^>3JMM!M};l zOPTWWLn4Px3GMP?ja2{f(!TQ#BWCmTzn)$GPHG~HjP}^={@(4l+6TBA2k|ST$-UPx zR7=J{RLU;ibxRMwJykww<-r}%?BoB6{fM2aCj`+Yp(|QlsfXsPoWDJx5DQ)XW2Spm zb+}cSWhb9s(Ze4V!~bL0-H2tsb{yvmi((ncrg#z(Ce_X&?MS;1$8MHjj8!%yZ8QnA zeZvWZv60T2*IFR9{O$>^3|-3c*#~cmr=)GL|BTfnWeYSulhK1M*!XX4BYv&YQaP?y z-B$G;E=U@<4U*d5DKbSdMEL5`XM**6OqPM5VgT35&Vu9Zt)!!(CbA!&lw+)M^;qyu zZSPb`Cr_(X=j{km^@4LQ0)}h9Vq7RL?50y-M!=kzj3kblXF+FS?CG71i@Y0GRUL?Z zhB^VCVr1ADv_~^H)?n;vj^<&S>gDqHTFdZw)}mBaeedwNrg4DS zI{e$_#|@lZ`pKp>d;PR;4*SqDSI4yk3Mylr5E85V@N&SH&g;j`kZ9;i z)oAjY1Ui>Zn0H>AuT)<} zL>%)0o-*B%Oli83ubGssOwZm4n+scp>LBg$<8DsnmD+9Lnr2vh!b}QU`T4{Op?Pc% zIvp33WR8Pp*ANDrqG|*MHIsBla53fxi#P(I6k6$ozZ5~VU^6>!+wwbCJV!mf`N-YE zgW$W7RBaWXpv8?hswZ4D>2Ay7H8@JGZxiutCCRley(CTg^|JI2S;d()?CXDI$nZwV zZ;qjpY%JnR?^Or@@z9J><OWRC?qyebo!Ul-&U zMTx~mSV_xMsagm8Qj}d^D57u&O3^S@QY31f;oRR%8)>*sQb2_=td&Gzr;vvlmkTbXWHs}64hJJ+ith#f5#h#ZNJsbgFawuI;ij5h=t%1{u71$wyPZ(dSBg;kSc-Q zuz@zG5CVDH_Wfdj;`f?A>HN~7F7XmDKWpk8k=_y_RY})EZR9{mk=n72b<(%qc|m@# zgKKk;IS7+`0777nfle$=V<)xb1csd`>48mIvFwn|%TTf@AEl0V&q8FU;Nh7BwVzJ6 znDnd3`F)Rs?-S+%5+6ICC~d>PI=6}xv}^m?pl61(J&Zj+Eg<$ICwsn4QPU@!Rn95# zl?Fshc1RL?_0hd2U((N^pb{5H>WI;i7wOX}KOIYZZ7xrs&)*HWD8T6O+^zH%tq47Z z`3B#kLA3ZOyT)bq89=l!U7MhPrQ!Q0O9a6vIibM`6fC%w8dvPVj(d+@>$@qc84d_c zE=xHLp)j#iG=dWrG?JiIG%mG3*Pvmbr}+~tT>lkLRMegb966u2bU#JxkQA0i+-S1} zW7s*vp3obDZr!V);^?c3%bU#X=WW|{v%%NR%1*xD=i4x74whFxw%~1<o>)O{mEG%3!|NIKZ$dY0~r>7A6O? zX!6QMeQIcrkRc)6B+y?U1^FJ1!IJ0;icg|6bK$y;&Mo}DU+fH5!m>Nq&uUY+g1%;U z^~u33T51+Ih8LeWCbZ5IvHe%46k@(fqN$?s{E=W620;CJka~jR>Ph9PFNWdf^Mf4T z26pI6&uG;EWT?giDVlYIxqNYJd z;VPbE&?cNNCNk~cew}a-BD}IP0FzNL_|8q{?}28}h)r#+Mt#Wv#`pqd!7Ffjd6A{2jXgm6KnfyZgh_{r2sD38!WKzr$%F_qYF_;k0Y&|AEtheW`vJL?~aJ z=BL}ht~&@2E@93yKa!ltpTZeujrFyvm}C@4fseaLUR z=~ria2qTiBwQ)wtwe;f=w2ET_XjPM+(A1mQMEv)Jif%q9-)^-Inty&!-<39y0e%F0 z6=wpx8g_ucg}y+O;I5#^O-ebp5i;?FG<8&%@>awd3Qz#f6_m*JQh<%4LOxQR8gPm; zu^1lT-lIV#wqpaV zf02e{2|fxNmB#i>>Ty?ADcQIgejr6a8kQ}7Ziruhb!#Rub#FXclOst5WvMj9Nh`3e z{F4;N$aM^#^TR?7^Kz8^pOiSCQ{pr>8FE!tk$SaVr^_nmL=1LjI>v%y`b%q{8o;h1 z$K{t@$$a<-V=V&dg6C{zatU>E)1phEt8C@e{)P75Y8@65h%6eH{jyF&GU`=dt>nZ{ z6?M*6$_{GLLDE$YMhQd~J$|C4*F+cDx^ORgaX4aRjK7sJv)yC>a`(tkKIruSwVS5) ze|OVl(`^60xM^KI5}!9cd@-wluiuYY7(u|HqSaVI){W$LFlq|f7ikhiXjHTnXO?JL z@V%jXbhmd=*(C?Bgk%Croj)~Ev7@w{MRzqHGXA_{w9|bPebH|dE+Y6={fp6(3ZeRA zA|NJ#{1KrJjXz7zyR>qk2h@MHDHxxFenm5~8vc)*mcOpNy%d5DXFmjl+aNsIT)E1? zh(!4boS#kL%pC{O9SbvUc3V2pt3AWH%`C%N#mH5a-FnSK*&lN?OiBf6WF$GWesKpK zctcuRIX-lZxBKk~ShmA9{1mF`M#(tSlG{~Vmfmu%@?IeO6UcgJjL)J)3dlb}VTbPW zL`vSd`=G)EF$4R4PcmM<4htHOBVDlw1%mnacS3m(7I_*N&gf$J@^l{}Il|fY{l3Q% zfyI(@2$`+ES4D0>H7_<5B!`)CU<-ob1qeE>*F1=S!N7~wHcLt2$Y7y;$t)#?#O0nG zgHF9U%er}3*l%Qbo$*vzQ%~E^*HOG+?kO#;@p?kBM3mn3TG81QuolQO?Rx$l5G$v< zZ5}sHC%;r>k3kpg3NI1@a!ovg9}V03U}*8i7_OROjyOO78LT$OmKSj(NFHspcDqAx zh_5zd4Ns>E>@wvlHg2Pp;_fM&NO1*Xfv+8*RdO&_KQc4<{|`28!{?R;c=2cs{Mt!8 zf(>&5SrDYMs?kHDaH-rkMx^02vcav`F3`FbqvOT57~@fU@zAQ+BnI&p~ZFvlC4KO6fe_fO_`C|BU&f2B~~t5+P=n!fN+eW;hJ zns9OQ{8iii1y7XS_VMjJ;K@Da6`QrBd& zJJL1m*zMK2cvwMQxdQENaJY39+NbNog1h5)_|RW=$IYLz%!#RMvSP!A@l-=vT0ca{ zWT&B<3EY|@INb#8X^vzRo|$Fcxp>L^FS`Bs#D6@XI)0sloTN1SRuocgvcweQzL19~ zaU-k^P)KY`>getCR?IJOh1-LW>U)1LdTuS1K}U8CF6m z|J^J235hP)lGG#g&Z6Py)akP}Qj={N+zyrjKCv;A@8j3D>-gfYi=i_zbVzrw9bCQQC9xu0WP>0i;R zzPcS%slvK#shqP!|E;r9%Ng@ZHlNWO<-XsX1%bxAr+apTlH;ic2b%}J;S1TmBZr_c@w=L zYinU%eaKUPmm^IML3^KWzw+a)J-R7Tk|MNuIIqF#=V6RdAwGh$L$2CEV_Uq zhkC$xU4c^u1I51UV)Vn3linpm%BjXU(?biX;e6G0R(Mx3VPrRi5Ucf6WTWA4&6ZPV zf0QC$u?h5pk1ql%zKFeqVZnagjtk=W;UTjVgCk?QAD#GJRXhWPJurJWxUchvn<7y0 z_p0BvE{$M)CIVSlm=w*fbHREatRcW&gq}%eazSA&O@l#32gIwyk19M#fK1M444fEv zWJsOv1R7;vCXmhB}r! zC{W-_etM-OusO=ePZDz3b0fCXS0lI$Vw%xSzNe07^L(Qz%O6$SWCZSgktOO2W9PLf?PipWbccXa zaG0~TXIF)kM9rNZW1twx<1R>+wxE%W3buz1Bt*`&*>PW5vVw_8p`a$xVYxq(#+Z-h zd(zE|5or57L|0YNvSb1+Kkb+N9{y7}yfyk$+&SL5crrLGZ~L(yvH zV4SV$EY9(^;{@-?b2(vblqylzgI6J1Wj^(!R z>ObF7q|Is-DJE~Pyg|W@Uik0=4|^o_=!=Uckmq`2hj0z!>`;4oDBpW;(Y(QC0iKd zX!A^p+FC|IohwtjT5+|X6YAaHMC_zSdZe^id))4)4!vbez1)0dd!Aov`v7CGVJ0o3 zud@S&eV%}+uj{F?&puwS^jU!M2@SVK2=ZZ8f%I!##}GE;&k$-WZ>A1f{k@nrxE47m z6-zqyn+NEq64y8F{+>;Vw%m@g)9EECQ0b*hpRPN`UTs~gJ*=qIr6cXP1*A6>d+?)Z zS9p7~=I{-(#iFr<8Hur(X2T0iIkz-2l{hUs2O{j0i04{HK=UE;FM7ccV7>lX=9c)K z*`4?ZpvNaO0iY4&c%-7UushG@WN4yE{7I$+Gj0J_r3sg+Qf#Md+7T5D!F;td%?2$+ z_3BBG&Frq6RlPBENyod*;8yg3Ec`Y#L-VERaI8o1{ z-5U@dk0niJFe_|3gN+X6e_Q^wy-WOJQ$MT83^tfF9frl#fB1ab!xHrbY?nakVNi&P34q-dQ$ABb7=mGsnjH{PVap?C4z~hAm^kyKbsU?8N(JZ;EIOW(acnGA> z63RTW`idP>A53l2?_eCWvM_uaVZ`;i9DiWiL()?58` zqnb!3YyydhKzg;bLy6AsI5pcLeG2O$v$Mu?=}VBK#s|SRVbXK~_8l|E)a-VIe8wJf z>2mWXRq|DCXZUaS^NO&KHdQ=oV7Xp(q7DyS>72p&DI;5_9Tjc41T{Z(^ClM92vi7>gv56zJT9Z2RKN&8U2t!o_6f5X zAU%Wo=^IVBlG#k}2#oza&8pQp4wNGwx4 z0mfP9P61aLAAPe1eA@s&;3wk^;9w2J*pfpp;0+)$##J;OyCts_vP3ib0uLb1`etGF zVoLoeIW{cdNh_ygdqbqnh>lU-5%$A4Sf0F{=s-{4yh& z0TnCGp_$)vaTIq{EN|__XGq6Ro#qwyx&|*V=y1xr>VDaPwczl~hyEBjg zT5P7_JX5h5dbki(o#l_Fp^)cQA`zs{6A;1 zF)lF9R*})c3ykwR1u|=z)UL8=nybfMnGt1Ywb>$$Nv6)x=ztiTiPg0%>3!NYzhBn1R38;it4>KP<;1TI!s+ugnQX`3bY;SADdlI8Z~y^o;{Ri>*&*9MHZJaJ&EK zt1HC<^Zmwx_4ioAH~UZACoh)Pf-}pyBWeYK28+imF8i_L8j>?*tb(eBfq_s3b*?wK z#%ei!$xqnh@e|m(&3`C1OlD!}m(p!lhJIA|x=KY8u6)!%8(9f!KWFDU^?uZ;23Ync zLy9*ylTY(|H>Xc_jEL0?2IZAJ=P0&CXlpcViK=CW8O&PXvZaJ}!Z^|yQQb=4L|M1DuX{TM$J6=aIk9sgMJuyZ zA2&6WdLhxxf7u7gs&O-xuLeYuS4_jTvl`4mr3G<$HthapHKgCI+aI@rH6OAkScsw= z^%KLECrsren1eeQvkPN_~8TMxIl( zwsTl%e)=u8l994T{I`EVpMCrETYw}7)zn)6)aQwh4<%rBYV4laEP4R@fe#UW!-Zfei2*+%3d!caJ=ZaS- z7pXkTmqi?-d=Do;BBftOez@pzrpY6BnJKxHR^GuQC8YAbqdLHZm!HJuw5NG}llzgw zc);A$WZ5X@Fz{aHi^2tmJkMAzwiOVlBdgX(z4pDX+%Y@PDYzLM+Y(0&Cdbv68yR6*VEjh)m+hg@J%gJcU;)4mT^szy1PP} ze)CsiH*LGY?r~W8oyV8+2$+}xk%kt^+3(ZGxB+Zk++6YJ1G-ZzC;>YkAAsJi?gM6z zl;O{=Pg80K&O4b_M;Uvd#FpW5H?fZIbi0s9)w2|DcTUf^*^~&|5yr>EM!IF30#W&D~&ZBvrW6njqy~^k~^|ZcrWC zRPP}L_P_CVPhEDkQM;&TnW>bOvTZA6+qP}nPT5Gxwr$(Conne}&3Aok9qhIbcWe76 zjDs=8^Yq^DtNZQs6tBp~dM{sd=wY|AcCS3^mU%tJjk>5+&hKtnws@eFEZiB5I#s{f zE&weA3(wIBu14(REVe%*y&sn?V*iCDaE`7Gm#kQ!Kx9Fow1H~H=OVb_} zLHr*2TCFMBa> zQ?URkPSI@g$feXt6&J8waG&^L@>J%4|B=|rKoVOeNMdUxlCm{(V^>Pj@aQ#SsJWUw zDaw{RBPZ8Gv4$x7Hp$!B?CF-MVYTT$c%{5q3Y}JN6xGHwZRfA4dgK2w`r`?xjJ_8g zLxg((e13WRH2&DVIsE+P@!+cN1jvta>d8IqjSeG-z11jCxqVK}Uw!yjfoVUwu0vwZ z+geqzGDE8K!!aGgIqYOA#%vv&$mR%&xD}7{cqs+>C%L7SU%YO0U(bY6&i4{5kHF&nq1g1VfCa@>)uv`p|f zB0YKQVHFQ4ToKu)9`@p5330}pR!b8*S%h+f=gSDK<@!-u=JQ_^W4*@b46#M6Lk7aW z1Bhao3#YLF4Hwia%UrOJTMfgz|1GgC$Fu(@u^nGEXb_MtJxs37pz>&FRD&e88*<#a z)!>>ocl3I_D*rtty@%&mjQ=FI+fDzsmHfC3;PZlo7Z~mp@bukB>^iB})9W2bqCaES0hQQKQHC!uFFbL#R^HzPEPyC~E~e z+s-bbWkvkBa`ADgc{H`D{6hE@{%C+Ha83J4jY43sex%-9PgxSf&Ygl7hm` zo%~0!9YTu>(Qr2nQTJ zh9Mm)i7_VSA;aO2Ac%)e&J6mQjrA=MbY+<$bmwWp@Nt|&4O#HZ8(%f*mqq(8&^3}zxE2F_WTj9M5)0N~ zLrr7-m_$Et;erZLl%BfeEo=~UyFNGnYL&Wpc~P@n$_E;wLs8u`FKl#b>U?M8YoD>v zxB$cU%ed^2VCl< zm+y>8gg8nlwC2e(P?TyV`iJ!4E_)0lsIMQ7^2C$7+P*)@>wFqt2cq+W^XmCXqL39V#s$lH$-`SW@__Q)oQW6BRmo z+PSxOFb9FrF)Yj#DRj!NcHz?zy$?3OUDf97nQv`NjgTcN_avyWF27>`k+*?aL{hSW zBS&Hh`Ywv*(q^M*Bwj-6ZV-?E>TU&m{f&BrNrT!z^G4VjKHIqQAvX z!wiS0B&`}HWyo|M)k_**$t0uncbts^CE7Du@kFD2s!^JrCYp-8VvB&rSs1?`8_8+S zSz1jtE%ik6z0{h6L!s@dbb$i5PGYn5>v%o->=YaCmfN%kW~jqmSo-WS)(d$=0{fjPovK|o^U zAaYI;0FNSvi7;I5VzA*}<$W=fJxO9^Z(NlMQN5FLAv~#Ml1>NVrK|fkz0iz5PdUt6 zg!+#RwL)tRyWNG>2BtNP8{Fsh3P!6Oe``n?KSsh4D`V6sIy4n;^>6pP&@0~kJ=_Rl zK@^#z%-9K1N)tYjL}xt%(pT{ybX;;(ec10gv3+JO7G;_r3uQ^xj7XO&|3Z^&0Hj1H zDLXK)c}}R6R%J}kidpyi=9TC_sKos;zN=43yjjmdc`b_1jwDm#ab~l49RJXKwaOy( zI9Aqtt>?y?WL5&IStl9m2}Qe!OJRd+DSHDZNq>7uU~-d&@|Mq=fT#U~EN=-kK~i-v z5P(1=zS|#CefP7FN&6FeXOHVT#U*EYA^2U@l}LU-F;~hkJr$pe;tQi78m1oy*JR`z z@5}`8b`PDo4()da386DOUL+L!QTA^tcx3)*TyQR9y#M4iZyqgcpP!!UK)crLd5V1O zqlSt@@+$S)9;uond`y$_%2d0aWHnUbb&5$Z-W!wg9$u@)dJFE=DL=ZK-B{s7{&u+X zZWE&{81B zAyfK!NSpSpBP&ZFn9Lu+gk+(_6kJC-UKM`0N8AT`Wjuxx4St#Akl$GU}V6s=xl-H)M#gMQmMzE`?WHO+dSoo*%*vL zawQ*0;|6lqA_q1bFfX$7jbuz3E7cdx#i+`Sk@TUwex)|!8^HtAjHq$x+}|w`O%+pc zNr@Sj3qCv_Q|&m`rVbG_TBXEgn?ZB%mR zhtOy)gyC-Bx1ch^JR__2jvsZ4u&ZTAkwl|jSVgIk?m_Mv3E@lPi!y;y5jsI57De=Q ze?A=Ia32(4q<+Zm&yQw&==)vlH>%cMN9^z;ZNhq0r+O>yT=k?fc^FHuLOKbE9~d#v zZhkOK2^)FZrZ^EsRAP5%=KC8+5Zq10-7;!292gOBI&$f{Y^=>s?Vk2E+?2gSl{VuR z^@dt1zkNfVmy>?+|4=pTrpKaxsHFPthW>R>&s?EOt>ziVp*EHLCoEsHcP2TJZ}v*| z^gO?XQIuzJ=ja01(`W`@$&D)|gA^U+?_BI<>LF>k^ z_B@vnH{nlwzFtjplT13n;IbJ>VF3=wEXInnke5foTEu>&^29$U*>fRT<#5h?$wY}B zKYwD(bZarct$TFxS>?@bt}b%$N^IKVv-3QAX#}y*oaAIfx5PH0bW~_9WQ9?-rp!Iv z^96eJ)arHhL_AlN%BH65g=2!cl@?;ROE6k>4#Imb+2ji`u!3leVFNmT68i6r@J6ss zDc4^|&tb{9>Z%gp50!%6Go1Veh-;x_MgVkp8l_)WCtB93u~cuYLMY!)OB(W7c^Fz5 zhbyS7P^O!E9k;INJGQqA;+VY=UIyqJwnhXuyEL2@)T=LQ(eR)FVyv=KY-%u;)M=$C zMZq<~B)^q$(hy-(=ycpp{4>RRw&Dgdx0m!7zIZpH~UY|eAOZ!1OWG~zkAyCURs0|et)Uu-tu_=epU}9BO;CD^UyAql(}iz zk)yvt!<~Xvog96lTx&l2xKdkpxtN0Dn!f=#2X zwoEz9Oc?V+Wv=$cOD=t~z1VXj0`3T7{^?nR^@nWY+mYd3C`837ChQs{Je2yd`UG#7 z*_c_Dq($c6OhZC7V&gXoyg-#8BruSXG-ZF|DEqBPK{%Xl5mgq7WIuTGBNwo4Nxq zGVP@Z*y9WslF?=SCS>CCyQI8S3N^U>S!kE|f93VE}j+Su1N>rWgS1~wI*DWSyiBUp}f>i%+cfC#dEp6Yl8FfKe9;{3eR zcHJ*u1<(;WXLM|o2~txz;T4T7Y>G#ULeT6yrc7Ybc@8Xa*2I+vaA3IwMl=?F*@qX( zJY4-)bfJrCPDFN(s0agi#F0Nl#t#%+xo0|et&)}fCYM`GPEKk;S!z4RW1_-{dwAwj zI=J5kR~0T zCpTj4ehxpFXUaaY<+CUO>VZOD`TKY5gNA?OXZZW2=*;MUDd7q6snUocsly(S02!pI zv+m3#6!opjod47~i; zQ6Fn@KIsj={j8HHXoON-Wf$jxTE(n;j%my+u0^*hN^Xx3NrhRlZ?r%YnyX)&_c?Ix z1kr0i0b<$Wn`z{uJq=U}m6Tns0BCvf@E5#QFX$`to$)HO_`*ePs0=th9N3fK-#rto zBTOj4^bz%kJh@1ZenV@sWP);M1QSVy(!p036WU!a-*SnuKg5|OZjS*>AGISRGk<&M zQ0YJJJhsk<5)`ub@-BSm2W^Q$@QT=$w@BPMstTd~XgTqsYjpZZK=zuBpt2xIH@Qbv zmAOjZv_z1ZEp74=`{TmQscrD6EZy(z^>ba3Ug3v)BfLY&=r}yOPXRfoGDB{X^=j%p=*#qmq@7TL6>8DKCrKswbA05*zl*Qx1nE$cE;#*A z^-fNp5ycQEo64LSq`xi7+eZ|-Ha_4OnnnXgRfZq~ZLr6sxG|fTiNPwKpG*d@)2zr& zDzxySLu|IDXAStUMy_1lC^Dp~vf@$TcJ^~GW| zS9UxnGj2B|zS@UId7^Ss{FM=5%uHgVgnIO{fX~L^-{uPU*!3y=G**kJ*)f;H=I`}D z`P#AfH?@V@Ml;I3bW{4NvX3K&EIFdnP|yW#`#py9lmJ+Dl%hZ)F5EPuM*8`+ti--j^PTU{fJE%-S-o`?==#;i%ObK!TwqxD zf_U}p@jmN{RIKL$z|s}*GIyoM8Cx0ZjzHwn?K#<0JOC*ltCFoAN4oHSh_ zq0%M9BOgqlA5nInFm%H!Ye|WQf~QI?;|lK*Qru){=ndOAHA2I8wqff+i$V@kK2(#4 zjpF=IEM4~%tWcgJ7!9oIh1T*if3b)Zl`(~Nu}1h)k=!`}UEd&|FX4T;pu$1P+Z=3{5w@du4Q*WzaA)5h-!qdhZSXL>7xl*3ULw4Tds| zbt_e6($d%f@oSJEeodMzmBmJbI~dZ9@!Hjl#=7<}*Z>kEg`lVr!63~s>)MOEN&Ieh zCyn7+`bc*g#IHp{Gu}@XA>j>8e6eplt4L|K@BB<{f9Qu~VM5>F{lmk<9!u#M$@P33 znnZIGDm#uXCK>y|o^z^OO<~fMx}sILmT0&HQ1YYEG54HM<{g&`R^d>dax2jLrtQL! z3F6n(67t;8h4ToNVhtNqFTEaQ2UPZ3=h2YFg&q4Xk(f;2jIXm*c{=jMvJ^6Zkw`L2 zsbrPB0*EG8kzkDryh!V&Y(wXDV@<-vR}e5L^Yd-oSC?{7EE~l2r=2OxYktc+hoCfU zq0BhO3Ky4x6~@zJ9!4lJn>S|I%*D&SZ4+rC?4fe+3#rb3K z1ks=#q$j5EFGw8N*}!qDw#%pfc&fcKkiO=C-_NMRm0p!TmO(nT6f2(ZhdzmOn{0(= zY{rp2EF5yj16%@(C5Uj3L#3I!Efxcgq-BsFxz3(yYHRta>K|e8Uxd}7pLX)_y1hKU zMz%2~pBa@Ru_rOd_I0b{dZb5?YJ(C8Orld%M^V~JGA1|0v2p&|NGehG#j5bhdd3Sv z(@q8I3Bn%2az&i(9c_Wtg6!;>d^dmI_J5=A1`K@;5f&B^w+!+-IUz3=duN}WhsiO? zFSj%O?}YvPodLo5@;mrHAz*1Gc1|@)w!0@!J%teqx8QjN?wvT@%NAg~N~UQ31{7Kja=j`8GZv;VrN| z+hTEXGfO)pedjmY9<%WWpbl=!uRZ|zKY8ut-i)wkEnw&6Jp}CHwihqXA0)5+gcbk! z;Rb5A-@^o4e}DcY3>NsH^$yxI?ER$=eHZcB`^7nEnlrZ z)BuvJFQb7Ik^9%otrimW@Yz0ei3~o7$am{e>2O9a`BIfNnjLUqAh*V%=5g#3ix5LM zZ*<9u41!m4BQ~J$r`o{e0O=COcv8iM2NdG6K0BFEM@+>5rV{UYnR=LuCD0jW3C7OS zxLhz>9tFh#ALT@n7H*={-y2QWiI72Q^ z1z^UMFT#@5U4hWQja`xY5QzJ1F9-s=dlGcHY48JuU;>Q|zW3#6+9UjnZWtygk<}h| zd99t6)d+0CTRo=b475M$EdJfR*HygNeAHcR*mBf^Iwk)#4YAj&f(jrlFv2V4RFRrx zFxDNnJl~j-IkE1~VG`YT3WivE7-y5`a$fAL@h!ATI%GII@F)8 zanWA1jSGjJX+p!R@KGT>F-ek~`hY|6uG8{{q{!n*0*Fv}m{JELjt?@i5VrPwrckhy zElV%=r_A6P&xjQ9RHJyMT?GC-gpK*~G1s9aI)_d^k5HqJQZ-oCH}>`@2N1yfdqNxD zNempFmIo3NGwUYIc51~LQETkdjd77=Td&HG1O)X_3H1Aeh zRrNAxcU%gUZYcv8b_@Ef&51v%2nQx4*$F>ojLHH4fDbNiKIakkW@YPlB*++4f-OE$^@K3u{);ZvB|0NW|vJ>m*2PpTa{*m4~2Nrxm zvNc9x&jTv1Lh(wGTs-7p50xrS^IQTWY^Sd|u1$gsp zAQ15P4A>oWI+?z+I8z|{qJL_o5W!z5s$X8IK3dheu2HV&W4)``5nq{f81lm?OjKZP zH#y*-eBuZZZxswTZEjWV%H`Gyq#S+BI7s%V9k*KwJq864-y03MvNgCZinxD|kuIZ6 zZi7~fy>4Z zVj60`>Ej?&@xCBw-rbzzHKoq6i+b;`1Sv=R8OlOne`nC6RP{nEZjO`2hS4Q_A#-js z-tk@F>r@M`*DK#<@fNiTsm&v!!b4=^%FMs3NmuM5h^rC8df0Rrt7v`N6|~q74g82+ zo`2l|o1wILr6zlEX%15S_2;cdk?pTF>g9(}l5hmyvgvDQd+Jd&^rco#L8oWNNOq(H zQ+#*VSB5=hz^k&-Fwd@uTRWmyG0OL?KRhVO&T%~VJ+~NFf3;4nN`dEo zQ_D-e6rT=tyq@|?prp#0-xBcVpk6El@7TaHBPzs>4Z9KKHhH5iZ6?i-k6ps9E36}+p$AauYj^yx!@l%wt{1-ZAI?Z+{<}t1 z(LkdaRV(!GPtTQgzxRTcrJJTy`KS66X+ik;0&)D3=aFxbLvQF#ce*s=C0Nw@1lf3j zKQQv147!Qqy+KXM`xorL3IPfGl;`Q&=fRBU#2PMn%W-|r>G}R%pC^l*gZaBT`2+;r zukc%~R*&gFvVIzT3WXPN-_7$B{S?>b_Pb7J@Jh||^}7!nu#63)Y<&0ie0$fp8)gk5 zmZH$7`c+5Cf4bt3FAA2{Nl5tC>qBh%5iFb;5-f_vrJ*(j`Y8K335d_EGE%|!2qa3D z7l8-4G9XAFof!@Rf2GLAnY@7pR^be}?h`*Aa2)%d8P;|tBD zPCpLr4$@uz!s{CZQ5uk$*75&)gWL+7O^C;F+>UHxi_+zDUhe32#73WBai+N(eS(aD zrJ8}01S@tCg7P{Vffr5IL4%=LVWj^hu@_>wy#D3HPQP zqY}a&n5}3^ViA50 z$`Z4jUivuBt$8?Pbl60Gq>mcGc$~UcqTaXQ@aj$fxX+XE!}11&2o#E`#gN#!&^(W)0gp~ z%btDu=0Es6Um(7Za`*~eLBGKlxB$R{moyDRAM8|iyw!Cgg~(>DqM&aO%zi8=8Lc>` zB4jJL0xU|&9e&MJF0zIP<2PLi8>kRFwwg7Q|0AeL_~p9&L9nA&l1N=?uh;p|K*JcH z1S4$f6Q$ygh6qL4z!f2D9wl=G{MYX)TrWUQ1nl^co$$%^iyUI{sTU57Yzo->r~Jl> z-zNXBU*6j5K&`xvR6M}9)84mP7|?VK@O4t+9Vnk?Jo6KKv?~1#5Wg5?K>NDuxA6g} z+7*aNto=?HwiZDLGlJx#{4EP#DC`E^IpBU}ptl6(czdCW@*Tb|GZD9ro#X({#ja{@ z;=4O)zwnZfyCZeFCDW?-v|6S-17n^F7)!dfJ(z&^s8V-bys4SrGbLyWXuL_|k?(lT zP2wG^3qeltmfcjc#Lf+VM!u9*swkeZ(KM^sfFi*!92AjVwlWp5qfiZ!4R<--#fV_0 z7pVCOrM-HrOXaLxhD_5Xe(G|Ue&Y?N$1BQBpB#g#4+9dJ-`YxoMsYeVn0svuGY9kt z#e5paW^nS-82!g(KnrSY5vEjG1tgNo1;b~~+Vb6<3m-{%*({mZ`YP{Zu-h&~t?f~! zo)y#@Y$1dD^dEs^&2>+*zP5 zs&(@~69Y%?t)?Az>$VU?_ky<`s{e^`rS+c~LEVPL9Gh|bQYI5?g)?p6e(4Cq-nPKx zfB~yDM9OUNkgox5K%eXhH&AQL)4Xv}wMz+cPKDNDb_Wzc7)<&@qw%1Z*k%kL2#c|Z#^-_VE_J>Lx19Be5BtYh)ThUeNY|qG4P`q2o9Y3MtnA$@~>NHHXoWe{z|EwkHd00 z_Jnkd+e@FzRuh3L;E@%kz>}jMQ+&VA0!i|9&6qx8A#)1v_kH=8wqP+tq0C>!Y2qC` zLaf<9e^%Y416d~-4sFlSHhMyO0q(85#4P!jmeZn=#?ctf^658J8It8Hx-{qFm4u`f zRr2QJ_-p2px11uqF88oIIlzFBm60atS0CTTfrf|0qd|}7-~96=-96yLNXDU)D3x|& zT*-$+$d^AeaPgu4s}Ok0kVl_usRhN8bV)^~ST>np(f+y&&72=7liB!FkQtkT3z4Ba z-Z&dLRsP`cmo5Wn;ehlj!2eJ##BI|u8n{V+9N_oY`R)wZn`}XwPSgBgK)8?_*wYGJ z_|Y|`>~VO$W`gFWIWt(q8QPEi&-C##c2?xk8eRCN;U}7;64u9RM2xY( zN;rk6*DB3UNt_7nFS|hVZ}g_c+kk1@eGi`M#`%gV1Qx$$*|+)gtu>7wI{-ge2LAb! z-roBXPts$#(-JWPdB;Ll&)^@aG8((^<&V5Ug9?&t3{N*sY9S zPMOmm9Z00&C*zp|LhJI#i+qz>4W|i6AWqgtnw=rn5D8Syr5>6uO^LnWnd((Zg=QsQ3V8q(HqEKUqt09$nDc4u#dmbjx06=(1oA?6`V?Pv_^`efxB6)x^W8dhYPW zVByOiK|a)TuYWOJl$(8s6%PZ-FeHKA)@aM}fzyOkS~d$3IK@}I~Aowsry5Vt9a`x5Z{5_2DLdtCSddYNnx z(1-Rwvs{S-D?RSFXGI>ah+M>fCX(?~NL&SmOlKy6XE!jy0ebu$3*}_x<4=%s6Xy~&o)2KhF#St; z2FO4(?k>$`9YVteqhef5VTfQeX^>4MbwN+yu{IsXFhK6^5Zrn5TXVBkT0gQ<9F(KsZc5FP6saHISB;N_)3FKZI-pMQ%;% zHhQ^QGT$b26fM)aHNkF_U=*&XU;B^>uyw;#fhmg7h}TRgzDeyKbf${7^_e!}+<#Wh z?0B9LHGTsCt;W#75n}hWf+T%I^DIzWEV=Po&J54uzSaVmB~{|74l_;)s8l> z4$XyI0hvsGl9Oo(broX*ZbCTo%VI9#Zp`H_rMojOl(&NWkGXhTxd)nMCN4W{68dt( z_I5cQ6LTn14~G__mzXgnr|J{b0*lfYOfh1w$}VBQ4RvO04gS2c*3ny3Pl4nPPn1GC z^1Y(E#V49!rSg4ORuW218xfYp101c%Z%(Mm39+X?;m)&5XG58c@_&Ptkxk3ZY>{~U zOlH-Ay0v#^=-ug9PIh!rsk;cYe)!M{cwUA)s%3i6p6wJ)KIU%SiM3(f#hj{(ldI`e z5>=J?F(*=$>g-}2$v&9flrX&+P`L&ah}}nysOATJdnJVKWQ=|d$nVAePYk#{(CYs> zMT6ujG8wwAM1Q;yymp;pj!WS32A18&Ltq>yW&bP=8O22G+zVE&QJd1GG4!`c$6xdO zN?Dd~{F@DJO}zQA($Qh~2||1*j9m@!R8UpuYWpQQZ>GrA!OYnb-(3gEunQ}G2vm&7 zZr@y*-8qwv&bfx4fzEFUBzqsVL9M)w@A6*NwWkoZ33u3B72`X$Orm&5ITu?a!woYd zmKemKGDhl+Coj!8PpJ&*m*CPdGkYt zlQ4<{$2h}-0R-1p+pqBnf9QdW$dD(mknzBp8 za9X!lpC^7yPvE?)eW?Hie_)4!NnpA%iH=H7(~0+IS8eoQezo0k|Da?@$noOmPY2S^tE4qEMo;^Mr-^&XVV!k1Uhm5 zGnvkxl2IF^Qfc4(!c+sRsAEX)dY`-a>)*(T(_6Vk_Vyx4d4dI!&~XyU;PKo(YgR!G zx8OkHg>+b$J@4S9p*!LTVw|5whS8*aas?Iho^MUX%DF?#e{!_iPEJC^a84&@u0(b} zFK@R?3BP~_0ReAMAnMrN`3Q_NFxkZoSIFlA3U6E>rtP}N&kPtpOY>zg?k%$gy^0KM z=JXVx`WFC#>;z7LZONs%K#l0v7`RlAkjj|e;@?sS%wa(pqi|@z3O_EFv&8c?>^{l_ z2ry;%I%4JHF8Na|=+QGlJJlJ(NQiR8E|hPN?-%avAKqCQ#ykxpXrSc|$wUuUpxN0@ zN#-N8U&)VD=DoK73H&BmpeLmYG&jrppQ?iBj?W%91Rc1+emf&BP4GdXXd^fbeuZVC zKj?h4CdMAL+t!uXi7ap(uX1*O&~h@{_8;$T5UEw?H5jN`pml$zgRh!O!}8s!6A6l| zTlx9M!3_)5cnF^+w1OGqR99(!cX5;}pv1d_BVRR7M8D38Q^dk64lujU6^mE@SkZS=s$chGA5tfpa)KYeY4Oa_$YDkf!ZmvG z-Z@F8*d!dpp`B>x@@ffPF*q{Fmv&~k9vJWK_XM<@_*i=SzYul)#Oz|woO?#;f;6U` zF*Y}k9<$GXws%@$K%HlfJ?PKd*9R;{nYUfgY`KERJ>4ImmVSChk|wNR=9)GPLh91@ zX^Q)wFjs(LyRm#w*MWAtdnMo>|_%*Ol@F#i&mGX zCMHJ|Jxxrh7UR}{T8BDy>JbUMm0f_m8&OE^^~aQEkP*U zxvJBr(O9fw%zm{qj*JY#TxghsfqzXt_?K`IA2q+36 zAH|}<=*gAW@3iYcSYw}w260Rn4;|_M-0!NsHtjhNFMMOAe_+lUnNer1`1Gfs@(V4J z)UM-|eWzF|-tutCymz7R0%wXJZad!bPL0g~E|0TU->$e%N)CI3!V(1G^ExkqFQy(U z`FRP2Th$n?M`s_GJPCsR!o$rz3?Pe@q++CBPHRz&m=^919G77=IjquWg8#AB37&6G zv1$-!L}}WPPrft@y^&J(oncW#Tgx5-t*D81&Qm8s?q{RIoFCQV)lBC@AjPF$rOl53 z^#!1tql6B`ZzUk%73LEV%jehEE+`!z1^n!M)NzCipX)_s1s5}xNEvwAk0#dxi*ccg~+i44YVqTFGjlvwadHZX{W!D}nM_CiB!@WKrv z0i{gF#{N(&g>(ethog8?`)rV4sLGm#i5%s~G}`4l3~GehMYwh1`t%SS zw5Gemf+szbiS!#nZ#p;jLnML#W3WjM$YE7pqdp~(^OOz1Z}7a&d89eiA{Kzt(8FBE zdaIHo(QbhLhkaIZmA1X2nLBN5N=$W!3WjoDxgvzCXRt4`m}N>By+tHp?NxUwjEV^<7uv0<16qtW-J6(pe2PRgn?8?1U5 z$LhRs@z2=DUZ~PMT{)@(&h+OW?y(^E=+L{tP$$u4byy7J9<}DCHu746LK&KTwZ{NI zT@RHnVE^wb;O+G@;S;daGwlwj)4_Mh1W)wsF?X=}K+q+cy2e!S71@2TSbjyDO=y3~ z1Z_AQpgB`QUDj_`D+j&vz{cK}0xBTPufG8v4|K%9 zUElbyP*hyIB78EIIZcZ28Vr?|Sf@skH>##8+TtibTHrfQ0Xhuq7Hl*9eg9Y92b#ic z@;qz+biB^WIYyEMx=>A`vL$?u+!CuP&5|$ItfGdErV7ksu=38M>+!cGcZsFl^Ed$( zI6jcZ)Z-EOFs{|D!bHAB1vkk3k2Q#xz{n_LsQ#*I_4OO|Spy%I9qg1AZt%<)`nrDm zlr^Y!GbK`+qv#uqvo>GE8=;E66M_V?43zf#HV1JlDL%?vmH|DViZd0}YccCE`-{63WQ=Y`NDF>* zxE3039T^%8BYE`4E9ZF3Q%TdoNR>^ zm@;S8)ISte5_GeAQQ>#v3xv#w~OkMPYDB@<5Qc~=u+lLGQ054fDfFNO6$^i zh%OJsIuf@301HWro?!)*l3`?0euL|-V{1)pZhU1Y`pZ_(S8McFtvs2nHPGX(3)qDY zd_8zI`8oxCp5}my*9LyazqL8AsQieksd1#-U`%mox91a#WV<`81DUAdL|_+7G_*pT1ze@TH?(dpDVC# z8tyf8mc-c#1JC`NX%tg%t60eaiNh}XXlbgyeb`@JIznDe;|=h96ihp;EOg1a#C-+hb#nRy@N z@lf{hpm0Q@Z<0AC_$r!cV)Q=_wh=@odB{%2ECi@AjAS7_BO^5UwtLxYpmN`r2Z6Q{ zU1qXBMNOA59Y4g_4?*iW1iba%eHA4np|CP4UDCNtgKPcb|teDtzYi{F9Ns>>Mw zjS+0Kd*!{Vp0m7ob_eLd0V<-!6i4`2ToA{!8X5{K?xol(m%!IN9>s(YmaPyWdOh0= z$n|2PLC+oVq>_k7pT7T~3*j28sZ*JV`}?!rwCwX#&LSm9ho@)@Nb zxqaqhX_1-8>pESA2T>Xfd(fgA$YYWgyv~UQR2dr0V@eeO$P)WVwsD!dEXv+P&$Dni zu}k%%D?#&YT?LtR0WqfT&r`x$VC&RigcjhIFi;<> z)*OmXEu~fU>KYb(2)L3}NON==iv=0B4@Hpw*svx~pf3-WmhyuN@xHtr2ntIPl-%oo zkSB04{U+yZbiXDii-^@yENK zgU4hGn8H}K^e^Q^v5hlL3~DR}(29h@2mJT5z(AtZL+O}SS7wdfpW^Z7dDd=!oqX`2 zbXoIOj4G-;*v+a7t2hnYfOuj(etv=54wpGb`*$hrm|GOKJb(1p8_RB%W?SGo`I<{C zm_4M~M{(2^5@w6!5=~tZapS|3pprKz=c3ETAYp0E0;pdm=zmSuVw8)hN~c+i($Si! zP#a!2mFLX9E^6nk48ey4%vfzC=O*Zq!n+UQI$@8X!9s7>yuC7Hl0^G4odxHT#ZMO7 zyAq@-$ZvP09%ue?l7e1U6Et~zm9<+U4Byw8D)yLo{r8tM2D9(g0cH!fIL--PzX>W& zOMl^cA!SVZhypL0tWYVErc}Rqj@nHZ`9hC{{!c5w)Qu@%#x&M0y!yLB?}|0Yf58n| zRP`0i-_`C79O{KM>!!3j*?(G!4t9#FGIly%%|M@^hAtj~k{usk^$p-*=m7J^(*O07 zc4E5!AAV8};D7uit>ORQ{3H@!qwn`?^+4#?-Q8QP!=HKI-xvx0-+{&+IEH7BsX?ljJ=`sMM0JkS`wTaH^?clLeQ zyj#kDpXYVUGYW0O~7 z9Ql}BcUcRiCN6_#OYex1saY)52sVz~!i}3WR6_k)YEG2^XI?AO8@-KX zjiBdbaW{JI=`AP6sw~$U{(ks}yi>Wby^t2uqnWl;ir2B=xD^{Uu?oAVXoiuB#77aw zREI;55qR<)d!qf607t-FM!davMc-?ygYaX^iN$X&t-Pe;vlcKVd_Z2~m@5}z<{oi-;ETRAZriLBBAxXHt z@P(2vl&7%Zc#+zla*Qs20mlo{f1eS;7fJg{XtvK3MgiDKJrj-zI(C4S(7UU1iWakX z->ALdA8`}_$E6=X2H$VrunF9Kv47yGbfdo=p1nJH_xA&Emh~P4h$Ek)0PF~r+)5n& z_3MFnBg%aJ+I3Ap=pCCGnY`v06v+g#nr92q7~OF*|B^Vk4wnE$+Lp|w_;p+pM1y|i~Q>;_>2Xi&Hs$COhRu!4L zOXkoVWLaH81zA0CtgOBR)!*7RvMq5f8?_ebA{%fs#JhvA_nbP!pt_x&My?&%!jo}wSrKkIBXZs{m2Zo#WQ4bkF{$) zYJ#Ywl=+iFrN};3bY3kJ6ox9a%DYy+lQ2FM%-ap}H11GgfC z(vC^23`ty&fg$;fLk#KMIv}8Y+A=Ex9#6P&xe;18@wZU8HBJ?iIb?yjx(Bh*h<47w z=4B{a98(Mh&S0v!RXk&7{N05}ghe1*1KQNU>zSK%Wx268(ye;X+Yg3;(_$2CS7H5# zn2s%=ea`17BwtOaca_I`UAmiycs1Tj(cE4Nj0TbF3OX(DgP(nNCmP1QILoSrGyml= z%=7VC+y0wEieWHZ=n8DG|6cCz7V|&u_Xm&m-<>?G*ndBZF+YC2aqG|U(u1-6Oh;=i zKY99jJ*&^OaXU6&1xc5(_)L8b4kmoEve8$7Rc-P?>Q697K2K=nrdkmpt9TJo!YB2n zV*!p>Xhnq@v+;}&USm2^>ywjfwE~Vp~6+^sX>o|u&zBdv{n^9Idh+AT~DhoLu7-`?ImcyZ24shSJ z6T(osOyrHaA&T+#cK6iFdKH`m`*G)?kl=*>Y%LYz%gJSxckNyr_0Q-oKkm- z&YN4DZn-Y3GtcZ5X_<*tQ*XnLIWd2i7}-qC{w7B?L%(4}Z7EqbV)py{b;GUg{~^(s ztmXe1^q=qTmHa=ukLN$`nVBEtp=FcNyYtno@d$ z9ypE2qwlS)vavben^eAr8!;PO;Ju1ZK!g3ZeQ&xGON{%fzPB1E>-yd_*az-=Ywe+_ z)1YtDL$hH!r?wAGZW?Pst>C7)RhQ@@ljPeSn)UsnX2@>eFM8junLByb_W#NJ|BDZT zHpPFvDBb`2;>C-{^PhL}tmOZjpa0*tn|J)>Zj!ivx1a3ftww&y7H-MSS0v_gPCi+C zBQ8E0(uxsZIb>Fj_p+fpMteO*dzCGGIivproLcuC>y?w756Y`_&yik=0UzVM?#I{E zxaMun)3m9DzZvIMEG!B1+x9WZF0>x)RsBnqFxK@hNuUqhx76B+QLnn)rVHbCrq|k@ z3pKC4@p!IkHTs(y&Gs(BR2n|)IIdNnb^SjvVSG%{LMKo|{MTT=%7Rkv2@Sn=|U%{_Wk%Ec-vTW{u@rwCPh z&F>NnT5O~_V7A&)Hi^u4ieqZwQtddNJ*xqxqhJ;&mb%9y{? zsj5=BWK_%ArB$f9#aoahwz9gKD9Nk4-!K&Q0zN&@WarTyo+0HGisCrv>5n&*StMr1$#G4 z#{0IPzV&Ba``=#e>bw9A_W$$!y`ufU|8lqgX#d~Evx@nz&0$eS8u~+2w)K_nF3Zb_ zeMF*Bzb}N#PEqAcFa4FToH|=S4Q9|PlH2cVHMyp>!Dd?xnn{t`Ca(>}#Z|+lVU!39<1&vd3I(O}|nKo?w`8a9rcG46~ zjS_U==DTN#$_sF<{#lM>(Zg6;AR}*?NtvHJMW5xW7qw?IuI_N9QmIYHEFYEQ*nTI^ z$&8<_IfQAwDerdAO8eZ~Gnk$j71Kd4Ww|0_#E%k6QIt6q9jEBHfl-i34lOYX{u9$u z9o1x|3-TtK{R*iaBw2$-X2XDs%v|o(9x*izq%fHABA&3B3Ve3qCNSqc`+IH#6RXIn?=10&=C4pNi1z2)_Ll&>$vmO8^Wv3Q;$#M&eQ+b z*#f^pib=x2$?+T3@nTB;KtAtyI6$zc%2D!1$D1*q1gQ57c_muU|FbuT$3MUEror-U zES~@S{g;E6h56rq{_-*Z&z(G5;5FtEoMJN@-r^w@TFa3b{Z8i)eE0_nr}@{v?@Tz4 z*+H)-76p$@dI9lSkCPbttQV@HpEUn$i85X3{~lA4#6qMfo&q5mV;>9=zeYmfXhc*! zuhZGu0vB)pc6`?9TwY!Z&AJny7)1e!e2ldAF4ooq4NtD~+Ld|$2Ht1yvx&MP40A%~ z2f!e%8_{igKAHCP-=ZAA+fauP9jc8 zkjQO_PDcu9rHI6o%y57hfQIJAk0<&SBg(+_1p5=AAKpg1J+sZb7u zvZ}z#pJW6iXC5i|I0Al{Fpj8Zol}aW`OPp#tkZFUXpcsSBL)WE;IH3zTm@jy+x7b2 zt2)9iL;{AOA_5~4hU8lGo5Nv<*of%`5Yr(SXd`f zobcufof~)Y)AW5))owaB;8M>Lm{Q7%NFdBTGUAuu2AmvUI6h;6Lqd^MqEX% z8*pidB>(vSy`y~-%(&{D*N110`1gOD?j=}=$^_CNhl+S{*QmrKFhnU)B_@HvM6C3O z5yw@SrKtF18j}b`JVhw;t6b(;r4|)MloC~L4;49~j$jOjIBYqkDkjTHbFBSSH5;2J z-1<{#6Ajp-?OSyAg!tCW;AOG9dh~^a<)T%2mlgSYh0kz%yI> zim0~5(}Hk|crp$-8YLk^MMT@;X+yX@JaHt?wX8Aj2Eua0Toz9{gnk8*OW=9-`tS%) z#7IJYv<$jS&ZD3j&DMAxogJ@0%w_S6Nr?S<6{>CV6e}6>6N>p<1G^18BgC%>y*e$U z+ZIm^VL2R^#uLW)9MKu}(W-Lk@btt$xW#dw#Bfdi{0E`hf7|&3o zT-Vn~zEL2BMhTS{!UHEGaGC8HDi*&qs-)VB!@4y-q2wCC2uK8__d&jAoWyDxDvSY? zro5NgD#ZqhQ6J`m74wn48gxP4w9&KiWD3X4rp#UW23CHW=Ez;S6jpw0&c$*})PI$l zq*zywVx3VEhCr5-9>DSlXx@=U&IsX7YV??ZB|br_E#Q~~)!UcP07D3TI5E|J-`SF7 zC?UL?1|2g_6PY^D0~H;JlQ2|g64+&B2abtH(BEmOvd2}C2rN#C6k8E`g))X~CN zH2J}xX2hasJ0cwWD8JpIJYXIsy)2 zarimiR`3x6RYW!R#VO>Ii+PMLtqz`29C2n&l4t`X)&)%%Si0qpf(^{23X|i3KZ}T} z2l^<4jER-~vW}>@P;jHf{Wl@1k0}3H?I50^KNG}wrdO4Sn%V)Pma8`&0gNKT^-&)& zPcGh`1BS%=nM2%c+nM=lS5K$E^|D4SGoHn)V1)>~6QW98;4K`Y@V2al zx~5my(%9^()wEd=N~)NHS3%xmWo<{80zg$*iUy0_J{kiV6s5*Uhzs=>;6y6UBm$Sp zZ||`f`5r?d@;RaTTEeEdWHUcs=5mokM{26=)Wc12#_HQ#o8pWno={O2N^n=;F32pz zLu3Unr{^NYXk8j{AWFQSAxd$O2i3$A`M8g~m-2`rrSO=&Fi~s{{!Cyf1}*?FjwNmj z-Kgy_kpITeN4fom!!RV*`iP~9i%rYvw30-1IzS5;WjPwys8}?p>pOsf)b`XO%Qy@} zDT1Fc3)glS$e}ImU8-8LsW?p7YP#g2nW?SM#dCAbIr$A*T}wWT1bhjd(i6$(LuMbJ1MLo30S6l%|q5iUle8x+Ne7EYjPmCzNbgmI~%mfIs9Lx@W%D7+5))J} zjZrRHk^e=Fi?ncN<%=Q2X>t4G+zU?|SW&tJy1Rh!^ELj(fR4#DiGf5x2I|qxY@0*H zFh_q(QOc6Jt{gdsj>{*PeAncs5yiFd8E)4W-R*7B+8BKa^}-#p+}c3fyjSCCD|hwR zQ=G&Ar8At9bRr#Sb1b|Ogn%whBA^r*Rx}5bEL-Puzse?G?MBIG*Qm?I(LI+gEL4Zm zf?6h#F$7lTg%-g@_fEYPjRg9od&OGrM#)=Tim0qu3x+wF80F9Dp zh9@8;X`oBn-KYxHS7_dIJ10cxy6&k}>qFuDe*+W$hc{RIj`#Naes19U@bHquL%07O zJ@&%V5|YEdd|o2R%v~~_BbO}|94bt26N=_i?PlBR>X)DEO~?rMJb#pe2vVVIn-|uN z+m`F0G)5d1HW6cTt+!2UD-FRpKg@ivLreX(xuL_Yh<6VfR(nDBB!u0xio=vRvEwbMAy1pj#S^}(>8vk5KB~DeF{fmo1L00Y{dw@ z<51qbF2#4h`LI@{GlgeR%(?}kPA`kOV=O831d=K3IGnjjR~Pxq5+IHykm9u|0TnmrXxLhR|b%zr=;6UC2)$Aq2ch@zA| zmG~$_u>v8O=Wy-;fEkkUY!_py!?7lFKsC~-1OmvgKwmp)Z5BDB9e<|K^I|lZTI3$c z$W+xiNNXTdFoDFTz9we=1*fnW$4}lK?XjMWI93a#rZZk8fxD21AiOX%^ZuUWxlV% zTE&=hJSm9hoS>16Ge$At3!8(nANZaJqX<#@j>M=9-F;CKOh{a$u585HY3K~W_+yS4 zIuQdv@xNLdJIDV*E41*#PuTM^$i{7OPgT6=K{1fA1IdJ%Tg1+qb>yILIKv_7x&bW0 zmI$x`1O)`r8{($PYS!?qYXw%Ytq4-r(n~v@vo;>nwt#kLCvye;3eDfaEW@c-HXK;$ zy$J;ISfp-2lKymAsHn()2T$8&Yyw ziVkzcrhKLPs65d{Y;HhNO0fuwD(0e)Fzw)WI5n4@+klb@0t`DkkNK*OpEK zxxClU2&Gtrk(kS7l^Hb7X_*={EJk;uSjjtzR^ojS1oe>&6;*B?#t_3I==6Q5u=#|KGlOPN(B6DS8}+p$b@y(plfrlB5nT zdAfgo{_*7OjaLYnGkx*f_iWiyl2W8D8@gW>kju8TH6h2FtUMbt{5?@I$nEC}%@?+K zWyLsOwn2RXZBpcY`zGk;ZP)?u1zAfo%ANdevk5p#cs0R}Pc9D6L-tv&QxQoiNziRl zjdZ*Bn{1@pyFt2=-y^p>89{@uSt3#fLUJjC z3CbCDhE2s)RsI@)%fDbUSNQ`((Dl+#z4HC-5;b4>zTo+%rJ_qlbuTyYL{Ifk97HM7 zdvmmU&&)gYIU_j(7MNF0Hm{}w6tP59*4ZC|!Y@TT_7vOz0s?-gB<1M6^1p<9%?m9) z{O0oo4pOxD90c)}S4V>0jY!b5Nzhvl33_)xf?k;fIt=c69q>gNV-nB{yJ6S!emP0O zF`1#s0Og>!yA5`_JKb#+Lup4l;DT!?d`2hYfHcG@rehQr{@NqV#?yg_70j7e#Sq@0 z46-Q=$S`1I6sXwXTibw*F$EL&JIU=hP12Q$@(wEzrto7O!*qlw-yah!^=Lw>A+ zxpA=4Bs)BL8+zWeXCH;lqeA=|Oh>xrc+$_59!rZCCl!1W(Nt5|j2!8no%F*JW z*E-lWX91XD)hTIAwk6KJ5llHx#b81Nm5S4@R0MJAUfSWxq}84mfcKmVQVvqlg)b{O z&2~cvts(rQv!O}{0=YnOc?&kY!3&p}q{Bfb&%avQekKSj_WNfdc0L$G3I<$yC%Ljt zO|mf@Aci9`p@fJ#CKED3DdHo44d;%kRY#1r!a8#nJK&5Oqg;7qiwI9eXeTjAuwf&~ zTt`aPpd@D(?PfG5pw)29p!`N9R$Ilz=o5naAXDWj`d zr1+FZD1|vDCZwr}2LP#CJ0^(o=JkT5XCqAKd>jijie5-Nd3UbaU6XT$qfHm#?Gi)n zBsm(QTrX31axAOi-)Bb^*Q^r@-Go2S?{Vc)fpqbiVCfNasTXW|M=qQ@En|+ zfrFFdH%AvoC&%aD-n(eayYfUs2Lea=KY36cXm5!-p_ovYw5x^bhu7phns zfdr6RhJ?RJs$co_M5`|KpnER|$bJ-@^im@)^oI z#X^6>920H%f1dC3%K1OKy}if$ANTRNf{+KZ>_d@2V>j%UQf^cdZmgJF0{{j`Ds_i? z7Z_Nj)E$n7P%QM37J{YXOt8Mqu|UOSQp$%KW>)GXwTg&z88f%P4?Q6F{472H6B1qB zu#L9)zq?z`|JCjGdXMw}KAv??Z)-O7UWPp{#v?>oAJ8$}d9l}zVHCaGefhErU+g{a zM%`Wyb@yHlhd=!Ayc@^EAO5zt+Z#r`zjb?i(GPJK{tdlAu(#JmFJt(_-ru^O@mB5w zf2X^%8}xcXcjuz}xBkw{{)?S(r}y&3^Ip(>+3$A!|80}`2G0`n-_q>ftc}Iq&^7qfCK4Pi*nirzx?I_u(2UOoU71R zDu~uE^0MzY5XiF(F@_H0Iu((El%bUlnWck#x#===vo7>L`0~wadetTuw&b)BLk0(s zB6*EeA(ejhLFEMV`O#`ao99T|5=nFElPt9HT;`c`?4XWBOhXUIzhpZb6$2kegdGIu z12!c2MAZ{#Z;=W()aSX$JTUebKXkj@j>^2IO)?bT%KS)JzNmO-LIWgMA&nL==pd;P z(H9^oNdvbmpwnm!AO(Xdoe#+8ZE?*qq%I>jHsr5R z-lhMH=EX(gTQZ{BB;jW?Zz}KJk}X$CgEQatjiGfl#?jYTlTKwr&hiHi$B+ulm=(MH*~DGvwO3?xo8Mjp|X_#=hv7;!uCQL((tJ!ZB@i!;TeRBtFTV0g8yt`CG(UdYW0q47%%+eqZtK@_>sKGS4LJYi?{}VP1(w>eN z(4PJSWj_!%R6j!_Oj4l!r&KNq@}{@~GPiPA8wiO0ZplH~t@K-3HOZF}P+w2aAV#x5 z*<}@6|G79{3a0=|Ego;dD zlBP_OWE9bUiFAgUH?(S&qcY)psIUP|%Z3_)r}%~-_d;RoOQSK0rwPipft1Ol&X(j? zC^z7XErkj{!BiM?*$68|tsswL6@dtf!GE8h9E%Pqa8|W)AIhY{R9cPk7VXyHlo6mb zs}yW90+g`{?TjMI`6v)$(-}os$O*hvZJReBIjdw1wIPls{0x7e!;N4Y>!-Cfi3~An%hA#?(7Fb_+lCg@!f;ShTkN0e_ljUGsC>h` zSf-9NA-3&KO$3mq6zm)Qj%PN0`;4cL19hqs&}VY2bWRzXsEUnk>7MD; zR2$Svp8{H_nI&Zm9QqU_c!p9L_Ba-;WAQ7?$pBFfGe^VX;P1vOm-il!UeQjZTMjZ3 z2c`k*y>2KljRdlh&W2UlG;0t$<*&@Hdzh*$tky>zdL;ybt!ed;zhk$64P4z$FM@q5&xPun)Mf zSVq_^=Z2|j*~R@@!!M=kt1*mQxei_{%d~@7f@#`;EXg+QfR<#O3LwvYvo!1M-W}_l zD{(5zOu9sI-H0fYi=w!1bC<&Um2gT?9*m|qMxBUEvMED>Nx<0Q^*|YYHPh}NUZSS8Vz8UnQS0NS!6lE6&j-g#fapwj^x8nW;LK9?S!SA4Kbol zLK*Q%WTuvLg@XTl1$trchriZAgLTKWx(p~WNfBR@uh6_NBQ#|Y=d=#ynDFKCLdSn2 zL%`n%D_>)9IumAr%76&d5(&aOuq-KN&Vf{{=~@?W&w<1Fp8Dbl7FwSb*=}q#YX<-u zz#VFb_I)6o2CKzbLIW5HxWd)j1ES~Vo&p5ocVF(hf%1zA6B5Bhd)_0BI_NQa`{4!<$iH3GPA#1D~#DXH|bVrAHBh*v;h^` z%*&>8aaezve#Hmra!Z`hE9j|nyS@fzlPt!$I-E;g*{K{GHp%!ZR0UwxRY!-{*z58Z za35V=+)JS>euL#E=612%J98&j*FS@6wTGT9{cKe3_dFXp!cg)lB8l8tJ&B`KT?yZk z9A%`#|B&zaUkr{^Ihc<)&gvI`{2;&+E<-@RMdl;wtB=2_|BIYneN!VS`f(~GkLS;K z)yJ93H>QHb+xmJyNMfO2vk^zP!>70PU5}+Y6V=^*7DK?#rNzg(ap1e8rSn;CG+eOm zh|mO~Z0?Q(OfsAz^-lSV^uaGrMcJp@;OSoX>2ID_2ixt>VLCINIG>6eOR3C4>C6PT z6&uO~3bRzrWO9axEUS85w>t(lKk{8ipRW`&dA!mdOz;XRlkg%WzPd%7z-&v?<}jVP z1ld12d;QOg!%rU$&(4odjx~D}PJ()D%{9385iAB>LelpvD4ki~gd<<25j8V8Hk^b~ z>-n5#H=y?7!YWKm4S9dip9Yfr)%rD);{U@T?Ce z^B^7sTu|~fJR=pOboNP5zl`WALrsNQtw;n^H{im7S~er;Tq0l}bi?P}@VO^GZWsyh zC}k+;lzOAC;AJ#;$B0}F6W{zv#u${@te^-~RLC{y#sxJNoHt|KjN6 z*dCglzlFUQVYk~8^$$*te?0nWMG(6$Gzh~8f&;xfwj61)8(FW_NZDpYbW7jb>}Ocb z-T{I+$}h+jO3y8s(7E1`Wdgzfmo_RXzbp?OVX zBGUAtw(Ne2&YNH)6|p}@6T;9N{#|b1FS^|qk9L9PS;GFW@SFc6V@c7FWviG1w%Gsf z_PRSI`@fy%y+`}MdwITm={)lmB{~efXC3ACE(5s(U+;f1W_&~uzX$++Ad*_+Ad=f76M=jG)$#*c;Ap5IfrMw0M6#~N(|Nff za#@a3HU$1(Xz&;6mte_8muIi~KOLsCMpGOWlph_Wazqt-$WmgXUNEXEAYjnY6`RWP zZ|$}BRampY2m$}EKJY*Jt4|?e&#y#@W(?(biK6yb6j-}~L`oeBWs}wK)DePALCMXs zi-kQ3{|2)xbd_tyo#4xtnkrU&7pu!vC^C&)91LVc6vH*jrn#16=dP63Otf+@gIW}- z0btx!G_1#52P<;%wx^SW^c#s=JW!&P#M(hyn-+&oMEe@1EF}E$Jab!q=pF3wxy`eh z{HN@*R}=r*hGIv6luhy6^L(SPq`x$%u;rIE~R~5Q1*;B`1X0 zpL#l45&wonEm1~G4ARjg)RvdZ!9arRJkwEpWjqx1aV!KTmP0IJqtXP@@iyN)C}O~@ z$D*}YU{mOA^11xISuA87A8guNWXBgpwzj~gG>lfi0=aH&uyFcRp#glL*4A|qQWHxY_s6v13LBWxA8<005Ye}GLk&(O(Gkb6s{48`fl ziZ@kshD!>vgDgwr@H~;BVD(-Y*iw@jEe6GiLtOmvHkyHmeGz0 z`uL_$Hm)o1qge9F@^4~J2VX(TcaxNX=e#aIY4ds$oSq>Vm+S$xfxi<1((wrp&1>mg zA~1n08o#wLYQU*_aw%}zD?%-nPUdx5WveV;S)^ywc}pGTrU#h?-~zgYjIE`SuNE_1zR4n!=jt={Ug^!`*6RrDvQQCApNVp$~j(t*E&2ef#DYK~C*B(Iw)Fn@D5%X*H+&_}}{<_CH;m zoV@*Xaw@`yl>+F@d?9WKfUd8MaCD9dP+c1uEMCq$; zDE{kPeUPY>E$itXL{+~lq?f>H0s7|``xobLKK=N1|HH}Ich!k{ z%yd`O*N5eoIwVR6o}QdNJc14q8o`Uhcc&+3`)?nZhV^J@BtM><{rvW1|BaZEuMhXn z4$nSaocw&a#M--L76YO5mD>UEEqfdv__a1iKKN=blr80~>83IgEMGM(%xka;4k8?X zfr8&iA!i5MFlK;@Pp;-t4W+ZXgKORPYBi$zAZ$-*5o-lh#S2kzSWF>%Mkw--ypT(^acTJguiv+ju1Q6(0@yYZ z%P%wg`ucVR(U#LglFNAB5t(FACWhI>rNGow#0QW@uFBv}`ACr*5D~nVvgvTRwNTx{ zn=2t%cR=99+E1-bE!9T>uwYbN(e*QCEc*#DmtB=#%^1OijXS!oTSV9h^4iwxTBl@7 z&~A@6;P61nlerO)>o@LzC_6qk!YDb8J3y*F(T!j#9^Ve2s>^jFpo$OrN@}wPKYy!2 z)x-QjIAV#20!y;Q!dL>!^2Fk30?RW+TO5GpxuPvJLCZR!yma(Wz2KHcspPt&oQ4gI zoG=oRqz^6*PH%ji7X_NzT;e#s6iRLLLVKS(Q$hQi*R9S)m124Bbyu5?jgfS$Dzp-; zrix1=oE1=Wy|GFN!!#E6>`Uk`w&aC;LatE`HjTLGSG33~K_HuFXlo1jqlo%jbqwOf zx(Xzk){r~iV0GcKtgV~Oq;p?_+r`(NiIP7baC0cGQe#85VlGj|_HC$8C z8|hSS{FiICp~iBpFEgt$u}?J2CkyyYJB2>*lv!%R$SGoP;&tIdD{O78sF&9s!%m^*X}YY=y>)gjZn3U>Tf+}++3@%* z^Q>h5qfmkH)MI{GjL8=bv3caij@Uu|jY( zb6Qm-HJd{Y^4mA9B~saJ!MAVV%NLYT^zEDPfBAya*wnU``_-1<73aT<>9pSY-|M}s z&i|dA$N7IBPs5~@X>{uB{wfz0b(i&Y7AZ~?!G4OlAo&NDO^Yfs*Oo!56W!tW+Z!0l zDQ+Frow#SB5li6^D3wr6`OG=dGnkJMJ1y&v>JIsi`oc9?T-j3YIj~lR<*elH!$QtM z>rq7fUY;e^|8RsE9;GBlH*BL#{_AzC`JeV4^FQ6ov!N2LN=FxRo$}E~F@UVd&5b82 z>*J-!oDic745m1VFGEkV&ErJ=(>_bg|FgsWH}4L^Nqo~bTIT=D-t&_D*L%6U_bC6} z%d=6NCDHr0UyM}P4fkG#y_ZD_UpyIwbS#18~av1%NWgCS}013R3~llJ#V$FlrqY!$Ym>n zEqmTqa8~%qeFZ8af^l#6z6RFw)%hR)%lo=SQau=k`4<|>yH{{u!GMs27ZDMD zN~OxTYhM9Q1-uvC?h8}44VJO#Xuzndvlqt3U%}-szqy5^`9ss!iuH6;K_zf6LZ>8~ zFDhEPUukNz(DT-mP%^)h*bRKu&aq#?rSDhDR`R>GR47F%SfYti4Z-1URon{=r!b+k zQhuqix63Xbkmj>fOO1ue#ajB@mY8g{>L#g}Q%fY7s;_FLc3PsLa)PJTtB5Q`OH^}H zi4}{3h@x6op-AH8Krd&@s&B2F!fOcxt^8w6OP5o;Aw%0zO*LnCTdn#6?&$68R%$Oj z)oZ-CoC=MZD+@>!9}fqBo!_WjC$~54>d4ng(H4lBAlwaey&C5HQLcdrN*Ct!6A1+rQOT zu>8ntzn7AXG!ng%K%}9hz7J~rT-BVn6wMp~_=j%yWu*v{BEQ9+Ce=p4qqcu!?Sf!g z-q+*ws2=)$pC$A^>XSS~c4RP^m2Lpr?*FVNLzDc!t9kfD*t6Lgdg zb4Xb}jo36t?&bcD2Q9sd&h%fX3;JLmyv2hY=5ruaB!X##Rlz7H(~Pe+N+*$!5sttB zv1^1XZsiiabPxdvftQnX&2b`mloRDTO5Fuw}3bmU#3ITvzi-wRa7ya32xxn5vG zV|W1=PE(QY#tU>`y$QsHKeRT2d#yeKFwK)C`sK-Ls%?{KDp;asQRe#k+EE}W+lNGs zq&F)K_(QYqC1A|A$`T45-{eLhB~;Qxw1T(iF(F>kr-Q$45Ua&wnc# zsM7S~wuqoD^M7yeMS1@7zaHoReLN!Ihfo zdmP6wk8d@O9KhXJ!(27G^_v0N~Ew-`7xW_+^yz?ZY-PDW4; zo)bk#sGU@swyolFt43%66hUqssFGh+fhub_P!+uw&|a*78HqLhJ3>p#@ap4{k+`%T zMr4wa6s63Jg}5GkSH!OLUAs){iyIzn$#Jq!Fad)N5_TpC-v?pw!IZ5aVO0@*+5%NX zZ@x4aROgf0i73LUbvO4E(H{+I>ZwqGF+9uci2qLnjHOL{>PPslY#G2u4Qpozx zf44dRM^FVBYS92JKL7W6J1@%lKlXZ$_P_V@+~EAr#z^@#*{Rgj?LgynbeM&&IO_hW zHpiJX@@a5nQWiiK47=chQi1J(q>_s1-$k-B8_%DM+9n&9ZlDpeJ#VelWw&o(sj~?m z9hhY~$#N{x;F*g%asQT)IL0)eihH`jG#;V441aZFmI))Nuz=@`97U5E$`8mSgE<2J zfAqqgUeNWcdwnw>gr$Thz?V&SX1xJou;Fl>Fpf4g<&@j0 z&`M#B(@|%(BZ{;Tw^E^rtgV%o9}X&_Qu1E#aS`dUh3%)#nT;vf4R`+1-ddk|AqlKy6wn+V%qY?Tn6uWl%PZ_YO5eM+?n@K+}Amemo;%i+Y zX&|f1;uQSHZn(>LpJ~E41^@ydrwrvo7$HHCA(^JJ4^W;H&dJX%2pAxcqY0Uz7+jB$ zoEQ;gFd?I-6ijf6C)2cUG@d3_vCe=*L1Iz8IY0aivT?|W@kH%*ec(%X zEAxlUP~s0UN@7t(77e;xD+_Z4!`@wC*joX^p24sI7BK10f{L1-D$bz+Ppg>N-7;5g zH6v0b!Ipce&1Hf!Z8vOue>0dvX?+!da%&&}YAXnIaEv$vZ#e>FXq8r8YLp8OV!z`u zhsXwwg|)I|JMRL;jNCo>!)FelR-MAKYQp_sp=NiMUq%f|iYMqepW(s}9snu79kOc;`j1Dc@} zz#&69$dL*>CHlS%ND>1(0Kf#!IRm5!#ZoY1V>H)quTaKiMv!qKg)-h789^FE3B(h+ z7PNny<|0js6(0sfFy-x&fpFy!@w2pBO-v#;Fv|#~D2GXBOs)e)IxHvCL4xR*5EhJ4 zGLc5|0j6|{XlJA7d?48`xE|v~$1la{NR?M3LvPTX;qc6P(}Pu>>>W=gH0f% z4e|4g5N73oR`L%UBbBMum$&y?q-ffW-4=|TrW8wa5iz6x3WTQ3P=B%u>sTJO#Z90O zQ-Q%zsT6->9cgWSPQ4+6oeKI)W2BA0s$F>1P@~c6!1@~xOTcVpk4TTu`3vm}(>JGB znJ%K+&1xe7NrPEXaT%4KVy-tNx9S-jmk1C?qFpJnbv#Glmb1OD5;qPm19Cv zKJvgx=HRsO3cxJm4d)-;#s^2UD4Jmf=C7qJ_gGu?>Xx zPmlEN6SY;p)jdkFm1@PTCMs%`(uAt7>X-UPlDhA9Z4qi#*X|spECk|JDl&$V9Hi690Oea8B;Vk5_$_e6z%@=1FhGFiFr|E6 z#Uhe09t!tk2Ig=g67Zl@XyA;x6Y8j4BfGC1a3WZk~^U$xwX*V&-eUWk)iB$u;+*I6rVRZBIS7Rd&zk(b+m%?ic$B8{g# z*yVGO`ex@zsQ^@|WbK0>pK3=G_;M)yN*e&wz_UNv23nj{8X!)Y3vH|THcSX)d(X?? zb#sDMs}0IPa@C!3@u}`qniQ~{ivh|qfUg5wWEAnH#eD|nXLZAj;w2UaeH(qMp!jkR zZ)4eNHH*{fitIe(Gc~pY7B3-N17aJh0 zPTo7Gt|4xOau!Tr3P<8bLS1Ot(HHsZdGYofP&`Ue?C}bCh$Ai;iCh|dJH_%qrwC(L z_s-C;2IgONDRZ3`AQ(i7DaWI&>HI&h9y+%(te={O9(a9KJVh%pUxt; zL>p}#r}^8GcU4k7uAhJQ=QiuVWS`dMzg7RUSIPhTeDBfz?|z;Y*8juL8DF8eM4KuF zi7+%40ihe0DSM3xiXzGtTGSP*i55S3Nh?7N%cp4s_IAaecyc}+4)JH;2UVF~BB`<& z%ZR}OO^&m+dWKY*nh)j$>T(Zj>wwx&s+XR@U%2dScSQbek~oQA@-RZc|EmxDPyWq2 z1r6bb(sc-hE!N|J><5#(%z-X9fA+ zT>r{(SKH=-eN*#?vsJqJx#)to1S$ZB&Wn!mJvqsw zSE#%r<=9BM1KC%=+KN!Tw=yAs5uTw`A1kI5uEjU+`O5Zi#fQNTy%}vSmTl%7EBj zJOw3X9s$vRk|uM$yIdnMhBMxc8OmW&rYYqsyB!_puJ5y59<7Kl?aRJ%Yi;(>8Ui_> zUzPV4CF)e`t$11tluLA(?~DCiSW;DPo{PIRSwFR9ERAzmzj0TEzs90Aq6GzX_v=N0 z^15?{=1VO*B8cQIRvj6H@(Kw%X8&<%xu2!w3eD?X0*@`76ECD!3{kaxf{W2KT*?9T zU&$cv&cv;mH*Toe%FJ-6J~q3v5ctYtG5+9& zg)RHg_G!K!&3$FvK}!()SlJlq;h^H9unsOrk2s1O&pys8}yK&hm@u=}7Tr z404#pWMT*>!N}nR0eDSFf?(=``Zz|yYm*UvbOdxh84!6tw*=@ygHa>sl*U6Ua>UXs z{AVe|agoAK3O8E+M5hC#KX3C<20_J1+2i9z@>sZ{s!%6FQKqxZDKBZ!kUN_>^Y-}m zASbZdhbmku7pTpnA%Hb3%-bTPr&4ATKpBxj2;!?e5;7gJK}3?(U1yyXF~6M|FY+pfDh!>~L_ z3gYnvvzV?_Bdy8f&eetZ3)@dILCutf_7Y%=4xFT8s47g+cDdh3%~3;CRj{_xyCFCe zQzMyMv!z5X)#H7TqH8^qsuWejr=~s4P$YFbstZr$ho{ckArUGX=6x&BYu)~<+m6{7 zpBT*guYm9C&GU(#o2A#qQcw=QZ$9Xv8n9Z$tn$4s2vzq@VZ{TQvwoH$N_iihGMvzG zB(kgjn3D-#)$J5K)CXZ{>9;np;<(b(><1mkzOi9Zf;auMC18tfy0#AsTbIN01~Mp4 zTL~do(+v1CzI|(1{YkAdRw@$J_-=(U2VwaaI={G0STmts*|Vt0>*t9!yF9g~XE}CCJ;!NLQj<@IO%Y`D zH5$H!Q4N#Y9%yA$L;!>vMSrRGDyWXlhnmnKG9*hqBGxHoT_IqaajBipuD4dGB(c)q zpR?TbWHTYxCE&20!Izc&(KyM3dPP439>Z^*Q^2u+Sx1v0aFs`h@ zO%>1xeLj;H_4`Tk7Biup@_+sHqeTng{~sTG%UeqZuYsT9p={Eq2mnPK~l; z+gb6!4r(h3?rp+~?rq?1legO;Kv7?UnPtyy(4ry#KqG zXZ83mc8r2^$pJw4{M4@BibWz`pm01f;km@6c#SUJDzI!Ym{L>4@lJgZI0~h&1w3>< z2Gz(dWo@ns3Q(zL=k0P^e6_gJ!YdN7R#$7OPn+luaSh}Y*(#}(^&W1Qkxq}l`oH>i zoCRC1Xsas)nR?6`d-J%Ne1Fev*8d{z!{QyFW&Q8&bu0ECFJ5#X*Z=!?R$Bkl80AKr zD3!HFHLLkzks)PGpb+3j3aQx&q*7v8yU1!2r4_t#e>W=>B*n_dvP6HegUZxp53{Rm zhBKo=`6rwtTlKZSqqrisng3EFczgekZnqr&`T5@7qyNXfJS)t9>CBH)882UW-ZBD4 z{5-Eu*XmBMc?FOxqpm4Oh^cwM_*k!l9;>&aPM}{dxh^y`Y);rSm}{G#dYnaj7vwOV zeSo>n)QLW4BxfpGc2Y+czJ41p`RY-g6L$Aa`XY&Fd*nVt~>an893LpGor)DDCcB zN3KK#Ic$0;CiB2t1hr2RF+_&^`QI@5fhrryQ;%h4WTAHfE4{$sVcOM zK{+;7xea@hXoOaT!)hwA38ca@1Y0!%vG`f&E*qgV*k!O{>mBA~qBl!9f~_OB@Z!dp zO2}U;&8Z6DLTkl)qpq>65e)sp?ncc$b>-w+mBk*zP6oe=oXVx^1yf9orfI2SuVcXp zYA$LrX?CBZ8Aj3)AEgZE${d0W!PCFcr%F!=a0+xX;wOu5WQq{rQv_atO?{D6Ameg~ z_2HGSR;P|L3fUPSzvAvuRuK@v0^O{2}nsAsM5=@ zT=OMm$!_Ng&3i5%3TvHJInimaZ0)7GFD~HCw;at-PSMZ&W&agWKUFE0%j}}%LB83A zX;^#lwB=k`TI^6V6$`6(XA3p>YSMx4L-KrlzK7>F^8Yo=Q=E=kj{vRu-)=?!yZhoX z|M$H-E6D#JOE5aI_%&_ZcB<(Q01{&DNR1GzObS zGvRBaV;@)ny|+|M(Q@?euktSVN1VpM5At7sjsN=OD;>j~7khnQh8z93e|CIy{8JyC z6}<;BVklxL2Af1#AhI5iiw+UgK-JF3!(FWyIC!r7qd?HRupjrudD}hzgvve1aTgd;A z=N9X~W$V)U6hTU18t1TPGiX`=UvztW?)tym?LPYd-Osba`mZd35IE3dT|~w!QU<|X zrYWqX_*%wRs^B66ut_25Y1K zpn<|xwyUko>MYYkW0+pFq@Cs&bj{j?SV3|r zI6Nu){fG#(Wgjwe$GW9IDuT$Ml&+^x#j=lt=_(| zxPWP214N92tdcKJ!>uu)v~3b=O%fMGV3>Z!35NOHauAR@Z4s3LkH$=^+(=&X_*=NR zwN4csIb^|d^#IF8E832NEi6#9IHqh0T)>obtL$T^_1z^)ghe2i2DGk$S2MTh%4%b; zSGW2>Uw$w&oFzuVRuwjni0;?|+B-T&zVbDgde>>ZZ%cP=5iiGkC7Rn?ftDbQtf0aI zfA_P`?nKL&muFesaJpX}%{(8UwVnSaFvl<+)T#no&VMiWcFOS|Up{~Fc>cSW=O*XB zcYLhhyk7h1PxH`sbN166Z9Mr2@8{c{`g9w2bLOid=}IR)U0;ENQ#QWwp|1q1{>TUO zXp9+(*fg)bR4XH76)!`YvT^g#u>^;2w7f#YvGI%$)^K#ptxvwwY7HE|{c1B43&vEv zZmr*bd|h1s3}p$91dB9vr&^*4^*cQhmq)4bSnL#RJ{l_?3HT7N`E=}H;Pyr!X*0@A z9C0fQS9d~o4I}LgYYq-uRRi~RDk>3 z3a1ImEfqK#?02rdv6s_T=9nYY-J$a44yT*bh1<+Cdq-MjVl~uTvto|V-xWr-5VQZ3 zqgtTfGNSe>SvO+#`-fG-txf+!(h<3l{-@V{zPnq||Ga$k|G1auM*1H<)^A?_dyYnb zU%wJaG1B*=1hRYEtO=56-%=N3H+4q}p(=S-QwXX0Yf%Wfuo@IXi`6(Thz2!It5T`d zsb;0p_ofhf0~s7ZTCN|f*Y~ARI!D^iqpC`h-&!HS;3xUw`tYDX;;Q^&MI}egv;IQfV+WHrA(m6T;VEEyup z>)uo+Rv7o2>fRcl+*bFdz<%etx1}{SO%n87YG~Gc&S~sJo0`U&P&ZK1+^I@*(UIiO zJ2bb~i|Qe}d%fsGt7h)yS)2Y(I61Z}hbdQr*$`*LUJ(f{*ao*U`^=I8&vx9eB@ zIhiCLUhOA3d8d|NqJ=wB^OcFYnvze{UW;Z*syCK>yr2CeekZNBgGw zrCJ!b)h-F3-??sSX(dLp=ysPXjJug$x7J+9dG#l^=c*T@|8%3dyo%7QhTpdx*G->w z>3=dp*(gV~N}v||uijo+|FhfOdG!CgpXVm}pHn&3ccBEb*yy{_1Qj?ntAmO%x6=t( zZQYGxsGh(pX@@Kjw+sVQ1F2R;WKNf+ynXy?hssxb{gxJrj+Qp8v(f_VqWacq6)T~; z**u^&rCO|(vdzc*YVqcCZOz{S&C z3z>7N5x86R!s4ENPl|?{iO(^LaEwfjJH!#=JEBS!r0`s{=T(_)N>QjY962$$uh2Xo z!$5yqw68TL%@>iyRo;J%t<1oSQ-!tO!b*#H2d+3>I>a>ORH`jywPUfT&Xcp)zE>$AhJN zbSJAvQS`mJ5N%&UgsfbhnhW?A*mEqah>UJdr@Bhjl4&DrS9YQL7Vlssv4z!}EhVnF z`zPk&+WxF>b+ZY*;!0PB+5&3L>z&KZu7&Uau1_F zUYGtiM=@?n1kqyux3}BvmhJy~kNF?(=kac$06yb`eK+pEl8?R{-LF8WS?w!6-%jHz zTeur#Z-to4sbyugSEJCd!roiIfvC$Nxg{2b9wW6`cdjsuIp*9be`` zYSv*hE@9?#uvr+tiIhmCe)x4p6kDyesuj>5wO!My!6tQkqg=g=9avdeTyF(dH4=<5 zwUv)6k; zyWO(=*Y4i#@LcSiG4uQVYkZ{m(8-sXOjMkSANr3 z-xxC}5h>_)m6+VnT5r9r^-OEahyh(2eIJl_S3H4A za(>}#Z|_rMU;J{4g4QWHnFn^+LK?RIe4I4*J84QsjS6%SxZTr5MFL!_f0iPd_b?MD zkYTvWq;%&_S!a3EMD4|lYjUoXBDL|mPbC@qwVzF$_{z%({1hgva8`V-w!6V*he3v!swKET{Il59YuIKzO8 z;rGEH7fYGtq`1~$sCYW z)Z{3E4CNrfDGI&t&H1NuzR7tT;6N}U_;7FzVw_Vi9AVZG|4Q_|aPY6ZBmUJd#-k4Z zNB^X=v{L{Y!02k4iL(#&o`v)}^PYtRc;!6{*(CFx{lDG@_yBWErW72#Iiy~g<>Yr1 zF)ze1f*n~dC%=2)j7B6zoj;LQV&(aNcDVoM-C;P1mv3Y7{NL-o?7b|_|DE3R$M`?@ z@@#H2RWBo4)~~h-ah!{A1Il)uYcPdGnUbQr^7dckd8YsiD-wB3`ew+ z$fBPV-)!(QTSEUm%E>h2ON!(rkdP6MzyPsp#1|Zeh^!ZS-o^&Fc>DJ^XP$R?dC4Vf zFGd+kW0Xc1De0Z>t$hVg?DI;M+6TSxbNE?X-4Kcy$>)8b5m$|DYS$IQqaeJO|T^%c-W6zzb&hgKl@$^R93j_W?h_Pj70K4H%*!`=l!_S3?!{AgzU`UdLT=RZ2 zI7pDVa+S9VntE^saU#B{!;<2DMOI-l5|Ipv!&HoiLnH)UiXwSv;mvM<{oxR&m|>3S zSB@3m`EZOnpglO_F~+Iq{Wlf@)Qr z|9bz-=l}j+f9nz~L}d)~*g=KAxNlT45^JJVsFIObW76S&rwrF&W>AU9BqJ$GnL((~ zt6aLQ(uj&AN`)$Shl-d`2QY&JoGdw|Y9`B#=GgL2-E3^1aJQdI>uA6p?Z~2Y$d_-m z4PKVJt45!%kPPPh+;1(%`bKtB?lDn<`5LKRcJL7B8+xk+fT=jQQ^dAH&L`oe+zNnV z4A6*Yl#}##G6;)Z`?3yCm}NQ1axAo&wK!*8YEZ1^X&Eh0mu<0(>y|}pu6HcitEu_ z8qb5XH#Z>Ws(5B3!O^@9)n)PII~j_mIc9SO>@M(35##6Y(<-{l;;A64hU3b3!VI6I ze1;=*({*Y8^hiUv!*L&H@Rt1f50c}5k(9v%oRS#qPZ^;ROxnbURo73YPvfT%7g>!b zm8LLQ-kyjvlsLM~ioI|*-2Llnv~0#xh){=lPV$w6r#qLL*7dA>7FrJK3i8{X3vTOr z?gmkNDj>mU;WQiNFh+&9g1o`wYu^zA*EmT4O6gSiWYoHxjPMMlQgwZe#2X2cOO#M* zAwqC81ee8~p=9w(ElSF}IILP@$XO(gTWvdVU z!Ls=~56w9S$GQYqZ{u{jruF_HhPl_dGTf+Xtm$+Y{n?dQ3M%^`+S1}ZWB35 zW0ap34FQ}|hG4u^>bjXMjlJ(}H-FpNDrn;d2Dz;3cm=DQcV7orDV)WqQMJgwzW#8Xwv$kh7)yzX|?tdDAqIjGMsSefy7+s+>zN{Gn@RKrk0#Hv(#qvPa z0x0DZQ{L6^ZJ)?#ynlLRB<0nHUC&x74=dUbjS%0wJ0-&4Yyfj#EyldbUo>iZS>$b} zgy9Ie*Bw#=7GlyFBxKat>GuBC>Avjre(1mq2Ucww;56t3y}gdLtj|*hKbvcX2vJZ+ zRDHfUg=~B=&(NjS!P6Y4jA~C3b->6}L2U+RuKZEFhPhO8G^6`H`CvG*&vo_&03W4*gp z+hs)}sG=ROVpn5jT}S8wKvr0Z28-1`3IkyjCC7*_7xFK_h!C7f3NEGIKBO6nLW&X; zF_OEr_?hC8&LX$WryWVyu`^2x?OyIUqjk+8L;@=EL z$hmLWPZDyiTr8zstSP6$N)p-W7%gCw)o5U&V$qOvcg|HHd>UbgbJ^brpj?L)Z)kYuk-0p_%r*Hx%t!9g$QNXp;Q02%?%BZs%RWF zYO!^2Uxj>EXl^cY4EdD1#T8oNg6>x2Gtq>_@%15Tw5W#``HCw5Db!!qkk5DtksRcR zbo6(3-}32 zM{MkaUKjY35$oktr))lgzEW59djq?0LjPF(*_lXgum(De! zj+p>KmZO<4X*XVEnzWjHvVI6!$yaZQ^=EqYKFmlCM`(REm=Ck*uFrDwVRk)-ndOj# zQ39#0p11Y$YS@5KtrXmvaWRcDlt!q2p|lFrT&bKEUw_-&u*x=Es|XId$YfaBb;)wy zvDCIEaqBx4tZY7HSz?0fr7_ASEAqdnagi3ztb8$qI4y2}oO|JE11n0GKzA1~e!j-P z7|=19CNYpG$Ur^1nQe2Z80P4YDN0!~*OepZ&~f?XlJA=QG@`inJ;UwVqPx8>72sIJ)Q3g@x)+T2RX*GKRp)ywD=J=-#QfqLDzqbgx*;-6(mBOA(b7Yr!xl z6Qdlu1Z40#ikKP@%&3e%57~I7Zd^G5OysXsgs<9e{EX(j6K^rKT?Qx^;+!(83mjwN zxC50FeyqAma#dEH2ZgXK#P9^9Bn@sps@-f`UH$TN zy$KoNp68EJ5J4(*ZS%sqaoch|l*Wjo!X{!&uJyKQZKWYN=ZBdOc4(>JHaB#*717Tv z&@z5*oTJOS@zX_`gM)!126DBxKtRWk3$W6*QsfjCCYL6V&MM=#p6FVa%aQ84eA>pZ z6k>_0t54x5Y_n67g{>H&cO1%_*QNOGHy_rjbf)kOidnZH)ahk0cZ?;4ovraM}X+Q!d`Bt?x*dByP)nUvQx zdbQ&xqC!3J=y4prqp_0a(-6kEoxltbZ$bI;0{ zajWsGj+=~s{;)%4MPI(3Ik&{PMUYaM#yNDxZq;!+&`{R2ZdS+7;Q7E~Xz;kNactZ3 zNID|7msvQJH?P+)^T47(RLDN`)+e#J-_1{`Vm`t=#p$SB53_{Mus*SR#XXdk|a1CUBD6F`4zDM9FQqfVRcjqz~D$M^2VR%a&`Y6Z({?TXDGrj0a#Fw zMq@OA)bb?bpo;KCx$JPDdU9aWPzd?FgfbTj5EiUlOJuA;Jg90|0%7 zlPp1f5Q|zNCZ14m+$uouK= zfMFW+xv`EUNu(=w8&E;);T%8-{?t@7Srddp`{{mi4d?VJz{3I$PP3=NNr*k& zmiZ4TVxsub@R+dE98r|ArxG7!C{`c@^Bm4S05C%`p6y~xbvV{!4yZ;tl|TR)7U*jy zt<555wByeddR~kMQ;XaKnOvem8rc`^y)2e1vAQMrN*EAw?na+k4gpSwB%er62^kxV z+Jhw1PH^7dPo0NHhgkqW`J z0j&GtVrHq7BCT}Nc{pTwVBI!{HW4@-Jx|?)Rm2RI}M#77=O$$LnmSYDE?P#W9Rr^XoVJj_z8Pn2HCg`?x~6wJtzh;b|9Hh zbBownvyL3}4QDtcT{nP5*b)IYfS`atdPCeaS}0N>U!nOsm}NK>%Z39>y*Hr%B}^p+T%ozL^Q|$)<{xp|goMOjUcN0Pwv5VWP~8AF zvKs&xsgf7cNt%8}b3;l_OVMGD*p#nSAC)J%h|LWsN+}j$QN>&o5~dy84yWd_a~n`H zL4e^2q8z|AOvR)e@!HZ!AeZ<08KD%5FcNdwtTKbfIW1FzhQ;V^6f1d0(Mr4zf}lQ< zp`yyo!x#ePN+EYBm}SdXl|y)v!9S+RghMPwYl{WkdJN0&>}wwkG6w zla*&)vjaQPQZ<|==H2)bSxs#m_hU83eI-xoap zv{ZD-sP5$kp6IFmiGwIbdT)+a@0odrK4&CnzykB?$>!B`fFhQN$~yZ)Q23>2$DV>4 zKtRCnl%yQJSN@lfuX&-xhu?g@z(I=ko`WFX^6E&?yAcU`HVJy`AwlmBNYE>jK!?G7 zuLHg)V@v{iVK?l0-Y+L9I3_bR8K4~WcDKP!cc;6pVkqrs2V8Ish0o|j9FT@M#dM6~ z!e4uY*?2k-v4T1Csu;o>ltDJ70T~8ti~$2{vpbnd?ZY8kFR$BQ=%EN+UhX6+-xrNJh|6s@1&N7VxC`ZTggf zAz!#)ItQ52DWc0aDP?puixi*I2&FK`#Dp|8@c!0*ViHaH$wrLY;<+>1`83=8G{GY| z#GMWEXE3EGh#*CDOU)AXDILkd(|uqB%yv1myr*b5O+bRvD=K+Gx6E5~;=QveBRPf% z?c|7(WQGEc+>ZEnH^>NOL4k-I=Z*z$nV!@X7hyhR2^8=?i1vcnPQZxzbGIXQv$r@x zDL+XbkZdj!%Km#qviaZn?zN+5i|46wF_@;YN{70i!Dx&$gl(W>8t#N$u*nPf>XX0q zcaQVS1kMHPO@+-7rgBE3&k@SRjE~49ORzjP>&-%e2)%zQ0A#?RnB*Kwy}PMW05T~h zaC-DRo$KrC5DF|ql8-uxEJZtSj}8ux&kutgzHPrx6GUmTK@R3}Z;WIxc6bf=>M_cZ zT-9+3u5-*pwh>B(>>B3Ci!o(69!!}-AdMBKz%IZS;}rP&=iunv2e0?fkIuKfk4G2( zIC*~oKJK5L?H^wp9iD@eGjMQn{O0K5=;Zhuocsv(kN*jNK01E04G@-!yw914CqZ(6 zCt^Dfy>k^DMmKJ>_d*qmBapy!G=(DsMr4NMB|(Pr38r#`glX(0c!G6&ib{9FKT+b5 Z$LH~Rd>;Jy{{jF2|Nn%R=hgs*Bmf3G)nEVs diff --git a/airbyte-v1-notused/.helmignore b/airbyte-v1-notused/.helmignore deleted file mode 100644 index 2b1b66e6..00000000 --- a/airbyte-v1-notused/.helmignore +++ /dev/null @@ -1,26 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ - -ci.sh -.cache/ diff --git a/airbyte-v1-notused/Chart.lock b/airbyte-v1-notused/Chart.lock deleted file mode 100644 index 1eb0e17d..00000000 --- a/airbyte-v1-notused/Chart.lock +++ /dev/null @@ -1,51 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -- name: airbyte-bootloader - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: temporal - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: temporal-ui - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: webapp - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: workload-api-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: workload-launcher - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: pod-sweeper - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: metrics - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: cron - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: connector-builder-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: connector-rollout-worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: keycloak - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: keycloak-setup - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 -generated: "2024-11-07T16:46:04.022416291Z" diff --git a/airbyte-v1-notused/Chart.yaml b/airbyte-v1-notused/Chart.yaml deleted file mode 100644 index f5114848..00000000 --- a/airbyte-v1-notused/Chart.yaml +++ /dev/null @@ -1,72 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x -- condition: airbyte-bootloader.enabled - name: airbyte-bootloader - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: temporal.enabled - name: temporal - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: temporal-ui.enabled - name: temporal-ui - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: webapp.enabled - name: webapp - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: server.enabled - name: server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: worker.enabled - name: worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: workload-api-server.enabled - name: workload-api-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: workload-launcher.enabled - name: workload-launcher - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: pod-sweeper.enabled - name: pod-sweeper - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: metrics.enabled - name: metrics - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: cron.enabled - name: cron - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: connector-builder-server.enabled - name: connector-builder-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: connector-rollout-worker.enabled - name: connector-rollout-worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: keycloak.enabled - name: keycloak - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: keycloak-setup.enabled - name: keycloak-setup - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -description: Helm chart to deploy airbyte -name: airbyte-v1 -type: application -version: "v1.0.2" diff --git a/airbyte-v1-notused/charts/airbyte-bootloader-1.2.0.tgz b/airbyte-v1-notused/charts/airbyte-bootloader-1.2.0.tgz deleted file mode 100644 index 23f9ec65aa21f301c8681a474d94a7d4b98c7d66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19006 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 J+Z+IZ0RY0N)YJd~ diff --git a/airbyte-v1-notused/charts/common/.helmignore b/airbyte-v1-notused/charts/common/.helmignore deleted file mode 100644 index 50af0317..00000000 --- a/airbyte-v1-notused/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/airbyte-v1-notused/charts/common/Chart.yaml b/airbyte-v1-notused/charts/common/Chart.yaml deleted file mode 100644 index 39edbb3c..00000000 --- a/airbyte-v1-notused/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.17.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: Bitnami - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -- https://www.bitnami.com/ -type: library -version: 1.17.1 diff --git a/airbyte-v1-notused/charts/common/README.md b/airbyte-v1-notused/charts/common/README.md deleted file mode 100644 index a2ecd604..00000000 --- a/airbyte-v1-notused/charts/common/README.md +++ /dev/null @@ -1,350 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 1.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | -| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | -| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | -| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | -| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|-----------------------------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Input | -|-----------------------------------|-----------------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | -| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ - -## License - -Copyright © 2022 Bitnami - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/airbyte-v1-notused/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/common/templates/_affinities.tpl deleted file mode 100644 index 2387be26..00000000 --- a/airbyte-v1-notused/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 9d9b7600..00000000 --- a/airbyte-v1-notused/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,154 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e3..00000000 --- a/airbyte-v1-notused/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc72..00000000 --- a/airbyte-v1-notused/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/common/templates/_ingress.tpl deleted file mode 100644 index 8caf73a6..00000000 --- a/airbyte-v1-notused/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,68 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7..00000000 --- a/airbyte-v1-notused/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/common/templates/_names.tpl deleted file mode 100644 index 1bdac8b7..00000000 --- a/airbyte-v1-notused/charts/common/templates/_names.tpl +++ /dev/null @@ -1,70 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- if .Values.namespaceOverride -}} -{{- .Values.namespaceOverride -}} -{{- else -}} -{{- .Release.Namespace -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/common/templates/_secrets.tpl deleted file mode 100644 index a53fb44f..00000000 --- a/airbyte-v1-notused/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,140 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key }} - {{- else }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844..00000000 --- a/airbyte-v1-notused/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db16685..00000000 --- a/airbyte-v1-notused/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/common/templates/_utils.tpl deleted file mode 100644 index 8c22b2a3..00000000 --- a/airbyte-v1-notused/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41..00000000 --- a/airbyte-v1-notused/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index ded1ae3b..00000000 --- a/airbyte-v1-notused/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index b6906ff7..00000000 --- a/airbyte-v1-notused/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index f820ec10..00000000 --- a/airbyte-v1-notused/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index 74472a06..00000000 --- a/airbyte-v1-notused/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 164ec0d0..00000000 --- a/airbyte-v1-notused/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index dcccfc1a..00000000 --- a/airbyte-v1-notused/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf4..00000000 --- a/airbyte-v1-notused/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/common/values.yaml b/airbyte-v1-notused/charts/common/values.yaml deleted file mode 100644 index f2df68e5..00000000 --- a/airbyte-v1-notused/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/connector-builder-server-1.2.0.tgz b/airbyte-v1-notused/charts/connector-builder-server-1.2.0.tgz deleted file mode 100644 index 5a0963f41cdaf2b6951597519bc49680d75dc998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19500 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 P00960H8X%F0O|n%Rg#Pj diff --git a/airbyte-v1-notused/charts/connector-builder-server/.gitignore b/airbyte-v1-notused/charts/connector-builder-server/.gitignore deleted file mode 100644 index 88e91e8a..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Charts are downloaded at install time with `helm dep build`. -charts diff --git a/airbyte-v1-notused/charts/connector-builder-server/Chart.yaml b/airbyte-v1-notused/charts/connector-builder-server/Chart.yaml deleted file mode 100644 index 47813507..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-connector-builder-server -name: connector-builder-server -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/connector-builder-server/README.md b/airbyte-v1-notused/charts/connector-builder-server/README.md deleted file mode 100644 index 9b49f69a..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# connector-builder-server - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-connector-builder-server - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| debug.enabled | bool | `false` | | -| debug.remoteDebugPort | int | `5005` | | -| enabled | bool | `true` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.configMapName | string | `""` | | -| global.credVolumeOverride | string | `""` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.deploymentMode | string | `"oss"` | | -| global.deploymentStrategyType | string | `"RollingUpdate"` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.secretName | string | `""` | | -| global.serviceAccountName | string | `"placeholderServiceAccount"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/connector-builder-server"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `30` | | -| livenessProbe.periodSeconds | int | `10` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| log.level | string | `"INFO"` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `10` | | -| readinessProbe.periodSeconds | int | `10` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| service.annotations | object | `{}` | | -| service.port | int | `80` | | -| service.type | string | `"NodePort"` | | -| tolerations | list | `[]` | | - diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl b/airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl deleted file mode 100644 index 174aebfe..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/templates/_helpers.tpl +++ /dev/null @@ -1,59 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Define db secret -*/}} - -{{- define "database.secret.name" -}} -{{- printf "%s-postgresql" .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl b/airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml b/airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml deleted file mode 100644 index 4eef212e..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/templates/deployment.yaml +++ /dev/null @@ -1,179 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} - {{- end }} - strategy: - type: {{ .Values.deploymentStrategyType }} - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.extraInitContainers }} - initContainers: - {{- toYaml .Values.extraInitContainers | nindent 6 }} - {{- end }} - containers: - - name: airbyte-connector-builder-server - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - {{- if .Values.debug.enabled }} - - name: JAVA_TOOL_OPTIONS - value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" - {{- end}} - {{- if eq .Values.global.deploymentMode "oss" }} - - name: AIRBYTE_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_VERSION - - name: MICROMETER_METRICS_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_ENABLED - - name: MICROMETER_METRICS_STATSD_FLAVOR - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_STATSD_FLAVOR - - name: SEGMENT_WRITE_KEY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: SEGMENT_WRITE_KEY - - name: STATSD_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_HOST - - name: STATSD_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_PORT - - name: TRACKING_STRATEGY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TRACKING_STRATEGY - {{- end }} - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: server-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compability(if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 8 }} - {{- end }} - - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /v1/health - port: http - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - httpGet: - path: /v1/health - port: http - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - - ports: - - name: http - containerPort: 8080 - protocol: TCP - {{- if .Values.debug.enabled }} - - name: debug - containerPort: {{ .Values.debug.remoteDebugPort }} - protocol: TCP - {{- end}} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - {{- if .Values.extraVolumeMounts }} - {{ toYaml .Values.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.global.extraVolumeMounts }} - {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 6 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 6 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - {{- if .Values.extraVolumes }} -{{ toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml b/airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml deleted file mode 100644 index e00ae6ba..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/templates/secrets.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Create secrets only for the local deployment -{{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: connector-builder-server-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml b/airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml deleted file mode 100644 index 6f1cb26e..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/templates/service.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: {{.Release.Name }}-airbyte-connector-builder-server-svc - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "airbyte.selectorLabels" . | nindent 4 }} diff --git a/airbyte-v1-notused/charts/connector-builder-server/values.yaml b/airbyte-v1-notused/charts/connector-builder-server/values.yaml deleted file mode 100644 index 64326ab9..00000000 --- a/airbyte-v1-notused/charts/connector-builder-server/values.yaml +++ /dev/null @@ -1,192 +0,0 @@ -global: - serviceAccountName: placeholderServiceAccount - deploymentMode: oss - deploymentStrategyType: RollingUpdate - configMapName: "" - secretName: "" - credVolumeOverride: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - -enabled: true -## replicaCount Number of server replicas -replicaCount: 1 - -## image.repository The repository to use for the airbyte server image. -## image.pullPolicy the pull policy to use for the airbyte server image -## image.tag The airbyte server image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/connector-builder-server - pullPolicy: IfNotPresent - -## podAnnotations [object] Add extra annotations to the server pod -## -podAnnotations: {} - -## containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the server containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## livenessProbe.enabled Enable livenessProbe on the server -## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## livenessProbe.periodSeconds Period seconds for livenessProbe -## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## livenessProbe.failureThreshold Failure threshold for livenessProbe -## livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## readinessProbe.enabled Enable readinessProbe on the server -## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## readinessProbe.periodSeconds Period seconds for readinessProbe -## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## readinessProbe.failureThreshold Failure threshold for readinessProbe -## readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## Server app resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## resources.limits [object] The resources limits for the server container -## resources.requests [object] The requested resources for the server container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## service.type The service type to use for the API server -## service.port The service port to expose the API server on -service: - type: NodePort - port: 80 - annotations: {} - -## nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## tolerations [array] Tolerations for server pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## affinity [object] Affinity and anti-affinity for server pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## log.level The log level to log at -log: - level: "INFO" - -## extraVolumeMounts [array] Additional volumeMounts for server container(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## extraVolumes [array] Additional volumes for server pod(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: AIRBYTE_VERSION -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: AIRBYTE_VERSION -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 -env_vars: {} - -debug: - enabled: false - remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/charts/connector-rollout-worker-1.2.0.tgz b/airbyte-v1-notused/charts/connector-rollout-worker-1.2.0.tgz deleted file mode 100644 index db6c0790094df7e978d94e019ec718fd4ad3844d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20393 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 Qg(OJD&PMjy?6EW1zMAY@jqy-* z@zz@Q(@Poh0>}{C(4$0uiifK6OdB`>lN})}?-?4T5r}Yn!;~x-%mQN}-#bq^p%_MN ziy}s%3GxJS+w%WAUP2i6aza!;Z&~o#w4|oEO!J{iAWyVG;`1ik9w++e&X!!w-r@ko zVkdb(lBv2-_TK`MO#fZ1UfX80IF2qCf;0~Gb*TFZ3`WR6*aRl0;kMra>!N_GKe-$K z?g)7q!>JU#RQeoYrbaaS6re8fYK`y8?tD7zbAXi#~ z;74z3>-P56hmuO4(BW33O0liC#|K9z7f0T;hskj)A*>0gf+R@OuB^_+r!fczpTG z>HACYasT{$|K#%c=mMOcgM-tP!{f{2(~}Eu`V-hc`3HD&d~&!65LSk~Pl?PYK`6ju zxt#mXg-#A*kZ0C=X^O=Gh+sTS;Shl#nILsYkRUq7Of8Tw4xI>(vB^(SX^#ILT|Dyi YJUvg(qd)(D00030|7e3kRsaG50D-6tlmGw# diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml deleted file mode 100644 index 38d167fd..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-connector-rollout-worker -name: connector-rollout-worker -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/README.md b/airbyte-v1-notused/charts/connector-rollout-worker/README.md deleted file mode 100644 index ad3e11f2..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# connector-rollout-worker - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-connector-rollout-worker - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|---------------------------------------------------|------|--------------------------------------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| debug.enabled | bool | `false` | | -| debug.remoteDebugPort | int | `5005` | | -| enabled | bool | `true` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.credVolumeOverride | string | `""` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.secretName | string | `""` | | -| global.serviceAccountName | string | `"airbyte-admin"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/connector-rollout-worker"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `50` | | -| livenessProbe.periodSeconds | int | `10` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| log.level | string | `"INFO"` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `10` | | -| readinessProbe.periodSeconds | int | `10` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| tolerations | list | `[]` | | diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore deleted file mode 100644 index 50af0317..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml deleted file mode 100644 index 39edbb3c..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.17.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: Bitnami - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -- https://www.bitnami.com/ -type: library -version: 1.17.1 diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md deleted file mode 100644 index a2ecd604..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/README.md +++ /dev/null @@ -1,350 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 1.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | -| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | -| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | -| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | -| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|-----------------------------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Input | -|-----------------------------------|-----------------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | -| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ - -## License - -Copyright © 2022 Bitnami - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl deleted file mode 100644 index 2387be26..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 9d9b7600..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,154 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e3..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc72..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl deleted file mode 100644 index 8caf73a6..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,68 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl deleted file mode 100644 index 1bdac8b7..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_names.tpl +++ /dev/null @@ -1,70 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- if .Values.namespaceOverride -}} -{{- .Values.namespaceOverride -}} -{{- else -}} -{{- .Release.Namespace -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl deleted file mode 100644 index a53fb44f..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,140 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key }} - {{- else }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db16685..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl deleted file mode 100644 index 8c22b2a3..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index ded1ae3b..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index b6906ff7..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index f820ec10..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index 74472a06..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 164ec0d0..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index dcccfc1a..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf4..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml deleted file mode 100644 index f2df68e5..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl deleted file mode 100644 index 7be7bc1a..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/templates/_helpers.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl b/airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml deleted file mode 100644 index f1094295..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/templates/deployment.yaml +++ /dev/null @@ -1,216 +0,0 @@ -{{- if or (eq .Values.global.edition "community") (eq .Values.global.enterprise.connectorRolloutOptIn true)}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} - {{- end }} - strategy: - type: Recreate - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - automountServiceAccountToken: true - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.extraInitContainers }} - initContainers: - {{- toYaml .Values.extraInitContainers | nindent 6 }} - {{- end }} - containers: - - name: airbyte-connector-rollout-worker-container - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - {{- if .Values.debug.enabled }} - - name: JAVA_TOOL_OPTIONS - value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" - {{- end }} - {{- if eq .Values.global.deploymentMode "oss" }} - - name: AIRBYTE_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_VERSION - - name: INTERNAL_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: INTERNAL_API_HOST - - name: MICROMETER_METRICS_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_ENABLED - - name: MICROMETER_METRICS_STATSD_FLAVOR - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_STATSD_FLAVOR - - name: SEGMENT_WRITE_KEY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: SEGMENT_WRITE_KEY - - name: STATSD_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_HOST - - name: STATSD_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_PORT - - name: TRACKING_STRATEGY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TRACKING_STRATEGY - - name: WEBAPP_URL - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WEBAPP_URL - - name: TEMPORAL_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_HOST - - name: TEMPORAL_WORKER_PORTS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_WORKER_PORTS - - name: LOG_LEVEL - value: "{{ .Values.log.level }}" - {{- end }} - {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} - - name: AIRBYTE_API_AUTH_HEADER_NAME - value: "X-Airbyte-Auth" - - name: AIRBYTE_API_AUTH_HEADER_VALUE - value: "Internal worker" - {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} - # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just - # splitting into two separate blocks for readability. - - name: AIRBYTE_API_AUTH_HEADER_NAME - value: "X-Airbyte-Auth" - - name: AIRBYTE_API_AUTH_HEADER_VALUE - value: "Internal worker" - {{- end }} - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: connector-rollout-worker-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 8 }} - {{- end }} - - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /health/liveness - port: heartbeat - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - httpGet: - path: /health/readiness - port: heartbeat - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - ports: - {{- if .Values.debug.enabled }} - - name: debug - containerPort: {{ .Values.debug.remoteDebugPort }} - protocol: TCP - {{- end}} - - name: heartbeat - containerPort: 8016 # for heartbeat server - - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - {{- if .Values.extraVolumeMounts }} - {{ toYaml .Values.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.global.extraVolumeMounts }} - {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 6 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 6 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - {{- if .Values.extraVolumes }} - {{ toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml deleted file mode 100644 index 24e141b1..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/templates/secrets.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Create secrets only for the local deployment -{{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: connector-rollout-worker-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/connector-rollout-worker/values.yaml b/airbyte-v1-notused/charts/connector-rollout-worker/values.yaml deleted file mode 100644 index 85d6bf18..00000000 --- a/airbyte-v1-notused/charts/connector-rollout-worker/values.yaml +++ /dev/null @@ -1,273 +0,0 @@ -global: - - serviceAccountName: &service-account-name "airbyte-admin" - edition: community - credVolumeOverride: "" - secretName: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - - enterprise: - connectorRolloutOptIn: false - - jobs: - ## Jobs resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - ## jobs.resources.limits [object] The resources limits for jobs - ## jobs.resources.requests [object] The requested resources for jobs - resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - - kube: - ## JOB_KUBE_ANNOTATIONS - ## pod annotations of the sync job and the default pod annotations fallback for others jobs - ## jobs.kube.annotations [object] key/value annotations applied to kube jobs - annotations: {} - - ## JOB_KUBE_LABELS - ## pod labels of the sync job and the default pod labels fallback for others jobs - ## jobs.kube.labels [object] key/value labels applied to kube jobs - labels: {} - - ## JOB_KUBE_NODE_SELECTORS - ## pod node selector of the sync job and the default pod node selector fallback for others jobs - ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs - nodeSelector: {} - - ## JOB_KUBE_TOLERATIONS - ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## any boolean values should be quoted to ensure the value is passed through as a string, eg: - ## - key: airbyte-server - ## operator: Equal - ## value: "true" - ## effect: NoSchedule - tolerations: [] - - ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - ## image pull secret to use for job pod - ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod - main_container_image_pull_secret: "" - - images: - ## JOB_KUBE_BUSYBOX_IMAGE - ## busybox image used by the job pod - ## jobs.kube.images.busybox [string] busybox image used by the job pod - busybox: "" - ## JOB_KUBE_SOCAT_IMAGE - ## socat image used by the job pod - ## jobs.kube.images.socat [string] socat image used by the job pod - socat: "" - ## JOB_KUBE_CURL_IMAGE - ## curl image used by the job pod - ## jobs.kube.images.curl [string] curl image used by the job pod - curl: "" - -enabled: true -## connector-rollout-worker.replicaCount Number of connector-rollout-worker replicas -replicaCount: 1 - -## connector-rollout-worker.image.repository The repository to use for the airbyte connector-rollout-worker image. -## connector-rollout-worker.image.pullPolicy the pull policy to use for the airbyte connector-rollout-worker image -## connector-rollout-worker.image.tag The airbyte connector-rollout-worker image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/connector-rollout-worker - pullPolicy: IfNotPresent - -## connector-rollout-worker.podAnnotations [object] Add extra annotations to the connector-rollout-worker pod(s) -## -podAnnotations: {} - -## connector-rollout-worker.podLabels [object] Add extra labels to the connector-rollout-worker pod(s) -## -podLabels: {} - -## connector-rollout-worker.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the connector-rollout-worker containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## connector-rollout-worker.livenessProbe.enabled Enable livenessProbe on the connector-rollout-worker -## connector-rollout-worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## connector-rollout-worker.livenessProbe.periodSeconds Period seconds for livenessProbe -## connector-rollout-worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## connector-rollout-worker.livenessProbe.failureThreshold Failure threshold for livenessProbe -## connector-rollout-worker.livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 50 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## connector-rollout-worker.readinessProbe.enabled Enable readinessProbe on the connector-rollout-worker -## connector-rollout-worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## connector-rollout-worker.readinessProbe.periodSeconds Period seconds for readinessProbe -## connector-rollout-worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## connector-rollout-worker.readinessProbe.failureThreshold Failure threshold for readinessProbe -## connector-rollout-worker.readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## connector-rollout-worker resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## connector-rollout-worker.resources.limits [object] The resources limits for the connector-rollout-worker container -## connector-rollout-worker.resources.requests [object] The requested resources for the connector-rollout-worker container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## connector-rollout-worker.nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## connector-rollout-worker.tolerations [array] Tolerations for connector-rollout-worker pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## connector-rollout-worker.affinity [object] Affinity and anti-affinity for connector-rollout-worker pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## connector-rollout-worker.log.level The log level to log at. -log: - level: "INFO" - - - -## connector-rollout-worker.extraVolumeMounts [array] Additional volumeMounts for connector-rollout-worker container(s). -## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## connector-rollout-worker.extraVolumes [array] Additional volumes for connector-rollout-worker pod(s). -## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: AIRBYTE_VERSION -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: AIRBYTE_VERSION -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example with default values for connector-rollout-worker: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Workspace storage for running jobs (logs, etc) -# WORKSPACE_ROOT: /workspace -# WORKSPACE_DOCKER_MOUNT: airbyte_workspace - -# # Miscellaneous -# TRACKING_STRATEGY: segment -# WEBAPP_URL: airbyte-webapp-svc:80 -# INTERNAL_API_HOST: http://airbyte-server-svc:8001 -env_vars: {} - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} - -debug: - enabled: true - remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/charts/cron-1.2.0.tgz b/airbyte-v1-notused/charts/cron-1.2.0.tgz deleted file mode 100644 index cc8a2b5a174f0273b8659e1af70dc39483819ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19551 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 O0RR6kh?g}0=m7vbgIsU` diff --git a/airbyte-v1-notused/charts/cron/Chart.yaml b/airbyte-v1-notused/charts/cron/Chart.yaml deleted file mode 100644 index 6db7eefd..00000000 --- a/airbyte-v1-notused/charts/cron/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-cron -name: cron -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/cron/README.md b/airbyte-v1-notused/charts/cron/README.md deleted file mode 100644 index 9f628a60..00000000 --- a/airbyte-v1-notused/charts/cron/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# cron - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-cron - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| enabled | bool | `true` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.configMapName | string | `""` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.deploymentMode | string | `"oss"` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.secretName | string | `""` | | -| global.secrets | object | `{}` | | -| global.serviceAccountName | string | `"placeholderServiceAccount"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/cron"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `30` | | -| livenessProbe.periodSeconds | int | `10` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.containerSecurityContext | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `10` | | -| readinessProbe.periodSeconds | int | `10` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| tolerations | list | `[]` | | -| workloadApi | object | `{}` | | - diff --git a/airbyte-v1-notused/charts/cron/charts/common/.helmignore b/airbyte-v1-notused/charts/cron/charts/common/.helmignore deleted file mode 100644 index 50af0317..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/airbyte-v1-notused/charts/cron/charts/common/Chart.yaml b/airbyte-v1-notused/charts/cron/charts/common/Chart.yaml deleted file mode 100644 index 39edbb3c..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.17.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: Bitnami - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -- https://www.bitnami.com/ -type: library -version: 1.17.1 diff --git a/airbyte-v1-notused/charts/cron/charts/common/README.md b/airbyte-v1-notused/charts/cron/charts/common/README.md deleted file mode 100644 index a2ecd604..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/README.md +++ /dev/null @@ -1,350 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 1.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | -| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | -| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | -| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | -| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|-----------------------------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Input | -|-----------------------------------|-----------------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | -| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ - -## License - -Copyright © 2022 Bitnami - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl deleted file mode 100644 index 2387be26..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 9d9b7600..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,154 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e3..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc72..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl deleted file mode 100644 index 8caf73a6..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,68 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl deleted file mode 100644 index 1bdac8b7..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_names.tpl +++ /dev/null @@ -1,70 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- if .Values.namespaceOverride -}} -{{- .Values.namespaceOverride -}} -{{- else -}} -{{- .Release.Namespace -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl deleted file mode 100644 index a53fb44f..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,140 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key }} - {{- else }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db16685..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl deleted file mode 100644 index 8c22b2a3..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index ded1ae3b..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index b6906ff7..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index f820ec10..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index 74472a06..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 164ec0d0..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index dcccfc1a..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf4..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/cron/charts/common/values.yaml b/airbyte-v1-notused/charts/cron/charts/common/values.yaml deleted file mode 100644 index f2df68e5..00000000 --- a/airbyte-v1-notused/charts/cron/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/cron/templates/_helpers.tpl b/airbyte-v1-notused/charts/cron/templates/_helpers.tpl deleted file mode 100644 index 174aebfe..00000000 --- a/airbyte-v1-notused/charts/cron/templates/_helpers.tpl +++ /dev/null @@ -1,59 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Define db secret -*/}} - -{{- define "database.secret.name" -}} -{{- printf "%s-postgresql" .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/cron/templates/_images.tpl b/airbyte-v1-notused/charts/cron/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/cron/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml b/airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml deleted file mode 100644 index 1d22b17e..00000000 --- a/airbyte-v1-notused/charts/cron/templates/cron-secrets.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Create secrets only for the local deployment -{{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: cron-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" - -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} - {{- end }} diff --git a/airbyte-v1-notused/charts/cron/templates/deployment.yaml b/airbyte-v1-notused/charts/cron/templates/deployment.yaml deleted file mode 100644 index f64fb6a6..00000000 --- a/airbyte-v1-notused/charts/cron/templates/deployment.yaml +++ /dev/null @@ -1,187 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} - {{- end }} - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - automountServiceAccountToken: true - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.extraInitContainers }} - initContainers: - {{- toYaml .Values.extraInitContainers | nindent 6 }} - {{- end }} - containers: - - name: airbyte-cron - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - {{- if eq .Values.global.deploymentMode "oss" }} - - name: AIRBYTE_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_VERSION - - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - - name: MICROMETER_METRICS_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_ENABLED - - name: MICROMETER_METRICS_STATSD_FLAVOR - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_STATSD_FLAVOR - - name: MICRONAUT_ENVIRONMENTS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CRON_MICRONAUT_ENVIRONMENTS - - name: TEMPORAL_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_HOST - - name: SEGMENT_WRITE_KEY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: SEGMENT_WRITE_KEY - - name: STATSD_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_HOST - - name: STATSD_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_PORT - - name: TRACKING_STRATEGY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TRACKING_STRATEGY - - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS - - name: WORKLOAD_API_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} - key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} - - name: WORKLOAD_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKLOAD_API_HOST - - name: WORKSPACE_DOCKER_MOUNT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKSPACE_DOCKER_MOUNT - - name: WORKSPACE_ROOT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKSPACE_ROOT - - # Database - {{- include "airbyte.database.envs" . | nindent 10 }} - - {{- end }} - - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: cron-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compability(if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 10 }} - {{- end }} - - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} - {{- end }} - - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 12 }} - {{- end }} - - {{- if .Values.extraVolumeMounts }} - volumeMounts: {{ toYaml .Values.extraVolumeMounts | nindent 10 }} - {{- end }} - - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 8 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 8 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} - {{- if .Values.extraVolumes }} - volumes: {{ toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/cron/values.yaml b/airbyte-v1-notused/charts/cron/values.yaml deleted file mode 100644 index 1bbace43..00000000 --- a/airbyte-v1-notused/charts/cron/values.yaml +++ /dev/null @@ -1,233 +0,0 @@ -global: - serviceAccountName: placeholderServiceAccount - deploymentMode: oss - configMapName: "" - secretName: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - secrets: {} - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - -enabled: true -## cron.replicaCount Number of cron replicas -replicaCount: 1 - -## cron.image.repository The repository to use for the airbyte cron image. -## cron.image.pullPolicy the pull policy to use for the airbyte cron image -## cron.image.tag The airbyte cron image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/cron - pullPolicy: IfNotPresent - -## cron.podAnnotations [object] Add extra annotations to the cron pod(s) -## -podAnnotations: {} - -## cron.podLabels [object] Add extra labels to the cron pod(s) -## -podLabels: {} - -## cron.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the cron containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## cron.livenessProbe.enabled Enable livenessProbe on the cron -## cron.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## cron.livenessProbe.periodSeconds Period seconds for livenessProbe -## cron.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## cron.livenessProbe.failureThreshold Failure threshold for livenessProbe -## cron.livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## cron.readinessProbe.enabled Enable readinessProbe on the cron -## cron.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## cron.readinessProbe.periodSeconds Period seconds for readinessProbe -## cron.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## cron.readinessProbe.failureThreshold Failure threshold for readinessProbe -## cron.readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - - ## server.containerSecurityContext Security context for the container - ## Examples: - ## containerSecurityContext: - ## runAsNonRoot: true - ## runAsUser: 1000 - ## readOnlyRootFilesystem: true - containerSecurityContext: {} - -## Web app resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## cron.resources.limits [object] The resources limits for the Web container -## cron.resources.requests [object] The requested resources for the Web container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## cron.nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## cron.tolerations [array] Tolerations for cron pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## cron.affinity [object] Affinity and anti-affinity for cron pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## cron.extraVolumeMounts [array] Additional volumeMounts for cron container(s). -## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: var-run -## mountPath: /var/run/ -## - name: var-cache-nginx -## mountPath: /var/cache/nginx -## - mountPath: /etc/nginx/conf.d -## name: nginx-conf-d -## -extraVolumeMounts: [] - -## cron.extraVolumes [array] Additional volumes for cron pod(s). -## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: var-run -## emptyDir: {} -## - name: var-cache-nginx -## emptyDir: {} -## - name: nginx-conf-d -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: POSTGRES_USER -# valueFrom: -# secretKeyRef: -# name: airbyte-secrets -# key: DATABASE_USER -# - name: POSTGRES_PWD -# valueFrom: -# secretKeyRef: -# name: airbyte-secrets -# key: DATABASE_PASSWORD -# - name: DYNAMIC_CONFIG_FILE_PATH -# value: "config/dynamicconfig/development.yaml" -# - name: DB -# value: "postgresql" -# - name: DB_PORT -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: DATABASE_PORT -# - name: POSTGRES_SEEDS -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: DATABASE_HOST -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example with default vars for cron: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Miscellaneous -# TRACKING_STRATEGY: segment -# API_URL: /api/v1/ -# INTERNAL_API_HOST: http://airbyte-server-svc:8001 - -env_vars: {} - - -## workloadApi: -## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored -## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored -workloadApi: {} - - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} diff --git a/airbyte-v1-notused/charts/keycloak-1.2.0.tgz b/airbyte-v1-notused/charts/keycloak-1.2.0.tgz deleted file mode 100644 index dfb5a0576498a420bf8014d672b5a2b6a566aaa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20269 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 E0Fm4{UjP6A diff --git a/airbyte-v1-notused/charts/keycloak-setup-1.2.0.tgz b/airbyte-v1-notused/charts/keycloak-setup-1.2.0.tgz deleted file mode 100644 index 2cb6bc86d90695ed5569f385dba6a94b9e455a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18955 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 diff --git a/airbyte-v1-notused/charts/keycloak-setup/.gitignore b/airbyte-v1-notused/charts/keycloak-setup/.gitignore deleted file mode 100644 index 88e91e8a..00000000 --- a/airbyte-v1-notused/charts/keycloak-setup/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Charts are downloaded at install time with `helm dep build`. -charts diff --git a/airbyte-v1-notused/charts/keycloak-setup/Chart.yaml b/airbyte-v1-notused/charts/keycloak-setup/Chart.yaml deleted file mode 100644 index a4eff29e..00000000 --- a/airbyte-v1-notused/charts/keycloak-setup/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-keycloak-setup -name: keycloak-setup -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/keycloak-setup/README.md b/airbyte-v1-notused/charts/keycloak-setup/README.md deleted file mode 100644 index 724dc7c8..00000000 --- a/airbyte-v1-notused/charts/keycloak-setup/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# keycloak-setup - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-keycloak-setup - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| enabled | bool | `true` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.deploymentMode | string | `"oss"` | | -| global.edition | string | `"community"` | | -| global.env_vars | object | `{}` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.secretName | string | `""` | | -| global.secrets | object | `{}` | | -| global.serviceAccountName | string | `"placeholderServiceAccount"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/keycloak-setup"` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| tolerations | list | `[]` | | - diff --git a/airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl b/airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl deleted file mode 100644 index 7be7bc1a..00000000 --- a/airbyte-v1-notused/charts/keycloak-setup/templates/_helpers.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl b/airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/keycloak-setup/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml b/airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml deleted file mode 100644 index 41e534df..00000000 --- a/airbyte-v1-notused/charts/keycloak-setup/templates/job.yaml +++ /dev/null @@ -1,143 +0,0 @@ -{{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} -{{- if eq .Values.global.deploymentMode "oss" }} ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 4 }} - {{- end }} - annotations: - "helm.sh/hook": "post-install, post-upgrade" - "helm.sh/hook-delete-policy": "before-hook-creation" -spec: - completions: 1 - template: - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - restartPolicy: Never - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 12 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 12 }} - {{- end }} - initContainers: - - name: keycloak-readiness-check - image: {{ include "imageUrl" (list .Values.initContainers.keycloakReadinessCheck.image $) }} - command: [ "sh", "-c", "until curl --output /dev/null --head --fail http://${KEYCLOAK_INTERNAL_HOST}/auth/health/ready; do sleep 1; done;" ] - env: - - name: KEYCLOAK_INTERNAL_HOST - valueFrom: - configMapKeyRef: - name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} - key: KEYCLOAK_INTERNAL_HOST - securityContext: - {{- toYaml .Values.initContainerSecurityContext | nindent 14 }} - {{- if .Values.extraInitContainers }} - {{- toYaml .Values.extraInitContainers | nindent 8 }} - {{- end }} - containers: - - name: airbyte-keycloak-setup-container - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - - name: AIRBYTE_URL - valueFrom: - configMapKeyRef: - name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} - key: AIRBYTE_URL - - name: KEYCLOAK_ADMIN_USER - valueFrom: - secretKeyRef: - name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: KEYCLOAK_ADMIN_USER - - name: KEYCLOAK_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: KEYCLOAK_ADMIN_PASSWORD - - name: KEYCLOAK_INTERNAL_HOST - valueFrom: - configMapKeyRef: - name: {{ .Values.global.configMapName | default (printf "%s-airbyte-env" .Release.Name) }} - key: KEYCLOAK_INTERNAL_HOST - - {{- include "airbyte.database.envs" . | nindent 12 }} - {{- include "airbyte.enterprise.instanceAdmin" . | nindent 12 }} - {{- include "airbyte.enterprise.identityProvider" . | nindent 12 }} - {{- include "airbyte.keycloak.database.envs" . | nindent 12 }} - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: keycloak-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if .Values.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compability(if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 12 }} - {{- end }} - - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 12 }} - {{- end }} - volumeMounts: - {{- if .Values.global.airbyteYml }} - - name: airbyte-yml-volume - mountPath: /app/configs/airbyte.yml - subPath: fileContents - readOnly: true - {{- end }} - {{- if .Values.extraVolumeMounts }} - {{- toYaml .Values.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 8 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 8 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} - volumes: - {{- if .Values.global.airbyteYml }} - - name: airbyte-yml-volume - secret: - secretName: {{ .Release.Name }}-airbyte-yml - {{- end }} - {{- if .Values.extraVolumes }} - {{- toYaml .Values.extraVolumes | nindent 8 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/keycloak-setup/values.yaml b/airbyte-v1-notused/charts/keycloak-setup/values.yaml deleted file mode 100644 index f134b437..00000000 --- a/airbyte-v1-notused/charts/keycloak-setup/values.yaml +++ /dev/null @@ -1,190 +0,0 @@ -## global.serviceAccountName Name of service account to be associated with service -## deploymentMode Determines deployment mode of airbyte -## secretName Overrides the secrate name with with credentials to S3 Bucket and logging -## database.secretName Name of database secret -## database.secretValue Value of database password key stored in secret -global: - serviceAccountName: placeholderServiceAccount - edition: community - deploymentMode: oss - secretName: "" - database: - secretName: "" - secretValue: "" - secrets: {} - env_vars: {} - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - - -enabled: true -## image.repository The repository to use for the airbyte keycloak-setup image. -## image.pullPolicy the pull policy to use for the airbyte keycloak-setup image -## image.tag The airbyte keycloak-setup image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/keycloak-setup - pullPolicy: IfNotPresent - -## podAnnotations [object] Add extra annotations to the keycloak-setup pod -## -podAnnotations: {} - -## podLabels [object] Add extra labels to the keycloak-setup pod -## -podLabels: {} - -## containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## tolerations [array] Tolerations for worker pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## Keycloak Setup resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## keycloak-setup.resources.limits [object] The resources limits for the airbyte keycloak-setup image -## keycloak-setup.resources.requests [object] The requested resources for the airbyte keycloak-setup image -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## affinity [object] Affinity and anti-affinity for keycloak-setup pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -## extraEnv: -## - name: AIRBYTE_VERSION -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: AIRBYTE_VERSION -## - name: DATABASE_HOST -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: DATABASE_HOST -## - name: DATABASE_PORT -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: DATABASE_PORT -## - name: DATABASE_PASSWORD -## valueFrom: -## secretKeyRef: -## name: airbyte-secrets -## key: DATABASE_PASSWORD -## - name: DATABASE_URL -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: DATABASE_URL -## - name: DATABASE_USER -## valueFrom: -## secretKeyRef: -## name: airbyte-secrets -## key: DATABASE_USER -## -extraEnv: [] - -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## extraContainer [array] Additional container for keycloak pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraVolumeMounts [array] Additional volumeMounts for server container(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## extraVolumes [array] Additional volumes for server pod(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db -# DATABASE_HOST: airbyte-db-svc -# DATABASE_PORT: 5432 -# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} -# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte -# DATABASE_PASSWORD: 12345 -# DATABASE_USER: airbyte -env_vars: {} - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} diff --git a/airbyte-v1-notused/charts/keycloak/.gitignore b/airbyte-v1-notused/charts/keycloak/.gitignore deleted file mode 100644 index 88e91e8a..00000000 --- a/airbyte-v1-notused/charts/keycloak/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Charts are downloaded at install time with `helm dep build`. -charts diff --git a/airbyte-v1-notused/charts/keycloak/Chart.yaml b/airbyte-v1-notused/charts/keycloak/Chart.yaml deleted file mode 100644 index 5641e569..00000000 --- a/airbyte-v1-notused/charts/keycloak/Chart.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x -description: Helm chart to deploy airbyte-keycloak -name: keycloak -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/keycloak/README.md b/airbyte-v1-notused/charts/keycloak/README.md deleted file mode 100644 index 5b86476d..00000000 --- a/airbyte-v1-notused/charts/keycloak/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# keycloak - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-keycloak - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| bypassInit | bool | `false` | | -| containerSecurityContext | object | `{}` | | -| enabled | bool | `true` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.deploymentMode | string | `"oss"` | airbyte deployment mode | -| global.edition | string | `"community"` | | -| global.env_vars | object | `{}` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.secretName | string | `""` | | -| global.secrets | object | `{}` | | -| global.serviceAccountName | string | `"placeholderServiceAccount"` | | -| headlessService.annotations | object | `{}` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/keycloak"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `30` | | -| livenessProbe.periodSeconds | int | `10` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `30` | | -| readinessProbe.periodSeconds | int | `10` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| service.annotations | object | `{}` | | -| service.port | int | `8180` | | -| service.type | string | `"ClusterIP"` | | -| startupProbe.enabled | bool | `true` | | -| startupProbe.failureThreshold | int | `60` | | -| startupProbe.initialDelaySeconds | int | `30` | | -| startupProbe.periodSeconds | int | `5` | | -| startupProbe.successThreshold | int | `1` | | -| startupProbe.timeoutSeconds | int | `1` | | -| tolerations | list | `[]` | | - diff --git a/airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl b/airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl deleted file mode 100644 index 7be7bc1a..00000000 --- a/airbyte-v1-notused/charts/keycloak/templates/_helpers.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak/templates/_images.tpl b/airbyte-v1-notused/charts/keycloak/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/keycloak/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/keycloak/templates/service.yaml b/airbyte-v1-notused/charts/keycloak/templates/service.yaml deleted file mode 100644 index 3e7b5fea..00000000 --- a/airbyte-v1-notused/charts/keycloak/templates/service.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# If Cloud or Pro/Enterprise, render the keycloak service template. -{{- if or (eq .Values.global.deploymentMode "cloud") (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{.Release.Name }}-airbyte-keycloak-svc - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - {{ if and (eq .Values.service.type "NodePort") (.Values.service.nodePort) }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - selector: - {{- include "airbyte.selectorLabels" . | nindent 4 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} - {{- end }} ---- -# This headless service sets ClusterIp: None so that it can be -# used for internal DNS resolution of all individual keycloak -# pods. Port 7800 is the default jgroups port that Keycloak -# expects to be open to enable Infinispan cache synchronization. -apiVersion: v1 -kind: Service -metadata: - name: {{.Release.Name }}-airbyte-keycloak-headless-svc - {{- with .Values.headlessService.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - type: ClusterIP - clusterIP: None - ports: - - name: jgroups - port: 7800 - targetPort: 7800 - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "airbyte.selectorLabels" . | nindent 4 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml b/airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml deleted file mode 100644 index 89769cff..00000000 --- a/airbyte-v1-notused/charts/keycloak/templates/statefulset.yaml +++ /dev/null @@ -1,193 +0,0 @@ -# if Cloud or Pro/Enterprise, render the keycloak StatefulSet template. -{{- if or (eq .Values.global.deploymentMode "cloud") (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - serviceName: {{.Release.Name }}-airbyte-keycloak-headless-svc - podManagementPolicy: OrderedReady # embedded infinispan does not handle parallel joins well, src https://github.com/keycloak/keycloak/issues/21108#issuecomment-1599010602 - updateStrategy: - type: RollingUpdate - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} - {{- end }} - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - initContainers: - {{- if and (eq .Values.global.deploymentMode "oss") (ne .Values.bypassInit true)}} - # This init container will only executed if the deployment mode is "oss" and the bypassInit is not true. - - name: init-db - image: {{ include "imageUrl" (list .Values.initContainers.initDb.image $) }} - command: [ "sh", "-c" ] - args: - - > - PGPASSWORD=$DATABASE_PASSWORD psql -h $DATABASE_HOST -p $DATABASE_PORT -U $DATABASE_USER -d $DATABASE_DB -c "CREATE SCHEMA IF NOT EXISTS keycloak"; - env: - {{- include "airbyte.database.envs" . | nindent 12 }} - - securityContext: - {{- toYaml .Values.initContainerSecurityContext | nindent 14 }} - {{- end }} - {{- if .Values.extraInitContainers }} - {{- toYaml .Values.extraInitContainers | nindent 8 }} - {{- end }} - containers: - - name: airbyte-keycloak - image: {{ include "imageUrl" (list .Values.image $)}} - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - {{- if eq .Values.global.deploymentMode "oss" }} - - name: KEYCLOAK_ADMIN_USER - valueFrom: - secretKeyRef: - name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: KEYCLOAK_ADMIN_USER - - name: KEYCLOAK_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.global.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: KEYCLOAK_ADMIN_PASSWORD - - name: KEYCLOAK_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: KEYCLOAK_PORT - - name: JAVA_OPTS_APPEND - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: KEYCLOAK_JAVA_OPTS_APPEND - {{- include "airbyte.keycloak.database.envs" . | nindent 12 }} - {{- end }} # end if oss - - {{- if .Values.extraEnv }} - {{ .Values.extraEnv | toYaml | nindent 12 }} - {{- end }} - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: keycloak-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if .Values.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - ports: - - name: http - containerPort: {{ .Values.service.port }} - protocol: TCP - - containerPort: 7800 - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 12 }} - {{- end }} - volumeMounts: - - name: keycloak-storage - mountPath: /opt/keycloak/data/infinispan - {{- if .Values.extraVolumeMounts }} - {{ toYaml .Values.extraVolumeMounts | nindent 10 }} - {{- end }} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 12 }} - {{- end }} - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /auth/health/live - port: {{ .Values.service.port }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - httpGet: - path: /auth/health/ready - port: {{ .Values.service.port }} - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - {{- if .Values.startupProbe.enabled }} - startupProbe: - httpGet: - path: /auth/health/started - port: {{ .Values.service.port }} - initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.startupProbe.periodSeconds }} - timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }} - successThreshold: {{ .Values.startupProbe.successThreshold }} - failureThreshold: {{ .Values.startupProbe.failureThreshold }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 8 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 8 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 10 }} - volumes: - {{- if .Values.extraVolumes }} - {{ toYaml .Values.extraVolumes | nindent 8 }} - {{- end }} - volumeClaimTemplates: - - metadata: - name: keycloak-storage - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: 1Gi -{{- end }} diff --git a/airbyte-v1-notused/charts/keycloak/values.yaml b/airbyte-v1-notused/charts/keycloak/values.yaml deleted file mode 100644 index 30de3c4b..00000000 --- a/airbyte-v1-notused/charts/keycloak/values.yaml +++ /dev/null @@ -1,245 +0,0 @@ -## global.serviceAccountName Name of service account to be associated with service -## deploymentMode Determines deployment mode of airbyte -## secretName Overrides the secrate name with with credentials to S3 Bucket and logging -## database.secretName Name of database secret -## database.secretValue Value of database password key stored in secret -global: - # serviceAccountName -- Service Account name override - serviceAccountName: placeholderServiceAccount - edition: community - # -- airbyte deployment mode - deploymentMode: oss - secretName: "" - database: - secretName: "" - secretValue: "" - secrets: {} - env_vars: {} - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - - -enabled: true - -bypassInit: false -## image.repository The repository to use for the airbyte keycloak image. -## image.pullPolicy the pull policy to use for the airbyte keycloak image -## image.tag The airbyte keycloak image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/keycloak - pullPolicy: IfNotPresent - -## podAnnotations [object] Add extra annotations to the keycloak pod -## -podAnnotations: {} - -## podLabels [object] Add extra labels to the keycloak pod -## -podLabels: {} - -## Configure extra options for the keycloak containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## livenessProbe.enabled Enable livenessProbe on keycloak -## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## livenessProbe.periodSeconds Period seconds for livenessProbe -## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## livenessProbe.failureThreshold Failure threshold for livenessProbe -## livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## readinessProbe.enabled Enable readinessProbe on keycloak -## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## readinessProbe.periodSeconds Period seconds for readinessProbe -## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## readinessProbe.failureThreshold Failure threshold for readinessProbe -## readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -startupProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 5 - timeoutSeconds: 1 - failureThreshold: 60 - successThreshold: 1 - -## containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## tolerations [array] Tolerations for worker pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## service.type The service type to use for the API server -## service.port The service port to expose the API server on -service: - type: ClusterIP - port: 8180 - annotations: {} - -headlessService: - annotations: {} - -## Keycloak resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## keycloak.resources.limits [object] The resources limits for the keycloak image -## keycloak.resources.requests [object] The requested resources for the keycloak image -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## affinity [object] Affinity and anti-affinity for keycloak pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -## extraEnv: -## - name: AIRBYTE_VERSION -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: AIRBYTE_VERSION -## - name: DATABASE_HOST -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: DATABASE_HOST -## - name: DATABASE_PORT -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: DATABASE_PORT -## - name: DATABASE_PASSWORD -## valueFrom: -## secretKeyRef: -## name: airbyte-secrets -## key: DATABASE_PASSWORD -## - name: DATABASE_URL -## valueFrom: -## configMapKeyRef: -## name: airbyte-env -## key: DATABASE_URL -## - name: DATABASE_USER -## valueFrom: -## secretKeyRef: -## name: airbyte-secrets -## key: DATABASE_USER -## -extraEnv: [] - -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## extraContainer [array] Additional container for keycloak pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraVolumeMounts [array] Additional volumeMounts for server container(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## extraVolumes [array] Additional volumes for server pod(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db -# DATABASE_HOST: airbyte-db-svc -# DATABASE_PORT: 5432 -# # translate manually DATABASE_URL: jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} -# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte -# DATABASE_PASSWORD: 12345 -# DATABASE_USER: airbyte -env_vars: {} - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} - diff --git a/airbyte-v1-notused/charts/metrics-1.2.0.tgz b/airbyte-v1-notused/charts/metrics-1.2.0.tgz deleted file mode 100644 index 10a7f16a23b4f51798b0bc0c4d40ce897b33a5b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18104 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 Q7XSeN|MpQ4X#mCn0Q3XP^#A|> diff --git a/airbyte-v1-notused/charts/metrics/.helmignore b/airbyte-v1-notused/charts/metrics/.helmignore deleted file mode 100644 index f885da3f..00000000 --- a/airbyte-v1-notused/charts/metrics/.helmignore +++ /dev/null @@ -1,25 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ - -ci.sh diff --git a/airbyte-v1-notused/charts/metrics/Chart.yaml b/airbyte-v1-notused/charts/metrics/Chart.yaml deleted file mode 100644 index 84bf0611..00000000 --- a/airbyte-v1-notused/charts/metrics/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-metrics -name: metrics -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/metrics/README.md b/airbyte-v1-notused/charts/metrics/README.md deleted file mode 100644 index 51fd055b..00000000 --- a/airbyte-v1-notused/charts/metrics/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# metrics - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-metrics - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| enabled | bool | `true` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.deploymentMode | string | `"oss"` | | -| global.extraContainers | list | `[]` | | -| global.serviceAccountName | string | `"placeholderServiceAccount"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/metrics-reporter"` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| tolerations | list | `[]` | | - diff --git a/airbyte-v1-notused/charts/metrics/charts/common/.helmignore b/airbyte-v1-notused/charts/metrics/charts/common/.helmignore deleted file mode 100644 index 50af0317..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml b/airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml deleted file mode 100644 index 39edbb3c..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.17.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: Bitnami - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -- https://www.bitnami.com/ -type: library -version: 1.17.1 diff --git a/airbyte-v1-notused/charts/metrics/charts/common/README.md b/airbyte-v1-notused/charts/metrics/charts/common/README.md deleted file mode 100644 index a2ecd604..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/README.md +++ /dev/null @@ -1,350 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 1.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | -| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | -| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | -| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | -| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|-----------------------------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Input | -|-----------------------------------|-----------------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | -| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ - -## License - -Copyright © 2022 Bitnami - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl deleted file mode 100644 index 2387be26..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 9d9b7600..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,154 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e3..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc72..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl deleted file mode 100644 index 8caf73a6..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,68 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl deleted file mode 100644 index 1bdac8b7..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_names.tpl +++ /dev/null @@ -1,70 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- if .Values.namespaceOverride -}} -{{- .Values.namespaceOverride -}} -{{- else -}} -{{- .Release.Namespace -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl deleted file mode 100644 index a53fb44f..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,140 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key }} - {{- else }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db16685..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl deleted file mode 100644 index 8c22b2a3..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index ded1ae3b..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index b6906ff7..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index f820ec10..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index 74472a06..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 164ec0d0..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index dcccfc1a..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf4..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/metrics/charts/common/values.yaml b/airbyte-v1-notused/charts/metrics/charts/common/values.yaml deleted file mode 100644 index f2df68e5..00000000 --- a/airbyte-v1-notused/charts/metrics/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/metrics/templates/_helpers.tpl b/airbyte-v1-notused/charts/metrics/templates/_helpers.tpl deleted file mode 100644 index 9f3ccdc6..00000000 --- a/airbyte-v1-notused/charts/metrics/templates/_helpers.tpl +++ /dev/null @@ -1,39 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Define db secret -*/}} - -{{- define "database.secret.name" -}} -{{- printf "%s-postgresql" .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/metrics/templates/_images.tpl b/airbyte-v1-notused/charts/metrics/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/metrics/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/metrics/templates/deployment.yaml b/airbyte-v1-notused/charts/metrics/templates/deployment.yaml deleted file mode 100644 index d9bf336c..00000000 --- a/airbyte-v1-notused/charts/metrics/templates/deployment.yaml +++ /dev/null @@ -1,124 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app.kubernetes.io/name: {{ include "airbyte.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - helm.sh/chart: {{ include "airbyte.chart" . }} - app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.airbyte.io/fullname: {{ include "airbyte.fullname" . }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - airbyte: metrics - strategy: - type: Recreate # Needed due to volume claims - template: - metadata: - labels: - airbyte: metrics - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - containers: - - name: airbyte-metrics-container - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - {{- if eq .Values.global.deploymentMode "oss" }} - - name: AIRBYTE_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_VERSION - - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - - name: METRIC_CLIENT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: METRIC_CLIENT - - name: OTEL_COLLECTOR_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: OTEL_COLLECTOR_ENDPOINT - - {{- include "airbyte.database.envs" . | nindent 8 }} - - {{- end }} - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: metrics-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compability(if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 8 }} - {{- end }} - - {{- if .Values.resources }} - resources: - {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: - {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - {{- if .Values.extraVolumeMounts }} - volumeMounts: - {{ toYaml .Values.extraVolumeMounts | nindent 10 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 6 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 6 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - {{- if .Values.extraVolumes }} - {{ toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/metrics/values.yaml b/airbyte-v1-notused/charts/metrics/values.yaml deleted file mode 100644 index 6ccaa691..00000000 --- a/airbyte-v1-notused/charts/metrics/values.yaml +++ /dev/null @@ -1,110 +0,0 @@ - -global: - # imagePullSecrets: - # - name: "" - serviceAccountName: placeholderServiceAccount - deploymentMode: oss - extraContainers: [] - database: - secretName: "" - secretValue: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - -enabled: true -## metrics.replicaCount Number of metrics-reporter replicas -replicaCount: 1 - -## metrics.image.repository The repository to use for the airbyte metrics-reporter image. -## metrics.image.pullPolicy the pull policy to use for the airbyte metrics-reporter image -## metrics.image.tag The airbyte metrics-reporter image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/metrics-reporter - pullPolicy: IfNotPresent - -## metrics.podAnnotations [object] Add extra annotations to the metrics-reporter pod -## -podAnnotations: {} - -## metrics.podLabels [object] Add extra labels to the metrics-reporter pod -## -podLabels: {} - -## metrics.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## metrics-reporter app resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## metrics.resources.limits [object] The resources limits for the metrics-reporter container -## metrics.resources.requests [object] The requested resources for the metrics-reporter container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## metrics.nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## metrics.tolerations [array] Tolerations for metrics-reporter pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## metrics.affinity [object] Affinity and anti-affinity for metrics-reporter pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## metrics.extraEnv [array] Additional env vars for metrics-reporter pod(s). -## Example: -## -## extraEnv: -## - name: SAMPLE_ENV_VAR -## value: "key=sample-value" -extraEnv: [] - -## metrics.extraVolumeMounts [array] Additional volumeMounts for metrics-reporter container(s). -## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## metrics.extraVolumes [array] Additional volumes for metrics-reporter pod(s). -## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -extraContainers: [] - -secrets: {} - -env_vars: {} diff --git a/airbyte-v1-notused/charts/pod-sweeper-1.2.0.tgz b/airbyte-v1-notused/charts/pod-sweeper-1.2.0.tgz deleted file mode 100644 index 9fbd245688d85f29f33db4536a803f986c1a0c3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19381 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 A{{R30 diff --git a/airbyte-v1-notused/charts/pod-sweeper/.gitignore b/airbyte-v1-notused/charts/pod-sweeper/.gitignore deleted file mode 100644 index 88e91e8a..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Charts are downloaded at install time with `helm dep build`. -charts diff --git a/airbyte-v1-notused/charts/pod-sweeper/Chart.yaml b/airbyte-v1-notused/charts/pod-sweeper/Chart.yaml deleted file mode 100644 index 919123a9..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-pod-sweeper -name: pod-sweeper -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/pod-sweeper/README.md b/airbyte-v1-notused/charts/pod-sweeper/README.md deleted file mode 100644 index cc34eedd..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# pod-sweeper - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-pod-sweeper - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| enabled | bool | `true` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.jobs.kube.annotations | object | `{}` | | -| global.jobs.kube.main_container_image_pull_secret | string | `""` | | -| global.jobs.kube.nodeSelector | object | `{}` | | -| global.jobs.kube.tolerations | list | `[]` | | -| global.jobs.resources.limits | object | `{}` | | -| global.jobs.resources.requests | object | `{}` | | -| global.logs.accessKey.existingSecret | string | `""` | | -| global.logs.accessKey.existingSecretKey | string | `""` | | -| global.logs.accessKey.password | string | `"minio"` | | -| global.logs.gcs.bucket | string | `""` | | -| global.logs.gcs.credentials | string | `""` | | -| global.logs.gcs.credentialsJson | string | `""` | | -| global.logs.minio.enabled | bool | `true` | | -| global.logs.s3.bucket | string | `"airbyte-dev-logs"` | | -| global.logs.s3.bucketRegion | string | `""` | | -| global.logs.s3.enabled | bool | `false` | | -| global.logs.secretKey.existingSecret | string | `""` | | -| global.logs.secretKey.existingSecretKey | string | `""` | | -| global.logs.secretKey.password | string | `"minio123"` | | -| global.secretName | string | `""` | | -| global.serviceAccountName | string | `"airbyte-admin"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"bitnami/kubectl"` | | -| image.tag | string | `"latest"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `5` | | -| livenessProbe.periodSeconds | int | `30` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| namespace | string | `""` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `5` | | -| readinessProbe.periodSeconds | int | `30` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| timeToDeletePods.running | string | `""` | | -| timeToDeletePods.succeeded | int | `120` | | -| timeToDeletePods.unsuccessful | int | `1440` | | -| tolerations | list | `[]` | | - diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl b/airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl deleted file mode 100644 index 847ec7b4..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/templates/_helpers.tpl +++ /dev/null @@ -1,59 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Define db secret -*/}} - -{{- define "database.secret.name" -}} -{{- printf "%s-postgresql" .Release.Name }} -{{- end }} diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl b/airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml b/airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml deleted file mode 100644 index 96ce9350..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/templates/configmap.yaml +++ /dev/null @@ -1,73 +0,0 @@ ---- - -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }}-sweep-pod-script - namespace: {{ .Values.namespace | default .Release.Namespace }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - -data: - sweep-pod.sh: | - #!/bin/bash - get_job_pods () { - kubectl -n ${KUBE_NAMESPACE} -L airbyte -l airbyte=job-pod \ - get pods \ - -o=jsonpath='{range .items[*]} {.metadata.name} {.status.phase} {.status.conditions[0].lastTransitionTime} {.status.startTime}{"\n"}{end}' - } - delete_pod() { - printf "From status '%s' since '%s', " $2 $3 - echo "$1" | grep -v "STATUS" | awk '{print $1}' | xargs --no-run-if-empty kubectl -n ${KUBE_NAMESPACE} delete pod - } - while : - do - echo "Starting pod sweeper cycle:" - - if [ -n "${RUNNING_TTL_MINUTES}" ]; then - # Time window for running pods - RUNNING_DATE_STR=`date -d "now - ${RUNNING_TTL_MINUTES} minutes" --utc -Ins` - RUNNING_DATE=`date -d $RUNNING_DATE_STR +%s` - echo "Will sweep running pods from before ${RUNNING_DATE_STR}" - fi - - if [ -n "${SUCCEEDED_TTL_MINUTES}" ]; then - # Shorter time window for succeeded pods - SUCCESS_DATE_STR=`date -d "now - ${SUCCEEDED_TTL_MINUTES} minutes" --utc -Ins` - SUCCESS_DATE=`date -d $SUCCESS_DATE_STR +%s` - echo "Will sweep succeeded pods from before ${SUCCESS_DATE_STR}" - fi - - if [ -n "${UNSUCCESSFUL_TTL_MINUTES}" ]; then - # Longer time window for unsuccessful pods (to debug) - NON_SUCCESS_DATE_STR=`date -d "now - ${UNSUCCESSFUL_TTL_MINUTES} minutes" --utc -Ins` - NON_SUCCESS_DATE=`date -d $NON_SUCCESS_DATE_STR +%s` - echo "Will sweep unsuccessful pods from before ${NON_SUCCESS_DATE_STR}" - fi - ( - IFS=$'\n' - for POD in `get_job_pods`; do - IFS=' ' - POD_NAME=`echo $POD | cut -d " " -f 1` - POD_STATUS=`echo $POD | cut -d " " -f 2` - POD_DATE_STR=`echo $POD | cut -d " " -f 3` - POD_START_DATE_STR=`echo $POD | cut -d " " -f 4` - POD_DATE=`date -d ${POD_DATE_STR:-$POD_START_DATE_STR} '+%s'` - if [ -n "${RUNNING_TTL_MINUTES}" ] && [ "$POD_STATUS" = "Running" ]; then - if [ "$POD_DATE" -lt "$RUNNING_DATE" ]; then - delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" - fi - elif [ -n "${SUCCEEDED_TTL_MINUTES}" ] && [ "$POD_STATUS" = "Succeeded" ]; then - if [ "$POD_DATE" -lt "$SUCCESS_DATE" ]; then - delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" - fi - elif [ -n "${UNSUCCESSFUL_TTL_MINUTES}" ] && [ "$POD_STATUS" != "Running" ] && [ "$POD_STATUS" != "Succeeded" ]; then - if [ "$POD_DATE" -lt "$NON_SUCCESS_DATE" ]; then - delete_pod "$POD_NAME" "$POD_STATUS" "$POD_DATE_STR" - fi - fi - done - ) - echo "Completed pod sweeper cycle. Sleeping for 60 seconds..." - sleep 60 - done diff --git a/airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml b/airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml deleted file mode 100644 index 374b9a4f..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/templates/deployment.yaml +++ /dev/null @@ -1,105 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - namespace: {{ .Values.namespace | default .Release.Namespace }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - namespace: {{ .Values.namespace | default .Release.Namespace }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - annotations: - checksum/sweep-pod-script: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - {{- if .Values.podAnnotations }} - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - containers: - - name: airbyte-pod-sweeper - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - - name: KUBE_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: RUNNING_TTL_MINUTES - value: "{{ .Values.timeToDeletePods.running }}" - - name: SUCCEEDED_TTL_MINUTES - value: "{{ .Values.timeToDeletePods.succeeded }}" - - name: UNSUCCESSFUL_TTL_MINUTES - value: "{{ .Values.timeToDeletePods.unsuccessful }}" - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - - mountPath: /script/sweep-pod.sh - subPath: sweep-pod.sh - name: sweep-pod-script - - mountPath: /.kube - name: kube-config - command: ["/bin/bash", "-c", /script/sweep-pod.sh] - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - exec: - command: - - /bin/sh - - -ec - - grep -aq sweep-pod.sh /proc/1/cmdline - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - exec: - command: - - /bin/sh - - -ec - - grep -aq sweep-pod.sh /proc/1/cmdline - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - - name: kube-config - emptyDir: {} - - name: sweep-pod-script - configMap: - name: {{ include "common.names.fullname" . }}-sweep-pod-script - defaultMode: 0755 diff --git a/airbyte-v1-notused/charts/pod-sweeper/values.yaml b/airbyte-v1-notused/charts/pod-sweeper/values.yaml deleted file mode 100644 index fa4bb8a6..00000000 --- a/airbyte-v1-notused/charts/pod-sweeper/values.yaml +++ /dev/null @@ -1,120 +0,0 @@ -## global.serviceAccountName Name of service account to be associated with service -global: - serviceAccountName: &service-account-name "airbyte-admin" - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - -enabled: true -## podSweeper.image.repository The image repository to use for the pod sweeper -## podSweeper.image.pullPolicy The pull policy for the pod sweeper image -## podSweeper.image.tag The pod sweeper image tag to use -image: - repository: bitnami/kubectl - pullPolicy: IfNotPresent - tag: latest - -## podSweeper.podAnnotations [object] Add extra annotations to the podSweeper pod -## -podAnnotations: {} - -## podSweeper.podLabels [object] Add extra labels to the podSweeper pod -## -podLabels: {} - -## podSweeper.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the podSweeper containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## podSweeper.livenessProbe.enabled Enable livenessProbe on the podSweeper -## podSweeper.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## podSweeper.livenessProbe.periodSeconds Period seconds for livenessProbe -## podSweeper.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## podSweeper.livenessProbe.failureThreshold Failure threshold for livenessProbe -## podSweeper.livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 30 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## podSweeper.readinessProbe.enabled Enable readinessProbe on the podSweeper -## podSweeper.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## podSweeper.readinessProbe.periodSeconds Period seconds for readinessProbe -## podSweeper.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## podSweeper.readinessProbe.failureThreshold Failure threshold for readinessProbe -## podSweeper.readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 30 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## Pod Sweeper app resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## podSweeper.resources.limits [object] The resources limits for the podSweeper container -## podSweeper.resources.requests [object] The requested resources for the podSweeper container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## podSweeper.nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## podSweeper.tolerations [array] Tolerations for podSweeper pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## podSweeper.affinity [object] Affinity and anti-affinity for podSweeper pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## Pod TTLs in minutes -## pod-sweeper will skip over pods with any status types with no TTL set (empty string) -## Pod Status docs: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase -## -## podSweeper.timeToDeletePods.running Time to remove pods on running status (minutes). -## podSweeper.timeToDeletePods.succeeded Time to remove pods on succeeded status (minutes). -## podSweeper.timeToDeletePods.unsuccessful Time to remove pods on neither running nor succeeded status (minutes). -timeToDeletePods: - running: "" - succeeded: 10 - ## 2 hours - generally long enough for someone trying to reproduce an error to debug. - unsuccessful: 120 - -replicaCount: 1 - -## namespace [string] namespace to deploy pod-sweeper at -namespace: "" diff --git a/airbyte-v1-notused/charts/server-1.2.0.tgz b/airbyte-v1-notused/charts/server-1.2.0.tgz deleted file mode 100644 index 5134142478762aaef32659cb290c639e73e396c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22346 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 diff --git a/airbyte-v1-notused/charts/temporal-ui/Chart.yaml b/airbyte-v1-notused/charts/temporal-ui/Chart.yaml deleted file mode 100644 index 590c8b4b..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-temporal-ui -name: temporal-ui -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore b/airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore deleted file mode 100644 index 50af0317..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml b/airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml deleted file mode 100644 index 39edbb3c..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.17.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: Bitnami - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -- https://www.bitnami.com/ -type: library -version: 1.17.1 diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/README.md b/airbyte-v1-notused/charts/temporal-ui/charts/common/README.md deleted file mode 100644 index a2ecd604..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/README.md +++ /dev/null @@ -1,350 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 1.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | -| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | -| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | -| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | -| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|-----------------------------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Input | -|-----------------------------------|-----------------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | -| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ - -## License - -Copyright © 2022 Bitnami - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl deleted file mode 100644 index 2387be26..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 9d9b7600..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,154 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e3..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc72..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl deleted file mode 100644 index 8caf73a6..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,68 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl deleted file mode 100644 index 1bdac8b7..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_names.tpl +++ /dev/null @@ -1,70 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- if .Values.namespaceOverride -}} -{{- .Values.namespaceOverride -}} -{{- else -}} -{{- .Release.Namespace -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl deleted file mode 100644 index a53fb44f..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,140 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key }} - {{- else }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db16685..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl deleted file mode 100644 index 8c22b2a3..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index ded1ae3b..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index b6906ff7..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index f820ec10..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index 74472a06..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 164ec0d0..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index dcccfc1a..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf4..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml b/airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml deleted file mode 100644 index f2df68e5..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl b/airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl deleted file mode 100644 index 7be7bc1a..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/templates/_helpers.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl b/airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml b/airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml deleted file mode 100644 index 06a07ea5..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/templates/deployment.yaml +++ /dev/null @@ -1,124 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} - {{- end }} - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.extraInitContainers }} - initContainers: - {{- toYaml .Values.extraInitContainers | nindent 6 }} - {{- end }} - containers: - - name: airbyte-temporal-ui - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compability(if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 8 }} - {{- end }} - - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /v1/health - port: http - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - httpGet: - path: /v1/health - port: http - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - - ports: - - name: http - containerPort: 8080 - protocol: TCP - {{- if .Values.debug.enabled }} - - name: debug - containerPort: {{ .Values.debug.remoteDebugPort }} - protocol: TCP - {{- end}} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - {{- if .Values.extraVolumeMounts }} - {{ toYaml .Values.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.global.extraVolumeMounts }} - {{ toYaml .Values.global.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 6 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 6 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - {{- if .Values.extraVolumes }} - {{ toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal-ui/templates/service.yaml b/airbyte-v1-notused/charts/temporal-ui/templates/service.yaml deleted file mode 100644 index 93d2c3eb..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/templates/service.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: {{.Release.Name }}-airbyte-temporal-ui-svc - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "airbyte.selectorLabels" . | nindent 4 }} diff --git a/airbyte-v1-notused/charts/temporal-ui/values.yaml b/airbyte-v1-notused/charts/temporal-ui/values.yaml deleted file mode 100644 index 9430941d..00000000 --- a/airbyte-v1-notused/charts/temporal-ui/values.yaml +++ /dev/null @@ -1,194 +0,0 @@ -global: - serviceAccountName: placeholderServiceAccount - deploymentMode: oss - deploymentStrategyType: RollingUpdate - configMapName: "" - secretName: "" - credVolumeOverride: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - -enabled: false -## replicaCount Number of server replicas -replicaCount: 1 - -## image.repository The repository to use for the airbyte server image. -## image.pullPolicy the pull policy to use for the airbyte server image -## image.tag The airbyte server image tag. Defaults to the chart's AppVersion -image: - repository: temporalio/ui - pullPolicy: IfNotPresent - tag: 2.30.1 - -## podAnnotations [object] Add extra annotations to the server pod -## -podAnnotations: {} - -## containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the server containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## livenessProbe.enabled Enable livenessProbe on the server -## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## livenessProbe.periodSeconds Period seconds for livenessProbe -## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## livenessProbe.failureThreshold Failure threshold for livenessProbe -## livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## readinessProbe.enabled Enable readinessProbe on the server -## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## readinessProbe.periodSeconds Period seconds for readinessProbe -## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## readinessProbe.failureThreshold Failure threshold for readinessProbe -## readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## Server app resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## resources.limits [object] The resources limits for the server container -## resources.requests [object] The requested resources for the server container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## service.type The service type to use for the API server -## service.port The service port to expose the API server on -service: - type: NodePort - port: 80 - annotations: {} - -## nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## tolerations [array] Tolerations for server pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## affinity [object] Affinity and anti-affinity for server pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## log.level The log level to log at -log: - level: "INFO" - -## extraVolumeMounts [array] Additional volumeMounts for server container(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## extraVolumes [array] Additional volumes for server pod(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: AIRBYTE_VERSION -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: AIRBYTE_VERSION -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 -env_vars: - TEMPORAL_ADDRESS: ab-temporal:7233 - -debug: - enabled: false - remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/charts/temporal/.gitignore b/airbyte-v1-notused/charts/temporal/.gitignore deleted file mode 100644 index 88e91e8a..00000000 --- a/airbyte-v1-notused/charts/temporal/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Charts are downloaded at install time with `helm dep build`. -charts diff --git a/airbyte-v1-notused/charts/temporal/Chart.yaml b/airbyte-v1-notused/charts/temporal/Chart.yaml deleted file mode 100644 index 468bee38..00000000 --- a/airbyte-v1-notused/charts/temporal/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-temporal -name: temporal -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/temporal/README.md b/airbyte-v1-notused/charts/temporal/README.md deleted file mode 100644 index 036ddee1..00000000 --- a/airbyte-v1-notused/charts/temporal/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# temporal - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-temporal - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| enabled | bool | `true` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.configMapName | string | `""` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.deploymentMode | string | `"oss"` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.secretName | string | `""` | | -| global.serviceAccountName | string | `"placeholderServiceAccount"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"temporalio/auto-setup"` | | -| image.tag | string | `"1.23.0"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `5` | | -| livenessProbe.periodSeconds | int | `30` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `5` | | -| readinessProbe.periodSeconds | int | `30` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| service.port | int | `7233` | | -| service.type | string | `"ClusterIP"` | | -| tolerations | list | `[]` | | - diff --git a/airbyte-v1-notused/charts/temporal/templates/_helpers.tpl b/airbyte-v1-notused/charts/temporal/templates/_helpers.tpl deleted file mode 100644 index 847ec7b4..00000000 --- a/airbyte-v1-notused/charts/temporal/templates/_helpers.tpl +++ /dev/null @@ -1,59 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Define db secret -*/}} - -{{- define "database.secret.name" -}} -{{- printf "%s-postgresql" .Release.Name }} -{{- end }} diff --git a/airbyte-v1-notused/charts/temporal/templates/_images.tpl b/airbyte-v1-notused/charts/temporal/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/temporal/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/temporal/templates/configmap.yaml b/airbyte-v1-notused/charts/temporal/templates/configmap.yaml deleted file mode 100644 index 5f4b89fe..00000000 --- a/airbyte-v1-notused/charts/temporal/templates/configmap.yaml +++ /dev/null @@ -1,54 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }}-dynamicconfig - labels: - {{- include "airbyte.labels" . | nindent 4 }} -data: - "development.yaml": | - # when modifying, remember to update the docker-compose version of this file in temporal/dynamicconfig/development.yaml - frontend.enableClientVersionCheck: - - value: true - constraints: {} - history.persistenceMaxQPS: - - value: 3000 - constraints: {} - frontend.persistenceMaxQPS: - - value: 3000 - constraints: {} - frontend.historyMgrNumConns: - - value: 30 - constraints: {} - frontend.throttledLogRPS: - - value: 20 - constraints: {} - frontend.enableUpdateWorkflowExecution: - - value: true - frontend.enableUpdateWorkflowExecutionAsyncAccepted: - - value: true - history.historyMgrNumConns: - - value: 50 - constraints: {} - system.advancedVisibilityWritingMode: - - value: "off" - constraints: {} - history.defaultActivityRetryPolicy: - - value: - InitialIntervalInSeconds: 1 - MaximumIntervalCoefficient: 100.0 - BackoffCoefficient: 2.0 - MaximumAttempts: 0 - history.defaultWorkflowRetryPolicy: - - value: - InitialIntervalInSeconds: 1 - MaximumIntervalCoefficient: 100.0 - BackoffCoefficient: 2.0 - MaximumAttempts: 0 - # Limit for responses. This mostly impacts discovery jobs since they have the largest responses. - limit.blobSize.error: - - value: 15728640 # 15MB - constraints: {} - limit.blobSize.warn: - - value: 10485760 # 10MB - constraints: {} diff --git a/airbyte-v1-notused/charts/temporal/templates/deployment.yaml b/airbyte-v1-notused/charts/temporal/templates/deployment.yaml deleted file mode 100644 index 83643ecd..00000000 --- a/airbyte-v1-notused/charts/temporal/templates/deployment.yaml +++ /dev/null @@ -1,162 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} - {{- end }} - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} -{{- if .Values.extraInitContainers }} - initContainers: -{{- toYaml .Values.extraInitContainers | nindent 6 }} -{{- end }} - containers: - - name: airbyte-temporal - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - {{- if eq .Values.global.deploymentMode "oss"}} - - name: AUTO_SETUP - value: "true" - - name: DB # The DB engine to use - value: "postgresql" - - name: DYNAMIC_CONFIG_FILE_PATH - value: "config/dynamicconfig/development.yaml" - - {{- include "airbyte.temporal.database.envs" . | nindent 10 }} - - {{- end }} - - {{- if eq .Values.global.database.type "external" }} - # Assume an external database requires SSL. - - name: POSTGRES_TLS_ENABLED - value: "false" - - name: POSTGRES_TLS_DISABLE_HOST_VERIFICATION - value: "false" - - name: SQL_TLS_ENABLED - value: "false" - - name: SQL_TLS_DISABLE_HOST_VERIFICATION - value: "false" - - name: SQL_SSL_MODE - value: "disable" - {{- end }} - - {{- if .Values.extraEnv }} - {{ .Values.extraEnv | toYaml | nindent 10 }} - {{- end }} - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: temporal-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - ports: - - containerPort: 7233 - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - - name: airbyte-temporal-dynamicconfig - mountPath: "/etc/temporal/config/dynamicconfig/" - {{- if .Values.extraVolumeMounts }} - {{ toYaml .Values.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - exec: - command: - - /bin/sh - - -ec - - 'test $(ps -ef | grep -v grep | grep temporal-server | wc -l) -eq 1' - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - exec: - command: - - /bin/sh - - -ec - - 'test $(ps -ef | grep -v grep | grep temporal-server | wc -l) -eq 1' - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 6 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 6 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - - name: airbyte-temporal-dynamicconfig - configMap: - name: {{ include "common.names.fullname" . }}-dynamicconfig - items: - - key: development.yaml - path: development.yaml - {{- if .Values.extraVolumes }} - {{ toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/temporal/templates/secrets.yaml b/airbyte-v1-notused/charts/temporal/templates/secrets.yaml deleted file mode 100644 index f77d1ff1..00000000 --- a/airbyte-v1-notused/charts/temporal/templates/secrets.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Create secrets only for the local deployment -{{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: temporal-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/temporal/templates/service.yaml b/airbyte-v1-notused/charts/temporal/templates/service.yaml deleted file mode 100644 index 39f13632..00000000 --- a/airbyte-v1-notused/charts/temporal/templates/service.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ .Release.Name }}-temporal - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - protocol: TCP - targetPort: 7233 - selector: - {{- include "airbyte.selectorLabels" . | nindent 4 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/temporal/values.yaml b/airbyte-v1-notused/charts/temporal/values.yaml deleted file mode 100644 index 64f90af2..00000000 --- a/airbyte-v1-notused/charts/temporal/values.yaml +++ /dev/null @@ -1,193 +0,0 @@ -global: - serviceAccountName: placeholderServiceAccount - deploymentMode: oss - configMapName: "" - secretName: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - type: internal - secretName: "" - secretValue: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - -enabled: true -## temporal.replicaCount The number of temporal replicas to deploy -replicaCount: 1 - -## temporal.image.repository The temporal image repository to use -## temporal.image.pullPolicy The pull policy for the temporal image -## temporal.image.tag The temporal image tag to use -image: - repository: temporalio/auto-setup - pullPolicy: IfNotPresent - tag: "1.23.0" - -## temporal.service.type The Kubernetes Service Type -## temporal.service.port The temporal port and exposed kubernetes port -service: - type: ClusterIP - port: 7233 - -## temporal.podAnnotations [object] Add extra annotations to the temporal pod -## -podAnnotations: {} - -## temporal.podLabels [object] Add extra labels to the temporal pod -## -podLabels: {} - -## temporal.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## temporal.extraInitContainers Additional InitContainers to initialize the pod -## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraInitContainers: -## - name: config-loader -## image: temporalio/auto-setup:1.23 -## command: -## - /bin/sh -## - -c -## - >- -## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; -## volumeMounts: -## - name: config -## mountPath: /config -extraInitContainers: [] - -## Configure extra options for the temporal containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## temporal.livenessProbe.enabled Enable livenessProbe on the temporal -## temporal.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## temporal.livenessProbe.periodSeconds Period seconds for livenessProbe -## temporal.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## temporal.livenessProbe.failureThreshold Failure threshold for livenessProbe -## temporal.livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 30 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## temporal.readinessProbe.enabled Enable readinessProbe on the temporal -## temporal.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## temporal.readinessProbe.periodSeconds Period seconds for readinessProbe -## temporal.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## temporal.readinessProbe.failureThreshold Failure threshold for readinessProbe -## temporal.readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 5 - periodSeconds: 30 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## temporal.nodeSelector [object] Node labels for temporal pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## temporal.tolerations [array] Tolerations for temporal pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## temporal.affinity [object] Affinity and anti-affinity for temporal pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## temporal.extraEnv [array] Additional env vars for temporal pod(s). -## Example: -## -## extraEnv: -## - name: SAMPLE_ENV_VAR -## value: "key=sample-value" -extraEnv: [] - -## temporal.extraVolumeMounts [array] Additional volumeMounts for temporal container(s). -## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## - name: config -## mountPath: /etc/temporal/config -## -extraVolumeMounts: [] - -## temporal.extraVolumes [array] Additional volumes for temporal pod(s). -## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## - name: config -## emptyDir: {} -## -extraVolumes: [] - -## Temporal resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## temporal.resources.limits [object] The resources limits for temporal pod(s) -## temporal.resources.requests [object] The requested resources for temporal pod(s) -resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - -extraContainers: [] - -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example with default vars for webapp: -# env_vars: - -# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db -# DB: airbyte-db-svc -# DB_PORT: 5432 -# DATABASE_DB: airbyte -# POSTGRES_USER: airbyte -# POSTGRES_PWD: 12345 - -env_vars: {} - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} diff --git a/airbyte-v1-notused/charts/webapp-1.2.0.tgz b/airbyte-v1-notused/charts/webapp-1.2.0.tgz deleted file mode 100644 index 93e6d157d408dde448e14e5f12e2b3a529569c9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20452 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.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $.Release.Name }}-airbyte-webapp-svc - port: - number: {{ $svcPort }} - {{- else }} - serviceName: {{ $fullName }}-svc - servicePort: {{ $svcPort }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/webapp/templates/secrets.yaml b/airbyte-v1-notused/charts/webapp/templates/secrets.yaml deleted file mode 100644 index 8ac24955..00000000 --- a/airbyte-v1-notused/charts/webapp/templates/secrets.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Create secrets only for the local deployment -{{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: webapp-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/webapp/templates/service.yaml b/airbyte-v1-notused/charts/webapp/templates/service.yaml deleted file mode 100644 index a4ccded3..00000000 --- a/airbyte-v1-notused/charts/webapp/templates/service.yaml +++ /dev/null @@ -1,29 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ .Release.Name }}-airbyte-webapp-svc - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - {{ if and (eq .Values.service.type "NodePort") (.Values.service.nodePort) }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - selector: - {{- include "airbyte.selectorLabels" . | nindent 4 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} - {{- end }} - {{- if .Values.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} diff --git a/airbyte-v1-notused/charts/webapp/values.yaml b/airbyte-v1-notused/charts/webapp/values.yaml deleted file mode 100644 index aedb5076..00000000 --- a/airbyte-v1-notused/charts/webapp/values.yaml +++ /dev/null @@ -1,261 +0,0 @@ -global: - serviceAccountName: placeholderServiceAccount - deploymentMode: oss - configMapName: "" - secretName: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - -enabled: true -## webapp.replicaCount Number of webapp replicas -replicaCount: 1 - -## webapp.image.repository The repository to use for the airbyte webapp image. -## webapp.image.pullPolicy the pull policy to use for the airbyte webapp image -## webapp.image.tag The airbyte webapp image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/webapp - pullPolicy: IfNotPresent - -## webapp.podAnnotations [object] Add extra annotations to the webapp pod(s) -## -podAnnotations: {} - -## webapp.podLabels [object] Add extra labels to the webapp pod(s) -## -podLabels: {} - -## webapp.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the webapp containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## webapp.livenessProbe.enabled Enable livenessProbe on the webapp -## webapp.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## webapp.livenessProbe.periodSeconds Period seconds for livenessProbe -## webapp.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## webapp.livenessProbe.failureThreshold Failure threshold for livenessProbe -## webapp.livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## webapp.readinessProbe.enabled Enable readinessProbe on the webapp -## webapp.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## webapp.readinessProbe.periodSeconds Period seconds for readinessProbe -## webapp.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## webapp.readinessProbe.failureThreshold Failure threshold for readinessProbe -## webapp.readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## webapp.service.type The service type to use for the webapp service -## webapp.service.port The service port to expose the webapp on -## webapp.service.annotations Annotations for the webapp service resource -service: - type: ClusterIP - port: 80 - annotations: {} - -## Web app resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## webapp.resources.limits [object] The resources limits for the Web container -## webapp.resources.requests [object] The requested resources for the Web container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## webapp.nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## webapp.tolerations [array] Tolerations for webapp pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## webapp.affinity [object] Affinity and anti-affinity for webapp pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## Configure the ingress resource that allows you to access the Airbyte installation. -## ref: http://kubernetes.io/docs/user-guide/ingress/ -## webapp.ingress.enabled Set to true to enable ingress record generation -## webapp.ingress.className Specifies ingressClassName for clusters >= 1.18+ -## webapp.ingress.annotations [object] Ingress annotations done as key:value pairs -## webapp.ingress.hosts The list of hostnames to be covered with this ingress record. -## webapp.ingress.tls [array] Custom ingress TLS configuration -ingress: - enabled: false - className: "" - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: [] - # - host: chart-example.local - # paths: - # - path: / - # pathType: ImplementationSpecific - - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -## webapp.api.url The webapp API url. -api: - url: /api/v1/ - -## webapp.fullstory.enabled Whether or not to enable fullstory -fullstory: - enabled: false - - -## webapp.extraVolumeMounts [array] Additional volumeMounts for webapp container(s). -## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: var-run -## mountPath: /var/run/ -## - name: var-cache-nginx -## mountPath: /var/cache/nginx -## - mountPath: /etc/nginx/conf.d -## name: nginx-conf-d -## -extraVolumeMounts: [] - -## webapp.extraVolumes [array] Additional volumes for webapp pod(s). -## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: var-run -## emptyDir: {} -## - name: var-cache-nginx -## emptyDir: {} -## - name: nginx-conf-d -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: POSTGRES_USER -# valueFrom: -# secretKeyRef: -# name: airbyte-secrets -# key: DATABASE_USER -# - name: POSTGRES_PWD -# valueFrom: -# secretKeyRef: -# name: airbyte-secrets -# key: DATABASE_PASSWORD -# - name: DYNAMIC_CONFIG_FILE_PATH -# value: "config/dynamicconfig/development.yaml" -# - name: DB -# value: "postgresql" -# - name: DB_PORT -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: DATABASE_PORT -# - name: POSTGRES_SEEDS -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: DATABASE_HOST -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example with default vars for webapp: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Miscellaneous -# TRACKING_STRATEGY: segment -# API_URL: /api/v1/ -# AIRBYTE_SERVER_HOST: airbyte-server-svc:8001 - -env_vars: {} - - - - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} diff --git a/airbyte-v1-notused/charts/worker-1.2.0.tgz b/airbyte-v1-notused/charts/worker-1.2.0.tgz deleted file mode 100644 index 6dff1d446e2d213837a6b1b83eade1bf4d793062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22793 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 diff --git a/airbyte-v1-notused/charts/worker/.gitignore b/airbyte-v1-notused/charts/worker/.gitignore deleted file mode 100644 index 88e91e8a..00000000 --- a/airbyte-v1-notused/charts/worker/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Charts are downloaded at install time with `helm dep build`. -charts diff --git a/airbyte-v1-notused/charts/worker/Chart.yaml b/airbyte-v1-notused/charts/worker/Chart.yaml deleted file mode 100644 index 7af3b504..00000000 --- a/airbyte-v1-notused/charts/worker/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-worker -name: worker -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/worker/README.md b/airbyte-v1-notused/charts/worker/README.md deleted file mode 100644 index a9d1b210..00000000 --- a/airbyte-v1-notused/charts/worker/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# worker - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-worker - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| debug.enabled | bool | `false` | | -| debug.remoteDebugPort | int | `5005` | | -| enabled | bool | `true` | | -| env_vars.CONTAINER_ORCHESTRATOR_ENABLED | bool | `true` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.credVolumeOverride | string | `""` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.edition | string | `"community"` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.jobs.kube.annotations | object | `{}` | | -| global.jobs.kube.images.busybox | string | `""` | | -| global.jobs.kube.images.curl | string | `""` | | -| global.jobs.kube.labels | object | `{}` | | -| global.jobs.kube.main_container_image_pull_secret | string | `""` | | -| global.jobs.kube.nodeSelector | object | `{}` | | -| global.jobs.kube.tolerations | list | `[]` | | -| global.jobs.resources.limits | object | `{}` | | -| global.jobs.resources.requests | object | `{}` | | -| global.secretName | string | `""` | | -| global.serviceAccountName | string | `"airbyte-admin"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/worker"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `50` | | -| livenessProbe.periodSeconds | int | `10` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| log.level | string | `"INFO"` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `10` | | -| readinessProbe.periodSeconds | int | `10` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| tolerations | list | `[]` | | -| workloadApi | object | `{}` | | - diff --git a/airbyte-v1-notused/charts/worker/templates/_helpers.tpl b/airbyte-v1-notused/charts/worker/templates/_helpers.tpl deleted file mode 100644 index b8ac92f8..00000000 --- a/airbyte-v1-notused/charts/worker/templates/_helpers.tpl +++ /dev/null @@ -1,242 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Define db secret -*/}} - -{{- define "database.secret.name" -}} -{{- printf "%s-postgresql" .Release.Name }} -{{- end }} - -## DEFAULT HELM VALUES -# Secret Manager Defaults -{{/* -Define secret persistence -*/}} -{{- define "airbyte.secretPersistence" -}} -{{- if (((.Values.global).secretsManager).type) }} - {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} -{{- else }} - {{- printf "" }} -{{- end }} -{{- end }} - -{{/* -Get secret store name or default -*/}} -{{- define "airbyte.secretStoreName" -}} -{{- $secretStoreName := . -}} -{{- if $secretStoreName -}} - {{- printf "%s" $secretStoreName -}} -{{- else -}} - {{- printf "airbyte-config-secrets" -}} -{{- end -}} -{{- end -}} - -{{/* -Get awsSecretManager access key id secret key or default -*/}} -{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} -{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} -{{- if $awsSecretManagerAccessKeyIdSecretKey -}} - {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "aws-secret-manager-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get awsSecretManager secret access key secret key or default -*/}} -{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} -{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} -{{- if $awsSecretManagerSecretAccessKeySecretKey -}} - {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "aws-secret-manager-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get googleSecretManager credentials secret key or default -*/}} -{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} -{{- $googleSecretManagerCredentialsSecretKey := . -}} -{{- if $googleSecretManagerCredentialsSecretKey -}} - {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} -{{- else -}} - {{- printf "google-secret-manager-credentials" -}} -{{- end -}} -{{- end -}} - -{{/* -Get vault auth token secret key or default -*/}} -{{- define "airbyte.vaultAuthTokenSecretKey" -}} -{{- $vaultAuthTokenSecretKey := . -}} -{{- if $vaultAuthTokenSecretKey -}} - {{- printf "%s" $vaultAuthTokenSecretKey -}} -{{- else -}} - {{- printf "vault-auth-token" -}} -{{- end -}} -{{- end -}} - - -# Storage Defaults -{{/* -Get storage type or default -*/}} -{{- define "airbyte.storageType" -}} -{{- $storageType := . -}} -{{- if $storageType -}} - {{- printf "%s" $storageType -}} -{{- else -}} - {{- printf "local" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket log or default -*/}} -{{- define "airbyte.storageBucketLog" -}} -{{- $storageBucketLog := . -}} -{{- if $storageBucketLog -}} - {{- printf "%s" $storageBucketLog -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket state or default -*/}} -{{- define "airbyte.storageBucketState" -}} -{{- $storageBucketState := . -}} -{{- if $storageBucketState -}} - {{- printf "%s" $storageBucketState -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket workload output or default -*/}} -{{- define "airbyte.storageBucketWorkloadOutput" -}} -{{- $storageBucketWorkloadOutput := . -}} -{{- if $storageBucketWorkloadOutput -}} - {{- printf "%s" $storageBucketWorkloadOutput -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get s3 access key id secret key or default -*/}} -{{- define "airbyte.s3AccessKeyIdSecretKey" -}} -{{- $s3AccessKeyIdSecretKey := . -}} -{{- if $s3AccessKeyIdSecretKey -}} - {{- printf "%s" $s3AccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "s3-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get s3 secret access key secret key or default -*/}} -{{- define "airbyte.s3SecretAccessKeySecretKey" -}} -{{- $s3SecretAccessKeySecretKey := . -}} -{{- if $s3SecretAccessKeySecretKey -}} - {{- printf "%s" $s3SecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "s3-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get minio access key id secret key or default -*/}} -{{- define "airbyte.minioAccessKeyIdSecretKey" -}} -{{- $minioAccessKeyIdSecretKey := . -}} -{{- if $minioAccessKeyIdSecretKey -}} - {{- printf "%s" $minioAccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "minio-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get minio secret access key secret key or default -*/}} -{{- define "airbyte.minioSecretAccessKeySecretKey" -}} -{{- $minioSecretAccessKeySecretKey := . -}} -{{- if $minioSecretAccessKeySecretKey -}} - {{- printf "%s" $minioSecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "minio-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get gcs credentials secret key or default -*/}} -{{- define "airbyte.gcsCredentialsSecretKey" -}} -{{- $gcsCredentialsSecretKey := . -}} -{{- if $gcsCredentialsSecretKey -}} - {{- printf "%s" $gcsCredentialsSecretKey -}} -{{- else -}} - {{- printf "gcs-credentials" -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/worker/templates/_images.tpl b/airbyte-v1-notused/charts/worker/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/worker/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/worker/templates/deployment.yaml b/airbyte-v1-notused/charts/worker/templates/deployment.yaml deleted file mode 100644 index ad46daeb..00000000 --- a/airbyte-v1-notused/charts/worker/templates/deployment.yaml +++ /dev/null @@ -1,500 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} - {{- end }} - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - automountServiceAccountToken: true - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.extraInitContainers }} - initContainers: - {{- toYaml .Values.extraInitContainers | nindent 6 }} - {{- end }} - containers: - - name: airbyte-worker-container - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - {{- if .Values.debug.enabled }} - - name: JAVA_TOOL_OPTIONS - value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" - {{- end}} - {{- if eq .Values.global.deploymentMode "oss" }} - - name: AIRBYTE_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_VERSION - - name: CONFIG_ROOT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONFIG_ROOT - {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} - - name: CONTAINER_ORCHESTRATOR_SECRET_MOUNT_PATH - value: "/secrets/gcs-log-creds" - - name: CONTAINER_ORCHESTRATOR_SECRET_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} - {{- end }} - {{- include "airbyte.logging.envs" . | nindent 8 }} - - name: MICROMETER_METRICS_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_ENABLED - - name: MICROMETER_METRICS_STATSD_FLAVOR - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_STATSD_FLAVOR - - name: SEGMENT_WRITE_KEY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: SEGMENT_WRITE_KEY - - name: STATSD_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_HOST - - name: STATSD_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_PORT - - name: TRACKING_STRATEGY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TRACKING_STRATEGY - - name: WORKSPACE_DOCKER_MOUNT - value: workspace - - name: WORKSPACE_ROOT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKSPACE_ROOT - - name: WEBAPP_URL - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WEBAPP_URL - - name: TEMPORAL_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_HOST - - name: TEMPORAL_WORKER_PORTS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_WORKER_PORTS - - name: JOB_KUBE_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: JOB_KUBE_SERVICEACCOUNT - value: {{ .Values.global.serviceAccountName }} - {{- if $.Values.global.jobs.kube.annotations }} - - name: JOB_KUBE_ANNOTATIONS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_ANNOTATIONS - {{- end }} - {{- if $.Values.global.jobs.kube.labels }} - - name: JOB_KUBE_LABELS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_LABELS - {{- end }} - {{- if $.Values.global.jobs.kube.nodeSelector }} - - name: JOB_KUBE_NODE_SELECTORS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_NODE_SELECTORS - {{- end }} - {{- if $.Values.global.jobs.kube.tolerations }} - - name: JOB_KUBE_TOLERATIONS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_TOLERATIONS - {{- end }} - - name: JOB_KUBE_BUSYBOX_IMAGE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_BUSYBOX_IMAGE - - name: JOB_KUBE_CURL_IMAGE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_CURL_IMAGE - {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} - - name: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - {{- end }} - - name: JOB_MAIN_CONTAINER_CPU_REQUEST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_CPU_REQUEST - - name: JOB_MAIN_CONTAINER_CPU_LIMIT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_CPU_LIMIT - - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_MEMORY_REQUEST - - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_MEMORY_LIMIT - - name: INTERNAL_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: INTERNAL_API_HOST - - name: WORKLOAD_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKLOAD_API_HOST - - name: WORKLOAD_API_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} - key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} - - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - - name: METRIC_CLIENT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: METRIC_CLIENT - - name: OTEL_COLLECTOR_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: OTEL_COLLECTOR_ENDPOINT - - name: ACTIVITY_MAX_ATTEMPT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: ACTIVITY_MAX_ATTEMPT - - name: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS - - name: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS - - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS - - name: SHOULD_RUN_NOTIFY_WORKFLOWS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: SHOULD_RUN_NOTIFY_WORKFLOWS - - name: MICRONAUT_ENVIRONMENTS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKERS_MICRONAUT_ENVIRONMENTS - {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} - - name: AIRBYTE_API_AUTH_HEADER_NAME - value: "X-Airbyte-Auth" - - name: AIRBYTE_API_AUTH_HEADER_VALUE - value: "Internal worker" - {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} - # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just - # splitting into two separate blocks for readability. - - name: AIRBYTE_API_AUTH_HEADER_NAME - value: "X-Airbyte-Auth" - - name: AIRBYTE_API_AUTH_HEADER_VALUE - value: "Internal worker" - {{- end }} - # SECRETS MANAGER - - name: SECRET_PERSISTENCE - value: {{ include "airbyte.secretPersistence" . }} - # Values for awsSecretManager - {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} - - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} - - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} - {{- end }} - {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} - - name: AWS_SECRET_MANAGER_REGION - value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} - {{- end }} - - {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} - - name: AWS_SECRET_MANAGER_SECRET_TAGS - value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} - {{- end }} - {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} - - name: AWS_KMS_KEY_ARN - value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} - {{- end }} - - # Values for Azure Key Vault - {{- if (((.Values.global).secretsManager).azureKeyVault) }} - - - name: AB_AZURE_KEY_VAULT_VAULT_URL - value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} - - - name: AB_AZURE_KEY_VAULT_TENANT_ID - value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} - - - name: AB_AZURE_KEY_VAULT_CLIENT_ID - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} - - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} - - {{- end }} - - {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} - - name: AB_AZURE_KEY_VAULT_TAGS - value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} - {{- end }} - - # Values for googleSecretManager secrets - {{- if (((.Values.global).secretsManager).googleSecretManager) }} - - name: SECRET_STORE_GCP_PROJECT_ID - value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} - - name: SECRET_STORE_GCP_CREDENTIALS - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} - {{- end }} - - # Values for vault secrets - {{- if (((.Values.global).secretsManager).vault) }} - - name: VAULT_ADDRESS - value: {{ (((.Values.global).secretsManager).vault).address }} - - name: VAULT_PREFIX - value: {{ (((.Values.global).secretsManager).vault).prefix }} - - name: VAULT_AUTH_TOKEN - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} - {{- end }} - - # Storage - {{- include "airbyte.storage.envs" . | nindent 8 }} - - # Database - {{- include "airbyte.database.envs" . | nindent 8 }} - - {{- end }} - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: worker-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compatibility (if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 8 }} - {{- end }} - - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: / - port: heartbeat - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - httpGet: - path: / - port: heartbeat - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - ports: - {{- if .Values.debug.enabled }} - - name: debug - containerPort: {{ .Values.debug.remoteDebugPort }} - protocol: TCP - {{- end}} - - name: heartbeat - containerPort: 9000 # for heartbeat server - - containerPort: 9001 # start temporal worker port pool - - containerPort: 9002 - - containerPort: 9003 - - containerPort: 9004 - - containerPort: 9005 - - containerPort: 9006 - - containerPort: 9007 - - containerPort: 9008 - - containerPort: 9009 - - containerPort: 9010 - - containerPort: 9011 - - containerPort: 9012 - - containerPort: 9013 - - containerPort: 9014 - - containerPort: 9015 - - containerPort: 9016 - - containerPort: 9017 - - containerPort: 9018 - - containerPort: 9019 - - containerPort: 9020 - - containerPort: 9021 - - containerPort: 9022 - - containerPort: 9023 - - containerPort: 9024 - - containerPort: 9025 - - containerPort: 9026 - - containerPort: 9027 - - containerPort: 9028 - - containerPort: 9029 - - containerPort: 9030 # end temporal worker port pool - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - {{- if eq (lower .Values.global.storage.type) "local" }} - - name: airbyte-storage - mountPath: /storage - {{- end }} - {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} - - name: gcs-log-creds-volume - mountPath: /secrets/gcs-log-creds - readOnly: true - {{- end }} - {{- if .Values.extraVolumeMounts }} -{{- toYaml .Values.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.global.extraVolumeMounts }} -{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 6 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 6 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - {{- if eq (lower .Values.global.storage.type) "local" }} - - name: airbyte-storage - persistentVolumeClaim: - claimName: airbyte-storage-pvc - {{- end }} - {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} - - name: gcs-log-creds-volume - secret: - secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} - {{- end }} - {{- if .Values.extraVolumes }} -{{- toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} - {{- if .Values.global.extraVolumes }} -{{- toYaml .Values.global.extraVolumes | nindent 6 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/worker/templates/secrets.yaml b/airbyte-v1-notused/charts/worker/templates/secrets.yaml deleted file mode 100644 index 93bb0c63..00000000 --- a/airbyte-v1-notused/charts/worker/templates/secrets.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Create secrets only for the local deployment -{{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: worker-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/worker/values.yaml b/airbyte-v1-notused/charts/worker/values.yaml deleted file mode 100644 index b05d279e..00000000 --- a/airbyte-v1-notused/charts/worker/values.yaml +++ /dev/null @@ -1,294 +0,0 @@ -global: - serviceAccountName: &service-account-name "airbyte-admin" - edition: community - credVolumeOverride: "" - secretName: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - - storage: - type: minio - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - - jobs: - ## Jobs resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - ## jobs.resources.limits [object] The resources limits for jobs - ## jobs.resources.requests [object] The requested resources for jobs - resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - - kube: - ## JOB_KUBE_ANNOTATIONS - ## pod annotations of the sync job and the default pod annotations fallback for others jobs - ## jobs.kube.annotations [object] key/value annotations applied to kube jobs - annotations: {} - - ## JOB_KUBE_LABELS - ## pod labels of the sync job and the default pod labels fallback for others jobs - ## jobs.kube.labels [object] key/value labels applied to kube jobs - labels: {} - - ## JOB_KUBE_NODE_SELECTORS - ## pod node selector of the sync job and the default pod node selector fallback for others jobs - ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs - nodeSelector: {} - - ## JOB_KUBE_TOLERATIONS - ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## any boolean values should be quoted to ensure the value is passed through as a string, eg: - ## - key: airbyte-server - ## operator: Equal - ## value: "true" - ## effect: NoSchedule - tolerations: [] - - ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - ## image pull secret to use for job pod - ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod - main_container_image_pull_secret: "" - - images: - ## JOB_KUBE_BUSYBOX_IMAGE - ## busybox image used by the job pod - ## jobs.kube.images.busybox [string] busybox image used by the job pod - busybox: "" - ## JOB_KUBE_CURL_IMAGE - ## curl image used by the job pod - ## jobs.kube.images.curl [string] curl image used by the job pod - curl: "" - -enabled: true -## worker.replicaCount Number of worker replicas -replicaCount: 1 - -## worker.image.repository The repository to use for the airbyte worker image. -## worker.image.pullPolicy the pull policy to use for the airbyte worker image -## worker.image.tag The airbyte worker image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/worker - pullPolicy: IfNotPresent - -## worker.podAnnotations [object] Add extra annotations to the worker pod(s) -## -podAnnotations: {} - -## worker.podLabels [object] Add extra labels to the worker pod(s) -## -podLabels: {} - -## worker.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the worker containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## worker.livenessProbe.enabled Enable livenessProbe on the worker -## worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## worker.livenessProbe.periodSeconds Period seconds for livenessProbe -## worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## worker.livenessProbe.failureThreshold Failure threshold for livenessProbe -## worker.livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 50 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## worker.readinessProbe.enabled Enable readinessProbe on the worker -## worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## worker.readinessProbe.periodSeconds Period seconds for readinessProbe -## worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## worker.readinessProbe.failureThreshold Failure threshold for readinessProbe -## worker.readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## worker resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## worker.resources.limits [object] The resources limits for the worker container -## worker.resources.requests [object] The requested resources for the worker container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## worker.nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## worker.tolerations [array] Tolerations for worker pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## worker.affinity [object] Affinity and anti-affinity for worker pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## worker.log.level The log level to log at. -log: - level: "INFO" - - - -## worker.extraVolumeMounts [array] Additional volumeMounts for worker container(s). -## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## worker.extraVolumes [array] Additional volumes for worker pod(s). -## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: AIRBYTE_VERSION -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: AIRBYTE_VERSION -# - name: API_URL -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: API_URL -# - name: TRACKING_STRATEGY -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: TRACKING_STRATEGY -# - name: FULLSTORY -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: FULLSTORY -# - name: INTERNAL_API_HOST -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: INTERNAL_API_HOST -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example with default values for worker: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db -# DATABASE_HOST: airbyte-db-svc -# DATABASE_PORT: 5432 -# DATABASE_DB: airbyte -# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} -# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte -# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 -# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 -env_vars: - CONTAINER_ORCHESTRATOR_ENABLED: true - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} - -## workloadApi: -## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored -## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored -workloadApi: {} - -debug: - enabled: false - remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/charts/workload-api-server-1.2.0.tgz b/airbyte-v1-notused/charts/workload-api-server-1.2.0.tgz deleted file mode 100644 index 3045136182ac2afd04fa8518d925d46417b7fa6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20958 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 R{}%uN|Nk`TkJA7I0svcyUMc_p diff --git a/airbyte-v1-notused/charts/workload-api-server/.gitignore b/airbyte-v1-notused/charts/workload-api-server/.gitignore deleted file mode 100644 index 88e91e8a..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Charts are downloaded at install time with `helm dep build`. -charts diff --git a/airbyte-v1-notused/charts/workload-api-server/Chart.yaml b/airbyte-v1-notused/charts/workload-api-server/Chart.yaml deleted file mode 100644 index f63ba3ff..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy the workload-api service -name: workload-api-server -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/workload-api-server/README.md b/airbyte-v1-notused/charts/workload-api-server/README.md deleted file mode 100644 index 7c1e72e6..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# workload-api-server - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy the workload-api service - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| debug.enabled | bool | `false` | | -| debug.remoteDebugPort | int | `5005` | | -| enabled | bool | `false` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.configMapName | string | `""` | | -| global.credVolumeOverride | string | `""` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.deploymentMode | string | `"oss"` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.logs.accessKey.existingSecret | string | `""` | | -| global.logs.accessKey.existingSecretKey | string | `""` | | -| global.logs.accessKey.password | string | `"minio"` | | -| global.logs.gcs.bucket | string | `""` | | -| global.logs.gcs.credentials | string | `""` | | -| global.logs.gcs.credentialsJson | string | `""` | | -| global.logs.minio.enabled | bool | `true` | | -| global.logs.s3.bucket | string | `"airbyte-dev-logs"` | | -| global.logs.s3.bucketRegion | string | `""` | | -| global.logs.s3.enabled | bool | `false` | | -| global.logs.secretKey.existingSecret | string | `""` | | -| global.logs.secretKey.existingSecretKey | string | `""` | | -| global.logs.secretKey.password | string | `"minio123"` | | -| global.secretName | string | `""` | | -| global.serviceAccountName | string | `"placeholderServiceAccount"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/workload-api-server"` | | -| ingress.annotations | object | `{}` | | -| ingress.className | string | `""` | | -| ingress.enabled | bool | `false` | | -| ingress.hosts | list | `[]` | | -| ingress.tls | list | `[]` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `60` | | -| livenessProbe.periodSeconds | int | `10` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| log.level | string | `"INFO"` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `30` | | -| readinessProbe.periodSeconds | int | `10` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| service.annotations | object | `{}` | | -| service.port | int | `8007` | | -| service.type | string | `"ClusterIP"` | | -| tolerations | list | `[]` | | -| workloadApi | object | `{}` | | - diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl b/airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl deleted file mode 100644 index 847ec7b4..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/templates/_helpers.tpl +++ /dev/null @@ -1,59 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Define db secret -*/}} - -{{- define "database.secret.name" -}} -{{- printf "%s-postgresql" .Release.Name }} -{{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl b/airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml b/airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml deleted file mode 100644 index 9eb4fcdd..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/templates/deployment.yaml +++ /dev/null @@ -1,208 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - minReadySeconds: 30 - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} - {{- end }} - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 0 - maxSurge: 100% - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.extraInitContainers }} - initContainers: - {{- toYaml .Values.extraInitContainers | nindent 6 }} - {{- end }} - containers: - - name: airbyte-workload-api-server-container - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - {{- if .Values.debug.enabled }} - - name: JAVA_TOOL_OPTIONS - value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" - {{- end }} - {{- if eq .Values.global.deploymentMode "oss" }} - - name: AIRBYTE_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_VERSION - - name: INTERNAL_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: INTERNAL_API_HOST - - name: AIRBYTE_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_API_HOST - - name: MICROMETER_METRICS_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_ENABLED - - name: MICROMETER_METRICS_STATSD_FLAVOR - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_STATSD_FLAVOR - - name: STATSD_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_HOST - - name: STATSD_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_PORT - - name: TEMPORAL_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_HOST - - name: WORKLOAD_API_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} - key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} - # Database - {{- include "airbyte.database.envs" . | nindent 8 }} - - {{- end }} - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: workload-api-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compability(if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 8 }} - {{- end }} - - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /health/liveness - port: http - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - httpGet: - path: /health/liveness - port: http - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - - ports: - - name: http - containerPort: 8007 - protocol: TCP - {{- if .Values.debug.enabled }} - - name: debug - containerPort: {{ .Values.debug.remoteDebugPort }} - protocol: TCP - {{- end }} - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} - - name: gcs-log-creds-volume - mountPath: /secrets/gcs-log-creds - readOnly: true - {{- end }} - {{- if .Values.extraVolumeMounts }} -{{- toYaml .Values.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.global.extraVolumeMounts }} -{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 8 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 8 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} - - name: gcs-log-creds-volume - secret: - secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} - {{- end }} - {{- if .Values.extraVolumes }} - {{- toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} - {{- if .Values.global.extraVolumes }} - {{- toYaml .Values.global.extraVolumes | nindent 6 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml b/airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml deleted file mode 100644 index 03e6f309..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/templates/secrets.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Create secrets only for the local deployment - {{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: workload-api-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} - {{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/templates/service.yaml b/airbyte-v1-notused/charts/workload-api-server/templates/service.yaml deleted file mode 100644 index 7319b2e2..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/templates/service.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{.Release.Name }}-workload-api-server-svc - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "airbyte.selectorLabels" . | nindent 4 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 4 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/workload-api-server/values.yaml b/airbyte-v1-notused/charts/workload-api-server/values.yaml deleted file mode 100644 index 2c378abc..00000000 --- a/airbyte-v1-notused/charts/workload-api-server/values.yaml +++ /dev/null @@ -1,281 +0,0 @@ -global: - serviceAccountName: placeholderServiceAccount - deploymentMode: oss - edition: community - configMapName: "" - secretName: "" - credVolumeOverride: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - - logs: - ## logs.accessKey.password Logs Access Key - ## logs.accessKey.existingSecret - ## logs.accessKey.existingSecretKey - accessKey: - password: minio - existingSecret: "" - existingSecretKey: "" - ## logs.secretKey.password Logs Secret Key - ## logs.secretKey.existingSecret - ## logs.secretKey.existingSecretKey - secretKey: - password: minio123 - existingSecret: "" - existingSecretKey: "" - - ## logs.minio.enabled Switch to enable or disable the Minio helm chart - minio: - enabled: true - - ## logs.s3.enabled Switch to enable or disable custom S3 Log location - ## logs.s3.bucket Bucket name where logs should be stored - ## logs.s3.bucketRegion Region of the bucket (must be empty if using minio) - s3: - enabled: false - bucket: airbyte-dev-logs - bucketRegion: "" - - ## Google Cloud Storage (GCS) Log Location Configuration - ## logs.gcs.bucket GCS bucket name - ## logs.gcs.credentials The path the GCS creds are written to - ## logs.gcs.credentialsJson Base64 encoded json GCP credentials file contents - gcs: - bucket: "" - # If you are mounting an existing secret to extraVolumes on scheduler, server and worker - # deployments, then set credentials to the path of the mounted JSON file - credentials: "" - # If credentialsJson is set then credentials auto resolves (to /secrets/gcs-log-creds/gcp.json) - credentialsJson: "" - -enabled: true -## replicaCount Number of server replicas -replicaCount: 1 - -## image.repository The repository to use for the airbyte workload api server image. -## image.pullPolicy the pull policy to use for the airbyte workload api server image -## image.tag The airbyte workload api server image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/workload-api-server - pullPolicy: IfNotPresent - -## podAnnotations [object] Add extra annotations to the server pod -## -podAnnotations: {} - -## podLabels [object] Add extra labels to the server pod -## -podLabels: {} - -## containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the server containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## livenessProbe.enabled Enable livenessProbe on the server -## livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## livenessProbe.periodSeconds Period seconds for livenessProbe -## livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## livenessProbe.failureThreshold Failure threshold for livenessProbe -## livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 60 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## readinessProbe.enabled Enable readinessProbe on the server -## readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## readinessProbe.periodSeconds Period seconds for readinessProbe -## readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## readinessProbe.failureThreshold Failure threshold for readinessProbe -## readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## Server app resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## resources.limits [object] The resources limits for the server container -## resources.requests [object] The requested resources for the server container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## service.type The service type to use for the API server -## service.port The service port to expose the API server on -service: - type: ClusterIP - port: 8007 - annotations: {} - -## nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## tolerations [array] Tolerations for server pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## affinity [object] Affinity and anti-affinity for server pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## Configure the ingress resource that allows you to access the Airbyte API. -## ref: http://kubernetes.io/docs/user-guide/ingress/ -## webapp.ingress.enabled Set to true to enable ingress record generation -## webapp.ingress.className Specifies ingressClassName for clusters >= 1.18+ -## webapp.ingress.annotations [object] Ingress annotations done as key:value pairs -## webapp.ingress.hosts The list of hostnames to be covered with this ingress record. -## webapp.ingress.tls [array] Custom ingress TLS configuration -ingress: - enabled: false - className: "" - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: [] - # - host: chart-example.local - # paths: - # - path: / - # pathType: ImplementationSpecific - - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -## log.level The log level to log at -log: - level: "INFO" - -## extraVolumeMounts [array] Additional volumeMounts for server container(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## extraVolumes [array] Additional volumes for server pod(s). -## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: AIRBYTE_VERSION -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: AIRBYTE_VERSION -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db -# DATABASE_HOST: airbyte-db-svc -# DATABASE_PORT: 5432 -# DATABASE_DB: airbyte -# # translate manually DATABASE_URL:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT/${DATABASE_DB} -# DATABASE_URL: jdbc:postgresql://airbyte-db-svc:5432/airbyte -# JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.29.15.001 -# CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: 0.35.15.001 -env_vars: {} - - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} - - -## workloadApi: -## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored -## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored -workloadApi: {} - -debug: - enabled: false - remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/charts/workload-launcher-1.2.0.tgz b/airbyte-v1-notused/charts/workload-launcher-1.2.0.tgz deleted file mode 100644 index c32ac33d32901e4164206f4f5c192f7ec0e7af5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23369 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 z 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 diff --git a/airbyte-v1-notused/charts/workload-launcher/.helmignore b/airbyte-v1-notused/charts/workload-launcher/.helmignore deleted file mode 100644 index 0e8a0eb3..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/airbyte-v1-notused/charts/workload-launcher/Chart.yaml b/airbyte-v1-notused/charts/workload-launcher/Chart.yaml deleted file mode 100644 index 3f26dadb..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -appVersion: 1.2.0 -description: Helm chart to deploy airbyte-workload-launcher -name: workload-launcher -type: application -version: 1.2.0 diff --git a/airbyte-v1-notused/charts/workload-launcher/README.md b/airbyte-v1-notused/charts/workload-launcher/README.md deleted file mode 100644 index d636166f..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# workload-launcher - -![Version: 0.67.17](https://img.shields.io/badge/Version-0.67.17-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: dev](https://img.shields.io/badge/AppVersion-dev-informational?style=flat-square) - -Helm chart to deploy airbyte-workload-launcher - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | common | 1.x.x | - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| containerSecurityContext | object | `{}` | | -| debug.enabled | bool | `false` | | -| debug.remoteDebugPort | int | `5005` | | -| enabled | bool | `false` | | -| env_vars | object | `{}` | | -| extraContainers | list | `[]` | | -| extraEnv | list | `[]` | | -| extraInitContainers | list | `[]` | | -| extraLabels | object | `{}` | | -| extraSelectorLabels | object | `{}` | | -| extraVolumeMounts | list | `[]` | | -| extraVolumes | list | `[]` | | -| global.credVolumeOverride | string | `""` | | -| global.database.secretName | string | `""` | | -| global.database.secretValue | string | `""` | | -| global.extraContainers | list | `[]` | | -| global.extraLabels | object | `{}` | | -| global.extraSelectorLabels | object | `{}` | | -| global.jobs.kube.annotations | object | `{}` | | -| global.jobs.kube.images.busybox | string | `""` | | -| global.jobs.kube.images.curl | string | `""` | | -| global.jobs.kube.labels | object | `{}` | | -| global.jobs.kube.main_container_image_pull_secret | string | `""` | | -| global.jobs.kube.nodeSelector | object | `{}` | | -| global.jobs.kube.tolerations | list | `[]` | | -| global.jobs.resources.limits | object | `{}` | | -| global.jobs.resources.requests | object | `{}` | | -| global.secretName | string | `""` | | -| global.serviceAccountName | string | `"airbyte-admin"` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"airbyte/workload-launcher"` | | -| livenessProbe.enabled | bool | `true` | | -| livenessProbe.failureThreshold | int | `3` | | -| livenessProbe.initialDelaySeconds | int | `50` | | -| livenessProbe.periodSeconds | int | `10` | | -| livenessProbe.successThreshold | int | `1` | | -| livenessProbe.timeoutSeconds | int | `1` | | -| log.level | string | `"INFO"` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podLabels | object | `{}` | | -| readinessProbe.enabled | bool | `true` | | -| readinessProbe.failureThreshold | int | `3` | | -| readinessProbe.initialDelaySeconds | int | `10` | | -| readinessProbe.periodSeconds | int | `10` | | -| readinessProbe.successThreshold | int | `1` | | -| readinessProbe.timeoutSeconds | int | `1` | | -| replicaCount | int | `1` | | -| resources.limits | object | `{}` | | -| resources.requests | object | `{}` | | -| secrets | object | `{}` | | -| tolerations | list | `[]` | | -| workloadApi | object | `{}` | | - diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore b/airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore deleted file mode 100644 index 50af0317..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml b/airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml deleted file mode 100644 index 39edbb3c..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/Chart.yaml +++ /dev/null @@ -1,23 +0,0 @@ -annotations: - category: Infrastructure -apiVersion: v2 -appVersion: 1.17.1 -description: A Library Helm Chart for grouping common logic between bitnami charts. - This chart is not deployable by itself. -home: https://github.com/bitnami/charts/tree/master/bitnami/common -icon: https://bitnami.com/downloads/logos/bitnami-mark.png -keywords: -- common -- helper -- template -- function -- bitnami -maintainers: -- name: Bitnami - url: https://github.com/bitnami/charts -name: common -sources: -- https://github.com/bitnami/charts -- https://www.bitnami.com/ -type: library -version: 1.17.1 diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/README.md b/airbyte-v1-notused/charts/workload-launcher/charts/common/README.md deleted file mode 100644 index a2ecd604..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/README.md +++ /dev/null @@ -1,350 +0,0 @@ -# Bitnami Common Library Chart - -A [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between bitnami charts. - -## TL;DR - -```yaml -dependencies: - - name: common - version: 1.x.x - repository: https://charts.bitnami.com/bitnami -``` - -```bash -$ helm dependency update -``` - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "common.names.fullname" . }} -data: - myvalue: "Hello World" -``` - -## Introduction - -This chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager. - -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - -## Prerequisites - -- Kubernetes 1.19+ -- Helm 3.2.0+ - -## Parameters - -The following table lists the helpers available in the library which are scoped in different sections. - -### Affinities - -| Helper identifier | Description | Expected Input | -|-------------------------------|------------------------------------------------------|------------------------------------------------| -| `common.affinities.nodes.soft` | Return a soft nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.nodes.hard` | Return a hard nodeAffinity definition | `dict "key" "FOO" "values" (list "BAR" "BAZ")` | -| `common.affinities.pods.soft` | Return a soft podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | -| `common.affinities.pods.hard` | Return a hard podAffinity/podAntiAffinity definition | `dict "component" "FOO" "context" $` | - -### Capabilities - -| Helper identifier | Description | Expected Input | -|------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------| -| `common.capabilities.kubeVersion` | Return the target Kubernetes version (using client default if .Values.kubeVersion is not set). | `.` Chart context | -| `common.capabilities.cronjob.apiVersion` | Return the appropriate apiVersion for cronjob. | `.` Chart context | -| `common.capabilities.deployment.apiVersion` | Return the appropriate apiVersion for deployment. | `.` Chart context | -| `common.capabilities.statefulset.apiVersion` | Return the appropriate apiVersion for statefulset. | `.` Chart context | -| `common.capabilities.ingress.apiVersion` | Return the appropriate apiVersion for ingress. | `.` Chart context | -| `common.capabilities.rbac.apiVersion` | Return the appropriate apiVersion for RBAC resources. | `.` Chart context | -| `common.capabilities.crd.apiVersion` | Return the appropriate apiVersion for CRDs. | `.` Chart context | -| `common.capabilities.policy.apiVersion` | Return the appropriate apiVersion for podsecuritypolicy. | `.` Chart context | -| `common.capabilities.networkPolicy.apiVersion` | Return the appropriate apiVersion for networkpolicy. | `.` Chart context | -| `common.capabilities.apiService.apiVersion` | Return the appropriate apiVersion for APIService. | `.` Chart context | -| `common.capabilities.hpa.apiVersion` | Return the appropriate apiVersion for Horizontal Pod Autoscaler | `.` Chart context | -| `common.capabilities.supportsHelmVersion` | Returns true if the used Helm version is 3.3+ | `.` Chart context | - -### Errors - -| Helper identifier | Description | Expected Input | -|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| `common.errors.upgrade.passwords.empty` | It will ensure required passwords are given when we are upgrading a chart. If `validationErrors` is not empty it will throw an error and will stop the upgrade action. | `dict "validationErrors" (list $validationError00 $validationError01) "context" $` | - -### Images - -| Helper identifier | Description | Expected Input | -|-----------------------------|------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `common.images.image` | Return the proper and full image name | `dict "imageRoot" .Values.path.to.the.image "global" $`, see [ImageRoot](#imageroot) for the structure. | -| `common.images.pullSecrets` | Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global` | -| `common.images.renderPullSecrets` | Return the proper Docker Image Registry Secret Names (evaluates values as templates) | `dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $` | - -### Ingress - -| Helper identifier | Description | Expected Input | -|-------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.ingress.backend` | Generate a proper Ingress backend entry depending on the API version | `dict "serviceName" "foo" "servicePort" "bar"`, see the [Ingress deprecation notice](https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/) for the syntax differences | -| `common.ingress.supportsPathType` | Prints "true" if the pathType field is supported | `.` Chart context | -| `common.ingress.supportsIngressClassname` | Prints "true" if the ingressClassname field is supported | `.` Chart context | -| `common.ingress.certManagerRequest` | Prints "true" if required cert-manager annotations for TLS signed certificates are set in the Ingress annotations | `dict "annotations" .Values.path.to.the.ingress.annotations` | - -### Labels - -| Helper identifier | Description | Expected Input | -|-----------------------------|-----------------------------------------------------------------------------|-------------------| -| `common.labels.standard` | Return Kubernetes standard labels | `.` Chart context | -| `common.labels.matchLabels` | Labels to use on `deploy.spec.selector.matchLabels` and `svc.spec.selector` | `.` Chart context | - -### Names - -| Helper identifier | Description | Expected Input | -|-----------------------------------|-----------------------------------------------------------------------|-------------------| -| `common.names.name` | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context | -| `common.names.fullname` | Create a default fully qualified app name. | `.` Chart context | -| `common.names.namespace` | Allow the release namespace to be overridden | `.` Chart context | -| `common.names.fullname.namespace` | Create a fully qualified app name adding the installation's namespace | `.` Chart context | -| `common.names.chart` | Chart name plus version | `.` Chart context | - -### Secrets - -| Helper identifier | Description | Expected Input | -|---------------------------|--------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.secrets.name` | Generate the name of the secret. | `dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $` see [ExistingSecret](#existingsecret) for the structure. | -| `common.secrets.key` | Generate secret key. | `dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName"` see [ExistingSecret](#existingsecret) for the structure. | -| `common.passwords.manage` | Generate secret password or retrieve one if already created. | `dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $`, length, strong and chartNAme fields are optional. | -| `common.secrets.exists` | Returns whether a previous generated secret already exists. | `dict "secret" "secret-name" "context" $` | - -### Storage - -| Helper identifier | Description | Expected Input | -|-------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| `common.storage.class` | Return the proper Storage Class | `dict "persistence" .Values.path.to.the.persistence "global" $`, see [Persistence](#persistence) for the structure. | - -### TplValues - -| Helper identifier | Description | Expected Input | -|---------------------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.tplvalues.render` | Renders a value that contains template | `dict "value" .Values.path.to.the.Value "context" $`, value is the value should rendered as template, context frequently is the chart context `$` or `.` | - -### Utils - -| Helper identifier | Description | Expected Input | -|--------------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------| -| `common.utils.fieldToEnvVar` | Build environment variable name given a field. | `dict "field" "my-password"` | -| `common.utils.secret.getvalue` | Print instructions to get a secret value. | `dict "secret" "secret-name" "field" "secret-value-field" "context" $` | -| `common.utils.getValueFromKey` | Gets a value from `.Values` object given its key path | `dict "key" "path.to.key" "context" $` | -| `common.utils.getKeyFromList` | Returns first `.Values` key with a defined value or first of the list if all non-defined | `dict "keys" (list "path.to.key1" "path.to.key2") "context" $` | - -### Validations - -| Helper identifier | Description | Expected Input | -|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `common.validations.values.single.empty` | Validate a value must not be empty. | `dict "valueKey" "path.to.value" "secret" "secret.name" "field" "my-password" "subchart" "subchart" "context" $` secret, field and subchart are optional. In case they are given, the helper will generate a how to get instruction. See [ValidateValue](#validatevalue) | -| `common.validations.values.multiple.empty` | Validate a multiple values must not be empty. It returns a shared error for all the values. | `dict "required" (list $validateValueConf00 $validateValueConf01) "context" $`. See [ValidateValue](#validatevalue) | -| `common.validations.values.mariadb.passwords` | This helper will ensure required password for MariaDB are not empty. It returns a shared error for all the values. | `dict "secret" "mariadb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mariadb chart and the helper. | -| `common.validations.values.mysql.passwords` | This helper will ensure required password for MySQL are not empty. It returns a shared error for all the values. | `dict "secret" "mysql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mysql chart and the helper. | -| `common.validations.values.postgresql.passwords` | This helper will ensure required password for PostgreSQL are not empty. It returns a shared error for all the values. | `dict "secret" "postgresql-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use postgresql chart and the helper. | -| `common.validations.values.redis.passwords` | This helper will ensure required password for Redis® are not empty. It returns a shared error for all the values. | `dict "secret" "redis-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use redis chart and the helper. | -| `common.validations.values.cassandra.passwords` | This helper will ensure required password for Cassandra are not empty. It returns a shared error for all the values. | `dict "secret" "cassandra-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use cassandra chart and the helper. | -| `common.validations.values.mongodb.passwords` | This helper will ensure required password for MongoDB® are not empty. It returns a shared error for all the values. | `dict "secret" "mongodb-secret" "subchart" "true" "context" $` subchart field is optional and could be true or false it depends on where you will use mongodb chart and the helper. | - -### Warnings - -| Helper identifier | Description | Expected Input | -|------------------------------|----------------------------------|------------------------------------------------------------| -| `common.warnings.rollingTag` | Warning about using rolling tag. | `ImageRoot` see [ImageRoot](#imageroot) for the structure. | - -## Special input schemas - -### ImageRoot - -```yaml -registry: - type: string - description: Docker registry where the image is located - example: docker.io - -repository: - type: string - description: Repository and image name - example: bitnami/nginx - -tag: - type: string - description: image tag - example: 1.16.1-debian-10-r63 - -pullPolicy: - type: string - description: Specify a imagePullPolicy. Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' - -pullSecrets: - type: array - items: - type: string - description: Optionally specify an array of imagePullSecrets (evaluated as templates). - -debug: - type: boolean - description: Set to true if you would like to see extra information on logs - example: false - -## An instance would be: -# registry: docker.io -# repository: bitnami/nginx -# tag: 1.16.1-debian-10-r63 -# pullPolicy: IfNotPresent -# debug: false -``` - -### Persistence - -```yaml -enabled: - type: boolean - description: Whether enable persistence. - example: true - -storageClass: - type: string - description: Ghost data Persistent Volume Storage Class, If set to "-", storageClassName: "" which disables dynamic provisioning. - example: "-" - -accessMode: - type: string - description: Access mode for the Persistent Volume Storage. - example: ReadWriteOnce - -size: - type: string - description: Size the Persistent Volume Storage. - example: 8Gi - -path: - type: string - description: Path to be persisted. - example: /bitnami - -## An instance would be: -# enabled: true -# storageClass: "-" -# accessMode: ReadWriteOnce -# size: 8Gi -# path: /bitnami -``` - -### ExistingSecret - -```yaml -name: - type: string - description: Name of the existing secret. - example: mySecret -keyMapping: - description: Mapping between the expected key name and the name of the key in the existing secret. - type: object - -## An instance would be: -# name: mySecret -# keyMapping: -# password: myPasswordKey -``` - -#### Example of use - -When we store sensitive data for a deployment in a secret, some times we want to give to users the possibility of using theirs existing secrets. - -```yaml -# templates/secret.yaml ---- -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "common.names.fullname" . }} - labels: - app: {{ include "common.names.fullname" . }} -type: Opaque -data: - password: {{ .Values.password | b64enc | quote }} - -# templates/dpl.yaml ---- -... - env: - - name: PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "common.secrets.name" (dict "existingSecret" .Values.existingSecret "context" $) }} - key: {{ include "common.secrets.key" (dict "existingSecret" .Values.existingSecret "key" "password") }} -... - -# values.yaml ---- -name: mySecret -keyMapping: - password: myPasswordKey -``` - -### ValidateValue - -#### NOTES.txt - -```console -{{- $validateValueConf00 := (dict "valueKey" "path.to.value00" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value01" "secret" "secretName" "field" "password-01") -}} - -{{ include "common.validations.values.multiple.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} -``` - -If we force those values to be empty we will see some alerts - -```console -$ helm install test mychart --set path.to.value00="",path.to.value01="" - 'path.to.value00' must not be empty, please add '--set path.to.value00=$PASSWORD_00' to the command. To get the current value: - - export PASSWORD_00=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-00}" | base64 -d) - - 'path.to.value01' must not be empty, please add '--set path.to.value01=$PASSWORD_01' to the command. To get the current value: - - export PASSWORD_01=$(kubectl get secret --namespace default secretName -o jsonpath="{.data.password-01}" | base64 -d) -``` - -## Upgrading - -### To 1.0.0 - -[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL. - -**What changes were introduced in this major version?** - -- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field. -- Use `type: library`. [Here](https://v3.helm.sh/docs/faq/#library-chart-support) you can find more information. -- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts - -**Considerations when upgrading to this version** - -- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues -- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore -- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3 - -**Useful links** - -- https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/ -- https://helm.sh/docs/topics/v2_v3_migration/ -- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/ - -## License - -Copyright © 2022 Bitnami - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl deleted file mode 100644 index 2387be26..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_affinities.tpl +++ /dev/null @@ -1,102 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return a soft nodeAffinity definition -{{ include "common.affinities.nodes.soft" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.soft" -}} -preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} - weight: 1 -{{- end -}} - -{{/* -Return a hard nodeAffinity definition -{{ include "common.affinities.nodes.hard" (dict "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes.hard" -}} -requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: {{ .key }} - operator: In - values: - {{- range .values }} - - {{ . | quote }} - {{- end }} -{{- end -}} - -{{/* -Return a nodeAffinity definition -{{ include "common.affinities.nodes" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.nodes" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.nodes.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.nodes.hard" . -}} - {{- end -}} -{{- end -}} - -{{/* -Return a soft podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.soft" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.soft" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 10 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname - weight: 1 -{{- end -}} - -{{/* -Return a hard podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods.hard" (dict "component" "FOO" "extraMatchLabels" .Values.extraMatchLabels "context" $) -}} -*/}} -{{- define "common.affinities.pods.hard" -}} -{{- $component := default "" .component -}} -{{- $extraMatchLabels := default (dict) .extraMatchLabels -}} -requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchLabels: {{- (include "common.labels.matchLabels" .context) | nindent 8 }} - {{- if not (empty $component) }} - {{ printf "app.kubernetes.io/component: %s" $component }} - {{- end }} - {{- range $key, $value := $extraMatchLabels }} - {{ $key }}: {{ $value | quote }} - {{- end }} - namespaces: - - {{ include "common.names.namespace" .context | quote }} - topologyKey: kubernetes.io/hostname -{{- end -}} - -{{/* -Return a podAffinity/podAntiAffinity definition -{{ include "common.affinities.pods" (dict "type" "soft" "key" "FOO" "values" (list "BAR" "BAZ")) -}} -*/}} -{{- define "common.affinities.pods" -}} - {{- if eq .type "soft" }} - {{- include "common.affinities.pods.soft" . -}} - {{- else if eq .type "hard" }} - {{- include "common.affinities.pods.hard" . -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl deleted file mode 100644 index 9d9b7600..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_capabilities.tpl +++ /dev/null @@ -1,154 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Return the target Kubernetes version -*/}} -{{- define "common.capabilities.kubeVersion" -}} -{{- if .Values.global }} - {{- if .Values.global.kubeVersion }} - {{- .Values.global.kubeVersion -}} - {{- else }} - {{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} - {{- end -}} -{{- else }} -{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for poddisruptionbudget. -*/}} -{{- define "common.capabilities.policy.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "policy/v1beta1" -}} -{{- else -}} -{{- print "policy/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "common.capabilities.networkPolicy.apiVersion" -}} -{{- if semverCompare "<1.7-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for cronjob. -*/}} -{{- define "common.capabilities.cronjob.apiVersion" -}} -{{- if semverCompare "<1.21-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "batch/v1beta1" -}} -{{- else -}} -{{- print "batch/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "common.capabilities.deployment.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for statefulset. -*/}} -{{- define "common.capabilities.statefulset.apiVersion" -}} -{{- if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apps/v1beta1" -}} -{{- else -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for ingress. -*/}} -{{- define "common.capabilities.ingress.apiVersion" -}} -{{- if .Values.ingress -}} -{{- if .Values.ingress.apiVersion -}} -{{- .Values.ingress.apiVersion -}} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end }} -{{- else if semverCompare "<1.14-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "networking.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for RBAC resources. -*/}} -{{- define "common.capabilities.rbac.apiVersion" -}} -{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "rbac.authorization.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "rbac.authorization.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for CRDs. -*/}} -{{- define "common.capabilities.crd.apiVersion" -}} -{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiextensions.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiextensions.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for APIService. -*/}} -{{- define "common.capabilities.apiService.apiVersion" -}} -{{- if semverCompare "<1.10-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "apiregistration.k8s.io/v1beta1" -}} -{{- else -}} -{{- print "apiregistration.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for Horizontal Pod Autoscaler. -*/}} -{{- define "common.capabilities.hpa.apiVersion" -}} -{{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .context) -}} -{{- if .beta2 -}} -{{- print "autoscaling/v2beta2" -}} -{{- else -}} -{{- print "autoscaling/v2beta1" -}} -{{- end -}} -{{- else -}} -{{- print "autoscaling/v2" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the used Helm version is 3.3+. -A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure. -This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error. -**To be removed when the catalog's minimun Helm version is 3.3** -*/}} -{{- define "common.capabilities.supportsHelmVersion" -}} -{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl deleted file mode 100644 index a79cc2e3..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_errors.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Through error when upgrading using empty passwords values that must not be empty. - -Usage: -{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}} -{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}} -{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }} - -Required password params: - - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error. - - context - Context - Required. Parent context. -*/}} -{{- define "common.errors.upgrade.passwords.empty" -}} - {{- $validationErrors := join "" .validationErrors -}} - {{- if and $validationErrors .context.Release.IsUpgrade -}} - {{- $errorString := "\nPASSWORDS ERROR: You must provide your current passwords when upgrading the release." -}} - {{- $errorString = print $errorString "\n Note that even after reinstallation, old credentials may be needed as they may be kept in persistent volume claims." -}} - {{- $errorString = print $errorString "\n Further information can be obtained at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases" -}} - {{- $errorString = print $errorString "\n%s" -}} - {{- printf $errorString $validationErrors | fail -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl deleted file mode 100644 index 42ffbc72..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_images.tpl +++ /dev/null @@ -1,75 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper image name -{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }} -*/}} -{{- define "common.images.image" -}} -{{- $registryName := .imageRoot.registry -}} -{{- $repositoryName := .imageRoot.repository -}} -{{- $tag := .imageRoot.tag | toString -}} -{{- if .global }} - {{- if .global.imageRegistry }} - {{- $registryName = .global.imageRegistry -}} - {{- end -}} -{{- end -}} -{{- if $registryName }} -{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- else -}} -{{- printf "%s:%s" $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names (deprecated: use common.images.renderPullSecrets instead) -{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }} -*/}} -{{- define "common.images.pullSecrets" -}} - {{- $pullSecrets := list }} - - {{- if .global }} - {{- range .global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets . -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names evaluating values as templates -{{ include "common.images.renderPullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "context" $) }} -*/}} -{{- define "common.images.renderPullSecrets" -}} - {{- $pullSecrets := list }} - {{- $context := .context }} - - {{- if $context.Values.global }} - {{- range $context.Values.global.imagePullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- range .images -}} - {{- range .pullSecrets -}} - {{- $pullSecrets = append $pullSecrets (include "common.tplvalues.render" (dict "value" . "context" $context)) -}} - {{- end -}} - {{- end -}} - - {{- if (not (empty $pullSecrets)) }} -imagePullSecrets: - {{- range $pullSecrets }} - - name: {{ . }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl deleted file mode 100644 index 8caf73a6..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_ingress.tpl +++ /dev/null @@ -1,68 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* -Generate backend entry that is compatible with all Kubernetes API versions. - -Usage: -{{ include "common.ingress.backend" (dict "serviceName" "backendName" "servicePort" "backendPort" "context" $) }} - -Params: - - serviceName - String. Name of an existing service backend - - servicePort - String/Int. Port name (or number) of the service. It will be translated to different yaml depending if it is a string or an integer. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.ingress.backend" -}} -{{- $apiVersion := (include "common.capabilities.ingress.apiVersion" .context) -}} -{{- if or (eq $apiVersion "extensions/v1beta1") (eq $apiVersion "networking.k8s.io/v1beta1") -}} -serviceName: {{ .serviceName }} -servicePort: {{ .servicePort }} -{{- else -}} -service: - name: {{ .serviceName }} - port: - {{- if typeIs "string" .servicePort }} - name: {{ .servicePort }} - {{- else if or (typeIs "int" .servicePort) (typeIs "float64" .servicePort) }} - number: {{ .servicePort | int }} - {{- end }} -{{- end -}} -{{- end -}} - -{{/* -Print "true" if the API pathType field is supported -Usage: -{{ include "common.ingress.supportsPathType" . }} -*/}} -{{- define "common.ingress.supportsPathType" -}} -{{- if (semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .)) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Returns true if the ingressClassname field is supported -Usage: -{{ include "common.ingress.supportsIngressClassname" . }} -*/}} -{{- define "common.ingress.supportsIngressClassname" -}} -{{- if semverCompare "<1.18-0" (include "common.capabilities.kubeVersion" .) -}} -{{- print "false" -}} -{{- else -}} -{{- print "true" -}} -{{- end -}} -{{- end -}} - -{{/* -Return true if cert-manager required annotations for TLS signed -certificates are set in the Ingress annotations -Ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations -Usage: -{{ include "common.ingress.certManagerRequest" ( dict "annotations" .Values.path.to.the.ingress.annotations ) }} -*/}} -{{- define "common.ingress.certManagerRequest" -}} -{{ if or (hasKey .annotations "cert-manager.io/cluster-issuer") (hasKey .annotations "cert-manager.io/issuer") }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl deleted file mode 100644 index 252066c7..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_labels.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Kubernetes standard labels -*/}} -{{- define "common.labels.standard" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -helm.sh/chart: {{ include "common.names.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector -*/}} -{{- define "common.labels.matchLabels" -}} -app.kubernetes.io/name: {{ include "common.names.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl deleted file mode 100644 index 1bdac8b7..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_names.tpl +++ /dev/null @@ -1,70 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "common.names.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "common.names.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "common.names.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified dependency name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -Usage: -{{ include "common.names.dependency.fullname" (dict "chartName" "dependency-chart-name" "chartValues" .Values.dependency-chart "context" $) }} -*/}} -{{- define "common.names.dependency.fullname" -}} -{{- if .chartValues.fullnameOverride -}} -{{- .chartValues.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .chartName .chartValues.nameOverride -}} -{{- if contains $name .context.Release.Name -}} -{{- .context.Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .context.Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts. -*/}} -{{- define "common.names.namespace" -}} -{{- if .Values.namespaceOverride -}} -{{- .Values.namespaceOverride -}} -{{- else -}} -{{- .Release.Namespace -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified app name adding the installation's namespace. -*/}} -{{- define "common.names.fullname.namespace" -}} -{{- printf "%s-%s" (include "common.names.fullname" .) (include "common.names.namespace" .) | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl deleted file mode 100644 index a53fb44f..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_secrets.tpl +++ /dev/null @@ -1,140 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Generate secret name. - -Usage: -{{ include "common.secrets.name" (dict "existingSecret" .Values.path.to.the.existingSecret "defaultNameSuffix" "mySuffix" "context" $) }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - defaultNameSuffix - String - Optional. It is used only if we have several secrets in the same deployment. - - context - Dict - Required. The context for the template evaluation. -*/}} -{{- define "common.secrets.name" -}} -{{- $name := (include "common.names.fullname" .context) -}} - -{{- if .defaultNameSuffix -}} -{{- $name = printf "%s-%s" $name .defaultNameSuffix | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- with .existingSecret -}} -{{- if not (typeIs "string" .) -}} -{{- with .name -}} -{{- $name = . -}} -{{- end -}} -{{- else -}} -{{- $name = . -}} -{{- end -}} -{{- end -}} - -{{- printf "%s" $name -}} -{{- end -}} - -{{/* -Generate secret key. - -Usage: -{{ include "common.secrets.key" (dict "existingSecret" .Values.path.to.the.existingSecret "key" "keyName") }} - -Params: - - existingSecret - ExistingSecret/String - Optional. The path to the existing secrets in the values.yaml given by the user - to be used instead of the default one. Allows for it to be of type String (just the secret name) for backwards compatibility. - +info: https://github.com/bitnami/charts/tree/master/bitnami/common#existingsecret - - key - String - Required. Name of the key in the secret. -*/}} -{{- define "common.secrets.key" -}} -{{- $key := .key -}} - -{{- if .existingSecret -}} - {{- if not (typeIs "string" .existingSecret) -}} - {{- if .existingSecret.keyMapping -}} - {{- $key = index .existingSecret.keyMapping $.key -}} - {{- end -}} - {{- end }} -{{- end -}} - -{{- printf "%s" $key -}} -{{- end -}} - -{{/* -Generate secret password or retrieve one if already created. - -Usage: -{{ include "common.secrets.passwords.manage" (dict "secret" "secret-name" "key" "keyName" "providedValues" (list "path.to.password1" "path.to.password2") "length" 10 "strong" false "chartName" "chartName" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - key - String - Required - Name of the key in the secret. - - providedValues - List - Required - The path to the validating value in the values.yaml, e.g: "mysql.password". Will pick first parameter with a defined value. - - length - int - Optional - Length of the generated random password. - - strong - Boolean - Optional - Whether to add symbols to the generated random password. - - chartName - String - Optional - Name of the chart used when said chart is deployed as a subchart. - - context - Context - Required - Parent context. - -The order in which this function returns a secret password: - 1. Already existing 'Secret' resource - (If a 'Secret' resource is found under the name provided to the 'secret' parameter to this function and that 'Secret' resource contains a key with the name passed as the 'key' parameter to this function then the value of this existing secret password will be returned) - 2. Password provided via the values.yaml - (If one of the keys passed to the 'providedValues' parameter to this function is a valid path to a key in the values.yaml and has a value, the value of the first key with a value will be returned) - 3. Randomly generated secret password - (A new random secret password with the length specified in the 'length' parameter will be generated and returned) - -*/}} -{{- define "common.secrets.passwords.manage" -}} - -{{- $password := "" }} -{{- $subchart := "" }} -{{- $chartName := default "" .chartName }} -{{- $passwordLength := default 10 .length }} -{{- $providedPasswordKey := include "common.utils.getKeyFromList" (dict "keys" .providedValues "context" $.context) }} -{{- $providedPasswordValue := include "common.utils.getValueFromKey" (dict "key" $providedPasswordKey "context" $.context) }} -{{- $secretData := (lookup "v1" "Secret" $.context.Release.Namespace .secret).data }} -{{- if $secretData }} - {{- if hasKey $secretData .key }} - {{- $password = index $secretData .key }} - {{- else }} - {{- printf "\nPASSWORDS ERROR: The secret \"%s\" does not contain the key \"%s\"\n" .secret .key | fail -}} - {{- end -}} -{{- else if $providedPasswordValue }} - {{- $password = $providedPasswordValue | toString | b64enc | quote }} -{{- else }} - - {{- if .context.Values.enabled }} - {{- $subchart = $chartName }} - {{- end -}} - - {{- $requiredPassword := dict "valueKey" $providedPasswordKey "secret" .secret "field" .key "subchart" $subchart "context" $.context -}} - {{- $requiredPasswordError := include "common.validations.values.single.empty" $requiredPassword -}} - {{- $passwordValidationErrors := list $requiredPasswordError -}} - {{- include "common.errors.upgrade.passwords.empty" (dict "validationErrors" $passwordValidationErrors "context" $.context) -}} - - {{- if .strong }} - {{- $subStr := list (lower (randAlpha 1)) (randNumeric 1) (upper (randAlpha 1)) | join "_" }} - {{- $password = randAscii $passwordLength }} - {{- $password = regexReplaceAllLiteral "\\W" $password "@" | substr 5 $passwordLength }} - {{- $password = printf "%s%s" $subStr $password | toString | shuffle | b64enc | quote }} - {{- else }} - {{- $password = randAlphaNum $passwordLength | b64enc | quote }} - {{- end }} -{{- end -}} -{{- printf "%s" $password -}} -{{- end -}} - -{{/* -Returns whether a previous generated secret already exists - -Usage: -{{ include "common.secrets.exists" (dict "secret" "secret-name" "context" $) }} - -Params: - - secret - String - Required - Name of the 'Secret' resource where the password is stored. - - context - Context - Required - Parent context. -*/}} -{{- define "common.secrets.exists" -}} -{{- $secret := (lookup "v1" "Secret" $.context.Release.Namespace .secret) }} -{{- if $secret }} - {{- true -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl deleted file mode 100644 index 60e2a844..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_storage.tpl +++ /dev/null @@ -1,23 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Return the proper Storage Class -{{ include "common.storage.class" ( dict "persistence" .Values.path.to.the.persistence "global" $) }} -*/}} -{{- define "common.storage.class" -}} - -{{- $storageClass := .persistence.storageClass -}} -{{- if .global -}} - {{- if .global.storageClass -}} - {{- $storageClass = .global.storageClass -}} - {{- end -}} -{{- end -}} - -{{- if $storageClass -}} - {{- if (eq "-" $storageClass) -}} - {{- printf "storageClassName: \"\"" -}} - {{- else }} - {{- printf "storageClassName: %s" $storageClass -}} - {{- end -}} -{{- end -}} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl deleted file mode 100644 index 2db16685..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_tplvalues.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Renders a value that contains template. -Usage: -{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }} -*/}} -{{- define "common.tplvalues.render" -}} - {{- if typeIs "string" .value }} - {{- tpl .value .context }} - {{- else }} - {{- tpl (.value | toYaml) .context }} - {{- end }} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl deleted file mode 100644 index 8c22b2a3..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_utils.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Print instructions to get a secret value. -Usage: -{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }} -*/}} -{{- define "common.utils.secret.getvalue" -}} -{{- $varname := include "common.utils.fieldToEnvVar" . -}} -export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 -d) -{{- end -}} - -{{/* -Build env var name given a field -Usage: -{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }} -*/}} -{{- define "common.utils.fieldToEnvVar" -}} - {{- $fieldNameSplit := splitList "-" .field -}} - {{- $upperCaseFieldNameSplit := list -}} - - {{- range $fieldNameSplit -}} - {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}} - {{- end -}} - - {{ join "_" $upperCaseFieldNameSplit }} -{{- end -}} - -{{/* -Gets a value from .Values given -Usage: -{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }} -*/}} -{{- define "common.utils.getValueFromKey" -}} -{{- $splitKey := splitList "." .key -}} -{{- $value := "" -}} -{{- $latestObj := $.context.Values -}} -{{- range $splitKey -}} - {{- if not $latestObj -}} - {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}} - {{- end -}} - {{- $value = ( index $latestObj . ) -}} - {{- $latestObj = $value -}} -{{- end -}} -{{- printf "%v" (default "" $value) -}} -{{- end -}} - -{{/* -Returns first .Values key with a defined value or first of the list if all non-defined -Usage: -{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }} -*/}} -{{- define "common.utils.getKeyFromList" -}} -{{- $key := first .keys -}} -{{- $reverseKeys := reverse .keys }} -{{- range $reverseKeys }} - {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }} - {{- if $value -}} - {{- $key = . }} - {{- end -}} -{{- end -}} -{{- printf "%s" $key -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl deleted file mode 100644 index ae10fa41..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/_warnings.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Warning about using rolling tag. -Usage: -{{ include "common.warnings.rollingTag" .Values.path.to.the.imageRoot }} -*/}} -{{- define "common.warnings.rollingTag" -}} - -{{- if and (contains "bitnami/" .repository) (not (.tag | toString | regexFind "-r\\d+$|sha256:")) }} -WARNING: Rolling tag detected ({{ .repository }}:{{ .tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment. -+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/ -{{- end }} - -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl deleted file mode 100644 index ded1ae3b..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_cassandra.tpl +++ /dev/null @@ -1,72 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Cassandra required passwords are not empty. - -Usage: -{{ include "common.validations.values.cassandra.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where Cassandra values are stored, e.g: "cassandra-passwords-secret" - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.cassandra.passwords" -}} - {{- $existingSecret := include "common.cassandra.values.existingSecret" . -}} - {{- $enabled := include "common.cassandra.values.enabled" . -}} - {{- $dbUserPrefix := include "common.cassandra.values.key.dbUser" . -}} - {{- $valueKeyPassword := printf "%s.password" $dbUserPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "cassandra-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.cassandra.values.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.cassandra.dbUser.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.dbUser.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled cassandra. - -Usage: -{{ include "common.cassandra.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.cassandra.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.cassandra.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key dbUser - -Usage: -{{ include "common.cassandra.values.key.dbUser" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether Cassandra is used as subchart or not. Default: false -*/}} -{{- define "common.cassandra.values.key.dbUser" -}} - {{- if .subchart -}} - cassandra.dbUser - {{- else -}} - dbUser - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl deleted file mode 100644 index b6906ff7..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mariadb.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MariaDB required passwords are not empty. - -Usage: -{{ include "common.validations.values.mariadb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MariaDB values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mariadb.passwords" -}} - {{- $existingSecret := include "common.mariadb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mariadb.values.enabled" . -}} - {{- $architecture := include "common.mariadb.values.architecture" . -}} - {{- $authPrefix := include "common.mariadb.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mariadb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mariadb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mariadb-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mariadb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mariadb. - -Usage: -{{ include "common.mariadb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mariadb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mariadb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mariadb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mariadb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mariadb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MariaDB is used as subchart or not. Default: false -*/}} -{{- define "common.mariadb.values.key.auth" -}} - {{- if .subchart -}} - mariadb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl deleted file mode 100644 index f820ec10..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mongodb.tpl +++ /dev/null @@ -1,108 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MongoDB® required passwords are not empty. - -Usage: -{{ include "common.validations.values.mongodb.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MongoDB® values are stored, e.g: "mongodb-passwords-secret" - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mongodb.passwords" -}} - {{- $existingSecret := include "common.mongodb.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mongodb.values.enabled" . -}} - {{- $authPrefix := include "common.mongodb.values.key.auth" . -}} - {{- $architecture := include "common.mongodb.values.architecture" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyDatabase := printf "%s.database" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicaSetKey := printf "%s.replicaSetKey" $authPrefix -}} - {{- $valueKeyAuthEnabled := printf "%s.enabled" $authPrefix -}} - - {{- $authEnabled := include "common.utils.getValueFromKey" (dict "key" $valueKeyAuthEnabled "context" .context) -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") (eq $authEnabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mongodb-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- $valueDatabase := include "common.utils.getValueFromKey" (dict "key" $valueKeyDatabase "context" .context) }} - {{- if and $valueUsername $valueDatabase -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mongodb-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replicaset") -}} - {{- $requiredReplicaSetKey := dict "valueKey" $valueKeyReplicaSetKey "secret" .secret "field" "mongodb-replica-set-key" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicaSetKey -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mongodb.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDb is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mongodb. - -Usage: -{{ include "common.mongodb.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mongodb.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mongodb.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mongodb.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.key.auth" -}} - {{- if .subchart -}} - mongodb.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mongodb.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MongoDB® is used as subchart or not. Default: false -*/}} -{{- define "common.mongodb.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mongodb.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl deleted file mode 100644 index 74472a06..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_mysql.tpl +++ /dev/null @@ -1,103 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate MySQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.mysql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where MySQL values are stored, e.g: "mysql-passwords-secret" - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.mysql.passwords" -}} - {{- $existingSecret := include "common.mysql.values.auth.existingSecret" . -}} - {{- $enabled := include "common.mysql.values.enabled" . -}} - {{- $architecture := include "common.mysql.values.architecture" . -}} - {{- $authPrefix := include "common.mysql.values.key.auth" . -}} - {{- $valueKeyRootPassword := printf "%s.rootPassword" $authPrefix -}} - {{- $valueKeyUsername := printf "%s.username" $authPrefix -}} - {{- $valueKeyPassword := printf "%s.password" $authPrefix -}} - {{- $valueKeyReplicationPassword := printf "%s.replicationPassword" $authPrefix -}} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $requiredRootPassword := dict "valueKey" $valueKeyRootPassword "secret" .secret "field" "mysql-root-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRootPassword -}} - - {{- $valueUsername := include "common.utils.getValueFromKey" (dict "key" $valueKeyUsername "context" .context) }} - {{- if not (empty $valueUsername) -}} - {{- $requiredPassword := dict "valueKey" $valueKeyPassword "secret" .secret "field" "mysql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPassword -}} - {{- end -}} - - {{- if (eq $architecture "replication") -}} - {{- $requiredReplicationPassword := dict "valueKey" $valueKeyReplicationPassword "secret" .secret "field" "mysql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.mysql.values.auth.existingSecret" (dict "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.auth.existingSecret" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.auth.existingSecret | quote -}} - {{- else -}} - {{- .context.Values.auth.existingSecret | quote -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled mysql. - -Usage: -{{ include "common.mysql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.mysql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.mysql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for architecture - -Usage: -{{ include "common.mysql.values.architecture" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.architecture" -}} - {{- if .subchart -}} - {{- .context.Values.mysql.architecture -}} - {{- else -}} - {{- .context.Values.architecture -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key auth - -Usage: -{{ include "common.mysql.values.key.auth" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether MySQL is used as subchart or not. Default: false -*/}} -{{- define "common.mysql.values.key.auth" -}} - {{- if .subchart -}} - mysql.auth - {{- else -}} - auth - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl deleted file mode 100644 index 164ec0d0..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_postgresql.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate PostgreSQL required passwords are not empty. - -Usage: -{{ include "common.validations.values.postgresql.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where postgresql values are stored, e.g: "postgresql-passwords-secret" - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.postgresql.passwords" -}} - {{- $existingSecret := include "common.postgresql.values.existingSecret" . -}} - {{- $enabled := include "common.postgresql.values.enabled" . -}} - {{- $valueKeyPostgresqlPassword := include "common.postgresql.values.key.postgressPassword" . -}} - {{- $valueKeyPostgresqlReplicationEnabled := include "common.postgresql.values.key.replicationPassword" . -}} - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - {{- $requiredPostgresqlPassword := dict "valueKey" $valueKeyPostgresqlPassword "secret" .secret "field" "postgresql-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlPassword -}} - - {{- $enabledReplication := include "common.postgresql.values.enabled.replication" . -}} - {{- if (eq $enabledReplication "true") -}} - {{- $requiredPostgresqlReplicationPassword := dict "valueKey" $valueKeyPostgresqlReplicationEnabled "secret" .secret "field" "postgresql-replication-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredPostgresqlReplicationPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to decide whether evaluate global values. - -Usage: -{{ include "common.postgresql.values.use.global" (dict "key" "key-of-global" "context" $) }} -Params: - - key - String - Required. Field to be evaluated within global, e.g: "existingSecret" -*/}} -{{- define "common.postgresql.values.use.global" -}} - {{- if .context.Values.global -}} - {{- if .context.Values.global.postgresql -}} - {{- index .context.Values.global.postgresql .key | quote -}} - {{- end -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for existingSecret. - -Usage: -{{ include "common.postgresql.values.existingSecret" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.existingSecret" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "existingSecret" "context" .context) -}} - - {{- if .subchart -}} - {{- default (.context.Values.postgresql.existingSecret | quote) $globalValue -}} - {{- else -}} - {{- default (.context.Values.existingSecret | quote) $globalValue -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled postgresql. - -Usage: -{{ include "common.postgresql.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.postgresql.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key postgressPassword. - -Usage: -{{ include "common.postgresql.values.key.postgressPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.postgressPassword" -}} - {{- $globalValue := include "common.postgresql.values.use.global" (dict "key" "postgresqlUsername" "context" .context) -}} - - {{- if not $globalValue -}} - {{- if .subchart -}} - postgresql.postgresqlPassword - {{- else -}} - postgresqlPassword - {{- end -}} - {{- else -}} - global.postgresql.postgresqlPassword - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled.replication. - -Usage: -{{ include "common.postgresql.values.enabled.replication" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.enabled.replication" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.postgresql.replication.enabled -}} - {{- else -}} - {{- printf "%v" .context.Values.replication.enabled -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for the key replication.password. - -Usage: -{{ include "common.postgresql.values.key.replicationPassword" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether postgresql is used as subchart or not. Default: false -*/}} -{{- define "common.postgresql.values.key.replicationPassword" -}} - {{- if .subchart -}} - postgresql.replication.password - {{- else -}} - replication.password - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl deleted file mode 100644 index dcccfc1a..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_redis.tpl +++ /dev/null @@ -1,76 +0,0 @@ - -{{/* vim: set filetype=mustache: */}} -{{/* -Validate Redis® required passwords are not empty. - -Usage: -{{ include "common.validations.values.redis.passwords" (dict "secret" "secretName" "subchart" false "context" $) }} -Params: - - secret - String - Required. Name of the secret where redis values are stored, e.g: "redis-passwords-secret" - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.validations.values.redis.passwords" -}} - {{- $enabled := include "common.redis.values.enabled" . -}} - {{- $valueKeyPrefix := include "common.redis.values.keys.prefix" . -}} - {{- $standarizedVersion := include "common.redis.values.standarized.version" . }} - - {{- $existingSecret := ternary (printf "%s%s" $valueKeyPrefix "auth.existingSecret") (printf "%s%s" $valueKeyPrefix "existingSecret") (eq $standarizedVersion "true") }} - {{- $existingSecretValue := include "common.utils.getValueFromKey" (dict "key" $existingSecret "context" .context) }} - - {{- $valueKeyRedisPassword := ternary (printf "%s%s" $valueKeyPrefix "auth.password") (printf "%s%s" $valueKeyPrefix "password") (eq $standarizedVersion "true") }} - {{- $valueKeyRedisUseAuth := ternary (printf "%s%s" $valueKeyPrefix "auth.enabled") (printf "%s%s" $valueKeyPrefix "usePassword") (eq $standarizedVersion "true") }} - - {{- if and (or (not $existingSecret) (eq $existingSecret "\"\"")) (eq $enabled "true") -}} - {{- $requiredPasswords := list -}} - - {{- $useAuth := include "common.utils.getValueFromKey" (dict "key" $valueKeyRedisUseAuth "context" .context) -}} - {{- if eq $useAuth "true" -}} - {{- $requiredRedisPassword := dict "valueKey" $valueKeyRedisPassword "secret" .secret "field" "redis-password" -}} - {{- $requiredPasswords = append $requiredPasswords $requiredRedisPassword -}} - {{- end -}} - - {{- include "common.validations.values.multiple.empty" (dict "required" $requiredPasswords "context" .context) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right value for enabled redis. - -Usage: -{{ include "common.redis.values.enabled" (dict "context" $) }} -*/}} -{{- define "common.redis.values.enabled" -}} - {{- if .subchart -}} - {{- printf "%v" .context.Values.redis.enabled -}} - {{- else -}} - {{- printf "%v" (not .context.Values.enabled) -}} - {{- end -}} -{{- end -}} - -{{/* -Auxiliary function to get the right prefix path for the values - -Usage: -{{ include "common.redis.values.key.prefix" (dict "subchart" "true" "context" $) }} -Params: - - subchart - Boolean - Optional. Whether redis is used as subchart or not. Default: false -*/}} -{{- define "common.redis.values.keys.prefix" -}} - {{- if .subchart -}}redis.{{- else -}}{{- end -}} -{{- end -}} - -{{/* -Checks whether the redis chart's includes the standarizations (version >= 14) - -Usage: -{{ include "common.redis.values.standarized.version" (dict "context" $) }} -*/}} -{{- define "common.redis.values.standarized.version" -}} - - {{- $standarizedAuth := printf "%s%s" (include "common.redis.values.keys.prefix" .) "auth" -}} - {{- $standarizedAuthValues := include "common.utils.getValueFromKey" (dict "key" $standarizedAuth "context" .context) }} - - {{- if $standarizedAuthValues -}} - {{- true -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl b/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl deleted file mode 100644 index 9a814cf4..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/templates/validations/_validations.tpl +++ /dev/null @@ -1,46 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Validate values must not be empty. - -Usage: -{{- $validateValueConf00 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-00") -}} -{{- $validateValueConf01 := (dict "valueKey" "path.to.value" "secret" "secretName" "field" "password-01") -}} -{{ include "common.validations.values.empty" (dict "required" (list $validateValueConf00 $validateValueConf01) "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" -*/}} -{{- define "common.validations.values.multiple.empty" -}} - {{- range .required -}} - {{- include "common.validations.values.single.empty" (dict "valueKey" .valueKey "secret" .secret "field" .field "context" $.context) -}} - {{- end -}} -{{- end -}} - -{{/* -Validate a value must not be empty. - -Usage: -{{ include "common.validations.value.empty" (dict "valueKey" "mariadb.password" "secret" "secretName" "field" "my-password" "subchart" "subchart" "context" $) }} - -Validate value params: - - valueKey - String - Required. The path to the validating value in the values.yaml, e.g: "mysql.password" - - secret - String - Optional. Name of the secret where the validating value is generated/stored, e.g: "mysql-passwords-secret" - - field - String - Optional. Name of the field in the secret data, e.g: "mysql-password" - - subchart - String - Optional - Name of the subchart that the validated password is part of. -*/}} -{{- define "common.validations.values.single.empty" -}} - {{- $value := include "common.utils.getValueFromKey" (dict "key" .valueKey "context" .context) }} - {{- $subchart := ternary "" (printf "%s." .subchart) (empty .subchart) }} - - {{- if not $value -}} - {{- $varname := "my-value" -}} - {{- $getCurrentValue := "" -}} - {{- if and .secret .field -}} - {{- $varname = include "common.utils.fieldToEnvVar" . -}} - {{- $getCurrentValue = printf " To get the current value:\n\n %s\n" (include "common.utils.secret.getvalue" .) -}} - {{- end -}} - {{- printf "\n '%s' must not be empty, please add '--set %s%s=$%s' to the command.%s" .valueKey $subchart .valueKey $varname $getCurrentValue -}} - {{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml b/airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml deleted file mode 100644 index f2df68e5..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/charts/common/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -## bitnami/common -## It is required by CI/CD tools and processes. -## @skip exampleValue -## -exampleValue: common-chart diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl b/airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl deleted file mode 100644 index 933c125b..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/templates/_helpers.tpl +++ /dev/null @@ -1,258 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -## DEFAULT HELM VALUES -# Secret Manager Defaults -{{/* -Define secret persistence -*/}} -{{- define "airbyte.secretPersistence" -}} -{{- if (((.Values.global).secretsManager).type) }} - {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} -{{- else }} - {{- printf "" }} -{{- end }} -{{- end }} - -{{/* -Get secret store name or default -*/}} -{{- define "airbyte.secretStoreName" -}} -{{- $secretStoreName := . -}} -{{- if $secretStoreName -}} - {{- printf "%s" $secretStoreName -}} -{{- else -}} - {{- printf "airbyte-config-secrets" -}} -{{- end -}} -{{- end -}} - -{{/* -Get awsSecretManager access key id secret key or default -*/}} -{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} -{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} -{{- if $awsSecretManagerAccessKeyIdSecretKey -}} - {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "aws-secret-manager-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get awsSecretManager secret access key secret key or default -*/}} -{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} -{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} -{{- if $awsSecretManagerSecretAccessKeySecretKey -}} - {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "aws-secret-manager-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get azureKeyVault clientId or default -*/}} -{{- define "airbyte.azureKeyVaultClientIdSecretKey" -}} -{{- $azureKeyVaultClientIdSecretKey := . -}} -{{- if $azureKeyVaultClientIdSecretKey -}} - {{- printf "%s" $azureKeyVaultClientIdSecretKey -}} -{{- else -}} - {{- printf "azure-key-vault-client-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get azureKeyVault clientSecret or default -*/}} -{{- define "airbyte.azureKeyVaultClientSecretSecretKey" -}} -{{- $azureKeyVaultClientSecretSecretKey := . -}} -{{- if $azureKeyVaultClientSecretSecretKey -}} - {{- printf "%s" $azureKeyVaultClientSecretSecretKey -}} -{{- else -}} - {{- printf "azure-key-vault-client-secret" -}} -{{- end -}} -{{- end -}} - -{{/* -Get googleSecretManager credentials secret key or default -*/}} -{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} -{{- $googleSecretManagerCredentialsSecretKey := . -}} -{{- if $googleSecretManagerCredentialsSecretKey -}} - {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} -{{- else -}} - {{- printf "google-secret-manager-credentials" -}} -{{- end -}} -{{- end -}} - -{{/* -Get vault auth token secret key or default -*/}} -{{- define "airbyte.vaultAuthTokenSecretKey" -}} -{{- $vaultAuthTokenSecretKey := . -}} -{{- if $vaultAuthTokenSecretKey -}} - {{- printf "%s" $vaultAuthTokenSecretKey -}} -{{- else -}} - {{- printf "vault-auth-token" -}} -{{- end -}} -{{- end -}} - - -# Storage Defaults -{{/* -Get storage type or default -*/}} -{{- define "airbyte.storageType" -}} -{{- $storageType := . -}} -{{- if $storageType -}} - {{- printf "%s" $storageType -}} -{{- else -}} - {{- printf "local" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket log or default -*/}} -{{- define "airbyte.storageBucketLog" -}} -{{- $storageBucketLog := . -}} -{{- if $storageBucketLog -}} - {{- printf "%s" $storageBucketLog -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket state or default -*/}} -{{- define "airbyte.storageBucketState" -}} -{{- $storageBucketState := . -}} -{{- if $storageBucketState -}} - {{- printf "%s" $storageBucketState -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket workload output or default -*/}} -{{- define "airbyte.storageBucketWorkloadOutput" -}} -{{- $storageBucketWorkloadOutput := . -}} -{{- if $storageBucketWorkloadOutput -}} - {{- printf "%s" $storageBucketWorkloadOutput -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get s3 access key id secret key or default -*/}} -{{- define "airbyte.s3AccessKeyIdSecretKey" -}} -{{- $s3AccessKeyIdSecretKey := . -}} -{{- if $s3AccessKeyIdSecretKey -}} - {{- printf "%s" $s3AccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "s3-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get s3 secret access key secret key or default -*/}} -{{- define "airbyte.s3SecretAccessKeySecretKey" -}} -{{- $s3SecretAccessKeySecretKey := . -}} -{{- if $s3SecretAccessKeySecretKey -}} - {{- printf "%s" $s3SecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "s3-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get minio access key id secret key or default -*/}} -{{- define "airbyte.minioAccessKeyIdSecretKey" -}} -{{- $minioAccessKeyIdSecretKey := . -}} -{{- if $minioAccessKeyIdSecretKey -}} - {{- printf "%s" $minioAccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "minio-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get minio secret access key secret key or default -*/}} -{{- define "airbyte.minioSecretAccessKeySecretKey" -}} -{{- $minioSecretAccessKeySecretKey := . -}} -{{- if $minioSecretAccessKeySecretKey -}} - {{- printf "%s" $minioSecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "minio-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get gcs credentials secret key or default -*/}} -{{- define "airbyte.gcsCredentialsSecretKey" -}} -{{- $gcsCredentialsSecretKey := . -}} -{{- if $gcsCredentialsSecretKey -}} - {{- printf "%s" $gcsCredentialsSecretKey -}} -{{- else -}} - {{- printf "gcs-credentials" -}} -{{- end -}} -{{- end -}} diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl b/airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml b/airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml deleted file mode 100644 index 533d08f4..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/templates/deployment.yaml +++ /dev/null @@ -1,557 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "common.names.fullname" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - {{- if .Values.extraLabels }} - {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "airbyte.selectorLabels" . | nindent 6 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 6 }} - {{- end }} - strategy: - type: RollingUpdate - template: - metadata: - labels: - {{- include "airbyte.selectorLabels" . | nindent 8 }} - {{- if .Values.extraSelectorLabels }} - {{ toYaml (mergeOverwrite .Values.extraSelectorLabels .Values.global.extraSelectorLabels) | nindent 8 }} - {{- end }} - {{- if .Values.podLabels }} - {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.podAnnotations }} - annotations: - {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} - {{- end }} - spec: - serviceAccountName: {{ .Values.global.serviceAccountName }} - automountServiceAccountToken: true - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.nodeSelector }} - nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.tolerations }} - tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.affinity }} - affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} - {{- end }} - {{- if .Values.extraInitContainers }} - initContainers: - {{- toYaml .Values.extraInitContainers | nindent 6 }} - {{- end }} - containers: - - name: airbyte-workload-launcher-container - image: {{ include "imageUrl" (list .Values.image $) }} - imagePullPolicy: "{{ .Values.image.pullPolicy }}" - env: - {{- if .Values.debug.enabled }} - - name: JAVA_TOOL_OPTIONS - value: "-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:{{ .Values.debug.remoteDebugPort }},server=y,suspend=n" - {{- end}} - {{- if eq .Values.global.deploymentMode "oss" }} - - name: AIRBYTE_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AIRBYTE_VERSION - - name: DATA_PLANE_ID - value: "local" - - name: PUB_SUB_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: PUB_SUB_ENABLED - - name: PUB_SUB_TOPIC_NAME - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: PUB_SUB_TOPIC_NAME - - name: CONFIG_ROOT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONFIG_ROOT - {{- if eq (lower (default "" .Values.global.storage.type)) "gcs" }} - - name: CONTAINER_ORCHESTRATOR_SECRET_MOUNT_PATH - value: "/secrets/gcs-log-creds" - - name: CONTAINER_ORCHESTRATOR_SECRET_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} - {{- end }} - - {{- include "airbyte.database.envs" . | nindent 8 }} - {{- include "airbyte.logging.envs" . | nindent 8 }} - - name: MICROMETER_METRICS_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_ENABLED - - name: MICROMETER_METRICS_STATSD_FLAVOR - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MICROMETER_METRICS_STATSD_FLAVOR - - name: SEGMENT_WRITE_KEY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: SEGMENT_WRITE_KEY - - name: STATSD_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_HOST - - name: STATSD_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STATSD_PORT - - name: TRACKING_STRATEGY - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TRACKING_STRATEGY - - name: WORKSPACE_DOCKER_MOUNT - value: workspace - - name: WORKSPACE_ROOT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKSPACE_ROOT - - name: WEBAPP_URL - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WEBAPP_URL - - name: WORKLOAD_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKLOAD_API_HOST - - name: TEMPORAL_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_HOST - - name: TEMPORAL_WORKER_PORTS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: TEMPORAL_WORKER_PORTS - - name: JOB_KUBE_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: JOB_KUBE_SERVICEACCOUNT - value: {{ .Values.global.serviceAccountName }} - {{- if $.Values.global.jobs.kube.annotations }} - - name: JOB_KUBE_ANNOTATIONS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_ANNOTATIONS - {{- end }} - {{- if $.Values.global.jobs.kube.labels }} - - name: JOB_KUBE_LABELS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_LABELS - {{- end }} - {{- if $.Values.global.jobs.kube.nodeSelector }} - - name: JOB_KUBE_NODE_SELECTORS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_NODE_SELECTORS - {{- end }} - {{- if $.Values.global.jobs.kube.tolerations }} - - name: JOB_KUBE_TOLERATIONS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_TOLERATIONS - {{- end }} - - name: CONNECTOR_SIDECAR_IMAGE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONNECTOR_SIDECAR_IMAGE - - name: WORKLOAD_INIT_IMAGE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKLOAD_INIT_IMAGE - - name: CONTAINER_ORCHESTRATOR_IMAGE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONTAINER_ORCHESTRATOR_IMAGE - - name: JOB_KUBE_BUSYBOX_IMAGE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_BUSYBOX_IMAGE - - name: JOB_KUBE_CURL_IMAGE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_CURL_IMAGE - {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} - - name: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - {{- end }} - - name: JOB_MAIN_CONTAINER_CPU_REQUEST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_CPU_REQUEST - - name: JOB_MAIN_CONTAINER_CPU_LIMIT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_CPU_LIMIT - - name: JOB_MAIN_CONTAINER_MEMORY_REQUEST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_MEMORY_REQUEST - - name: JOB_MAIN_CONTAINER_MEMORY_LIMIT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_MAIN_CONTAINER_MEMORY_LIMIT - - name: JOB_KUBE_LOCAL_VOLUME_ENABLED - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOB_KUBE_LOCAL_VOLUME_ENABLED - - name: KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS - - name: WORKLOAD_API_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} - key: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} - - name: WORKLOAD_API_BEARER_TOKEN_SECRET_NAME - value: {{ index .Values "workloadApi" "bearerTokenSecretName" | default (printf "%s-airbyte-secrets" .Release.Name ) }} - - name: WORKLOAD_API_BEARER_TOKEN_SECRET_KEY - value: {{ index .Values "workloadApi" "bearerTokenSecretKey" | default "WORKLOAD_API_BEARER_TOKEN" }} - - name: INTERNAL_API_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: INTERNAL_API_HOST - - name: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - - name: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION - - name: METRIC_CLIENT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: METRIC_CLIENT - - name: OTEL_COLLECTOR_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: OTEL_COLLECTOR_ENDPOINT - - name: ACTIVITY_MAX_ATTEMPT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: ACTIVITY_MAX_ATTEMPT - - name: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS - - name: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS - - name: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKFLOW_FAILURE_RESTART_DELAY_SECONDS - - name: SHOULD_RUN_NOTIFY_WORKFLOWS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: SHOULD_RUN_NOTIFY_WORKFLOWS - - name: MICRONAUT_ENVIRONMENTS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: LAUNCHER_MICRONAUT_ENVIRONMENTS - - name: WORKLOAD_LAUNCHER_PARALLELISM - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: WORKLOAD_LAUNCHER_PARALLELISM - - name: FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT - - name: FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST - {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} - - name: AIRBYTE_API_AUTH_HEADER_NAME - value: "X-Airbyte-Auth" - - name: AIRBYTE_API_AUTH_HEADER_VALUE - value: "Internal worker" - {{- else if and (eq .Values.global.deploymentMode "oss") .Values.global.auth.enabled }} - # Self-Managed Enterprise and Community w/ auth enabled use the same auth header, just - # splitting into two separate blocks for readability. - - name: AIRBYTE_API_AUTH_HEADER_NAME - value: "X-Airbyte-Auth" - - name: AIRBYTE_API_AUTH_HEADER_VALUE - value: "Internal worker" - {{- end }} - - # SECRETS MANAGER - - name: SECRET_PERSISTENCE - value: {{ include "airbyte.secretPersistence" . }} - # Values for AwsSecretsManager - {{- if eq ((((.Values.global).secretsManager).awsSecretManager).authenticationType) "credentials" }} - - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} - - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} - - - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID_REF_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - - name: AWS_SECRET_MANAGER_ACCESS_KEY_ID_REF_KEY - value: {{ include "airbyte.awsSecretManagerAccessKeyIdSecretKey" .Values.global.secretsManager.awsSecretManager.accessKeyIdSecretKey }} - - - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY_REF_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - - name: AWS_SECRET_MANAGER_SECRET_ACCESS_KEY_REF_KEY - value: {{ include "airbyte.awsSecretManagerSecretAccessKeySecretKey" .Values.global.secretsManager.awsSecretManager.secretAccessKeySecretKey }} - - {{- end }} - {{- if ((((.Values.global).secretsManager).awsSecretManager).region) }} - - name: AWS_SECRET_MANAGER_REGION - value: {{ (((.Values.global).secretsManager).awsSecretManager).region }} - {{- end }} - - {{- if ((((.Values.global).secretsManager).awsSecretManager).tags) }} - - name: AWS_SECRET_MANAGER_SECRET_TAGS - value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.awsSecretManager.tags }} - {{- end }} - {{- if ((((.Values.global).secretsManager).awsSecretManager).kms) }} - - name: AWS_KMS_KEY_ARN - value: {{ ((((.Values.global).secretsManager).awsSecretManager).kms) | default "" }} - {{- end }} - - # Values for Azure Key Vault - {{- if (((.Values.global).secretsManager).azureKeyVault) }} - - - name: AB_AZURE_KEY_VAULT_VAULT_URL - value: {{ (((.Values.global).secretsManager).azureKeyVault).vaultUrl }} - - - name: AB_AZURE_KEY_VAULT_TENANT_ID - value: {{ (((.Values.global).secretsManager).azureKeyVault).tenantId }} - - - name: AB_AZURE_KEY_VAULT_CLIENT_ID - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} - - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} - - - name: AB_AZURE_KEY_VAULT_CLIENT_ID_REF_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - - name: AB_AZURE_KEY_VAULT_CLIENT_ID_REF_REF_KEY - value: {{ include "airbyte.azureKeyVaultClientIdSecretKey" .Values.global.secretsManager.azureKeyVault.clientIdSecretKey }} - - - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET_REF_REF_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - - name: AB_AZURE_KEY_VAULT_CLIENT_SECRET_REF_REF_KEY - value: {{ include "airbyte.azureKeyVaultClientSecretSecretKey" .Values.global.secretsManager.azureKeyVault.clientSecretSecretKey }} - - {{- end }} - - {{- if ((((.Values.global).secretsManager).azureKeyVault).tags) }} - - name: AB_AZURE_KEY_VAULT_TAGS - value: {{ include "airbyte.tagsToString" .Values.global.secretsManager.azureKeyVault.tags }} - {{- end }} - - # Values for googleSecretManager secrets - {{- if (((.Values.global).secretsManager).googleSecretManager) }} - - name: SECRET_STORE_GCP_PROJECT_ID - value: {{ .Values.global.secretsManager.googleSecretManager.projectId }} - - name: SECRET_STORE_GCP_CREDENTIALS - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} - - name: SECRET_STORE_GCP_SECRET_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - - name: SECRET_STORE_GCP_SECRET_KEY - value: {{ include "airbyte.googleSecretManagerCredentialsSecretKey" .Values.global.secretsManager.googleSecretManager.credentialsSecretKey }} - {{- end }} - - # Values for vault secrets - {{- if (((.Values.global).secretsManager).vault) }} - - name: VAULT_ADDRESS - value: {{ (((.Values.global).secretsManager).vault).address }} - - name: VAULT_PREFIX - value: {{ (((.Values.global).secretsManager).vault).prefix }} - - name: VAULT_AUTH_TOKEN - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - key: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} - - name: VAULT_AUTH_TOKEN_REF_NAME - value: {{ include "airbyte.secretStoreName" .Values.global.secretsManager.secretsManagerSecretName }} - - name: VAULT_AUTH_TOKEN_REF_KEY - value: {{ include "airbyte.vaultAuthTokenSecretKey" .Values.global.secretsManager.vault.authTokenSecretKey }} - {{- end }} - - # Storage - {{- include "airbyte.storage.envs" . | nindent 8 }} - - {{- end }} - - # Values from secret - {{- if .Values.secrets }} - {{- range $k, $v := .Values.secrets }} - - name: {{ $k }} - valueFrom: - secretKeyRef: - name: workload-launcher-secrets - key: {{ $k }} - {{- end }} - {{- end }} - - # Values from env - {{- if or .Values.env_vars .Values.global.env_vars }} - {{- range $k, $v := mergeOverwrite .Values.env_vars .Values.global.env_vars }} - - name: {{ $k }} - value: {{ $v | quote }} - {{- end }} - {{- end }} - - # Values from extraEnv for more compability(if you want to use external secret source or other stuff) - {{- if .Values.extraEnv }} - {{- toYaml .Values.extraEnv | nindent 8 }} - {{- end }} - - {{- if .Values.livenessProbe.enabled }} - livenessProbe: - httpGet: - path: /health/liveness - port: heartbeat - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - {{- end }} - {{- if .Values.readinessProbe.enabled }} - readinessProbe: - httpGet: - path: /health/readiness - port: heartbeat - initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.readinessProbe.failureThreshold }} - {{- end }} - ports: - {{- if .Values.debug.enabled }} - - name: debug - containerPort: {{ .Values.debug.remoteDebugPort }} - protocol: TCP - {{- end}} - - name: heartbeat - containerPort: 8016 # for heartbeat server - {{- if .Values.resources }} - resources: {{- toYaml .Values.resources | nindent 10 }} - {{- end }} - {{- if .Values.containerSecurityContext }} - securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} - {{- end }} - volumeMounts: - {{- if eq (lower .Values.global.storage.type) "local" }} - - name: airbyte-storage - mountPath: /storage - {{- end }} - {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} - - name: gcs-log-creds-volume - mountPath: /secrets/gcs-log-creds - readOnly: true - {{- end }} - {{- if .Values.extraVolumeMounts }} -{{- toYaml .Values.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.global.extraVolumeMounts }} -{{- toYaml .Values.global.extraVolumeMounts | nindent 8 }} - {{- end }} - {{- if .Values.extraContainers }} - {{ toYaml .Values.extraContainers | nindent 6 }} - {{- end }} - {{- if .Values.global.extraContainers }} - {{ toYaml .Values.global.extraContainers | nindent 6 }} - {{- end }} - securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} - volumes: - {{- if eq (lower .Values.global.storage.type) "local" }} - - name: airbyte-storage - persistentVolumeClaim: - claimName: airbyte-storage-pvc - {{- end }} - {{- if and (eq .Values.global.deploymentMode "oss") (eq (lower (default "" .Values.global.storage.type)) "gcs") }} - - name: gcs-log-creds-volume - secret: - secretName: {{ ternary (printf "%s-gcs-log-creds" ( .Release.Name )) .Values.global.storage.storageSecretName (not ((.Values.global.storage).storageSecretName)) }} - {{- end }} - {{- if .Values.extraVolumes }} -{{- toYaml .Values.extraVolumes | nindent 6 }} - {{- end }} - {{- if .Values.global.extraVolumes }} -{{- toYaml .Values.global.extraVolumes | nindent 6 }} - {{- end }} diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml b/airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml deleted file mode 100644 index c49cec64..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/templates/jobs-secrets.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Create dataplane secrets only for the local deployment - {{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: workload-launcher-secrets - namespace: {{ .Values.jobs_namespace }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} - {{- end }} diff --git a/airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml b/airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml deleted file mode 100644 index c72f6bfe..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/templates/secrets.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Create secrets only for the local deployment -{{- if .Values.secrets }} -apiVersion: v1 -kind: Secret -metadata: - name: workload-launcher-secrets - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" -type: Opaque -data: - {{- range $k, $v := mergeOverwrite .Values.secrets .Values.global.secrets }} - {{ $k }}: {{ if $v }}{{ $v | b64enc }} {{else}}""{{end}} - {{- end }} -{{- end }} diff --git a/airbyte-v1-notused/charts/workload-launcher/values.yaml b/airbyte-v1-notused/charts/workload-launcher/values.yaml deleted file mode 100644 index 486760a5..00000000 --- a/airbyte-v1-notused/charts/workload-launcher/values.yaml +++ /dev/null @@ -1,294 +0,0 @@ -global: - - serviceAccountName: &service-account-name "airbyte-admin" - edition: community - credVolumeOverride: "" - secretName: "" - extraContainers: [] - ## extraSelectorLabels [object] - use to specify own additional selector labels for deployment - extraSelectorLabels: {} - ## extraLabels [object] - use to specify own additional labels for deployment - extraLabels: {} - database: - secretName: "" - secretValue: "" - - storage: - type: minio - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "" - - jobs: - ## Jobs resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - ## jobs.resources.limits [object] The resources limits for jobs - ## jobs.resources.requests [object] The requested resources for jobs - resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - - kube: - ## JOB_KUBE_ANNOTATIONS - ## pod annotations of the sync job and the default pod annotations fallback for others jobs - ## jobs.kube.annotations [object] key/value annotations applied to kube jobs - annotations: {} - - ## JOB_KUBE_LABELS - ## pod labels of the sync job and the default pod labels fallback for others jobs - ## jobs.kube.labels [object] key/value labels applied to kube jobs - labels: {} - - ## JOB_KUBE_NODE_SELECTORS - ## pod node selector of the sync job and the default pod node selector fallback for others jobs - ## jobs.kube.nodeSelector [object] key/value node selector applied to kube jobs - nodeSelector: {} - - ## JOB_KUBE_TOLERATIONS - ## jobs.kube.tolerations [array] Tolerations for jobs.kube pod assignment. - ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## any boolean values should be quoted to ensure the value is passed through as a string, eg: - ## - key: airbyte-server - ## operator: Equal - ## value: "true" - ## effect: NoSchedule - tolerations: [] - - ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - ## image pull secret to use for job pod - ## jobs.kube.main_container_image_pull_secret [string] image pull secret to use for job pod - main_container_image_pull_secret: "" - - images: - ## JOB_KUBE_BUSYBOX_IMAGE - ## busybox image used by the job pod - ## jobs.kube.images.busybox [string] busybox image used by the job pod - busybox: "" - ## JOB_KUBE_CURL_IMAGE - ## curl image used by the job pod - ## jobs.kube.images.curl [string] curl image used by the job pod - curl: "" - -enabled: true -## workload-launcher.replicaCount Number of workload launcher replicas -replicaCount: 1 - -## workload-launcher.image.repository The repository to use for the airbyte workload launcher image. -## workload-launcher.image.pullPolicy the pull policy to use for the airbyte workload launcher image -## workload-launcher.image.tag The airbyte workload launcher image tag. Defaults to the chart's AppVersion -image: - repository: airbyte/workload-launcher - pullPolicy: IfNotPresent - -## workload-launcher.podAnnotations [object] Add extra annotations to the workload launcher pod(s) -## -podAnnotations: {} - -## workload-launcher.podLabels [object] Add extra labels to the workload launcher pod(s) -## -podLabels: {} - -## workload-launcher.containerSecurityContext Security context for the container -## Examples: -## containerSecurityContext: -## runAsNonRoot: true -## runAsUser: 1000 -## readOnlyRootFilesystem: true -containerSecurityContext: {} - -## Configure extra options for the workload launcher containers' liveness and readiness probes -## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes -## workload-launcher.livenessProbe.enabled Enable livenessProbe on the workload launcher -## workload-launcher.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe -## workload-launcher.livenessProbe.periodSeconds Period seconds for livenessProbe -## workload-launcher.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe -## workload-launcher.livenessProbe.failureThreshold Failure threshold for livenessProbe -## workload-launcher.livenessProbe.successThreshold Success threshold for livenessProbe -## -livenessProbe: - enabled: true - initialDelaySeconds: 50 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## workload-launcher.readinessProbe.enabled Enable readinessProbe on the workload launcher -## workload-launcher.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe -## workload-launcher.readinessProbe.periodSeconds Period seconds for readinessProbe -## workload-launcher.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe -## workload-launcher.readinessProbe.failureThreshold Failure threshold for readinessProbe -## workload-launcher.readinessProbe.successThreshold Success threshold for readinessProbe -## -readinessProbe: - enabled: true - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - failureThreshold: 3 - successThreshold: 1 - -## workload launcher resource requests and limits -## ref: http://kubernetes.io/docs/user-guide/compute-resources/ -## We usually recommend not to specify default resources and to leave this as a conscious -## choice for the user. This also increases chances charts run on environments with little -## resources, such as Minikube. If you do want to specify resources, uncomment the following -## lines, adjust them as necessary, and remove the curly braces after 'resources:'. -## workload-launcher.resources.limits [object] The resources limits for the workload launcher container -## workload-launcher.resources.requests [object] The requested resources for the workload launcher container -resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - requests: {} - -## workload-launcher.nodeSelector [object] Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -## -nodeSelector: {} - -## workload-launcher.tolerations [array] Tolerations for workload launcher pod assignment. -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## workload-launcher.affinity [object] Affinity and anti-affinity for workload launcher pod assignment. -## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## workload-launcher.log.level The log level to log at. -log: - level: "INFO" - - - -## workload-launcher.extraVolumeMounts [array] Additional volumeMounts for workload launcher container(s). -## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumeMounts: -## - name: tmpdir -## mountPath: /tmp -## -extraVolumeMounts: [] - -## workload-launcher.extraVolumes [array] Additional volumes for workload launcher pod(s). -## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): -## extraVolumes: -## - name: tmpdir -## emptyDir: {} -## -extraVolumes: [] - -## extraContainer [array] Additional container for server pod(s) -## Example: -# extraContainers: -# - name: otel_collector -# image: somerepo/someimage:sometag -# args: [ -# "--important-args" -# ] -# ports: -# - containerPort: 443 -# volumeMounts: -# - name: volumeMountCool -# mountPath: /some/path -# readOnly: true -extraContainers: [] - -## extraInitContainers [array] Additional init containers for server pod(s) -## Example: -# extraInitContainers: -# - name: sleepy -# image: alpine -# command: ['sleep', '60'] - -extraInitContainers: [] - -## extraEnv [array] Supply extra env variables to main container using full notation -## Example: (With default env vars and values taken from generated config map) -# extraEnv: -# - name: AIRBYTE_VERSION -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: AIRBYTE_VERSION -# - name: API_URL -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: API_URL -# - name: TRACKING_STRATEGY -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: TRACKING_STRATEGY -# - name: FULLSTORY -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: FULLSTORY -# - name: INTERNAL_API_HOST -# valueFrom: -# configMapKeyRef: -# name: airbyte-env -# key: INTERNAL_API_HOST -## -extraEnv: [] -## secrets [object] Supply additional secrets to container -## Example: -## secrets: -## DATABASE_PASSWORD: strong-password -## DATABASE_USER: my-db-user -secrets: {} - -## env_vars [object] Supply extra env variables to main container using simplified notation -## Example with default values for workload launcher: -# env_vars: -# AIRBYTE_VERSION: 0.40.4 - -# # Workspace storage for running jobs (logs, etc) -# WORKSPACE_ROOT: /workspace -# WORKSPACE_DOCKER_MOUNT: airbyte_workspace - -# # Miscellaneous -# TRACKING_STRATEGY: segment -# WEBAPP_URL: airbyte-webapp-svc:80 -# INTERNAL_API_HOST: http://airbyte-server-svc:8001 -env_vars: {} - -## extraSelectorLabels [object] - use to specify own additional selector labels for deployment -extraSelectorLabels: {} -## extraLabels [object] - use to specify own additional labels for deployment -extraLabels: {} - -## workloadApi: -## bearerTokenSecretName: workload-api-bearer-token-name kubernetes secret name where bearer token is stored -## bearerTokenSecretKey: workload-api-bearer-token-key kubernetes secret key where bearer token is stored -workloadApi: {} - -debug: - enabled: false - remoteDebugPort: 5005 diff --git a/airbyte-v1-notused/templates/NOTES.txt b/airbyte-v1-notused/templates/NOTES.txt deleted file mode 100644 index 6487ae65..00000000 --- a/airbyte-v1-notused/templates/NOTES.txt +++ /dev/null @@ -1,22 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.webapp.ingress.enabled }} -{{- range $host := .Values.webapp.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.webapp.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.webapp.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "airbyte.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.webapp.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "airbyte.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "airbyte.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.webapp.service.port }} -{{- else if contains "ClusterIP" .Values.webapp.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name=webapp" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} diff --git a/airbyte-v1-notused/templates/_database.tpl b/airbyte-v1-notused/templates/_database.tpl deleted file mode 100644 index fd0e5ef8..00000000 --- a/airbyte-v1-notused/templates/_database.tpl +++ /dev/null @@ -1,234 +0,0 @@ -{{/* -Database Configuration -*/}} - -{{/* -Renders the database host -*/}} -{{- define "airbyte.database.host" }} - {{- if .Values.postgresql.enabled }} - {{- printf "%s" "airbyte-db-svc" }} - {{- else if .Values.global.database.host }} - {{- .Values.global.database.host }} - {{- else }} - {{ $host := .Values.global.database.host | required "You must set `global.database.host` when using an external database" }} - {{- end }} -{{- end }} - -{{/* -Renders an environment variable definition that provides the database host -*/}} -{{- define "airbyte.database.host.env" }} -- name: DATABASE_HOST - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: DATABASE_HOST -{{- end }} - -{{/* -Renders the database port -*/}} -{{- define "airbyte.database.port" }} - {{- if .Values.postgresql.enabled }} - {{- printf "%s" "5432" }} - {{- else if .Values.global.database.port }} - {{- .Values.global.database.port }} - {{- else }} - {{ $port := .Values.global.database.port | required "You must set `global.database.port` when using an external database" }} - {{- end }} -{{- end }} - -{{/* -Renders an environment variable definition that provides the database port -*/}} -{{- define "airbyte.database.port.env" }} -- name: DATABASE_PORT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: DATABASE_PORT -{{- end }} - -{{/* -Renders the database name -*/}} -{{- define "airbyte.database.name" }} - {{- if .Values.postgresql.enabled }} - {{- .Values.postgresql.postgresqlDatabase }} - {{- else if .Values.global.database.database }} - {{- .Values.global.database.database }} - {{- else }} - {{ $database := .Values.global.database.database | required "You must set `global.database.database` when using an external database" }} - {{- end }} -{{- end }} - -{{/* -Renders an environment variable definition that provides the database name -*/}} -{{- define "airbyte.database.name.env" }} -- name: DATABASE_DB - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: DATABASE_DB -{{- end }} - -{{/* -Renders the database user -*/}} -{{- define "airbyte.database.user" }} - {{- if .Values.postgresql.enabled }} - {{- .Values.postgresql.postgresqlUsername }} - {{- else if .Values.global.database.user }} - {{- .Values.global.database.user }} - {{- else }} - {{- if .Values.global.database.userSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} - {{- else }} - {{ $user := .Values.global.database.user | required "You must set `global.database.user` when using an external database" }} - {{- end }} - {{- end }} -{{- end }} - -{{/* -Renders the name of the secret where the database user will be referenced -*/}} -{{- define "airbyte.database.userSecretKey" }} - {{- if .Values.global.database.userSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} - {{- .Values.global.database.userSecretKey }} - {{- else }} - {{- printf "%s" "DATABASE_USER" }} - {{- end }} -{{- end }} - -{{/* -Renders an environment variable definition that provides the database user -*/}} -{{- define "airbyte.database.user.env" }} -- name: DATABASE_USER - valueFrom: - secretKeyRef: - {{- if .Values.global.database.userSecretKey }} - name: {{ .Values.global.database.secretName }} - {{- else }} - name: {{ .Release.Name }}-airbyte-secrets - {{- end }} - key: {{ include "airbyte.database.userSecretKey" .}} -{{- end }} - -{{/* -Renders the database password -*/}} -{{- define "airbyte.database.password" }} - {{- if .Values.postgresql.enabled }} - {{- .Values.postgresql.postgresqlPassword }} - {{- else if .Values.global.database.password }} - {{- .Values.global.database.password }} - {{- else }} - {{- if .Values.global.database.passwordSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} - {{- else }} - {{ $password := .Values.global.database.password | required "You must set `global.database.password` when using an external database" }} - {{- end }} - {{- end }} -{{- end }} - -{{/* -Renders the name of the secret where the database password will be referenced -*/}} -{{- define "airbyte.database.passwordSecretKey" }} - {{- if .Values.global.database.passwordSecretKey }} - {{ $secretName := .Values.global.database.secretName | required "You must set `global.database.secretName` when using an external database" }} - {{- .Values.global.database.passwordSecretKey }} - {{- else }} - {{- printf "%s" "DATABASE_PASSWORD" }} - {{- end }} -{{- end }} - -{{/* -Renders an environment variable definition that provides the database password -*/}} -{{- define "airbyte.database.password.env" }} -- name: DATABASE_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "airbyte.database.secretName" . }} - key: {{ include "airbyte.database.passwordSecretKey" . }} -{{- end }} - - -{{/* -Renders the database url (JDBC) -*/}} -{{- define "airbyte.database.url" }} -{{- $host := (include "airbyte.database.host" .) }} -{{- $dbName := (include "airbyte.database.name" .) }} -{{- $port := (include "airbyte.database.port" . ) }} -{{- printf "jdbc:postgresql://%s:%s/%s" $host $port $dbName }} -{{- end }} - -{{/* -Renders an environment variable definition that provides the database url (JDBC) -*/}} -{{- define "airbyte.database.url.env" }} -- name: DATABASE_URL - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: DATABASE_URL -{{- end }} - -{{/* -Renders the name of the secret containing database credentials -*/}} -{{- define "airbyte.database.secretName" }} - {{- if .Values.global.database.secretName }} - {{- .Values.global.database.secretName | quote }} - {{- else }} - {{ .Release.Name }}-airbyte-secrets - {{- end }} -{{- end }} - -{{/* -Renders all of the common environment variables which provide database credentials -*/}} -{{- define "airbyte.database.envs" }} -{{ include "airbyte.database.host.env" . }} -{{ include "airbyte.database.port.env" . }} -{{ include "airbyte.database.name.env" . }} -{{ include "airbyte.database.user.env" . }} -{{ include "airbyte.database.password.env" . }} -{{ include "airbyte.database.url.env" . }} -{{- end }} - -{{/* -Renders a set of database secrets to be included in the shared Airbyte secret -*/}} -{{- define "airbyte.database.secrets" }} -{{ $user := (include "airbyte.database.user" .)}} -{{- if not (empty $user) }} -DATABASE_USER: {{ $user }} -{{- end }} -{{ $password := (include "airbyte.database.password" .)}} -{{- if not (empty $password) }} -DATABASE_PASSWORD: {{ $password }} -{{- end}} -{{- end }} - -{{/* -Renders a set of database configuration variables to be included in the shared Airbyte config map -*/}} -{{- define "airbyte.database.configVars" }} -DATABASE_HOST: {{ include "airbyte.database.host" . }} -DATABASE_PORT: {{ include "airbyte.database.port" . | quote }} -DATABASE_DB: {{ include "airbyte.database.name" . }} -DATABASE_URL: {{ include "airbyte.database.url" . }} -{{- if .Values.global.database.user }} -DATABASE_USER: {{ include "airbyte.database.user" . }} -{{- end}} -{{- if .Values.global.database.password }} -DATABASE_PASSWORD: {{ include "airbyte.database.password" . }} -{{- end}} -{{- end }} diff --git a/airbyte-v1-notused/templates/_enterprise.tpl b/airbyte-v1-notused/templates/_enterprise.tpl deleted file mode 100644 index 8e74d5aa..00000000 --- a/airbyte-v1-notused/templates/_enterprise.tpl +++ /dev/null @@ -1,83 +0,0 @@ -{{/* -Enteprise Configuration -*/}} - -{{- define "airbyte.enterprise.license" -}} -{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) }} -{{- $secretName := .Values.global.enterprise.secretName | required "You must set `global.enterprise.secretName` when `global.edition` is 'enterprise'" }} -{{- $secretKey := .Values.global.enterprise.licenseKeySecretKey | required "You must set `global.enterprise.licenseKeySecretKey` when `global.edition` is 'enterprise'" }} -- name: AIRBYTE_LICENSE_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.global.enterprise.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: {{ .Values.global.enterprise.licenseKeySecretKey }} -{{- end }} -{{- end }} - -{{- define "airbyte.enterprise.instanceAdmin" -}} -{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) }} -{{- $auth := .Values.global.auth | required "You must set `global.auth` when `global.edition` is 'enterprise'"}} -{{- $authInstanceAdminSecretName := .Values.global.auth.instanceAdmin.secretName | required "You must set `global.auth.instanceAdmin.secretName` when `global.edition` is 'enterprise'" }} -{{- $authInstanceAdminFirstName := .Values.global.auth.instanceAdmin.firstName | required "You must set `global.auth.instanceAdmin.firstName` when `global.edition` is 'enterprise'" }} -{{- $authInstanceAdminLastName := .Values.global.auth.instanceAdmin.lastName | required "You must set `global.auth.instanceAdmin.lastName` when `global.edition` is 'enterprise'" }} -{{- $authInstanceAdminEmailSecretKey := .Values.global.auth.instanceAdmin.emailSecretKey | required "You must set `global.auth.instanceAdmin.emailSecretKey` when `global.edition` is 'enterprise'" }} -{{- $authInstanceAdminPasswordSecretKey := .Values.global.auth.instanceAdmin.passwordSecretKey | required "You must set `global.auth.instanceAdmin.passwordSecretKey` when `global.edition` is 'enterprise'" }} -- name: INITIAL_USER_FIRST_NAME - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: INITIAL_USER_FIRST_NAME -- name: INITIAL_USER_LAST_NAME - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: INITIAL_USER_LAST_NAME -- name: INITIAL_USER_EMAIL - valueFrom: - secretKeyRef: - name: {{ .Values.global.auth.instanceAdmin.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: {{ .Values.global.auth.instanceAdmin.emailSecretKey }} -- name: INITIAL_USER_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.global.auth.instanceAdmin.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: {{ .Values.global.auth.instanceAdmin.passwordSecretKey }} -{{- end }} -{{- end }} - -{{- define "airbyte.enterprise.identityProvider" -}} -{{- if and (or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise")) (not .Values.global.airbyteYml) .Values.global.auth.identityProvider }} -{{- $authIdentityProviderSecretName := .Values.global.auth.identityProvider.secretName | required "You must set `global.auth.identityProvider.secretName` when enabling SSO" }} -{{- $authIdentityProviderType := .Values.global.auth.identityProvider.type | required "You must set `global.auth.identityProvider.type` when enabling SSO "}} -{{- $authIdentityProviderOIDC := .Values.global.auth.identityProvider.oidc | required "You must set `global.auth.identityProvider.oidc` when enabling SSO" }} -{{- $authIdentityProviderOIDCDomain := .Values.global.auth.identityProvider.oidc.domain | required "You must set `global.auth.identityProvider.oidc.domain` when enabling SSO" }} -{{- $authIdentityProviderOIDCAppName := .Values.global.auth.identityProvider.oidc.appName | required "You must set `global.auth.identityProvider.oidc.appName` when enabling SSO" }} -{{- $authIdentityProviderOIDCClientIdSecretKey := .Values.global.auth.identityProvider.oidc.clientIdSecretKey | required "You must set `global.auth.identityProvider.oidc.clientIdSecretKey` when enabling SSO" }} -{{- $authIdentityProviderOIDCClientSecretSecretKey := .Values.global.auth.identityProvider.oidc.clientSecretSecretKey | required "You must set `global.auth.identityProvider.oidc.clientSecretSecretKey` when enabling SSO" }} -- name: IDENTITY_PROVIDER_TYPE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: IDENTITY_PROVIDER_TYPE -- name: OIDC_DOMAIN - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: OIDC_DOMAIN -- name: OIDC_APP_NAME - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: OIDC_APP_NAME -- name: OIDC_CLIENT_ID - valueFrom: - secretKeyRef: - name: {{ .Values.global.auth.identityProvider.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: {{ .Values.global.auth.identityProvider.oidc.clientIdSecretKey }} -- name: OIDC_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: {{ .Values.global.auth.identityProvider.secretName | default (printf "%s-airbyte-secrets" .Release.Name) }} - key: {{ .Values.global.auth.identityProvider.oidc.clientSecretSecretKey }} -{{- end }} -{{- end }} diff --git a/airbyte-v1-notused/templates/_helpers.tpl b/airbyte-v1-notused/templates/_helpers.tpl deleted file mode 100644 index d99db7f4..00000000 --- a/airbyte-v1-notused/templates/_helpers.tpl +++ /dev/null @@ -1,350 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "airbyte.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "airbyte.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "airbyte.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "airbyte.labels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "airbyte.selectorLabels" -}} -app.kubernetes.io/name: {{ include "airbyte.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - - -{{/* -Common DB labels -*/}} -{{- define "airbyte.databaseLabels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.databaseSelectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector DB labels -*/}} -{{- define "airbyte.databaseSelectorLabels" -}} -app.kubernetes.io/name: {{ printf "%s-db" .Release.Name }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Common DB labels -*/}} -{{- define "airbyte.minioLabels" -}} -helm.sh/chart: {{ include "airbyte.chart" . }} -{{ include "airbyte.minioSelectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector DB labels -*/}} -{{- define "airbyte.minioSelectorLabels" -}} -app.kubernetes.io/name: {{ printf "%s-minio" .Release.Name }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "airbyte.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "airbyte.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Add environment variables to configure minio -*/}} -{{- define "airbyte.storage.minio.endpoint" -}} -{{- if ((((.Values.global).storage).minio).endpoint) }} - {{- .Values.global.storage.minio.endpoint -}} -{{- else -}} - {{- printf "http://airbyte-minio-svc:9000" -}} -{{- end -}} -{{- end -}} - -{{- define "airbyte.s3PathStyleAccess" -}} -{{- ternary "true" "" (eq (lower (default "" .Values.global.storage.type)) "minio") -}} -{{- end -}} - -{{/* -Returns the GCP credentials path -*/}} -{{- define "airbyte.gcpLogCredentialsPath" -}} -{{- if ((((.Values.global).storage).gcs).credentialsPath) }} - {{- printf "%s" .Values.global.storage.gcs.credentialsPath -}} -{{- else -}} - {{- printf "%s" "/secrets/gcs-log-creds/gcp.json" -}} -{{- end -}} -{{- end -}} - -{{/* -Construct comma separated list of key/value pairs from object (useful for ENV var values) -*/}} -{{- define "airbyte.flattenMap" -}} -{{- $kvList := list -}} -{{- range $key, $value := . -}} -{{- $kvList = printf "%s=%s" $key $value | mustAppend $kvList -}} -{{- end -}} -{{ join "," $kvList }} -{{- end -}} - -{{/* -Construct semi-colon delimited list of comma separated key/value pairs from array of objects (useful for ENV var values) -*/}} -{{- define "airbyte.flattenArrayMap" -}} -{{- $mapList := list -}} -{{- range $element := . -}} -{{- $mapList = include "airbyte.flattenMap" $element | mustAppend $mapList -}} -{{- end -}} -{{ join ";" $mapList }} -{{- end -}} - -## DEFAULT HELM VALUES -# Secret Manager Defaults -{{/* -Define secret persistence -*/}} -{{- define "airbyte.secretPersistence" -}} -{{- if (((.Values.global).secretsManager).type) }} - {{- printf "%s" (snakecase .Values.global.secretsManager.type) }} -{{- else }} - {{- printf "" }} -{{- end }} -{{- end }} - -{{/* -Get secret store name or default -*/}} -{{- define "airbyte.secretStoreName" -}} -{{- $secretStoreName := . -}} -{{- if $secretStoreName -}} - {{- printf "%s" $secretStoreName -}} -{{- else -}} - {{- printf "airbyte-config-secrets" -}} -{{- end -}} -{{- end -}} - -{{/* -Get awsSecretManager access key id secret key or default -*/}} -{{- define "airbyte.awsSecretManagerAccessKeyIdSecretKey" -}} -{{- $awsSecretManagerAccessKeyIdSecretKey := . -}} -{{- if $awsSecretManagerAccessKeyIdSecretKey -}} - {{- printf "%s" $awsSecretManagerAccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "aws-secret-manager-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get awsSecretManager secret access key secret key or default -*/}} -{{- define "airbyte.awsSecretManagerSecretAccessKeySecretKey" -}} -{{- $awsSecretManagerSecretAccessKeySecretKey := . -}} -{{- if $awsSecretManagerSecretAccessKeySecretKey -}} - {{- printf "%s" $awsSecretManagerSecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "aws-secret-manager-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get googleSecretManager credentials secret key or default -*/}} -{{- define "airbyte.googleSecretManagerCredentialsSecretKey" -}} -{{- $googleSecretManagerCredentialsSecretKey := . -}} -{{- if $googleSecretManagerCredentialsSecretKey -}} - {{- printf "%s" $googleSecretManagerCredentialsSecretKey -}} -{{- else -}} - {{- printf "google-secret-manager-credentials" -}} -{{- end -}} -{{- end -}} - -{{/* -Get vault auth token secret key or default -*/}} -{{- define "airbyte.vaultAuthTokenSecretKey" -}} -{{- $vaultAuthTokenSecretKey := . -}} -{{- if $vaultAuthTokenSecretKey -}} - {{- printf "%s" $vaultAuthTokenSecretKey -}} -{{- else -}} - {{- printf "vault-auth-token" -}} -{{- end -}} -{{- end -}} - - -# Storage Defaults -{{/* -Get storage type or default -*/}} -{{- define "airbyte.storageType" -}} -{{- $storageType := . -}} -{{- if $storageType -}} - {{- printf "%s" $storageType -}} -{{- else -}} - {{- printf "local" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket log or default -*/}} -{{- define "airbyte.storageBucketLog" -}} -{{- $storageBucketLog := . -}} -{{- if $storageBucketLog -}} - {{- printf "%s" $storageBucketLog -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket state or default -*/}} -{{- define "airbyte.storageBucketState" -}} -{{- $storageBucketState := . -}} -{{- if $storageBucketState -}} - {{- printf "%s" $storageBucketState -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get storage bucket workload output or default -*/}} -{{- define "airbyte.storageBucketWorkloadOutput" -}} -{{- $storageBucketWorkloadOutput := . -}} -{{- if $storageBucketWorkloadOutput -}} - {{- printf "%s" $storageBucketWorkloadOutput -}} -{{- else -}} - {{- printf "airbyte-storage" -}} -{{- end -}} -{{- end -}} - -{{/* -Get s3 access key id secret key or default -*/}} -{{- define "airbyte.s3AccessKeyIdSecretKey" -}} -{{- $s3AccessKeyIdSecretKey := . -}} -{{- if $s3AccessKeyIdSecretKey -}} - {{- printf "%s" $s3AccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "s3-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get s3 secret access key secret key or default -*/}} -{{- define "airbyte.s3SecretAccessKeySecretKey" -}} -{{- $s3SecretAccessKeySecretKey := . -}} -{{- if $s3SecretAccessKeySecretKey -}} - {{- printf "%s" $s3SecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "s3-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get minio access key id secret key or default -*/}} -{{- define "airbyte.minioAccessKeyIdSecretKey" -}} -{{- $minioAccessKeyIdSecretKey := . -}} -{{- if $minioAccessKeyIdSecretKey -}} - {{- printf "%s" $minioAccessKeyIdSecretKey -}} -{{- else -}} - {{- printf "minio-access-key-id" -}} -{{- end -}} -{{- end -}} - -{{/* -Get minio secret access key secret key or default -*/}} -{{- define "airbyte.minioSecretAccessKeySecretKey" -}} -{{- $minioSecretAccessKeySecretKey := . -}} -{{- if $minioSecretAccessKeySecretKey -}} - {{- printf "%s" $minioSecretAccessKeySecretKey -}} -{{- else -}} - {{- printf "minio-secret-access-key" -}} -{{- end -}} -{{- end -}} - -{{/* -Get gcs credentials secret key or default -*/}} -{{- define "airbyte.gcsCredentialsSecretKey" -}} -{{- $gcsCredentialsSecretKey := . -}} -{{- if $gcsCredentialsSecretKey -}} - {{- printf "%s" $gcsCredentialsSecretKey -}} -{{- else -}} - {{- printf "gcs-credentials" -}} -{{- end -}} -{{- end -}} - -{{/* -Convert tags to a comma-separated list of key=value pairs. -*/}} -{{- define "airbyte.tagsToString" -}} -{{- $result := list -}} -{{- range . -}} - {{- $key := .key -}} - {{- $value := .value -}} - {{- if eq (typeOf $value) "bool" -}} - {{- $value = ternary "true" "false" $value -}} - {{- end -}} - {{- $result = append $result (printf "%s=%s" $key $value) -}} -{{- end -}} -{{- join "," $result -}} -{{- end -}} diff --git a/airbyte-v1-notused/templates/_images.tpl b/airbyte-v1-notused/templates/_images.tpl deleted file mode 100644 index 6c32ec44..00000000 --- a/airbyte-v1-notused/templates/_images.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{- define "imageUrl" -}} -{{- $img := index . 0 -}} -{{- $root := index . 1 -}} - -{{- $reg := $root.Values.global.image.registry -}} -{{/* ensure the registry has a trailing slash, if set */}} -{{- $reg = (ternary $reg (printf "%s/" (trimSuffix "/" $reg)) (empty $reg)) -}} - -{{/* some images are defined as a string instead of an object (busybox, curl, connector sidecar, etc) */}} -{{- if (eq (typeOf $img) "string") -}} -{{- printf "%s%s" $reg (tpl $img $root) | quote -}} -{{- else -}} -{{- $tag := coalesce $img.tag $root.Values.global.image.tag $root.Chart.AppVersion -}} -{{- printf "%s%s:%s" $reg $img.repository $tag | quote -}} -{{- end -}} - -{{- end -}} \ No newline at end of file diff --git a/airbyte-v1-notused/templates/_keycloak.tpl b/airbyte-v1-notused/templates/_keycloak.tpl deleted file mode 100644 index ac0545db..00000000 --- a/airbyte-v1-notused/templates/_keycloak.tpl +++ /dev/null @@ -1,44 +0,0 @@ -{{/* -Keycloak Configuration -*/}} - -{{- define "airbyte.keycloak.database.user.env" }} -- name: KEYCLOAK_DATABASE_USERNAME - valueFrom: - secretKeyRef: - {{- if .Values.global.database.userSecretKey }} - name: {{ .Values.global.database.secretName }} - {{- else }} - name: {{ .Release.Name }}-airbyte-secrets - {{- end }} - key: {{ include "airbyte.database.userSecretKey" .}} -{{- end }} - -{{- define "airbyte.keycloak.database.password.env" }} -- name: KEYCLOAK_DATABASE_PASSWORD - valueFrom: - secretKeyRef: - name: {{ include "airbyte.database.secretName" . }} - key: {{ include "airbyte.database.passwordSecretKey" . }} -{{- end }} - -{{- define "airbyte.keycloak.database.url" }} -{{ $host := (include "airbyte.database.host" .) }} -{{ $dbName := (include "airbyte.database.name" .) }} -{{ $port := (include "airbyte.database.port" . ) }} -{{- printf "jdbc:postgresql://%s:%s/%s?currentSchema=keycloak" $host $port $dbName }} -{{- end }} - -{{- define "airbyte.keycloak.database.url.env" }} -- name: KEYCLOAK_DATABASE_URL - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: KEYCLOAK_DATABASE_URL -{{- end }} - -{{- define "airbyte.keycloak.database.envs" }} -{{ include "airbyte.keycloak.database.user.env" . }} -{{ include "airbyte.keycloak.database.password.env" . }} -{{ include "airbyte.keycloak.database.url.env" . }} -{{- end }} diff --git a/airbyte-v1-notused/templates/_logging.tpl b/airbyte-v1-notused/templates/_logging.tpl deleted file mode 100644 index f1382739..00000000 --- a/airbyte-v1-notused/templates/_logging.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{/* -Common logging configs -*/}} -{{- define "airbyte.logging.envs" }} -- name: LOG_LEVEL - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: LOG_LEVEL -{{- end }} diff --git a/airbyte-v1-notused/templates/_storage.tpl b/airbyte-v1-notused/templates/_storage.tpl deleted file mode 100644 index 70819063..00000000 --- a/airbyte-v1-notused/templates/_storage.tpl +++ /dev/null @@ -1,243 +0,0 @@ -{{/* -Storage configs -*/}} - -{{/* -Returns the provider name -*/}} -{{- define "airbyte.storage.provider" }} -{{- if .Values.global.storage.type }} - {{- printf "%s" (lower .Values.global.storage.type) }} -{{- else }} - {{- printf "minio" }} -{{- end }} -{{- end }} - -{{/* -Returns the storage provider secret name -*/}} -{{- define "airbyte.storage.secretName" }} -{{- if .Values.global.storage.secretName }} - {{- printf "%s" .Values.global.storage.secretName }} -{{- else if .Values.global.storage.storageSecretName }} - {{- printf "%s" .Values.global.storage.storageSecretName }} -{{- else -}} - {{/* GCS has its own default secret we create */}} - {{- if eq (include "airbyte.storage.provider" .) "gcs" }} - {{- printf "%s-gcs-log-creds" .Release.Name }} - {{- else }} - {{- printf "%s-airbyte-secrets" .Release.Name }} - {{- end }} -{{- end }} -{{- end }} - -{{/* -Returns azure environment variables. -*/}} -{{- define "airbyte.storage.azure.envs" }} -{{- if .Values.global.storage.azure.connectionString }} -- name: AZURE_STORAGE_CONNECTION_STRING - value: {{ .Values.global.storage.azure.connectionString }} -{{- end }} -{{- if .Values.global.storage.azure.connectionStringSecretKey }} -- name: AZURE_STORAGE_CONNECTION_STRING - valueFrom: - secretKeyRef: - name: {{ include "airbyte.storage.secretName" . }} - key: {{ .Values.global.storage.azure.connectionStringSecretKey }} -{{- end }} -{{- end }} - -{{/* -Returns azure secrets -*/}} -{{- define "airbyte.storage.azure.secrets" }} -{{- if .Values.global.storage.azure }} -AZURE_STORAGE_CONNECTION_STRING: {{ .Values.global.storage.azure.connectionString | default "" }} -{{- end }} -{{- end }} - -{{/* -Returns S3 environment variables. -*/}} -{{- define "airbyte.storage.s3.envs" }} -{{- if eq .Values.global.storage.s3.authenticationType "credentials" }} -- name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: {{ include "airbyte.storage.secretName" . }} - key: {{ .Values.global.storage.s3.accessKeyIdSecretKey | default "s3-access-key-id" }} -- name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ include "airbyte.storage.secretName" . }} - key: {{ .Values.global.storage.s3.secretAccessKeySecretKey | default "s3-secret-access-key" }} -{{- end }} -{{- if .Values.global.storage.s3.region }} -- name: AWS_DEFAULT_REGION - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: AWS_DEFAULT_REGION -{{- end }} -{{- end}} - -{{/* -Returns S3 secrets -*/}} -{{- define "airbyte.storage.s3.secrets" }} -{{- if and (.Values.global.storage.s3) (eq .Values.global.storage.s3.authenticationType "credentials") }} -AWS_ACCESS_KEY_ID: {{ .Values.global.storage.s3.accessKeyId | default "" }} -AWS_SECRET_ACCESS_KEY: {{ .Values.global.storage.s3.secretAccessKey | default "" }} -{{- end }} -{{- end }} - -{{/* -Returns GCS environment variables. -*/}} -{{- define "airbyte.storage.gcs.envs" }} -- name: GOOGLE_APPLICATION_CREDENTIALS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: GOOGLE_APPLICATION_CREDENTIALS -{{- end}} - -{{/* -Returns GCS secrets. -*/}} -{{- define "airbyte.storage.gcs.secrets" }} -{{- if .Values.global.storage.gcs }} -gcp.json: {{ .Values.global.storage.gcs.credentialsJson }} -{{- end }} -{{- end}} - -{{/* -Returns Minio environment variables. -*/}} -{{- define "airbyte.storage.minio.envs" }} -{{- if .Values.global.storage.minio }} -- name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: {{ include "airbyte.storage.secretName" . }} - key: {{ .Values.global.storage.minio.accessKeyIdSecretKey | default "MINIO_ACCESS_KEY_ID" }} -- name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ include "airbyte.storage.secretName" . }} - key: {{ .Values.global.storage.minio.secretAccessKeySecretKey | default "MINIO_SECRET_ACCESS_KEY" }} -{{- else }} -- name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: {{ include "airbyte.storage.secretName" . }} - key: "MINIO_ACCESS_KEY_ID" -- name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ include "airbyte.storage.secretName" . }} - key: "MINIO_SECRET_ACCESS_KEY" -{{- end }} -- name: MINIO_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MINIO_ENDPOINT -{{- end }} - -{{- define "airbyte.storage.minio.secrets" }} -{{- if .Values.global.storage.minio }} -MINIO_ACCESS_KEY_ID: {{ .Values.global.storage.minio.accessKeyId | default "minio" | quote }} -MINIO_SECRET_ACCESS_KEY: {{ .Values.global.storage.minio.secretAccessKey | default "minio123" | quote }} -{{- else }} -MINIO_ACCESS_KEY_ID: "minio" -MINIO_SECRET_ACCESS_KEY: "minio123" -{{- end }} -{{- end }} - -{{/* -Returns storage config environment variables. -*/}} -{{- define "airbyte.storage.envs" }} -{{- $storageProvider := (include "airbyte.storage.provider" .) }} -- name: S3_PATH_STYLE_ACCESS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: S3_PATH_STYLE_ACCESS -- name: STORAGE_TYPE - value: {{ upper $storageProvider }} -- name: STORAGE_BUCKET_ACTIVITY_PAYLOAD - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STORAGE_BUCKET_ACTIVITY_PAYLOAD -- name: STORAGE_BUCKET_LOG - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STORAGE_BUCKET_LOG -- name: STORAGE_BUCKET_STATE - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STORAGE_BUCKET_STATE -- name: STORAGE_BUCKET_WORKLOAD_OUTPUT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: STORAGE_BUCKET_WORKLOAD_OUTPUT -{{/* S3 */}} -{{- if eq $storageProvider "s3" }} -{{- include "airbyte.storage.s3.envs" . }} -{{- end }} - -{{/* GCS */}} -{{- if eq $storageProvider "gcs" }} -{{- include "airbyte.storage.gcs.envs" . }} -{{- end }} - -{{/* MINIO */}} -{{- if eq $storageProvider "minio" }} -{{- include "airbyte.storage.minio.envs" . }} -{{- end }} - -{{/* AZURE */}} -{{- if eq $storageProvider "azure" }} -{{- include "airbyte.storage.azure.envs" . }} -{{- end }} - -{{- end }} - -{{/* -Returns storage config variables. -*/}} -{{- define "airbyte.storage.configVars" }} -{{- end }} - -{{/* -Returns storage config secrets. -*/}} -{{- define "airbyte.storage.secrets" }} -{{- $storageProvider := (include "airbyte.storage.provider" .) }} -{{/* S3 */}} -{{- if eq $storageProvider "s3" }} -{{- include "airbyte.storage.s3.secrets" . }} -{{- end }} - -{{/* GCS */}} -{{- if eq $storageProvider "gcs" }} -{{- include "airbyte.storage.gcs.secrets" . }} -{{- end }} - -{{/* MINIO */}} -{{- if eq $storageProvider "minio" }} -{{- include "airbyte.storage.minio.secrets" . }} -{{- end }} - -{{/* AZURE */}} -{{- if eq $storageProvider "azure" }} -{{- include "airbyte.storage.azure.secrets" . }} -{{- end }} -{{- end }} diff --git a/airbyte-v1-notused/templates/_temporal.tpl b/airbyte-v1-notused/templates/_temporal.tpl deleted file mode 100644 index c4e213c9..00000000 --- a/airbyte-v1-notused/templates/_temporal.tpl +++ /dev/null @@ -1,58 +0,0 @@ -{{/* -Temporal Configuration -*/}} - -{{- define "airbyte.temporal.database.host.env" }} -- name: POSTGRES_SEEDS - valueFrom: - {{- if .Values.global.database.hostSecretKey }} - secretKeyRef: - name: {{ include "airbyte.database.secretName" . }} - key: {{ .Values.global.database.hostSecretKey }} - {{- else }} - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: DATABASE_HOST - {{- end }} -{{- end }} - -{{- define "airbyte.temporal.database.port.env" }} -- name: DB_PORT - valueFrom: - {{- if .Values.global.database.portSecretKey }} - secretKeyRef: - name: {{ include "airbyte.database.secretName" . }} - key: {{ .Values.global.database.portSecretKey }} - {{- else }} - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: DATABASE_PORT - {{- end }} -{{- end }} - -{{- define "airbyte.temporal.database.user.env" }} -- name: POSTGRES_USER - valueFrom: - secretKeyRef: - {{- if .Values.global.database.userSecretKey }} - name: {{ .Values.global.database.secretName }} - {{- else }} - name: {{ .Release.Name }}-airbyte-secrets - {{- end }} - key: {{ include "airbyte.database.userSecretKey" .}} -{{- end }} - -{{- define "airbyte.temporal.database.password.env" }} -- name: POSTGRES_PWD - valueFrom: - secretKeyRef: - name: {{ include "airbyte.database.secretName" . }} - key: {{ include "airbyte.database.passwordSecretKey" . }} -{{- end }} - -{{- define "airbyte.temporal.database.envs" }} -{{ include "airbyte.temporal.database.host.env" . }} -{{ include "airbyte.temporal.database.port.env" . }} -{{ include "airbyte.temporal.database.user.env" . }} -{{ include "airbyte.temporal.database.password.env" . }} -{{- end }} diff --git a/airbyte-v1-notused/templates/airbyte-db.yaml b/airbyte-v1-notused/templates/airbyte-db.yaml deleted file mode 100644 index 91cbd658..00000000 --- a/airbyte-v1-notused/templates/airbyte-db.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{- if .Values.postgresql.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: airbyte-db-svc - annotations: - helm.sh/hook: pre-install - helm.sh/hook-weight: "-1" - labels: - {{ include "airbyte.databaseLabels" . | nindent 4 }} -spec: - type: ClusterIP - ports: - - port: 5432 - protocol: TCP - selector: - {{ include "airbyte.databaseSelectorLabels" . | nindent 4 }} ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: airbyte-db - annotations: - helm.sh/hook: pre-install - helm.sh/hook-weight: "-1" - labels: - {{ include "airbyte.databaseLabels" . | nindent 4 }} -spec: - replicas: 1 - serviceName: airbyte-db-svc - selector: - matchLabels: - {{ include "airbyte.databaseSelectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{ include "airbyte.databaseSelectorLabels" . | nindent 8 }} - spec: - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - containers: - - name: airbyte-db-container - image: {{ include "imageUrl" (list .Values.postgresql.image $) }} - env: - - name: POSTGRES_DB - value: {{ .Values.postgresql.postgresqlDatabase }} - - name: POSTGRES_PASSWORD - value: {{ .Values.postgresql.postgresqlPassword }} - - name: POSTGRES_USER - value: {{ .Values.postgresql.postgresqlUsername }} - - name: PGDATA - value: /var/lib/postgresql/data/pgdata - ports: - - containerPort: 5432 - securityContext: {{- toYaml .Values.postgresql.containerSecurityContext | nindent 12 }} - volumeMounts: - - name: airbyte-volume-db - mountPath: /var/lib/postgresql/data - {{- with .Values.postgresql.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.postgresql.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.postgresql.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: {{- toYaml .Values.postgresql.podSecurityContext | nindent 8 }} - - volumeClaimTemplates: - - metadata: - name: airbyte-volume-db - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: 500Mi -{{- end }} diff --git a/airbyte-v1-notused/templates/airbyte-yml-secret.yaml b/airbyte-v1-notused/templates/airbyte-yml-secret.yaml deleted file mode 100644 index eb6574e6..00000000 --- a/airbyte-v1-notused/templates/airbyte-yml-secret.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.global.airbyteYml }} -# The Secret that contains the airbyte.yml content. For this to work helm must be started with -# --set-file global.airbyteYml=/airbyte.yml -# For Airbyte Enterprise our installation script automatically specifies this, for Community -# users will need to specify it, if they want to use the airbyte.yml config file. -# If nothing is specified we'll assume an empty config -apiVersion: v1 -kind: Secret -metadata: - name: {{ .Release.Name }}-airbyte-yml - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" - labels: - {{- include "airbyte.labels" . | nindent 4 }} -type: Opaque -data: - fileContents: "{{ .Values.global.airbyteYml | default "" | nindent 4 | b64enc }}" -{{- end }} diff --git a/airbyte-v1-notused/templates/env-configmap.yaml b/airbyte-v1-notused/templates/env-configmap.yaml deleted file mode 100644 index bfbeea2b..00000000 --- a/airbyte-v1-notused/templates/env-configmap.yaml +++ /dev/null @@ -1,160 +0,0 @@ -{{- $airbyteYmlDict := (default "" .Values.global.airbyteYml | fromYaml) }} -# default to empty dict if airbyteYml is undefined -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ .Release.Name }}-airbyte-env - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" - labels: - {{- include "airbyte.labels" . | nindent 4 }} -data: - AIRBYTE_VERSION: {{ .Values.version | default .Chart.AppVersion }} - {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} - AIRBYTE_EDITION: "pro" - {{- else }} - AIRBYTE_EDITION: "community" - {{- end }} - - {{- if $airbyteYmlDict }} - AIRBYTE_URL: {{ (index $airbyteYmlDict "webapp-url") | quote }} - {{- else}} - AIRBYTE_URL: {{ .Values.global.airbyteUrl | quote }} - {{- end }} - - AIRBYTE_SERVER_HOST: {{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} - API_URL: {{ .Values.webapp.api.url }} - CONNECTOR_BUILDER_API_URL: {{ index .Values.webapp "connector-builder-server" "url" | quote }} - CONFIG_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} # temporary solution for oss kube deploys for airbyte api server until that server is wrapped into the config server - CONFIG_ROOT: /configs - CONFIGS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: "0.35.15.001" - DATA_DOCKER_MOUNT: airbyte_data - DB_DOCKER_MOUNT: airbyte_db - {{- include "airbyte.database.configVars" . | nindent 2 }} - KEYCLOAK_DATABASE_URL: {{ include "airbyte.keycloak.database.url" . | quote }} - GOOGLE_APPLICATION_CREDENTIALS: {{ include "airbyte.gcpLogCredentialsPath" . | quote }} - INTERNAL_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }} - WORKLOAD_API_HOST: http://{{ .Release.Name }}-workload-api-server-svc:{{ index .Values "workload-api-server" "service" "port" }} - - - {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} - INITIAL_USER_FIRST_NAME: {{ .Values.global.auth.instanceAdmin.firstName }} - INITIAL_USER_LAST_NAME: {{ .Values.global.auth.instanceAdmin.lastName }} - {{- if .Values.global.auth.identityProvider }} - IDENTITY_PROVIDER_TYPE: {{ .Values.global.auth.identityProvider.type }} - OIDC_DOMAIN: {{ .Values.global.auth.identityProvider.oidc.domain }} - OIDC_APP_NAME: {{ .Values.global.auth.identityProvider.oidc.appName }} - {{- end }} - KEYCLOAK_INTERNAL_HOST: {{ .Release.Name }}-airbyte-keycloak-svc:{{ .Values.keycloak.service.port }} - KEYCLOAK_PORT: {{ .Values.keycloak.service.port | quote }} - - {{- if $airbyteYmlDict }} - KEYCLOAK_HOSTNAME_URL: {{ printf "%s/auth" (index $airbyteYmlDict "webapp-url") | quote }} - {{- else }} - KEYCLOAK_HOSTNAME_URL: {{ printf "%s/auth" .Values.global.airbyteUrl | quote }} - {{- end }} - - KEYCLOAK_JAVA_OPTS_APPEND: -Djgroups.dns.query={{ .Release.Name }}-airbyte-keycloak-headless-svc - {{- else }} - KEYCLOAK_INTERNAL_HOST: localhost # just a placeholder so that nginx template is valid - shouldn't be used when edition isn't "pro" - {{- end }} - - CONNECTOR_BUILDER_API_HOST: {{ .Release.Name }}-airbyte-connector-builder-server-svc:{{ index .Values "connector-builder-server" "service" "port" }} - - {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} - {{- if $airbyteYmlDict }} - AIRBYTE_API_HOST: {{ printf "%s/api/public" (index $airbyteYmlDict "webapp-url") | quote }} - {{- else }} - AIRBYTE_API_HOST: {{ printf "%s/api/public" .Values.global.airbyteUrl | quote }} - {{- end }} - {{- else if (eq .Values.global.edition "community")}} - AIRBYTE_API_HOST: http://localhost:{{ .Values.server.service.port }}/api/public - {{- else }} - AIRBYTE_API_HOST: http://{{ .Release.Name }}-airbyte-server-svc:{{ .Values.server.service.port }}/api/public - {{- end }} - - {{- if $.Values.global.jobs.kube.annotations }} - JOB_KUBE_ANNOTATIONS: {{ $.Values.global.jobs.kube.annotations | include "airbyte.flattenMap" | quote }} - {{- end }} - - {{- if $.Values.global.jobs.kube.labels }} - JOB_KUBE_LABELS: {{ $.Values.global.jobs.kube.labels | include "airbyte.flattenMap" | quote }} - {{- end }} - - {{- if $.Values.global.jobs.kube.nodeSelector }} - JOB_KUBE_NODE_SELECTORS: {{ $.Values.global.jobs.kube.nodeSelector | include "airbyte.flattenMap" | quote }} - {{- end }} - - {{- if $.Values.global.jobs.kube.tolerations }} - JOB_KUBE_TOLERATIONS: {{ $.Values.global.jobs.kube.tolerations | include "airbyte.flattenArrayMap" | quote }} - {{- end }} - - JOB_KUBE_BUSYBOX_IMAGE: {{ include "imageUrl" (list $.Values.global.jobs.kube.images.busybox $) }} - JOB_KUBE_CURL_IMAGE: {{ include "imageUrl" (list $.Values.global.jobs.kube.images.curl $) }} - {{ $workloadLauncher := (index .Values "workload-launcher") }} - CONTAINER_ORCHESTRATOR_IMAGE: {{ include "imageUrl" (list $workloadLauncher.containerOrchestrator.image $) }} - WORKLOAD_INIT_IMAGE: {{ include "imageUrl" (list $workloadLauncher.workloadInit.image $) }} - CONNECTOR_SIDECAR_IMAGE: {{ include "imageUrl" (list $workloadLauncher.connectorSidecar.image $) }} - - JOB_MAIN_CONTAINER_CPU_LIMIT: {{ ((.Values.global.jobs.resources | default dict).limits | default dict).cpu | default "" | quote }} - JOB_MAIN_CONTAINER_CPU_REQUEST: {{ ((.Values.global.jobs.resources | default dict).requests | default dict).cpu | default "" | quote }} - JOB_MAIN_CONTAINER_MEMORY_LIMIT: {{ ((.Values.global.jobs.resources | default dict).limits | default dict).memory | default "" | quote }} - JOB_MAIN_CONTAINER_MEMORY_REQUEST: {{ ((.Values.global.jobs.resources | default dict).requests | default dict).memory | default "" | quote }} - - {{- if $.Values.global.jobs.kube.main_container_image_pull_secret }} - JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET: {{ $.Values.global.jobs.kube.main_container_image_pull_secret }} - {{- end }} - JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION: "0.29.15.001" - - JOB_KUBE_LOCAL_VOLUME_ENABLED: {{ .Values.global.jobs.local.volume.enabled | quote }} - - LOG_LEVEL: {{ default "INFO" (((.Values.global).logging).level) }} - MICROMETER_METRICS_ENABLED: "false" - MICROMETER_METRICS_STATSD_FLAVOR: "datadog" - RUN_DATABASE_MIGRATION_ON_STARTUP: {{ index .Values "airbyte-bootloader" "runDatabaseMigrationsOnStartup" | default "true" | quote }} - SEGMENT_WRITE_KEY: 7UDdp5K55CyiGgsauOr2pNNujGvmhaeu - # Storage start - STORAGE_TYPE: {{ (((.Values.global).storage).type) | default "minio" | quote }} - STORAGE_BUCKET_ACTIVITY_PAYLOAD: {{ ((((.Values.global).storage).bucket).activityPayload) | default "airbyte-storage" | quote }} - STORAGE_BUCKET_LOG: {{ ((((.Values.global).storage).bucket).log) | default "airbyte-storage" | quote }} - STORAGE_BUCKET_STATE: {{ ((((.Values.global).storage).bucket).state) | default "airbyte-storage" | quote }} - STORAGE_BUCKET_WORKLOAD_OUTPUT: {{ ((((.Values.global).storage).bucket).workloadOutput) | default "airbyte-storage" | quote }} - - {{- with .Values.global.storage.s3 }} - AWS_DEFAULT_REGION: {{ .region | default "" | quote }} - {{- end}} - - MINIO_ENDPOINT: {{ include "airbyte.storage.minio.endpoint" . | quote }} - S3_PATH_STYLE_ACCESS: {{ include "airbyte.s3PathStyleAccess" . | quote }} - # Storage end - STATSD_HOST: "localhost" - STATSD_PORT: "8125" - TEMPORAL_HOST: {{ .Release.Name }}-temporal:{{ .Values.temporal.service.port }} - TEMPORAL_WORKER_PORTS: 9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040 - TRACKING_STRATEGY: segment - WEBAPP_URL: {{ .Values.webapp.url | default (printf "http://%s-airbyte-webapp-svc:%d" .Release.Name (.Values.webapp.service.port | int)) }} - WORKER_ENVIRONMENT: kubernetes - WORKSPACE_DOCKER_MOUNT: airbyte_workspace - WORKSPACE_ROOT: /workspace - METRIC_CLIENT: {{ .Values.global.metrics.metricClient | default "" | quote }} - OTEL_COLLECTOR_ENDPOINT: {{ .Values.global.metrics.otelCollectorEndpoint | default "" | quote }} - ACTIVITY_MAX_ATTEMPT: {{ .Values.worker.activityMaxAttempt | default "" | quote }} - ACTIVITY_INITIAL_DELAY_BETWEEN_ATTEMPTS_SECONDS: {{ .Values.worker.activityInitialDelayBetweenAttemptsSeconds | default "" | quote }} - ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS: {{ .Values.worker.activityMaxDelayBetweenAttemptsSeconds | default "" | quote }} - WORKFLOW_FAILURE_RESTART_DELAY_SECONDS: "" - FILE_TRANSFER_EPHEMERAL_STORAGE_LIMIT: 5G - FILE_TRANSFER_EPHEMERAL_STORAGE_REQUEST: 5G - - LAUNCHER_MICRONAUT_ENVIRONMENTS: "control-plane,oss" - WORKERS_MICRONAUT_ENVIRONMENTS: "control-plane" - CRON_MICRONAUT_ENVIRONMENTS: "control-plane" - SERVER_MICRONAUT_ENVIRONMENTS: "control-plane" - SHOULD_RUN_NOTIFY_WORKFLOWS: "true" - MAX_NOTIFY_WORKERS: {{ .Values.worker.maxNotifyWorkers | default "5" | quote }} - KUBERNETES_CLIENT_MAX_IDLE_CONNECTIONS: "" - WORKLOAD_LAUNCHER_PARALLELISM: "10" - CONNECTOR_BUILDER_SERVER_API_HOST: http://{{ .Release.Name }}-airbyte-connector-builder-server-svc:{{ index .Values "connector-builder-server" "service" "port" }} - PUB_SUB_ENABLED: "false" - PUB_SUB_TOPIC_NAME: "" - ENTERPRISE_SOURCE_STUBS_URL: {{ .Values.server.env_vars.ENTERPRISE_SOURCE_STUBS_URL | default "https://connectors.airbyte.com/files/resources/connector_stubs/v0/connector_stubs.json" }} diff --git a/airbyte-v1-notused/templates/gcs-log-creds-secret.yaml b/airbyte-v1-notused/templates/gcs-log-creds-secret.yaml deleted file mode 100644 index 92214675..00000000 --- a/airbyte-v1-notused/templates/gcs-log-creds-secret.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if and - (eq .Values.global.deploymentMode "oss") - (eq (lower (default "" .Values.global.storage.type)) "gcs") - (not .Values.global.storage.secretName) - (not .Values.global.storage.storageSecretName) -}} -{{- $gcsConfig := required "You must set 'global.storage.gcs' when setting 'global.storage.type' to 'gcs'" .Values.global.storage.gcs }} -{{- $credentialsJson := required "You must set 'global.storage.gcs.credentialsJson' when 'global.storage.secretName' is not set" .Values.global.storage.gcs.credentialsJson }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ .Release.Name }}-gcs-log-creds - labels: - {{- include "airbyte.labels" . | nindent 4 }} -type: Opaque -data: - gcp.json: {{ $credentialsJson | default "" | quote }} -{{- end }} diff --git a/airbyte-v1-notused/templates/minio.yaml b/airbyte-v1-notused/templates/minio.yaml deleted file mode 100644 index a47ea4e2..00000000 --- a/airbyte-v1-notused/templates/minio.yaml +++ /dev/null @@ -1,185 +0,0 @@ -{{- if (eq (lower (default "" .Values.global.storage.type)) "minio")}} -apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 -kind: StatefulSet -metadata: - # This name uniquely identifies the Deployment - name: airbyte-minio - annotations: - helm.sh/hook: pre-install - helm.sh/hook-weight: "-1" - labels: - {{ include "airbyte.minioLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - {{ include "airbyte.minioSelectorLabels" . | nindent 6 }} - serviceName: airbyte-minio-svc - volumeClaimTemplates: - - metadata: - name: airbyte-minio-pv-claim - spec: - accessModes: [ "ReadWriteOnce" ] - resources: - requests: - storage: {{ .Values.minio.storage.volumeClaimValue }} - template: - metadata: - labels: - # Label is used as selector in the service. - {{ include "airbyte.minioSelectorLabels" . | nindent 8 }} - spec: - # Refer to the PVC created earlier - securityContext: - fsGroup: 1000 - containers: - - name: airbyte-minio - image: {{ include "imageUrl" (list .Values.minio.image $) }} - args: - - server - - /storage - env: - # Minio access key and secret key. This must match the S3_ACCESS_KEY_ID and S3_SECRET_ACCESS_KEY declared in /dev/.env. - - name: MINIO_ROOT_USER - valueFrom: - secretKeyRef: - name: {{ .Release.Name }}-airbyte-secrets - key: MINIO_ACCESS_KEY_ID - - name: MINIO_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Release.Name }}-airbyte-secrets - key: MINIO_SECRET_ACCESS_KEY - ports: - - containerPort: 9000 - resources: - requests: - memory: "1024Mi" - cpu: "200m" - limits: - memory: "1024Mi" - cpu: "200m" - # Mount the volume into the pod - securityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - volumeMounts: - - name: airbyte-minio-pv-claim # must match the volume name, above - mountPath: "/storage" - {{- with .Values.minio.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.minio.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.minio.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - ---- -apiVersion: v1 -kind: Service -metadata: - name: airbyte-minio-svc - labels: - {{ include "airbyte.minioLabels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install - helm.sh/hook-weight: "-1" -spec: - ports: - - port: 9000 - targetPort: 9000 - protocol: TCP - selector: - {{ include "airbyte.minioSelectorLabels" . | nindent 4 }} ---- -# This pod creates the state-storage bucket in the minio server, -# which the local cloud deployment requires to store its state. -apiVersion: v1 -kind: Pod -metadata: - name: airbyte-minio-create-bucket - annotations: - "helm.sh/hook": post-install, post-upgrade - "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation -spec: - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - restartPolicy: OnFailure - securityContext: - fsGroup: 1000 - containers: - - name: minio-mc - image: {{ include "imageUrl" (list .Values.minio.mcImage $) }} - command: ["/bin/sh", "-c", - "until (/usr/bin/mc config host add myminio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY) do echo '...waiting...' && sleep 1; done; - /usr/bin/mc mb --ignore-existing myminio/state-storage; - /usr/bin/mc policy set public myminio/state-storage; - /usr/bin/mc mb --ignore-existing myminio/airbyte-dev-logs; - /usr/bin/mc policy set public myminio/airbyte-dev-logs;"] - securityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - env: - {{- if and (eq (lower (default "" .Values.global.storage.type)) "minio") (((.Values.global).storage).minio) }} - - name: MINIO_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} - key: {{ include "airbyte.minioAccessKeyIdSecretKey" .Values.global.storage.minio.accessKeyIdSecretKey }} - - name: MINIO_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ include "airbyte.secretStoreName" .Values.global.storage.storageSecretName }} - key: {{ include "airbyte.minioSecretAccessKeySecretKey" .Values.global.storage.minio.secretAccessKeySecretKey }} - {{- else }} - # this is for the internally deployed minio - - name: MINIO_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ .Release.Name }}-airbyte-secrets - key: MINIO_ACCESS_KEY_ID - - name: MINIO_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Release.Name }}-airbyte-secrets - key: MINIO_SECRET_ACCESS_KEY - {{- end }} - - name: MINIO_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: MINIO_ENDPOINT -{{- end }} diff --git a/airbyte-v1-notused/templates/secret.yaml b/airbyte-v1-notused/templates/secret.yaml deleted file mode 100644 index 7d4230d0..00000000 --- a/airbyte-v1-notused/templates/secret.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: {{ .Release.Name }}-airbyte-secrets - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-1" - labels: - {{- include "airbyte.labels" . | nindent 4 }} -type: Opaque -stringData: - {{- include "airbyte.database.secrets" . | nindent 2 }} - {{- include "airbyte.storage.secrets" . | nindent 2 }} - {{- if or (eq .Values.global.edition "pro") (eq .Values.global.edition "enterprise") }} - KEYCLOAK_ADMIN_USER: {{ .Values.keycloak.auth.adminUsername | quote }} - KEYCLOAK_ADMIN_PASSWORD: {{ .Values.keycloak.auth.adminPassword | quote }} - {{- end }} - WORKLOAD_API_BEARER_TOKEN: {{ index ".Values.workload-api.bearerToken" | quote }} diff --git a/airbyte-v1-notused/templates/serviceaccount.yaml b/airbyte-v1-notused/templates/serviceaccount.yaml deleted file mode 100644 index 7f7acd85..00000000 --- a/airbyte-v1-notused/templates/serviceaccount.yaml +++ /dev/null @@ -1,77 +0,0 @@ -{{- if eq .Values.global.deploymentMode "oss" }} -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "airbyte.serviceAccountName" . }} - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install - helm.sh/hook-weight: "-10" - {{- with .Values.serviceAccount.annotations }} - {{- toYaml . | nindent 4 }} - {{- end }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ include "airbyte.serviceAccountName" . }}-role - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install - helm.sh/hook-weight: "-5" -rules: - - apiGroups: ["*"] -{{- if eq .Values.global.edition "community" }} - resources: ["jobs", "pods", "pods/log", "pods/exec", "pods/attach", "secrets"] -{{- else }} - resources: ["jobs", "pods", "pods/log", "pods/exec", "pods/attach"] -{{- end }} - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # over-permission for now ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ include "airbyte.serviceAccountName" . }}-binding - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - helm.sh/hook: pre-install - helm.sh/hook-weight: "-3" -roleRef: - apiGroup: "" - kind: Role - name: {{ include "airbyte.serviceAccountName" . }}-role -subjects: - - kind: ServiceAccount - name: {{ include "airbyte.serviceAccountName" . }} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - {{- include "airbyte.labels" . | nindent 4 }} - name: node-viewer -rules: - - apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "airbyte.labels" . | nindent 4 }} - name: {{ include "airbyte.serviceAccountName" . }}-admin-node-viewer -subjects: - - kind: ServiceAccount - name: {{ include "airbyte.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -roleRef: - kind: ClusterRole - name: node-viewer - apiGroup: rbac.authorization.k8s.io -{{- end }} -{{- end }} diff --git a/airbyte-v1-notused/templates/tests/test-webapp.yaml b/airbyte-v1-notused/templates/tests/test-webapp.yaml deleted file mode 100644 index 8b33ae24..00000000 --- a/airbyte-v1-notused/templates/tests/test-webapp.yaml +++ /dev/null @@ -1,29 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: "{{ include "common.names.fullname" . }}-test-connection" - labels: - {{- include "airbyte.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - {{- if .Values.global.imagePullSecrets }} - imagePullSecrets: - {{- range .Values.global.imagePullSecrets }} - {{- printf "- name: %s" .name | nindent 8 }} - {{- end }} - {{- end }} - containers: - - name: wget - image: {{ include "imageUrl" (list .Values.testWebapp.image $) }} - command: ['wget'] - args: ['{{ .Release.Name }}-airbyte-webapp-svc:{{ .Values.webapp.service.port }}'] - resources: - requests: - memory: "64Mi" - cpu: "100m" - limits: - memory: "128Mi" - cpu: "200m" - restartPolicy: Never diff --git a/airbyte-v1-notused/values.yaml b/airbyte-v1-notused/values.yaml deleted file mode 100644 index cf9fbdd0..00000000 --- a/airbyte-v1-notused/values.yaml +++ /dev/null @@ -1,2313 +0,0 @@ -### Airbyte V1 Helm Chart - - -# Global params that are overwritten with umbrella chart -global: - # -- Service Account name override - serviceAccountName: &service-account-name "airbyte-admin" - # -- Deployment mode, whether or not render the default env vars and volumes in deployment spec - deploymentMode: "oss" - # -- Edition; "community" or "pro" - edition: "community" - - airbyteYml: "" - - enterprise: - # -- Secret name where an Airbyte license key is stored - secretName: "airbyte-v1-airbyte-secrets" - # -- The key within `licenseKeySecretName` where the Airbyte license key is stored - licenseKeySecretKey: "license-key" - - # -- The URL where Airbyte will be reached; This should match your Ingress host - airbyteUrl: "" - - # Docker image config that will apply to all images. - image: - # Docker registry to pull platform images from, e.g. http://my-registry:8000/ - registry: "" - # Image tag to use for airbyte images. - # Does not include non-airbyte images such as busybox, temporal, minio, etc. - tag: "1.2.0" - - # Docker image pull secret - imagePullSecrets: - - name: regcred - - # -- Auth configuration - auth: - # -- Whether auth is enabled - enabled: true - # -- Admin user configuration - instanceAdmin: - # -- Secret name where the instanceAdmin configuration is stored - secretName: "airbyte-v1-airbyte-secrets" - # -- The first name of the initial user - firstName: "" - # -- The last name of the initial user - lastName: "" - # -- The key within `emailSecretName` where the initial user's email is stored - emailSecretKey: "instance-admin-email" - # -- The key within `passwordSecretName` where the initial user's password is stored - passwordSecretKey: "instance-admin-password" - - # -- Environment variables - env_vars: {} - - # -- Database configuration - database: - type: "external" # "external" - - # -- Secret name where database credentials are stored - secretName: "airbyte-v1-airbyte-secrets" # e.g. "airbyte-v1-airbyte-secrets" - - # -- The database host - # -- Value will be overriden by TF - host: "airbyte-host" - - # -- The database port - # -- Value will be overriden by TF - port: "3306" - - # -- The database name - database: "airbyte-v1" - - # -- The database user - user: "rds_admin" - - # -- The database password - password: "pwd" - - storage: - # -- The storage backend type. Supports s3, gcs, azure, minio (default) - type: s3 # default storage used - # -- Secret name where storage provider credentials are stored - storageSecretName: "airbyte-v1-airbyte-secrets" - - # S3 - bucket: ## S3 bucket names that you've created. We recommend storing the following all in one bucket. - log: b-multitenantdev-dev-airbyte-v1-logs - state: b-multitenantdev-dev-airbyte-v1-logs - workloadOutput: b-multitenantdev-dev-airbyte-v1-logs - s3: - region: "us-east-1" ## e.g. us-east-1 - authenticationType: credentials ## Use "credentials" or "instanceProfile" - - metrics: - # -- The metric client to configure globally. Supports "otel" - metricClient: "" - # -- The open-telemetry-collector endpoint that metrics will be sent to - otelCollectorEndpoint: "" - - # Jobs resource requests and limits, see http://kubernetes.io/docs/user-guide/compute-resources/ - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. - jobs: - resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- Job resource requests - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- Job resource limits - limits: {} - - local: - volume: - enabled: false - - kube: - ## JOB_KUBE_ANNOTATIONS - # pod annotations of the sync job and the default pod annotations fallback for others jobs - # -- key/value annotations applied to kube jobs - annotations: {} - - ## JOB_KUBE_LABELS - ## pod labels of the sync job and the default pod labels fallback for others jobs - # -- key/value labels applied to kube jobs - labels: {} - - ## JOB_KUBE_NODE_SELECTORS - ## pod node selector of the sync job and the default pod node selector fallback for others jobs - # -- Node labels for pod assignment - nodeSelector: {} - - ## JOB_KUBE_TOLERATIONS - # -- Node tolerations for pod assignment - # Any boolean values should be quoted to ensure the value is passed through as a string. - tolerations: [] - - ## JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET - # -- image pull secret to use for job pod - main_container_image_pull_secret: "regcred" - - images: - ## JOB_KUBE_BUSYBOX_IMAGE - # -- busybox image used by the job pod - busybox: "busybox:1.35" - ## JOB_KUBE_CURL_IMAGE - # -- curl image used by the job pod - curl: "curlimages/curl:8.1.1" - -## @section Common Parameters - -# -- String to partially override airbyte.fullname template with a string (will prepend the release name) -nameOverride: "" -# -- String to fully override airbyte.fullname template with a string -fullnameOverride: "" - -# Pods Service Account, see https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ -serviceAccount: - # -- Specifies whether a ServiceAccount should be created - create: true - # -- Annotations for service account. Evaluated as a template. Only used if `create` is `true`. - annotations: {} - # -- Name of the service account to use. If not set and create is true, a name is generated using the fullname template. - name: *service-account-name - -# -- Sets the AIRBYTE_VERSION environment variable. Defaults to Chart.AppVersion. -## If changing the image tags below, you should probably also update this. -version: "" - -## @section Webapp Parameters - -webapp: - enabled: true - # -- Number of webapp replicas - replicaCount: 1 - - ## webapp.image.repository - ## webapp.image.pullPolicy - ## webapp.image.tag The airbyte webapp image tag. Defaults to the chart's AppVersion - image: - # -- The repository to use for the airbyte webapp image - repository: airbyte/webapp - # -- The pull policy to use for the airbyte webapp image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the webapp pods - podAnnotations: {} - - # -- webapp.podLabels [object] Add extra labels to the webapp pods - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=101(nginx) - fsGroup: 101 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=101(nginx) - runAsUser: 101 - # gid=101(nginx) - runAsGroup: 101 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - ## Configure extra options for the webapp containers' liveness and readiness probes, - ## see https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - livenessProbe: - # -- Enable livenessProbe on the webapp - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 1 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the webapp - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 1 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - service: - # -- The service type to use for the webapp service - type: ClusterIP - # -- The service port to expose the webapp on - port: 80 - # -- Annotations for the webapp service resource - annotations: {} - - ## Web app resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the Web container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the Web container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for webapp pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - ## Configure the ingress resource that allows you to access the Airbyte installation. - ## ref: http://kubernetes.io/docs/user-guide/ingress/ - ingress: - # -- Set to true to enable ingress record generation - enabled: true - # -- Specifies ingressClassName for clusters >= 1.18+ - className: "nginx" - # -- Ingress annotations done as key:value pairs - annotations: {} - # kubernetes.io/tls-acme: "true" - # -- The list of hostnames to be covered with this ingress record. - hosts: - - host: - paths: - - path: / - pathType: ImplementationSpecific - # -- Custom ingress TLS configuration - tls: [] - - api: - # -- The webapp API url - url: /api/v1/ - - connector-builder-server: - url: /connector-builder-api - - fullstory: - # -- Whether or not to enable fullstory - enabled: false - - ## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: var-run - ## mountPath: /var/run/ - ## - name: var-cache-nginx - ## mountPath: /var/cache/nginx - ## - mountPath: /etc/nginx/conf.d - ## name: nginx-conf-d - ## - # -- Additional volumeMounts for webapp containers - extraVolumeMounts: [] - - ## Examples (when using `webapp.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: var-run - ## emptyDir: {} - ## - name: var-cache-nginx - ## emptyDir: {} - ## - name: nginx-conf-d - ## emptyDir: {} - # -- Additional volumes for webapp pods - extraVolumes: [] - - ## Example: - # extraContainers: - # - name: otel_collector - # image: somerepo/someimage:sometag - # args: [ - # "--important-args" - # ] - # ports: - # - containerPort: 443 - # volumeMounts: - # - name: volumeMountCool - # mountPath: /some/path - # readOnly: true - # -- Additional container for server pods - extraContainers: [] - - ## Example: - # extraInitContainers: - # - name: sleepy - # image: alpine - # command: ['sleep', '60'] - # -- Additional init containers for server pods - extraInitContainers: [] - - # -- Supply extra env variables to main container using full notation - extraEnv: [] - ## Example: - ## secrets: - ## DATABASE_PASSWORD: strong-password - ## DATABASE_USER: my-db-user - # -- Supply additional secrets to container - secrets: {} - - ## Example: - ## env_vars: - ## DATABASE_HOST: airbyte-db - ## DATABASE_PORT: 5432 - # -- Supply extra env variables to main container using simplified notation - env_vars: {} - -## @section Pod Sweeper parameters - -pod-sweeper: - enabled: true - image: - # -- The image repository to use for the pod sweeper - repository: bitnami/kubectl - # -- The pull policy for the pod sweeper image - pullPolicy: IfNotPresent - # -- The pod sweeper image tag to use - tag: 1.28.9 - - # -- Add extra annotations to the podSweeper pod - podAnnotations: {} - - # -- Add extra labels to the podSweeper pod - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1001(anon) - fsGroup: 1001 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1001(anon) - runAsUser: 1001 - # gid=1001(anon) - runAsGroup: 1001 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the podSweeper - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 5 - # -- Period seconds for livenessProbe - periodSeconds: 30 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 1 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the podSweeper - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 5 - # -- Period seconds for readinessProbe - periodSeconds: 30 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 1 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## Pod Sweeper app resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the podSweeper container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the podSweeper container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for pod assignment, see https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - ## Examples: - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for podSweeper container(s). - extraVolumeMounts: [] - - ## Examples: - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for podSweeper pod(s). - extraVolumes: [] - -## @section Server parameters - -server: - enabled: true - # -- Number of server replicas - replicaCount: 1 - - image: - # -- The repository to use for the airbyte server image. - repository: airbyte/server - # -- the pull policy to use for the airbyte server image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the server pods - podAnnotations: {} - - # -- Add extra labels to the server pods - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - ## Configure extra options for the server containers' liveness and readiness probes - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes - livenessProbe: - # -- Enable livenessProbe on the server - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 10 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the server - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 10 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## server resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the server container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the server container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for server pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for server pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - log: - # -- The log level to log at - level: "INFO" - - ## Examples (when using `server.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for server containers - extraVolumeMounts: [] - - ## Examples (when using `server.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for server pods - extraVolumes: [] - - ## Example: - # extraContainers: - # - name: otel_collector - # image: somerepo/someimage:sometag - # args: [ - # "--important-args" - # ] - # ports: - # - containerPort: 443 - # volumeMounts: - # - name: volumeMountCool - # mountPath: /some/path - # readOnly: true - # -- Additional container for server pods - extraContainers: [] - - ## Example: - # extraInitContainers: - # - name: sleepy - # image: alpine - # command: ['sleep', '60'] - # -- Additional init containers for server pods - extraInitContainers: [] - - ## Example: (With default env vars and values taken from generated config map) - # extraEnv: - # - name: AIRBYTE_VERSION - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: AIRBYTE_VERSION - # - name: API_URL - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: API_URL - # - name: TRACKING_STRATEGY - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: TRACKING_STRATEGY - # - name: FULLSTORY - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: FULLSTORY - # - name: INTERNAL_API_HOST - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: INTERNAL_API_HOST - ## - # -- Supply extra env variables to main container using full notation - extraEnv: [] - ## Example: - ## secrets: - ## DATABASE_PASSWORD: strong-password - ## DATABASE_USER: my-db-user - # -- Supply additional secrets to container - secrets: {} - ## Example: - ## env_vars: - ## DATABASE_HOST: airbyte-db - ## DATABASE_PORT: 5432 - # -- Supply extra env variables to main container using simplified notation - env_vars: {} - -## @section Worker Parameters - -worker: - enabled: true - # -- Number of worker replicas - replicaCount: 1 - - image: - # -- The repository to use for the airbyte worker image. - repository: airbyte/worker - # -- the pull policy to use for the airbyte worker image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the worker pods - podAnnotations: {} - - # -- Add extra labels to the worker pods - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the worker - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 1 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the worker - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 1 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## worker resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - #! -- The resources limits for the worker container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the worker container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for worker pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - log: - #! -- The log level to log at. - level: "INFO" - - ## Example: - ## - ## extraEnv: - ## - name: JOB_KUBE_TOLERATIONS - ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" - # -- Additional env vars for worker pods - extraEnv: [] - - ## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for worker containers - extraVolumeMounts: [] - - ## Examples (when using `worker.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for worker pods - extraVolumes: [] - # -- Additional container for worker pods - extraContainers: [] - - hpa: - enabled: false - - debug: - enabled: false - - ## current no exist documentations - activityMaxAttempt: "" - activityInitialDelayBetweenAttemptsSeconds: "" - activityMaxDelayBetweenAttemptsSeconds: "" - maxNotifyWorkers: 5 - -## @section Workload Launcher Parameters - -workload-launcher: - enabled: true - # -- Number of workload launcher replicas - replicaCount: 1 - - image: - # -- The repository to use for the airbyte workload launcher image. - repository: airbyte/workload-launcher - # -- The pull policy to use for the airbyte workload launcher image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the workload launcher pods - podAnnotations: {} - - # -- Add extra labels to the workload launcher pods - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the workload launcher - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 1 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the workload launcher - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 1 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## workload launcher resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the workload launcher container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the workload launcher container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for workload launcher pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # Affinity and anti-affinity for workload launcher pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - log: - # -- The log level to log at - level: "INFO" - - ## Example: - ## - ## extraEnv: - ## - name: JOB_KUBE_TOLERATIONS - ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" - # -- Additional env vars for workload launcher pods - extraEnv: [] - - ## Examples (when using `workload launcher.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for workload launcher containers - extraVolumeMounts: [] - - ## Examples (when using `workload-launcher.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for workload launcher pods - extraVolumes: [] - - extraContainers: [] - - hpa: - enabled: false - - debug: - enabled: false - - containerOrchestrator: - # -- Enable or disable Orchestrator - enabled: true - # -- Orchestrator image - # This is a template string that will be passed to the "tpl" helper. - image: "airbyte/container-orchestrator:{{ default .Chart.AppVersion .Values.global.image.tag }}" - - connectorSidecar: - # -- Connector Sidecar image - # This is a template string that will be passed to the "tpl" helper. - image: "airbyte/connector-sidecar:{{ default .Chart.AppVersion .Values.global.image.tag }}" - - workloadInit: - # -- Workload init image - # This is a template string that will be passed to the "tpl" helper. - image: "airbyte/workload-init-container:{{ default .Chart.AppVersion .Values.global.image.tag }}" - - ## current no exist documentations - activityMaxAttempt: "" - activityInitialDelayBetweenAttemptsSeconds: "" - activityMaxDelayBetweenAttemptsSeconds: "" - - maxNotifyWorkers: 5 - -## @section Rollout Worker Parameters - -connector-rollout-worker: - enabled: false - # -- Number of connector rollout worker replicas - replicaCount: 2 - - image: - # -- The repository to use for the airbyte connector rollout worker image. - repository: airbyte/connector-rollout-worker - # -- The pull policy to use for the airbyte connector rollout worker image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the connector rollout worker pods - podAnnotations: {} - - # -- Add extra labels to the connector rollout worker pods - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the connector rollout worker - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 1 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the connector rollout worker - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 1 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## connector rollout worker resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the connector rollout worker container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the connector rollout worker container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for connector rollout worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # Affinity and anti-affinity for connector rollout worker pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - log: - # -- The log level to log at - level: "INFO" - ## Example: - ## - ## extraEnv: - ## - name: JOB_KUBE_TOLERATIONS - ## value: "key=airbyte-server,operator=Equals,value=true,effect=NoSchedule" - # -- Additional env vars for connector rollout worker pods - extraEnv: [] - - ## Examples (when using `connector rollout worker.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for connector rollout worker containers - extraVolumeMounts: [] - - ## Examples (when using `connector-rollout-worker.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for connector rollout worker pods - extraVolumes: [] - - extraContainers: [] - - hpa: - enabled: false - - debug: - enabled: false - - containerOrchestrator: - # -- Enable or disable Orchestrator - enabled: true - # -- Orchestrator image - image: "" - - ## current no exist documentations - activityMaxAttempt: "" - activityInitialDelayBetweenAttemptsSeconds: "" - activityMaxDelayBetweenAttemptsSeconds: "" - - maxNotifyWorkers: 5 - -## @section Metrics parameters -metrics: - enabled: false - - # -- Number of metrics-reporter replicas - replicaCount: 1 - - image: - # -- The repository to use for the airbyte metrics-reporter image. - repository: airbyte/metrics-reporter - # -- The pull policy to use for the airbyte metrics-reporter image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the metrics-reporter pod - podAnnotations: {} - - # -- Add extra labels to the metrics-reporter pod - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - ## metrics-reporter app resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the metrics-reporter container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the metrics-reporter container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for metrics-reporter pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for metrics-reporter pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - ## Example: - ## - ## extraEnv: - ## - name: SAMPLE_ENV_VAR - ## value: "key=sample-value" - # -- Additional env vars for metrics-reporter pods - extraEnv: [] - - ## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for metrics-reporter containers - extraVolumeMounts: [] - - ## Examples (when using `metrics.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for metrics-reporter pods - extraVolumes: [] - - extraContainers: [] - - secrets: {} - - env_vars: {} - -## @section Bootloader Parameters - -airbyte-bootloader: - enabled: true - image: - # -- The repository to use for the airbyte bootloader image. - repository: airbyte/bootloader - # -- The pull policy to use for the airbyte bootloader image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the bootloader pod - podAnnotations: {} - - # -- Add extra labels to the bootloader pod - podLabels: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for worker pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - ## Bootloader resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the airbyte bootloader image - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the airbyte bootloader image - limits: {} - - # -- Affinity and anti-affinity for bootloader pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - ## Example: (With default env vars and values taken from generated config map) - ## extraEnv: - ## - name: AIRBYTE_VERSION - ## valueFrom: - ## configMapKeyRef: - ## name: airbyte-env - ## key: AIRBYTE_VERSION - ## - name: DATABASE_HOST - ## valueFrom: - ## configMapKeyRef: - ## name: airbyte-env - ## key: DATABASE_HOST - ## - name: DATABASE_PORT - ## valueFrom: - ## configMapKeyRef: - ## name: airbyte-env - ## key: DATABASE_PORT - ## - name: DATABASE_PASSWORD - ## valueFrom: - ## secretKeyRef: - ## name: airbyte-secrets - ## key: DATABASE_PASSWORD - ## - name: DATABASE_URL - ## valueFrom: - ## configMapKeyRef: - ## name: airbyte-env - ## key: DATABASE_URL - ## - name: DATABASE_USER - ## valueFrom: - ## secretKeyRef: - ## name: airbyte-secrets - ## key: DATABASE_USER - # -- Supply extra env variables to main container using full notation - extraEnv: [] - ## Example: - ## secrets: - ## DATABASE_PASSWORD: strong-password - ## DATABASE_USER: my-db-user - # -- Supply additional secrets to container - secrets: {} - - ## Example: - ## env_vars: - ## DATABASE_HOST: airbyte-db - ## DATABASE_PORT: 5432 - # -- Supply extra env variables to main container using simplified notation - env_vars: {} - ## Example: - # extraContainers: - # - name: otel_collector - # image: somerepo/someimage:sometag - # args: [ - # "--important-args" - # ] - # ports: - # - containerPort: 443 - # volumeMounts: - # - name: volumeMountCool - # mountPath: /some/path - # readOnly: true - # -- Additional container for server pod(s) - extraContainers: [] - - ## Example: - # extraInitContainers: - # - name: sleepy - # image: alpine - # command: ['sleep', '60'] - # -- Additional init containers for server pods - extraInitContainers: [] - - ## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for server containers - extraVolumeMounts: [] - - ## Examples (when using `containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for server pods - extraVolumes: [] - -## @section Temporal parameters -## TODO: Move to consuming temporal from a dedicated helm chart - -temporal: - enabled: true - # -- The number of temporal replicas to deploy - replicaCount: 1 - - image: - # -- The temporal image repository to use - repository: temporalio/auto-setup - # -- The pull policy for the temporal image - pullPolicy: IfNotPresent - # -- The temporal image tag to use - tag: "1.23.0" - - service: - # -- The Kubernetes Service Type - type: ClusterIP - # -- The temporal port and exposed kubernetes port - port: 7233 - - # -- Add extra annotations to the temporal pod - podAnnotations: {} - - # -- Add extra labels to the temporal pod - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(temporal) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(temporal) - runAsUser: 1000 - # gid=1000(temporal) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraInitContainers: - ## - name: config-loader - ## image: temporalio/auto-setup:1.23 - ## command: - ## - /bin/sh - ## - -c - ## - >- - ## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; - ## volumeMounts: - ## - name: config - ## mountPath: /config - # -- Additional InitContainers to initialize the pod - extraInitContainers: [] - - livenessProbe: - # -- Enable livenessProbe on the temporal - enabled: false - - readinessProbe: - # -- Enable readinessProbe on the temporal - enabled: false - - # -- Node labels for temporal pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for temporal pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for temporal pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - ## Example: - ## - ## extraEnv: - ## - name: SAMPLE_ENV_VAR - ## value: "key=sample-value" - # -- Additional env vars for temporal pod(s). - extraEnv: [] - ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - ## - name: config - ## mountPath: /etc/temporal/config - # -- Additional volumeMounts for temporal containers - extraVolumeMounts: [] - - ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - ## - name: config - ## emptyDir: {} - # -- Additional volumes for temporal pods - extraVolumes: [] - - ## Temporal resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for temporal pods - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for temporal pods - limits: {} - - extraContainers: [] - -## @section Temporal parameters -## TODO: Move to consuming temporal from a dedicated helm chart - -temporal-ui: - enabled: false - # -- The number of temporal-ui replicas to deploy - replicaCount: 1 - - image: - # -- The temporal-ui image repository to use - repository: temporalio/ui - # -- The pull policy for the temporal-ui image - pullPolicy: IfNotPresent - tag: "2.30.1" - - service: - # -- The Kubernetes Service Type - type: ClusterIP - # -- The temporal-ui port and exposed kubernetes port - port: 8088 - - # -- Add extra annotations to the temporal-ui pod - podAnnotations: {} - - # -- Add extra labels to the temporal-ui pod - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # gid=1000(temporal-ui) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: false - # uid=1000(temporal-ui) - runAsUser: 0 - # gid=1000(temporal-ui) - runAsGroup: 0 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraInitContainers: - ## - name: config-loader - ## image: temporalio/ui:2.30.1 - ## command: - ## - /bin/sh - ## - -c - ## - >- - ## find /etc/temporal/config/ -maxdepth 1 -mindepth 1 -exec cp -ar {} /config/ \; - ## volumeMounts: - ## - name: config - ## mountPath: /config - # -- Additional InitContainers to initialize the pod - extraInitContainers: [] - - livenessProbe: - # -- Enable livenessProbe on the temporal-ui - enabled: false - - readinessProbe: - # -- Enable readinessProbe on the temporal-ui - enabled: false - - # -- Node labels for temporal-ui pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for temporal-ui pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for temporal-ui pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - ## Example: - ## - ## extraEnv: - ## - name: SAMPLE_ENV_VAR - ## value: "key=sample-value" - # -- Additional env vars for temporal-ui pod(s). - extraEnv: [] - - ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - ## - name: config - ## mountPath: /etc/temporal/config - # -- Additional volumeMounts for temporal containers - extraVolumeMounts: [] - - ## Examples (when using `temporal.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - ## - name: config - ## emptyDir: {} - # -- Additional volumes for temporal-ui pods - extraVolumes: [] - - ## Temporal UI resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for temporal-ui pods - requests: {} - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for temporal-ui pods - limits: {} - - extraContainers: [] - -## @section Airbyte Database parameters - -# PostgreSQL chart configuration, see https://github.com/bitnami/charts/blob/master/bitnami/postgresql/values.yaml -postgresql: - # -- Switch to enable or disable the PostgreSQL helm chart - enabled: false - - ## image.repository Repository for airbyte-db statefulset - image: - repository: airbyte/db - # -- Airbyte Postgresql username - postgresqlUsername: airbyte - # -- Airbyte Postgresql password - postgresqlPassword: airbyte - # -- Airbyte Postgresql database - postgresqlDatabase: db-airbyte - # fullnameOverride: *db-hostname - ## This secret is used in case of postgresql.enabled=true and we would like to specify password for newly created postgresql instance - # -- Name of an existing secret containing the PostgreSQL password ('postgresql-password' key) - existingSecret: "" - podSecurityContext: - # gid=70(postgres) - fsGroup: 70 - containerSecurityContext: - # -- Ensures the container will run with a non-root user - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=70(postgres) - runAsUser: 70 - # gid=70(postgres) - runAsGroup: 70 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - commonAnnotations: - # -- It will determine when the hook should be rendered - helm.sh/hook: pre-install - # -- The order in which the hooks are executed. If weight is lower, it has higher priority - helm.sh/hook-weight: "-1" - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for postgresql pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for postgresql pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - -# External PostgreSQL configuration, All of these values are only used when postgresql.enabled is set to false -externalDatabase: - # -- Database host - host: "" - # -- non-root Username for Airbyte Database - user: "" - # -- Database password - password: "" - # -- Name of an existing secret resource containing the DB password - existingSecret: "" - # -- Name of an existing secret key containing the DB password - existingSecretPasswordKey: "" - # -- Database name - database: "" - # -- Database port number - port: "" - # -- Database full JDBC URL (ex: jdbc:postgresql://host:port/db?parameters) - jdbcUrl: "" - - -minio: - image: - # -- Minio image used by Minio helm chart - repository: minio/minio - # -- Minio tag image - tag: latest - - mcImage: - repository: minio/minio - tag: latest - - storage: - volumeClaimValue: 500Mi - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - # -- Tolerations for minio pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - ## - tolerations: [] - - # -- Affinity and anti-affinity for minio pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - -## @section cron parameters -cron: - enabled: true - # -- Number of cron replicas - replicaCount: 1 - image: - # -- The repository to use for the airbyte cron image. - repository: airbyte/cron - # -- The pull policy to use for the airbyte cron image - pullPolicy: IfNotPresent - - # -- Add extra annotations to the cron pods - podAnnotations: {} - - # -- Add extra labels to the cron pods - podLabels: {} - - # -- Security context for the container - podSecurityContext: - # uid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the cron - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 1 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the cron - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 1 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## cron resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the cron container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the cron container - requests: {} - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for cron pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for cron pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - log: - # -- The log level to log at. - level: "INFO" - - ## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumeMounts: - ## - name: tmpdir - ## mountPath: /tmp - # -- Additional volumeMounts for cron containers - extraVolumeMounts: [] - - ## Examples (when using `cron.containerSecurityContext.readOnlyRootFilesystem=true`): - ## extraVolumes: - ## - name: tmpdir - ## emptyDir: {} - # -- Additional volumes for cron pods - extraVolumes: [] - - ## Example: - # extraContainers: - # - name: otel_collector - # image: somerepo/someimage:sometag - # args: [ - # "--important-args" - # ] - # ports: - # - containerPort: 443 - # volumeMounts: - # - name: volumeMountCool - # mountPath: /some/path - # readOnly: true - # -- Additional container for cron pods - extraContainers: [] - - ## Example: - # extraInitContainers: - # - name: sleepy - # image: alpine - # command: ['sleep', '60'] - # -- Additional init containers for cron pods - extraInitContainers: [] - - ## Example: (With default env vars and values taken from generated config map) - # extraEnv: - # - name: AIRBYTE_VERSION - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: AIRBYTE_VERSION - # - name: API_URL - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: API_URL - # - name: TRACKING_STRATEGY - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: TRACKING_STRATEGY - # - name: FULLSTORY - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: FULLSTORY - # - name: INTERNAL_API_HOST - # valueFrom: - # configMapKeyRef: - # name: airbyte-env - # key: INTERNAL_API_HOST - # -- Supply extra env variables to main container using full notation - extraEnv: [] - ## Example: - ## secrets: - ## DATABASE_PASSWORD: strong-password - ## DATABASE_USER: my-db-user - # -- Supply additional secrets to container - secrets: {} - ## Example: - ## env_vars: - ## DATABASE_HOST: airbyte-db - ## DATABASE_PORT: 5432 - # -- Supply extra env variables to main container using simplified notation - env_vars: {} - -connector-builder-server: - enabled: true - # -- Number of connector-builder-server replicas - replicaCount: 1 - - image: - # -- The repository to use for the airbyte connector-builder-server image. - repository: airbyte/connector-builder-server - # -- The pull policy to use for the airbyte connector-builder-server image - pullPolicy: IfNotPresent - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the server - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 10 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the server - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 10 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## connector-builder-server resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the connector-builder-server container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the connector-builder-server container - requests: {} - - log: - # -- The log level to log at. - level: "INFO" - - env_vars: {} - service: - port: 80 - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for webapp pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - -keycloak: - enabled: false - env_vars: {} - - auth: - adminUsername: airbyteAdmin - adminPassword: keycloak123 - - image: - repository: airbyte/keycloak - pullPolicy: IfNotPresent - - # -- Security context for the container - podSecurityContext: - # gid=0(root) - fsGroup: 0 - - initContainers: - initDb: - image: "postgres:13-alpine" - - initContainerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=70(postgres) - runAsUser: 70 - # gid=70(postgres) - runAsGroup: 70 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(keycloak) - runAsUser: 1000 - # gid=0(root) - runAsGroup: 0 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for webapp pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - -keycloak-setup: - enabled: false - env_vars: {} - - image: - repository: airbyte/keycloak-setup - pullPolicy: IfNotPresent - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - initContainerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # gid=100(curl_user) - runAsUser: 100 - # gid=101(curl_group) - runAsGroup: 101 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - initContainers: - keycloakReadinessCheck: - image: "curlimages/curl:8.1.1" - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for webapp pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - -workload-api-server: - enabled: true - - bearerToken: token - - # -- workload-api-server replicas - replicaCount: 1 - - image: - # -- The repository to use for the airbyte-workload-api-server image. - repository: airbyte/workload-api-server - # -- The pull policy to use for the airbyte-workload-api-server image - pullPolicy: IfNotPresent - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the server - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 10 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the server - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 10 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## airbyte-workload-api-server resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the airbyte-workload-api-server container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the airbyte-workload-api-server container - requests: {} - - log: - # -- The log level at which to log - level: "INFO" - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for webapp pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - env_vars: {} - service: - port: 8007 - - # Configure the ingress resource that allows you to access the Airbyte Workload API, see http://kubernetes.io/docs/user-guide/ingress/ - ingress: - # -- Set to true to enable ingress record generation - enabled: false - # -- Specifies ingressClassName for clusters >= 1.18+ - className: "" - # -- Ingress annotations done as key:value pairs - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - # -- The list of hostnames to be covered with this ingress record - hosts: [] - # - host: localhost - # paths: - # - path: / - # pathType: ImplementationSpecific - # -- Custom ingress TLS configuration - tls: [] - # - secretName: chart-example-tls - # hosts: - # - localhost - -featureflag-server: - enabled: false - - # -- workload-api-server replicas - replicaCount: 1 - - image: - # -- The repository to use for the airbyte-workload-api-server image. - repository: airbyte/featureflag-server - # -- The pull policy to use for the airbyte-workload-api-server image - pullPolicy: IfNotPresent - - # -- Security context for the container - podSecurityContext: - # gid=1000(airbyte) - fsGroup: 1000 - - containerSecurityContext: - allowPrivilegeEscalation: false - runAsNonRoot: true - # uid=1000(airbyte) - runAsUser: 1000 - # gid=1000(airbyte) - runAsGroup: 1000 - readOnlyRootFilesystem: false - capabilities: - drop: ["ALL"] - seccompProfile: - type: RuntimeDefault - - livenessProbe: - # -- Enable livenessProbe on the server - enabled: true - # -- Initial delay seconds for livenessProbe - initialDelaySeconds: 30 - # -- Period seconds for livenessProbe - periodSeconds: 10 - # -- Timeout seconds for livenessProbe - timeoutSeconds: 10 - # -- Failure threshold for livenessProbe - failureThreshold: 3 - # -- Success threshold for livenessProbe - successThreshold: 1 - - readinessProbe: - # -- Enable readinessProbe on the server - enabled: true - # -- Initial delay seconds for readinessProbe - initialDelaySeconds: 10 - # -- Period seconds for readinessProbe - periodSeconds: 10 - # -- Timeout seconds for readinessProbe - timeoutSeconds: 10 - # -- Failure threshold for readinessProbe - failureThreshold: 3 - # -- Success threshold for readinessProbe - successThreshold: 1 - - ## airbyte-workload-api-server resource requests and limits - ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## We usually recommend not to specify default resources and to leave this as a conscious - ## choice for the user. This also increases chances charts run on environments with little - ## resources, such as Minikube. If you do want to specify resources, uncomment the following - ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. - resources: - ## Example: - ## limits: - ## cpu: 200m - ## memory: 1Gi - # -- The resources limits for the airbyte-workload-api-server container - limits: {} - ## Examples: - ## requests: - ## memory: 256Mi - ## cpu: 250m - # -- The requested resources for the airbyte-workload-api-server container - requests: {} - - log: - # -- The log level at which to log - level: "INFO" - - # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ - nodeSelector: {} - - # -- Tolerations for webapp pod assignment, see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - tolerations: [] - - # -- Affinity and anti-affinity for webapp pod assignment, see - # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - - env_vars: {} - service: - port: 8007 - - # Configure the ingress resource that allows you to access the Airbyte Workload API, see http://kubernetes.io/docs/user-guide/ingress/ - ingress: - # -- Set to true to enable ingress record generation - enabled: false - # -- Specifies ingressClassName for clusters >= 1.18+ - className: "" - # -- Ingress annotations done as key:value pairs - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - # -- The list of hostnames to be covered with this ingress record - hosts: [] - # - host: localhost - # paths: - # - path: / - # pathType: ImplementationSpecific - # -- Custom ingress TLS configuration - tls: [] - # - secretName: chart-example-tls - # hosts: - # - localhost - -testWebapp: - image: - repository: busybox - tag: latest From 85770c2fb45b0347a4314a629070fed00b2f2800 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 9 Jan 2025 16:27:43 +0100 Subject: [PATCH 58/69] Add blotout env to server template --- .../airbyte-v1/charts/server/templates/deployment.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/helm/airbyte-v1/charts/server/templates/deployment.yaml b/helm/airbyte-v1/charts/server/templates/deployment.yaml index 186082d6..cd2f2ee0 100644 --- a/helm/airbyte-v1/charts/server/templates/deployment.yaml +++ b/helm/airbyte-v1/charts/server/templates/deployment.yaml @@ -100,6 +100,16 @@ spec: configMapKeyRef: name: {{ .Release.Name }}-airbyte-env key: CONFIG_ROOT + - name: BLOTOUT_AUTH_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: BLOTOUT_AUTH_ENDPOINT + - name: BLOTOUT_BASE_URL + valueFrom: + configMapKeyRef: + name: {{ .Release.Name }}-airbyte-env + key: BLOTOUT_BASE_URL - name: MICROMETER_METRICS_ENABLED valueFrom: configMapKeyRef: From 4a2f875b8ceffbbcdcf9787e145988c5ad147ec7 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 9 Jan 2025 16:33:10 +0100 Subject: [PATCH 59/69] update airbyte-v1 chart to v1.3.5 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 82c4f2a5..a73fdd4d 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.4" +version: "v1.3.5" From dedbb16ac7f88d7da278f018acbcb9aaddb21fc4 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 9 Jan 2025 18:43:15 +0100 Subject: [PATCH 60/69] test local charts,v1.3.6 --- helm/airbyte-v1/Chart.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index a73fdd4d..7e117002 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -24,7 +24,8 @@ dependencies: version: 1.3.0 - condition: server.enabled name: server - repository: https://airbytehq.github.io/helm-charts/ + # repository: https://airbytehq.github.io/helm-charts/ + repository: 'file://charts/server' version: 1.3.0 - condition: worker.enabled name: worker @@ -69,4 +70,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.5" +version: "v1.3.6" From eb8330d64eccd96a74a2f9b0a5604d03e9f5fbfa Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 9 Jan 2025 19:03:13 +0100 Subject: [PATCH 61/69] Test server env vars, v1.3.7 --- helm/airbyte-v1/Chart.yaml | 5 ++--- helm/airbyte-v1/templates/env-configmap.yaml | 4 ++-- helm/airbyte-v1/values.yaml | 6 +++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 7e117002..43c311f1 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -24,8 +24,7 @@ dependencies: version: 1.3.0 - condition: server.enabled name: server - # repository: https://airbytehq.github.io/helm-charts/ - repository: 'file://charts/server' + repository: https://airbytehq.github.io/helm-charts/ version: 1.3.0 - condition: worker.enabled name: worker @@ -70,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.6" +version: "v1.3.7" diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml index bf615ae8..42effb44 100644 --- a/helm/airbyte-v1/templates/env-configmap.yaml +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -24,8 +24,8 @@ data: {{- end }} ### Env vars requested by the Blotout team - BLOTOUT_AUTH_ENDPOINT: {{ .Values.global.blotout_auth_endpoint | default "" | quote }} - BLOTOUT_BASE_URL: {{ .Values.global.blotout_base_url | default "" }} + BLOTOUT_AUTH_ENDPOINT: {{ .Values.server.env_vars.blotout_auth_endpoint | default "" | quote }} + BLOTOUT_BASE_URL: {{ .Values.server.env_vars.blotout_base_url | default "" }} AWS_SECRET_ACCESS_KEY: {{ .Values.global.aws_secret_key | default "" }} AWS_ACCESS_KEY_ID: {{ .Values.global.aws_access_key | default "" | quote }} JOB_MAIN_CONTAINER_CPU_REQUEST: {{ .Values.global.resource_cpu_request | default "0.5" }} diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 665f47c2..414b0afa 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -14,8 +14,6 @@ global: aws_access_key: "" aws_secret_key: "" # -- Blotout required configuration - blotout_auth_endpoint: "/api/v1/auth/validation" - blotout_base_url: "" resource_cpu_limit: "2" resource_cpu_request: "0.5" resource_memory_limit: "6Gi" @@ -741,7 +739,9 @@ server: ## DATABASE_HOST: airbyte-db ## DATABASE_PORT: 5432 # -- Supply extra env variables to main container using simplified notation - env_vars: {} + env_vars: + blotout_auth_endpoint: "" + blotout_base_url: "" ## @section Worker Parameters From 6473414643e89a354d6e2367ae6da6c3563b8677 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 9 Jan 2025 19:11:27 +0100 Subject: [PATCH 62/69] Fix BLOTOUT_AUTH_ENDPOINT and BLOTOUT_BASE_URL vars --- helm/airbyte-v1/templates/env-configmap.yaml | 4 ++-- helm/airbyte-v1/values.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml index 42effb44..66f8e6aa 100644 --- a/helm/airbyte-v1/templates/env-configmap.yaml +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -24,8 +24,8 @@ data: {{- end }} ### Env vars requested by the Blotout team - BLOTOUT_AUTH_ENDPOINT: {{ .Values.server.env_vars.blotout_auth_endpoint | default "" | quote }} - BLOTOUT_BASE_URL: {{ .Values.server.env_vars.blotout_base_url | default "" }} + BLOTOUT_AUTH_ENDPOINT: {{ .Values.server.env_vars.BLOTOUT_AUTH_ENDPOINT | default "" | quote }} + BLOTOUT_BASE_URL: {{ .Values.server.env_vars.BLOTOUT_BASE_URL | default "" }} AWS_SECRET_ACCESS_KEY: {{ .Values.global.aws_secret_key | default "" }} AWS_ACCESS_KEY_ID: {{ .Values.global.aws_access_key | default "" | quote }} JOB_MAIN_CONTAINER_CPU_REQUEST: {{ .Values.global.resource_cpu_request | default "0.5" }} diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 414b0afa..6c4d6582 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -740,8 +740,8 @@ server: ## DATABASE_PORT: 5432 # -- Supply extra env variables to main container using simplified notation env_vars: - blotout_auth_endpoint: "" - blotout_base_url: "" + BLOTOUT_AUTH_ENDPOINT: "" + BLOTOUT_BASE_URL: "" ## @section Worker Parameters From ea2cb9a6f79bd41d6289a2f3e328c6b6b312b968 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Thu, 9 Jan 2025 19:24:26 +0100 Subject: [PATCH 63/69] Fix BLOTOUT_AUTH_ENDPOINT and BLOTOUT_BASE_URL vars --- helm/airbyte-v1/templates/env-configmap.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml index 66f8e6aa..8f991141 100644 --- a/helm/airbyte-v1/templates/env-configmap.yaml +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -24,8 +24,8 @@ data: {{- end }} ### Env vars requested by the Blotout team - BLOTOUT_AUTH_ENDPOINT: {{ .Values.server.env_vars.BLOTOUT_AUTH_ENDPOINT | default "" | quote }} - BLOTOUT_BASE_URL: {{ .Values.server.env_vars.BLOTOUT_BASE_URL | default "" }} + BLOTOUT_AUTH_ENDPOINT: "" + BLOTOUT_BASE_URL: "" AWS_SECRET_ACCESS_KEY: {{ .Values.global.aws_secret_key | default "" }} AWS_ACCESS_KEY_ID: {{ .Values.global.aws_access_key | default "" | quote }} JOB_MAIN_CONTAINER_CPU_REQUEST: {{ .Values.global.resource_cpu_request | default "0.5" }} From 8a0404fbf0e29e477e2233e48c318bf41e8df90f Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 17 Jan 2025 11:32:38 +0100 Subject: [PATCH 64/69] Set resource requests and limitation for critical airbyte-v1 components --- helm/airbyte-v1/Chart.yaml | 2 +- helm/airbyte-v1/values.yaml | 39 +++++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 43c311f1..8069f33f 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.7" +version: "v1.3.8" diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 6c4d6582..4f27f21c 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -638,13 +638,17 @@ server: ## cpu: 200m ## memory: 1Gi # -- The resources limits for the server container - limits: {} + limits: + cpu: 950m + memory: 4Gi ## Examples: ## requests: ## memory: 256Mi ## cpu: 250m - # -- The requested resources for the server container - requests: {} + # -- The requested resources for the workload launcher container + requests: + cpu: 400m + memory: 1Gi # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ nodeSelector: {} @@ -820,14 +824,17 @@ worker: ## cpu: 200m ## memory: 1Gi #! -- The resources limits for the worker container - limits: {} + limits: + cpu: 950m + memory: 4Gi ## Examples: ## requests: ## memory: 256Mi ## cpu: 250m - # -- The requested resources for the worker container - requests: {} - + # -- The requested resources for the workload launcher container + requests: + cpu: 400m + memory: 1Gi # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ nodeSelector: {} @@ -955,13 +962,17 @@ workload-launcher: ## cpu: 200m ## memory: 1Gi # -- The resources limits for the workload launcher container - limits: {} + limits: + cpu: 950m + memory: 4Gi ## Examples: ## requests: ## memory: 256Mi ## cpu: 250m # -- The requested resources for the workload launcher container - requests: {} + requests: + cpu: 400m + memory: 1Gi # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ nodeSelector: {} @@ -2221,13 +2232,17 @@ workload-api-server: ## cpu: 200m ## memory: 1Gi # -- The resources limits for the airbyte-workload-api-server container - limits: {} + limits: + cpu: 950m + memory: 4Gi ## Examples: ## requests: ## memory: 256Mi ## cpu: 250m - # -- The requested resources for the airbyte-workload-api-server container - requests: {} + # -- The requested resources for the workload launcher container + requests: + cpu: 400m + memory: 1Gi log: # -- The log level at which to log From a81b76e58c28050975a53241c2fb4f4c87260f1d Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 17 Jan 2025 11:53:35 +0100 Subject: [PATCH 65/69] test remove not needed vars --- .../charts/server/templates/deployment.yaml | 20 +++++++++---------- helm/airbyte-v1/templates/env-configmap.yaml | 4 ++-- helm/airbyte-v1/values.yaml | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/helm/airbyte-v1/charts/server/templates/deployment.yaml b/helm/airbyte-v1/charts/server/templates/deployment.yaml index cd2f2ee0..f9a1b72e 100644 --- a/helm/airbyte-v1/charts/server/templates/deployment.yaml +++ b/helm/airbyte-v1/charts/server/templates/deployment.yaml @@ -100,16 +100,16 @@ spec: configMapKeyRef: name: {{ .Release.Name }}-airbyte-env key: CONFIG_ROOT - - name: BLOTOUT_AUTH_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: BLOTOUT_AUTH_ENDPOINT - - name: BLOTOUT_BASE_URL - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }}-airbyte-env - key: BLOTOUT_BASE_URL + # - name: BLOTOUT_AUTH_ENDPOINT + # valueFrom: + # configMapKeyRef: + # name: {{ .Release.Name }}-airbyte-env + # key: BLOTOUT_AUTH_ENDPOINT + # - name: BLOTOUT_BASE_URL + # valueFrom: + # configMapKeyRef: + # name: {{ .Release.Name }}-airbyte-env + # key: BLOTOUT_BASE_URL - name: MICROMETER_METRICS_ENABLED valueFrom: configMapKeyRef: diff --git a/helm/airbyte-v1/templates/env-configmap.yaml b/helm/airbyte-v1/templates/env-configmap.yaml index 8f991141..12c489d8 100644 --- a/helm/airbyte-v1/templates/env-configmap.yaml +++ b/helm/airbyte-v1/templates/env-configmap.yaml @@ -24,8 +24,8 @@ data: {{- end }} ### Env vars requested by the Blotout team - BLOTOUT_AUTH_ENDPOINT: "" - BLOTOUT_BASE_URL: "" + # BLOTOUT_AUTH_ENDPOINT: "" + # BLOTOUT_BASE_URL: "" AWS_SECRET_ACCESS_KEY: {{ .Values.global.aws_secret_key | default "" }} AWS_ACCESS_KEY_ID: {{ .Values.global.aws_access_key | default "" | quote }} JOB_MAIN_CONTAINER_CPU_REQUEST: {{ .Values.global.resource_cpu_request | default "0.5" }} diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index 4f27f21c..b3d55532 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -963,7 +963,7 @@ workload-launcher: ## memory: 1Gi # -- The resources limits for the workload launcher container limits: - cpu: 950m + cpu: "1" memory: 4Gi ## Examples: ## requests: From ff86e0ae2fcee282e3cac20b7ba50a8524b38b07 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 17 Jan 2025 14:15:13 +0100 Subject: [PATCH 66/69] Set resource requests and limitation for critical airbyte-v1 components --- helm/airbyte-v1/values.yaml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index b3d55532..fabac373 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -963,7 +963,7 @@ workload-launcher: ## memory: 1Gi # -- The resources limits for the workload launcher container limits: - cpu: "1" + cpu: 950m memory: 4Gi ## Examples: ## requests: @@ -1114,18 +1114,24 @@ connector-rollout-worker: ## resources, such as Minikube. If you do want to specify resources, uncomment the following ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. resources: + requests: + memory: 1Gi + cpu: 350m + limits: + cpu: 900m + memory: 4Gi ## Example: ## limits: ## cpu: 200m ## memory: 1Gi # -- The resources limits for the connector rollout worker container - limits: {} + # limits: {} ## Examples: ## requests: ## memory: 256Mi ## cpu: 250m # -- The requested resources for the connector rollout worker container - requests: {} + # requests: {} # -- Node labels for pod assignment, see https://kubernetes.io/docs/user-guide/node-selection/ nodeSelector: {} From d59c026b2ecf9f9dd4a2a3248fce58fd56e31194 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Tue, 21 Jan 2025 09:21:32 +0100 Subject: [PATCH 67/69] Increase chart version airbyte-v1 to v1.3.9 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 8069f33f..e4097bbd 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.8" +version: "v1.3.9" From 4102e3feebf02c1c24ec2a59ce9215f94c426eb7 Mon Sep 17 00:00:00 2001 From: Muharrem Rexhepi Date: Fri, 31 Jan 2025 10:10:05 +0100 Subject: [PATCH 68/69] upgrade airbyte-v1 helm release to v1.3.10 --- helm/airbyte-v1/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index e4097bbd..07e00b65 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.9" +version: "v1.3.10" From d1d662df92ed91b13a7a6615ea80ac1479819f5c Mon Sep 17 00:00:00 2001 From: manojsaikumar Date: Tue, 18 Feb 2025 17:05:32 +0530 Subject: [PATCH 69/69] change in airbyte resources --- helm/airbyte-v1/Chart.yaml | 2 +- helm/airbyte-v1/values.yaml | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 07e00b65..7006bc52 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -69,4 +69,4 @@ dependencies: description: Helm chart to deploy airbyte name: airbyte-v1 type: application -version: "v1.3.10" +version: "v1.3.11" diff --git a/helm/airbyte-v1/values.yaml b/helm/airbyte-v1/values.yaml index fabac373..36376a5a 100644 --- a/helm/airbyte-v1/values.yaml +++ b/helm/airbyte-v1/values.yaml @@ -14,9 +14,9 @@ global: aws_access_key: "" aws_secret_key: "" # -- Blotout required configuration - resource_cpu_limit: "2" + resource_cpu_limit: "6" resource_cpu_request: "0.5" - resource_memory_limit: "6Gi" + resource_memory_limit: "9Gi" resource_memory_request: "1Gi" # -- Airbyte configuration @@ -639,8 +639,8 @@ server: ## memory: 1Gi # -- The resources limits for the server container limits: - cpu: 950m - memory: 4Gi + cpu: 2 + memory: 6Gi ## Examples: ## requests: ## memory: 256Mi @@ -825,8 +825,8 @@ worker: ## memory: 1Gi #! -- The resources limits for the worker container limits: - cpu: 950m - memory: 4Gi + cpu: 2 + memory: 6Gi ## Examples: ## requests: ## memory: 256Mi @@ -963,8 +963,8 @@ workload-launcher: ## memory: 1Gi # -- The resources limits for the workload launcher container limits: - cpu: 950m - memory: 4Gi + cpu: 2 + memory: 6Gi ## Examples: ## requests: ## memory: 256Mi @@ -1118,8 +1118,8 @@ connector-rollout-worker: memory: 1Gi cpu: 350m limits: - cpu: 900m - memory: 4Gi + cpu: 2 + memory: 6Gi ## Example: ## limits: ## cpu: 200m @@ -1789,8 +1789,8 @@ minio: memory: 1Gi cpu: 250m limits: - cpu: 300m - memory: 2Gi + cpu: 1 + memory: 4Gi ## @section cron parameters cron: enabled: true @@ -2239,8 +2239,8 @@ workload-api-server: ## memory: 1Gi # -- The resources limits for the airbyte-workload-api-server container limits: - cpu: 950m - memory: 4Gi + cpu: 2 + memory: 6Gi ## Examples: ## requests: ## memory: 256Mi

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 O0RR6kh?g}0=m7vbgIsU` literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/keycloak-1.2.0.tgz b/helm/airbyte-v1/charts/keycloak-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..dfb5a0576498a420bf8014d672b5a2b6a566aaa7 GIT binary patch literal 20269 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 E0Fm4{UjP6A literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz b/helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2cb6bc86d90695ed5569f385dba6a94b9e455a0b GIT binary patch literal 18955 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 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/metrics-1.2.0.tgz b/helm/airbyte-v1/charts/metrics-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..10a7f16a23b4f51798b0bc0c4d40ce897b33a5b8 GIT binary patch literal 18104 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 Q7XSeN|MpQ4X#mCn0Q3XP^#A|> literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz b/helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9fbd245688d85f29f33db4536a803f986c1a0c3f GIT binary patch literal 19381 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 A{{R30 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/server-1.2.0.tgz b/helm/airbyte-v1/charts/server-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5134142478762aaef32659cb290c639e73e396c8 GIT binary patch literal 22346 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 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/webapp-1.2.0.tgz b/helm/airbyte-v1/charts/webapp-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..93e6d157d408dde448e14e5f12e2b3a529569c9d GIT binary patch literal 20452 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 literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz b/helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3045136182ac2afd04fa8518d925d46417b7fa6d GIT binary patch literal 20958 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 R{}%uN|Nk`TkJA7I0svcyUMc_p literal 0 HcmV?d00001 diff --git a/helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz b/helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c32ac33d32901e4164206f4f5c192f7ec0e7af5f GIT binary patch literal 23369 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 z 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 literal 0 HcmV?d00001 From d7aa6f1a261778726352278bebf640f2eca1324e Mon Sep 17 00:00:00 2001 From: Astrit Zeqiri Date: Fri, 6 Dec 2024 14:28:50 +0100 Subject: [PATCH 19/69] Read deps --- helm/airbyte-v1/Chart.lock | 51 -------------- helm/airbyte-v1/Chart.yaml | 66 ------------------ .../charts/airbyte-bootloader-1.2.0.tgz | Bin 19006 -> 0 bytes .../charts/airbyte-bootloader/Chart.lock | 6 -- .../charts/airbyte-bootloader/Chart.yaml | 6 -- helm/airbyte-v1/charts/common-1.17.1.tgz | Bin 14611 -> 0 bytes .../charts/connector-builder-server-1.2.0.tgz | Bin 19500 -> 0 bytes .../connector-builder-server/Chart.lock | 6 -- .../connector-builder-server/Chart.yaml | 6 -- .../charts/connector-rollout-worker-1.2.0.tgz | Bin 20393 -> 0 bytes .../connector-rollout-worker/Chart.lock | 6 -- .../connector-rollout-worker/Chart.yaml | 6 -- helm/airbyte-v1/charts/cron-1.2.0.tgz | Bin 19551 -> 0 bytes helm/airbyte-v1/charts/cron/Chart.lock | 6 -- helm/airbyte-v1/charts/cron/Chart.yaml | 6 -- helm/airbyte-v1/charts/keycloak-1.2.0.tgz | Bin 20269 -> 0 bytes .../charts/keycloak-setup-1.2.0.tgz | Bin 18955 -> 0 bytes .../charts/keycloak-setup/Chart.lock | 6 -- .../charts/keycloak-setup/Chart.yaml | 6 -- helm/airbyte-v1/charts/keycloak/Chart.lock | 6 -- helm/airbyte-v1/charts/metrics-1.2.0.tgz | Bin 18104 -> 0 bytes helm/airbyte-v1/charts/metrics/Chart.lock | 6 -- helm/airbyte-v1/charts/metrics/Chart.yaml | 6 -- helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz | Bin 19381 -> 0 bytes helm/airbyte-v1/charts/pod-sweeper/Chart.lock | 6 -- helm/airbyte-v1/charts/pod-sweeper/Chart.yaml | 6 -- helm/airbyte-v1/charts/server-1.2.0.tgz | Bin 22346 -> 0 bytes helm/airbyte-v1/charts/server/Chart.lock | 6 -- helm/airbyte-v1/charts/server/Chart.yaml | 6 -- helm/airbyte-v1/charts/temporal-1.2.0.tgz | Bin 19894 -> 0 bytes helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz | Bin 18280 -> 0 bytes helm/airbyte-v1/charts/temporal-ui/Chart.lock | 6 -- helm/airbyte-v1/charts/temporal-ui/Chart.yaml | 6 -- helm/airbyte-v1/charts/temporal/Chart.lock | 6 -- helm/airbyte-v1/charts/temporal/Chart.yaml | 6 -- helm/airbyte-v1/charts/webapp-1.2.0.tgz | Bin 20452 -> 0 bytes helm/airbyte-v1/charts/webapp/Chart.lock | 6 -- helm/airbyte-v1/charts/webapp/Chart.yaml | 6 -- helm/airbyte-v1/charts/worker-1.2.0.tgz | Bin 22793 -> 0 bytes helm/airbyte-v1/charts/worker/Chart.lock | 6 -- helm/airbyte-v1/charts/worker/Chart.yaml | 6 -- .../charts/workload-api-server-1.2.0.tgz | Bin 20958 -> 0 bytes .../charts/workload-api-server/Chart.lock | 6 -- .../charts/workload-api-server/Chart.yaml | 6 -- .../charts/workload-launcher-1.2.0.tgz | Bin 23369 -> 0 bytes .../charts/workload-launcher/Chart.lock | 6 -- .../charts/workload-launcher/Chart.yaml | 6 -- 47 files changed, 291 deletions(-) delete mode 100644 helm/airbyte-v1/Chart.lock delete mode 100644 helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/airbyte-bootloader/Chart.lock delete mode 100644 helm/airbyte-v1/charts/common-1.17.1.tgz delete mode 100644 helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/connector-builder-server/Chart.lock delete mode 100644 helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock delete mode 100644 helm/airbyte-v1/charts/cron-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/cron/Chart.lock delete mode 100644 helm/airbyte-v1/charts/keycloak-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/keycloak-setup-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/keycloak-setup/Chart.lock delete mode 100644 helm/airbyte-v1/charts/keycloak/Chart.lock delete mode 100644 helm/airbyte-v1/charts/metrics-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/metrics/Chart.lock delete mode 100644 helm/airbyte-v1/charts/pod-sweeper-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/pod-sweeper/Chart.lock delete mode 100644 helm/airbyte-v1/charts/server-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/server/Chart.lock delete mode 100644 helm/airbyte-v1/charts/temporal-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/temporal-ui-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/temporal-ui/Chart.lock delete mode 100644 helm/airbyte-v1/charts/temporal/Chart.lock delete mode 100644 helm/airbyte-v1/charts/webapp-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/webapp/Chart.lock delete mode 100644 helm/airbyte-v1/charts/worker-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/worker/Chart.lock delete mode 100644 helm/airbyte-v1/charts/workload-api-server-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/workload-api-server/Chart.lock delete mode 100644 helm/airbyte-v1/charts/workload-launcher-1.2.0.tgz delete mode 100644 helm/airbyte-v1/charts/workload-launcher/Chart.lock diff --git a/helm/airbyte-v1/Chart.lock b/helm/airbyte-v1/Chart.lock deleted file mode 100644 index 92a366ec..00000000 --- a/helm/airbyte-v1/Chart.lock +++ /dev/null @@ -1,51 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -- name: airbyte-bootloader - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: temporal - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: temporal-ui - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: webapp - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: workload-api-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: workload-launcher - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: pod-sweeper - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: metrics - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: cron - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: connector-builder-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: connector-rollout-worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: keycloak - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- name: keycloak-setup - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -digest: sha256:b961e0cea6c562b9e198aa7fc6a73d913e066d600099b15e2530539dc84b5188 -generated: "2024-12-06T14:01:16.900954+01:00" diff --git a/helm/airbyte-v1/Chart.yaml b/helm/airbyte-v1/Chart.yaml index 607dec54..95553bd9 100644 --- a/helm/airbyte-v1/Chart.yaml +++ b/helm/airbyte-v1/Chart.yaml @@ -1,71 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x -- condition: airbyte-bootloader.enabled - name: airbyte-bootloader - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: temporal.enabled - name: temporal - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: temporal-ui.enabled - name: temporal-ui - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: webapp.enabled - name: webapp - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: server.enabled - name: server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: worker.enabled - name: worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: workload-api-server.enabled - name: workload-api-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: workload-launcher.enabled - name: workload-launcher - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: pod-sweeper.enabled - name: pod-sweeper - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: metrics.enabled - name: metrics - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: cron.enabled - name: cron - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: connector-builder-server.enabled - name: connector-builder-server - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: connector-rollout-worker.enabled - name: connector-rollout-worker - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: keycloak.enabled - name: keycloak - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 -- condition: keycloak-setup.enabled - name: keycloak-setup - repository: https://airbytehq.github.io/helm-charts/ - version: 1.2.0 description: Helm chart to deploy airbyte name: airbyte type: application diff --git a/helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz b/helm/airbyte-v1/charts/airbyte-bootloader-1.2.0.tgz deleted file mode 100644 index 23f9ec65aa21f301c8681a474d94a7d4b98c7d66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19006 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 J+Z+IZ0RY0N)YJd~ diff --git a/helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz b/helm/airbyte-v1/charts/connector-builder-server-1.2.0.tgz deleted file mode 100644 index 5a0963f41cdaf2b6951597519bc49680d75dc998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19500 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 P00960H8X%F0O|n%Rg#Pj diff --git a/helm/airbyte-v1/charts/connector-builder-server/Chart.lock b/helm/airbyte-v1/charts/connector-builder-server/Chart.lock deleted file mode 100644 index 746fb41b..00000000 --- a/helm/airbyte-v1/charts/connector-builder-server/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2022-10-17T18:35:15.123937677Z" diff --git a/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml b/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml index 2491fe2c..47813507 100644 --- a/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml +++ b/helm/airbyte-v1/charts/connector-builder-server/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-connector-builder-server name: connector-builder-server type: application diff --git a/helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz b/helm/airbyte-v1/charts/connector-rollout-worker-1.2.0.tgz deleted file mode 100644 index db6c0790094df7e978d94e019ec718fd4ad3844d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20393 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 Qg(OJD&PMjy?6EW1zMAY@jqy-* z@zz@Q(@Poh0>}{C(4$0uiifK6OdB`>lN})}?-?4T5r}Yn!;~x-%mQN}-#bq^p%_MN ziy}s%3GxJS+w%WAUP2i6aza!;Z&~o#w4|oEO!J{iAWyVG;`1ik9w++e&X!!w-r@ko zVkdb(lBv2-_TK`MO#fZ1UfX80IF2qCf;0~Gb*TFZ3`WR6*aRl0;kMra>!N_GKe-$K z?g)7q!>JU#RQeoYrbaaS6re8fYK`y8?tD7zbAXi#~ z;74z3>-P56hmuO4(BW33O0liC#|K9z7f0T;hskj)A*>0gf+R@OuB^_+r!fczpTG z>HACYasT{$|K#%c=mMOcgM-tP!{f{2(~}Eu`V-hc`3HD&d~&!65LSk~Pl?PYK`6ju zxt#mXg-#A*kZ0C=X^O=Gh+sTS;Shl#nILsYkRUq7Of8Tw4xI>(vB^(SX^#ILT|Dyi YJUvg(qd)(D00030|7e3kRsaG50D-6tlmGw# diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock deleted file mode 100644 index 97cc9396..00000000 --- a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - version: 1.17.1 -digest: sha256:dacc73770a5640c011e067ff8840ddf89631fc19016c8d0a9e5ea160e7da8690 -generated: "2024-11-07T16:44:04.182471666Z" diff --git a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml index 48c0f251..38d167fd 100644 --- a/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml +++ b/helm/airbyte-v1/charts/connector-rollout-worker/Chart.yaml @@ -1,11 +1,5 @@ apiVersion: v2 appVersion: 1.2.0 -dependencies: -- name: common - repository: https://charts.bitnami.com/bitnami - tags: - - bitnami-common - version: 1.x.x description: Helm chart to deploy airbyte-connector-rollout-worker name: connector-rollout-worker type: application diff --git a/helm/airbyte-v1/charts/cron-1.2.0.tgz b/helm/airbyte-v1/charts/cron-1.2.0.tgz deleted file mode 100644 index cc8a2b5a174f0273b8659e1af70dc39483819ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19551 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