diff --git a/.kustomanager.lock.yaml b/.kustomanager.lock.yaml
index 5d3e4c0..912d461 100644
--- a/.kustomanager.lock.yaml
+++ b/.kustomanager.lock.yaml
@@ -360,15 +360,6 @@ builds:
buildPath: builds/local/crossplane
cluster: local
name: crossplane
- - timestamp: 1712732160
- sourceHash: 0485e2af8727ea81e44258a1ac2f66f3cd0c8fc3cd9785ca65536453c7a83aa4
- sourceHashType: sha256
- sourcePath: cluster-local/keycloak-provider
- buildHash: cef1acc572dc9bbef1d420951a4790b0ef0fed79c7a4543eeea71a4db262163d
- buildHashType: sha256
- buildPath: builds/local/keycloak-provider
- cluster: local
- name: keycloak-provider
- timestamp: 1712733461
sourceHash: 297e1c519318064b1e7153c6a9757030b92fbec07fb66e360ad0e77384ceb969
sourceHashType: sha256
@@ -378,12 +369,57 @@ builds:
buildPath: builds/local/argocd
cluster: local
name: argocd
- - timestamp: 1712733843
- sourceHash: 412870b42f20fb711df278bd8cd23f6ec21e0565546db63cd8bd61b638ce4c22
+ - timestamp: 1712738100
+ sourceHash: 28cc87faa5b6cf853aac1f36b1affa688adc81a837f7a4bb32d988e136b53381
sourceHashType: sha256
sourcePath: cluster-local/keycloak
- buildHash: d574e3b130aa52da336642ac185de1eb338c3e865a046994b8d47d73b8434190
+ buildHash: 707d98f6ffa862540c7e14cef95a853886d71d1a1fcf7026ffc1fa8c81f143cc
buildHashType: sha256
buildPath: builds/local/keycloak
cluster: local
name: keycloak
+ - timestamp: 1712738100
+ sourceHash: 1d963b880ab57521602a8dc5141a53d2723651eb16a9f9fded52d77d548eb5cd
+ sourceHashType: sha256
+ sourcePath: cluster-local/keycloak-provider
+ buildHash: 89f5d2c352c304da1c4e4113d3236a6f5d9b056f4eba23d3cd7eaecea7cce90e
+ buildHashType: sha256
+ buildPath: builds/local/keycloak-provider
+ cluster: local
+ name: keycloak-provider
+ - timestamp: 1712739145
+ sourceHash: bac871a181b2998769e2c4330f99d63b175f7d640e658b4b39969679b31441d3
+ sourceHashType: sha256
+ sourcePath: cluster-local/whoami
+ buildHash: c9476984c1290eb30c3c108dfc0deb8dc796846f4eb69325f80831075231afe9
+ buildHashType: sha256
+ buildPath: builds/local/whoami
+ cluster: local
+ name: whoami
+ - timestamp: 1712739305
+ sourceHash: 08eaed4a08dc1acf68afe4be08c2667498da2e6289ff152a296cee6edeb652fb
+ sourceHashType: sha256
+ sourcePath: cluster-local/debug
+ buildHash: 6fc3be83c4d3738f2e1b1e1b054749040853d1b4134cc4d0df5693da0cba4193
+ buildHashType: sha256
+ buildPath: builds/local/debug
+ cluster: local
+ name: debug
+ - timestamp: 1712740463
+ sourceHash: 03debff110bc8b4ad4ba170e4ea4aecd33e3e88c89ee03936131337ebf047af2
+ sourceHashType: sha256
+ sourcePath: cluster-local/coredns
+ buildHash: d1a1cf717c14046d3689a6e853d7605c1a033480b2791862999f27a8eedadf3a
+ buildHashType: sha256
+ buildPath: builds/local/coredns
+ cluster: local
+ name: coredns
+ - timestamp: 1712751942
+ sourceHash: 9bc3fa06cb2a087ec674003fb6c24d663a54fd84831ff14b906038982017f6a8
+ sourceHashType: sha256
+ sourcePath: cluster-local/deeppharmgraph
+ buildHash: 6ef763f0026e641344901a914f25234eebfedcee213f0a007b14710a9d2637a5
+ buildHashType: sha256
+ buildPath: builds/local/deeppharmgraph
+ cluster: local
+ name: deeppharmgraph
diff --git a/builds/local/coredns/build.yaml b/builds/local/coredns/build.yaml
new file mode 100644
index 0000000..0d0a86c
--- /dev/null
+++ b/builds/local/coredns/build.yaml
@@ -0,0 +1,8 @@
+apiVersion: v1
+data:
+ keycloak.override: |
+ rewrite name substring id.dev.lan.shamrock.systems keycloak.keycloak.svc.cluster.local
+kind: ConfigMap
+metadata:
+ name: coredns-custom
+ namespace: kube-system
diff --git a/builds/local/coredns/kustomization.yaml b/builds/local/coredns/kustomization.yaml
new file mode 100644
index 0000000..a54eb2e
--- /dev/null
+++ b/builds/local/coredns/kustomization.yaml
@@ -0,0 +1,6 @@
+# Automatically generated by Kustomanager
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./build.yaml
diff --git a/builds/local/debug/build.yaml b/builds/local/debug/build.yaml
new file mode 100644
index 0000000..4c8b717
--- /dev/null
+++ b/builds/local/debug/build.yaml
@@ -0,0 +1,24 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app.kubernetes.io/name: curl-debug
+ name: curl-debug
+ namespace: default
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: curl-debug
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: curl-debug
+ spec:
+ containers:
+ - args:
+ - infinity
+ command:
+ - sleep
+ image: quay.io/curl/curl:latest
+ name: curl
diff --git a/builds/local/debug/kustomization.yaml b/builds/local/debug/kustomization.yaml
new file mode 100644
index 0000000..a54eb2e
--- /dev/null
+++ b/builds/local/debug/kustomization.yaml
@@ -0,0 +1,6 @@
+# Automatically generated by Kustomanager
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./build.yaml
diff --git a/builds/local/deeppharmgraph/build.yaml b/builds/local/deeppharmgraph/build.yaml
new file mode 100644
index 0000000..c18e263
--- /dev/null
+++ b/builds/local/deeppharmgraph/build.yaml
@@ -0,0 +1,2319 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ labels:
+ name: deeppharmgraph
+ name: deeppharmgraph
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow
+ namespace: deeppharmgraph
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow
+ namespace: deeppharmgraph
+rules:
+- apiGroups:
+ - ""
+ resources:
+ - events
+ verbs:
+ - get
+ - list
+- apiGroups:
+ - ""
+ resources:
+ - pods
+ verbs:
+ - create
+ - get
+ - delete
+ - list
+ - patch
+ - watch
+- apiGroups:
+ - ""
+ resources:
+ - pods/log
+ verbs:
+ - get
+ - list
+- apiGroups:
+ - ""
+ resources:
+ - pods/exec
+ verbs:
+ - create
+ - get
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-admin
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: admin
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-op
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: op
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-public
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: public
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-user
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: user
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-viewer
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: viewer
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow
+ namespace: deeppharmgraph
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: dpg-processing-airflow
+subjects:
+- kind: ServiceAccount
+ name: dpg-processing-airflow
+ namespace: deeppharmgraph
+---
+apiVersion: v1
+data:
+ AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX: "true"
+ AUTH_KEYCLOAK_ACCESS_TOKEN_URL: http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/openid-connect/token
+ AUTH_KEYCLOAK_AIRFLOW_BASE_URL: http://dpg-processing.dev.lan.shamrock.systems/
+ AUTH_KEYCLOAK_API_BASE_URL: http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/
+ AUTH_KEYCLOAK_AUTHORIZE_URL: http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/openid-connect/auth
+ AUTH_KEYCLOAK_CLIENT_ID: application-airflow
+ AUTH_KEYCLOAK_JWKS_URL: http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/openid-connect/certs
+ AUTH_KEYCLOAK_SCOPE: openid
+kind: ConfigMap
+metadata:
+ name: airflow-env-configmap
+ namespace: deeppharmgraph
+---
+apiVersion: v1
+data:
+ pod_template.yaml: "\napiVersion: v1\nkind: Pod\nmetadata:\n name: dummy-name\nspec:\n
+ \ restartPolicy: Never\n serviceAccountName: dpg-processing-airflow\n shareProcessNamespace:
+ false\n nodeSelector:\n {}\n affinity:\n {}\n tolerations:\n []\n
+ \ securityContext:\n fsGroup: 0\n containers:\n - name: base \n image:
+ apache/airflow:2.6.3-python3.9\n imagePullPolicy: IfNotPresent\n securityContext:\n
+ \ runAsUser: 50000\n runAsGroup: 0\n envFrom: \n -
+ secretRef:\n name: dpg-processing-airflow-config-envs\n env:\n
+ \ ## KubernetesExecutor Pods use LocalExecutor internally\n - name:
+ AIRFLOW__CORE__EXECUTOR\n value: LocalExecutor \n - name:
+ DATABASE_USER\n valueFrom:\n secretKeyRef:\n name:
+ airflow-postgres-app\n key: user\n - name: DATABASE_PASSWORD\n
+ \ valueFrom:\n secretKeyRef:\n name: airflow-postgres-app\n
+ \ key: password\n - name: CONNECTION_CHECK_MAX_COUNT\n value:
+ \"20\"\n - name: AIRFLOW__CORE__FERNET_KEY\n valueFrom:\n secretKeyRef:\n
+ \ key: AIRFLOW__CORE__FERNET_KEY\n name: airflow-env-secret\n
+ \ - name: AIRFLOW__WEBSERVER__SECRET_KEY\n valueFrom:\n secretKeyRef:\n
+ \ key: AIRFLOW__WEBSERVER__SECRET_KEY\n name: airflow-env-secret\n
+ \ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX\n valueFrom:\n configMapKeyRef:\n
+ \ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX\n name: airflow-env-configmap\n
+ \ - name: AUTH_KEYCLOAK_API_BASE_URL\n valueFrom:\n configMapKeyRef:\n
+ \ key: AUTH_KEYCLOAK_API_BASE_URL\n name: airflow-env-configmap\n
+ \ - name: AUTH_KEYCLOAK_SCOPE\n valueFrom:\n configMapKeyRef:\n
+ \ key: AUTH_KEYCLOAK_SCOPE\n name: airflow-env-configmap\n
+ \ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL\n valueFrom:\n configMapKeyRef:\n
+ \ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL\n name: airflow-env-configmap\n
+ \ - name: AUTH_KEYCLOAK_AUTHORIZE_URL\n valueFrom:\n configMapKeyRef:\n
+ \ key: AUTH_KEYCLOAK_AUTHORIZE_URL\n name: airflow-env-configmap\n
+ \ - name: AUTH_KEYCLOAK_JWKS_URL\n valueFrom:\n configMapKeyRef:\n
+ \ key: AUTH_KEYCLOAK_JWKS_URL\n name: airflow-env-configmap\n
+ \ - name: AUTH_KEYCLOAK_CLIENT_ID\n valueFrom:\n configMapKeyRef:\n
+ \ key: AUTH_KEYCLOAK_CLIENT_ID\n name: airflow-env-configmap\n
+ \ - name: AUTH_KEYCLOAK_CLIENT_SECRET\n valueFrom:\n secretKeyRef:\n
+ \ key: AUTH_KEYCLOAK_CLIENT_SECRET\n name: airflow-env-secret\n
+ \ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL\n valueFrom:\n configMapKeyRef:\n
+ \ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL\n name: airflow-env-configmap\n
+ \ ports: []\n command: []\n args: []\n volumeMounts: \n
+ \ - name: logs-data\n mountPath: /opt/airflow/logs\n volumes:
+ \ \n - name: logs-data\n emptyDir: {}"
+kind: ConfigMap
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-pod-template
+ namespace: deeppharmgraph
+---
+apiVersion: v1
+kind: Secret
+metadata:
+ name: airflow-env-secret
+ namespace: deeppharmgraph
+stringData:
+ AIRFLOW__CORE__FERNET_KEY: su8TakfoyJ3Mv6i136Y-i6vcJqhlthL8Q60F9M6GLJM=
+ AIRFLOW__WEBSERVER__SECRET_KEY: e5EqEnDH4wkWxnMf97n7RK7mAyBG2qdu
+ AUTH_KEYCLOAK_CLIENT_SECRET: HxLbmeGmDDcDGuC5eh9MrkQFWYAE3cZE
+---
+apiVersion: v1
+kind: Secret
+metadata:
+ name: dpg-admin-secret
+ namespace: deeppharmgraph
+stringData:
+ password: password
+---
+apiVersion: v1
+data:
+ AIRFLOW__CELERY__FLOWER_PORT: NTU1NQ==
+ AIRFLOW__CORE__DAGS_FOLDER: L29wdC9haXJmbG93L2RhZ3M=
+ AIRFLOW__CORE__EXECUTOR: S3ViZXJuZXRlc0V4ZWN1dG9y
+ AIRFLOW__CORE__SQL_ALCHEMY_CONN_CMD: YmFzaCAtYyAnZXZhbCAiJERBVEFCQVNFX1NRTEFMQ0hFTVlfQ01EIic=
+ AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_CMD: YmFzaCAtYyAnZXZhbCAiJERBVEFCQVNFX1NRTEFMQ0hFTVlfQ01EIic=
+ AIRFLOW__KUBERNETES__NAMESPACE: ZGVlcHBoYXJtZ3JhcGg=
+ AIRFLOW__KUBERNETES__POD_TEMPLATE_FILE: L29wdC9haXJmbG93L3BvZF90ZW1wbGF0ZXMvcG9kX3RlbXBsYXRlLnlhbWw=
+ AIRFLOW__KUBERNETES__WORKER_CONTAINER_REPOSITORY: YXBhY2hlL2FpcmZsb3c=
+ AIRFLOW__KUBERNETES__WORKER_CONTAINER_TAG: Mi42LjMtcHl0aG9uMy45
+ AIRFLOW__KUBERNETES_EXECUTOR__NAMESPACE: ZGVlcHBoYXJtZ3JhcGg=
+ AIRFLOW__KUBERNETES_EXECUTOR__POD_TEMPLATE_FILE: L29wdC9haXJmbG93L3BvZF90ZW1wbGF0ZXMvcG9kX3RlbXBsYXRlLnlhbWw=
+ AIRFLOW__KUBERNETES_EXECUTOR__WORKER_CONTAINER_REPOSITORY: YXBhY2hlL2FpcmZsb3c=
+ AIRFLOW__KUBERNETES_EXECUTOR__WORKER_CONTAINER_TAG: Mi42LjMtcHl0aG9uMy45
+ AIRFLOW__LOGGING__BASE_LOG_FOLDER: L29wdC9haXJmbG93L2xvZ3M=
+ AIRFLOW__LOGGING__DAG_PROCESSOR_MANAGER_LOG_LOCATION: L29wdC9haXJmbG93L2xvZ3MvZGFnX3Byb2Nlc3Nvcl9tYW5hZ2VyL2RhZ19wcm9jZXNzb3JfbWFuYWdlci5sb2c=
+ AIRFLOW__SCHEDULER__CHILD_PROCESS_LOG_DIRECTORY: L29wdC9haXJmbG93L2xvZ3Mvc2NoZWR1bGVy
+ AIRFLOW__TRIGGERER__DEFAULT_CAPACITY: MTAwMA==
+ AIRFLOW__WEBSERVER__WEB_SERVER_PORT: ODA4MA==
+ DATABASE_CELERY_CMD: ZWNobyAtbiAiZGIrcG9zdGdyZXNxbDovLyQoZXZhbCAkREFUQUJBU0VfVVNFUl9DTUQpOiQoZXZhbCAkREFUQUJBU0VfUEFTU1dPUkRfQ01EKUAke0RBVEFCQVNFX0hPU1R9OiR7REFUQUJBU0VfUE9SVH0vJHtEQVRBQkFTRV9EQn0ke0RBVEFCQVNFX1BST1BFUlRJRVN9Ig==
+ DATABASE_DB: YXBw
+ DATABASE_HOST: ZHBnLXByb2Nlc3NpbmctYWlyZmxvdy1wZ2JvdW5jZXIuZGVlcHBoYXJtZ3JhcGguc3ZjLmNsdXN0ZXIubG9jYWw=
+ DATABASE_PASSWORD_CMD: ZWNobyAiJHtEQVRBQkFTRV9QQVNTV09SRH0iIHwgcHl0aG9uMyAtYyAiaW1wb3J0IHVybGxpYi5wYXJzZTsgZW5jb2RlZF9wYXNzID0gdXJsbGliLnBhcnNlLnF1b3RlKGlucHV0KCkpOyBwcmludChlbmNvZGVkX3Bhc3MpIg==
+ DATABASE_PORT: NjQzMg==
+ DATABASE_PROPERTIES: ""
+ DATABASE_PSQL_CMD: ZWNobyAtbiAicG9zdGdyZXNxbDovLyQoZXZhbCAkREFUQUJBU0VfVVNFUl9DTUQpOiQoZXZhbCAkREFUQUJBU0VfUEFTU1dPUkRfQ01EKUAxMjcuMC4wLjE6JHtEQVRBQkFTRV9QT1JUfS8ke0RBVEFCQVNFX0RCfSR7REFUQUJBU0VfUFJPUEVSVElFU30i
+ DATABASE_SQLALCHEMY_CMD: ZWNobyAtbiAicG9zdGdyZXNxbCtwc3ljb3BnMjovLyQoZXZhbCAkREFUQUJBU0VfVVNFUl9DTUQpOiQoZXZhbCAkREFUQUJBU0VfUEFTU1dPUkRfQ01EKUAke0RBVEFCQVNFX0hPU1R9OiR7REFUQUJBU0VfUE9SVH0vJHtEQVRBQkFTRV9EQn0ke0RBVEFCQVNFX1BST1BFUlRJRVN9Ig==
+ DATABASE_USER_CMD: ZWNobyAiJHtEQVRBQkFTRV9VU0VSfSIgfCBweXRob24zIC1jICJpbXBvcnQgdXJsbGliLnBhcnNlOyBlbmNvZGVkX3VzZXIgPSB1cmxsaWIucGFyc2UucXVvdGUoaW5wdXQoKSk7IHByaW50KGVuY29kZWRfdXNlciki
+ TZ: RXRjL1VUQw==
+kind: Secret
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-config-envs
+ namespace: deeppharmgraph
+---
+apiVersion: v1
+data:
+ db_migrations.py: CiMjIyMjIyMjIyMjIyMKIyMgSW1wb3J0cyAjIwojIyMjIyMjIyMjIyMjCmltcG9ydCBsb2dnaW5nCmltcG9ydCB0aW1lCmZyb20gYWlyZmxvdy51dGlscy5kYiBpbXBvcnQgdXBncmFkZWRiCgoKIyMjIyMjIyMjIyMjIwojIyBDb25maWdzICMjCiMjIyMjIyMjIyMjIyMKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19maWxlX18pCmxvZy5zZXRMZXZlbCgiSU5GTyIpCgojIGhvdyBmcmVxdWVudGx5IHRvIGNoZWNrIGZvciB1bmFwcGxpZWQgbWlncmF0aW9ucwpDT05GX19DSEVDS19NSUdSQVRJT05TX0lOVEVSVkFMID0gMzAwCgoKIyMjIyMjIyMjIyMjIyMjCiMjIEZ1bmN0aW9ucyAjIwojIyMjIyMjIyMjIyMjIyMKZnJvbSBhaXJmbG93LnV0aWxzLmRiIGltcG9ydCBjaGVja19taWdyYXRpb25zCgoKZGVmIG5lZWRzX2RiX21pZ3JhdGlvbnMoKSAtPiBib29sOgogICAgIiIiCiAgICBSZXR1cm4gYSBib29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgZGF0YWJhc2UgaGFzIHVuYXBwbGllZCBtaWdyYXRpb25zLgogICAgIiIiCiAgICBsb2dfYWxlbWJpYyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJhbGVtYmljLnJ1bnRpbWUubWlncmF0aW9uIikKICAgIGxvZ19hbGVtYmljX2xldmVsID0gbG9nX2FsZW1iaWMubGV2ZWwKICAgIHRyeToKICAgICAgICBsb2dfYWxlbWJpYy5zZXRMZXZlbCgiV0FSTiIpCiAgICAgICAgY2hlY2tfbWlncmF0aW9ucygxKQogICAgICAgIGxvZ19hbGVtYmljLnNldExldmVsKGxvZ19hbGVtYmljX2xldmVsKQogICAgICAgIHJldHVybiBGYWxzZQogICAgZXhjZXB0IFRpbWVvdXRFcnJvcjoKICAgICAgICByZXR1cm4gVHJ1ZQoKCmRlZiBhcHBseV9kYl9taWdyYXRpb25zKCkgLT4gTm9uZToKICAgICIiIgogICAgQXBwbHkgYW55IHBlbmRpbmcgREIgbWlncmF0aW9ucy4KICAgICIiIgogICAgbG9nLmluZm8oIi0tLS0tLS0tIFNUQVJUIC0gQVBQTFkgREIgTUlHUkFUSU9OUyAtLS0tLS0tLSIpCiAgICB1cGdyYWRlZGIoKQogICAgbG9nLmluZm8oIi0tLS0tLS0tIEZJTklTSCAtIEFQUExZIERCIE1JR1JBVElPTlMgLS0tLS0tLS0iKQoKCmRlZiBtYWluKHN5bmNfZm9yZXZlcjogYm9vbCk6CiAgICAjIGluaXRpYWwgY2hlY2sgJiBhcHBseQogICAgaWYgbmVlZHNfZGJfbWlncmF0aW9ucygpOgogICAgICAgIGxvZy53YXJuaW5nKCJ0aGVyZSBhcmUgdW5hcHBsaWVkIGRiIG1pZ3JhdGlvbnMsIHRyaWdnZXJpbmcgYXBwbHkuLi4iKQogICAgICAgIGFwcGx5X2RiX21pZ3JhdGlvbnMoKQogICAgZWxzZToKICAgICAgICBsb2cuaW5mbygidGhlcmUgYXJlIG5vIHVuYXBwbGllZCBkYiBtaWdyYXRpb25zLCBjb250aW51aW5nLi4uIikKCiAgICBpZiBzeW5jX2ZvcmV2ZXI6CiAgICAgICAgIyBkZWZpbmUgdmFyaWFibGUgdG8gdHJhY2sgaG93IGxvbmcgc2luY2UgbGFzdCBtaWdyYXRpb25zIGNoZWNrCiAgICAgICAgbWlncmF0aW9uc19jaGVja19lcG9jaCA9IHRpbWUudGltZSgpCgogICAgICAgICMgbWFpbiBsb29wCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgaWYgKHRpbWUudGltZSgpIC0gbWlncmF0aW9uc19jaGVja19lcG9jaCkgPiBDT05GX19DSEVDS19NSUdSQVRJT05TX0lOVEVSVkFMOgogICAgICAgICAgICAgICAgbG9nLmRlYnVnKGYiY2hlY2sgaW50ZXJ2YWwgcmVhY2hlZCwgY2hlY2tpbmcgZm9yIHVuYXBwbGllZCBkYiBtaWdyYXRpb25zLi4uIikKICAgICAgICAgICAgICAgIGlmIG5lZWRzX2RiX21pZ3JhdGlvbnMoKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybmluZygidGhlcmUgYXJlIHVuYXBwbGllZCBkYiBtaWdyYXRpb25zLCB0cmlnZ2VyaW5nIGFwcGx5Li4uIikKICAgICAgICAgICAgICAgICAgICBhcHBseV9kYl9taWdyYXRpb25zKCkKICAgICAgICAgICAgICAgIG1pZ3JhdGlvbnNfY2hlY2tfZXBvY2ggPSB0aW1lLnRpbWUoKQoKICAgICAgICAgICAgIyBlbnN1cmUgd2UgZG9udCBsb29wIHRvbyBmYXN0CiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQoKCiMjIyMjIyMjIyMjIyMjCiMjIFJ1biBNYWluICMjCiMjIyMjIyMjIyMjIyMjCm1haW4oc3luY19mb3JldmVyPVRydWUp
+kind: Secret
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: db-migrations
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-db-migrations
+ namespace: deeppharmgraph
+---
+apiVersion: v1
+data:
+ gen_auth_file.sh: CiMhL2Jpbi9zaCAtZQoKIyBERVNDUklQVElPTjoKIyAtIHVwZGF0ZXMgdGhlIHBnYm91bmNlciBgYXV0aF9maWxlYCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcwojIC0gY2FsbGVkIGluIG1haW4gcGdib3VuY2VyIGNvbnRhaW5lciBzdGFydC1jb21tYW5kIHNvIHRoYXQgYGF1dGhfZmlsZWAgaXMgdXBkYXRlZCBlYWNoIHJlc3RhcnQsCiMgICBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbGl2ZW5lc3NQcm9iZSBmYWlscyBkdWUgdG8gYSBEQVRBQkFTRV9QQVNTV09SRCBzZWNyZXQgdXBkYXRlCgojIHZhcmlhYmxlcyB0byBpbmNyZWFzZSBjbGFyaXR5IG9mIHBhdHRlcm4gbWF0Y2hpbmcKT05FX1FVT1RFPSciJwpUV09fUVVPVEU9JyIiJwoKIyBwZ2JvdW5jZXIgcmVxdWlyZXMgYCJgIHRvIGJlIGVzY2FwZWQgYXMgYCIiYApFU0NBUEVEX0RBVEFCQVNFX1VTRVI9IiR7REFUQUJBU0VfVVNFUi8kT05FX1FVT1RFLyRUV09fUVVPVEV9IgpFU0NBUEVEX0RBVEFCQVNFX1BBU1NXT1JEPSIke0RBVEFCQVNFX1BBU1NXT1JELyRPTkVfUVVPVEUvJFRXT19RVU9URX0iCgojIHBnYm91bmNlciByZXF1aXJlcyBhdXRoX2ZpbGUgaW4gZm9ybWF0IGAibXktdXNlcm5hbWUiICJteS1wYXNzd29yZCJgCmVjaG8gXCIkRVNDQVBFRF9EQVRBQkFTRV9VU0VSXCIgXCIkRVNDQVBFRF9EQVRBQkFTRV9QQVNTV09SRFwiID4gL2hvbWUvcGdib3VuY2VyL3VzZXJzLnR4dAplY2hvICJTdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGF1dGhfZmlsZTogL2hvbWUvcGdib3VuY2VyL3VzZXJzLnR4dCI=
+ gen_self_signed_cert.sh: CiMhL2Jpbi9zaCAtZQoKQ0VSVF9ESVI9Ii9ob21lL3BnYm91bmNlci9nZW5lcmF0ZWQtY2VydHMiCktFWV9GSUxFPSIkQ0VSVF9ESVIvY2xpZW50LmtleSIKQ0VSVF9GSUxFPSIkQ0VSVF9ESVIvY2xpZW50LmNydCIKCiMgY3JlYXRlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZQpta2RpciAtcCAiJENFUlRfRElSIgoKIyB2YXJpYWJsZXMgZm9yIGNlcnRpZmljYXRlIGdlbmVyYXRpb24KQ09NTU9OX05BTUU9ImxvY2FsaG9zdCIKREFZU19WQUxJRD0zNjUKCiMgZ2VuZXJhdGUgdGhlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGFuZCBhIHByaXZhdGUga2V5Cm9wZW5zc2wgcmVxIC14NTA5IFwKICAtbmV3a2V5IHJzYTo0MDk2IFwKICAta2V5b3V0ICIkS0VZX0ZJTEUiIFwKICAtb3V0ICIkQ0VSVF9GSUxFIiBcCiAgLWRheXMgIiREQVlTX1ZBTElEIiBcCiAgLXN1YmogIi9DTj0kQ09NTU9OX05BTUUiIFwKICAtbm9kZXMKCiMgc2V0IHBlcm1pc3Npb25zIGZvciB0aGUgcHJpdmF0ZSBrZXkgZmlsZQpjaG1vZCA2MDAgIiRLRVlfRklMRSIKCmVjaG8gIlN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgc2VsZi1zaWduZWQgY2VydGlmaWNhdGU6ICRDRVJUX0ZJTEUiCmVjaG8gIlN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUga2V5OiAkS0VZX0ZJTEUi
+ pgbouncer.ini: CltkYXRhYmFzZXNdCiogPSBob3N0PWFpcmZsb3ctcG9zdGdyZXMtcncgcG9ydD01NDMyCgpbcGdib3VuY2VyXQpwb29sX21vZGUgPSB0cmFuc2FjdGlvbgptYXhfY2xpZW50X2Nvbm4gPSAxMDAwCmRlZmF1bHRfcG9vbF9zaXplID0gIDIwCmlnbm9yZV9zdGFydHVwX3BhcmFtZXRlcnMgPSBleHRyYV9mbG9hdF9kaWdpdHMKCmxpc3Rlbl9wb3J0ID0gNjQzMgpsaXN0ZW5fYWRkciA9ICoKCmF1dGhfdHlwZSA9IG1kNQphdXRoX2ZpbGUgPSAvaG9tZS9wZ2JvdW5jZXIvdXNlcnMudHh0Cgpsb2dfZGlzY29ubmVjdGlvbnMgPSAwCmxvZ19jb25uZWN0aW9ucyA9IDAKCiMgbG9ja3Mgd2lsbCBuZXZlciBiZSByZWxlYXNlZCB3aGVuIGBwb29sX21vZGU9dHJhbnNhY3Rpb25gIChhaXJmbG93IGluaXRkYi91cGdyYWRlZGIgc2NyaXB0cyBjcmVhdGUgbG9ja3MpCnNlcnZlcl9yZXNldF9xdWVyeSA9IFNFTEVDVCBwZ19hZHZpc29yeV91bmxvY2tfYWxsKCkKc2VydmVyX3Jlc2V0X3F1ZXJ5X2Fsd2F5cyA9IDEKCiMjIENMSUVOVCBUTFMgU0VUVElOR1MgIyMKY2xpZW50X3Rsc19zc2xtb2RlID0gcHJlZmVyCmNsaWVudF90bHNfY2lwaGVycyA9IG5vcm1hbApjbGllbnRfdGxzX2tleV9maWxlID0gL2hvbWUvcGdib3VuY2VyL2dlbmVyYXRlZC1jZXJ0cy9jbGllbnQua2V5CmNsaWVudF90bHNfY2VydF9maWxlID0gL2hvbWUvcGdib3VuY2VyL2dlbmVyYXRlZC1jZXJ0cy9jbGllbnQuY3J0CgojIyBTRVJWRVIgVExTIFNFVFRJTkdTICMjCnNlcnZlcl90bHNfc3NsbW9kZSA9IHByZWZlcgpzZXJ2ZXJfdGxzX2NpcGhlcnMgPSBub3JtYWw=
+kind: Secret
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: pgbouncer
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-pgbouncer
+ namespace: deeppharmgraph
+---
+apiVersion: v1
+data:
+ webserver_config.py: aW1wb3J0IG9zCmZyb20gdHlwaW5nIGltcG9ydCBBbnksIFVuaW9uCgpmcm9tIGFpcmZsb3cud3d3LnNlY3VyaXR5IGltcG9ydCBBaXJmbG93U2VjdXJpdHlNYW5hZ2VyCmZyb20gZmxhc2tfYXBwYnVpbGRlci5zZWN1cml0eS5tYW5hZ2VyIGltcG9ydCBBVVRIX09BVVRICgoKY2xhc3MgS2V5Y2xvYWtBdXRob3JpemVyKEFpcmZsb3dTZWN1cml0eU1hbmFnZXIpOgogICAgZGVmIGdldF9vYXV0aF91c2VyX2luZm8oCiAgICAgICAgc2VsZiwgcHJvdmlkZXI6IHN0ciwgcmVzcDogQW55CiAgICApIC0+IGRpY3Rbc3RyLCBVbmlvbltzdHIsIGxpc3Rbc3RyXV1dOgogICAgICAgIG1lID0gc2VsZi5hcHBidWlsZGVyLnNtLm9hdXRoX3JlbW90ZXNbcHJvdmlkZXJdLmdldCgib3BlbmlkLWNvbm5lY3QvdXNlcmluZm8iKQogICAgICAgIG1lLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgIGRhdGEgPSBtZS5qc29uKCkKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgICAiZmlyc3RfbmFtZSI6IGRhdGEuZ2V0KCJnaXZlbl9uYW1lIiwgIiIpLAogICAgICAgICAgICAibGFzdF9uYW1lIjogZGF0YS5nZXQoImZhbWlseV9uYW1lIiwgIiIpLAogICAgICAgICAgICAiZW1haWwiOiBkYXRhLmdldCgiZW1haWwiLCAiIiksCiAgICAgICAgICAgICJuYW1lIjogZGF0YS5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgICAgICJ1c2VybmFtZSI6IGRhdGEuZ2V0KCJwcmVmZXJyZWRfdXNlcm5hbWUiLCAiIiksCiAgICAgICAgICAgICJyb2xlX2tleXMiOiBkYXRhLmdldCgicm9sZXMiLCBbXSksCiAgICAgICAgfQogICAgICAgIHByaW50KHBheWxvYWQpCiAgICAgICAgcmV0dXJuIHBheWxvYWQKCgpBVVRIX1RZUEUgPSBBVVRIX09BVVRICgpBVVRIX1JPTEVTX01BUFBJTkcgPSB7CiAgICAiYWRtaW4iOiBbIkFkbWluIl0sCiAgICAicHVibGljIjogWyJQdWJsaWMiXSwKICAgICJ2aWV3ZXIiOiBbIlZpZXdlciJdLAogICAgInVzZXIiOiBbIlVzZXIiXSwKICAgICJvcCI6IFsiT3AiXSwKfQoKQVVUSF9ST0xFU19TWU5DX0FUX0xPR0lOID0gVHJ1ZQpBVVRIX1VTRVJfUkVHSVNUUkFUSU9OID0gVHJ1ZQoKT0FVVEhfUFJPVklERVJTID0gWwogICAgewogICAgICAgICJuYW1lIjogImtleWNsb2FrIiwKICAgICAgICAiaWNvbiI6ICJmYS1rZXkiLAogICAgICAgICJ0b2tlbl9rZXkiOiAiYWNjZXNzX3Rva2VuIiwKICAgICAgICAicmVtb3RlX2FwcCI6IHsKICAgICAgICAgICAgImFwaV9iYXNlX3VybCI6IG9zLmVudmlyb25bIkFVVEhfS0VZQ0xPQUtfQVBJX0JBU0VfVVJMIl0sCiAgICAgICAgICAgICJjbGllbnRfa3dhcmdzIjogeyJzY29wZSI6IG9zLmVudmlyb25bIkFVVEhfS0VZQ0xPQUtfU0NPUEUiXX0sCiAgICAgICAgICAgICJyZXF1ZXN0X3Rva2VuX3VybCI6IE5vbmUsCiAgICAgICAgICAgICJhY2Nlc3NfdG9rZW5fdXJsIjogb3MuZW52aXJvblsiQVVUSF9LRVlDTE9BS19BQ0NFU1NfVE9LRU5fVVJMIl0sCiAgICAgICAgICAgICJhdXRob3JpemVfdXJsIjogb3MuZW52aXJvblsiQVVUSF9LRVlDTE9BS19BVVRIT1JJWkVfVVJMIl0sCiAgICAgICAgICAgICJqd2tzX3VyaSI6IG9zLmVudmlyb25bIkFVVEhfS0VZQ0xPQUtfSldLU19VUkwiXSwKICAgICAgICAgICAgImNsaWVudF9pZCI6IG9zLmVudmlyb25bIkFVVEhfS0VZQ0xPQUtfQ0xJRU5UX0lEIl0sCiAgICAgICAgICAgICJjbGllbnRfc2VjcmV0Ijogb3MuZW52aXJvblsiQVVUSF9LRVlDTE9BS19DTElFTlRfU0VDUkVUIl0sCiAgICAgICAgICAgICJhaXJmbG93X2Jhc2VfdXJsIjogb3MuZW52aXJvblsiQVVUSF9LRVlDTE9BS19BSVJGTE9XX0JBU0VfVVJMIl0sCiAgICAgICAgfSwKICAgIH0KXQoKU0VDVVJJVFlfTUFOQUdFUl9DTEFTUyA9IEtleWNsb2FrQXV0aG9yaXplcgo=
+kind: Secret
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-webserver-config
+ namespace: deeppharmgraph
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: dpg-datastore-primary
+ namespace: deeppharmgraph
+spec:
+ ports:
+ - name: http
+ port: 80
+ protocol: TCP
+ targetPort: 7878
+ selector:
+ app.kubernetes.io/name: oxigraph-primary
+ type: ClusterIP
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: pgbouncer
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-pgbouncer
+ namespace: deeppharmgraph
+spec:
+ ports:
+ - name: pgbouncer
+ port: 6432
+ protocol: TCP
+ selector:
+ app: airflow
+ component: pgbouncer
+ release: dpg-processing-airflow
+ type: ClusterIP
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: web
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-web
+ namespace: deeppharmgraph
+spec:
+ ports:
+ - name: web
+ port: 8080
+ protocol: TCP
+ targetPort: 8080
+ selector:
+ app: airflow
+ component: web
+ release: dpg-processing-airflow
+ sessionAffinity: None
+ type: ClusterIP
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: oxigraph-primary-pvc
+ namespace: deeppharmgraph
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 32Gi
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: db-migrations
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-db-migrations
+ namespace: deeppharmgraph
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: airflow
+ component: db-migrations
+ release: dpg-processing-airflow
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ annotations:
+ checksum/db-migrations-script: 37898f38b90abd06081105d992362ec9e0d0015123b69e758e59031a9e6ddfc9
+ checksum/secret-config-envs: 858f363428dd71df9353344009e3328775b49a39540c4652c12f6310419f5d51
+ checksum/secret-local-settings: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+ labels:
+ app: airflow
+ component: db-migrations
+ release: dpg-processing-airflow
+ spec:
+ affinity: {}
+ containers:
+ - args:
+ - python
+ - -u
+ - /mnt/scripts/db_migrations.py
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: db-migrations
+ resources: {}
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ - mountPath: /mnt/scripts
+ name: scripts
+ readOnly: true
+ initContainers:
+ - args:
+ - bash
+ - -c
+ - exec timeout 60s airflow db check
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: check-db
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ nodeSelector: {}
+ restartPolicy: Always
+ securityContext:
+ fsGroup: 0
+ serviceAccountName: dpg-processing-airflow
+ tolerations: []
+ volumes:
+ - emptyDir: {}
+ name: logs-data
+ - name: scripts
+ secret:
+ secretName: dpg-processing-airflow-db-migrations
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: pgbouncer
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-pgbouncer
+ namespace: deeppharmgraph
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: airflow
+ component: pgbouncer
+ release: dpg-processing-airflow
+ strategy:
+ rollingUpdate:
+ maxSurge: 1
+ maxUnavailable: 0
+ template:
+ metadata:
+ annotations:
+ checksum/secret-config-envs: 858f363428dd71df9353344009e3328775b49a39540c4652c12f6310419f5d51
+ checksum/secret-pgbouncer: 4e9f8069d3409019804aa33f690710e2b9e381ea88a829a848b20d8ee46fba38
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+ labels:
+ app: airflow
+ component: pgbouncer
+ release: dpg-processing-airflow
+ spec:
+ affinity: {}
+ containers:
+ - args:
+ - /bin/sh
+ - -c
+ - |-
+ /home/pgbouncer/config/gen_self_signed_cert.sh && \
+ /home/pgbouncer/config/gen_auth_file.sh && \
+ exec pgbouncer /home/pgbouncer/config/pgbouncer.ini
+ command:
+ - /usr/bin/dumb-init
+ - --rewrite=15:2
+ - --
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: ghcr.io/airflow-helm/pgbouncer:1.18.0-patch.1
+ imagePullPolicy: IfNotPresent
+ livenessProbe:
+ exec:
+ command:
+ - /bin/sh
+ - -c
+ - psql $(eval $DATABASE_PSQL_CMD) --tuples-only --command="SELECT 1;"
+ | grep -q "1"
+ failureThreshold: 3
+ initialDelaySeconds: 5
+ periodSeconds: 30
+ timeoutSeconds: 60
+ name: pgbouncer
+ ports:
+ - containerPort: 6432
+ name: pgbouncer
+ protocol: TCP
+ resources: {}
+ securityContext:
+ runAsGroup: 1001
+ runAsUser: 1001
+ startupProbe:
+ failureThreshold: 30
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ tcpSocket:
+ port: 6432
+ timeoutSeconds: 15
+ volumeMounts:
+ - mountPath: /home/pgbouncer/config
+ name: pgbouncer-config
+ readOnly: true
+ nodeSelector: {}
+ restartPolicy: Always
+ securityContext:
+ fsGroup: 0
+ serviceAccountName: dpg-processing-airflow
+ terminationGracePeriodSeconds: 120
+ tolerations: []
+ volumes:
+ - name: pgbouncer-config
+ secret:
+ items:
+ - key: gen_auth_file.sh
+ mode: 493
+ path: gen_auth_file.sh
+ - key: gen_self_signed_cert.sh
+ mode: 493
+ path: gen_self_signed_cert.sh
+ - key: pgbouncer.ini
+ path: pgbouncer.ini
+ secretName: dpg-processing-airflow-pgbouncer
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: scheduler
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-scheduler
+ namespace: deeppharmgraph
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: airflow
+ component: scheduler
+ release: dpg-processing-airflow
+ strategy:
+ rollingUpdate:
+ maxSurge: 25%
+ maxUnavailable: 0
+ type: RollingUpdate
+ template:
+ metadata:
+ annotations:
+ checksum/config-pod-template: 7eb8c18e40789e086be46f5739e74888c5c7f69c149ab70dd2d4dde3b6d1a4c3
+ checksum/secret-config-envs: 858f363428dd71df9353344009e3328775b49a39540c4652c12f6310419f5d51
+ checksum/secret-local-settings: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+ labels:
+ app: airflow
+ component: scheduler
+ release: dpg-processing-airflow
+ spec:
+ affinity: {}
+ containers:
+ - args:
+ - bash
+ - -c
+ - exec airflow scheduler -n -1
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ livenessProbe:
+ exec:
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ - python
+ - -Wignore
+ - -c
+ - |
+ import os
+ import sys
+
+ # suppress logs triggered from importing airflow packages
+ os.environ["AIRFLOW__LOGGING__LOGGING_LEVEL"] = "ERROR"
+
+ # shared imports
+ try:
+ from airflow.jobs.job import Job
+ except ImportError:
+ # `BaseJob` was renamed to `Job` in airflow 2.6.0
+ from airflow.jobs.base_job import BaseJob as Job
+ from airflow.utils.db import create_session
+ from airflow.utils.net import get_hostname
+
+ # heartbeat check imports
+ try:
+ from airflow.jobs.scheduler_job_runner import SchedulerJobRunner
+ except ImportError:
+ # `SchedulerJob` is wrapped by `SchedulerJobRunner` since airflow 2.6.0
+ from airflow.jobs.scheduler_job import SchedulerJob as SchedulerJobRunner
+
+ with create_session() as session:
+ ########################
+ # heartbeat check
+ ########################
+ # ensure the SchedulerJob with most recent heartbeat for this `hostname` is alive
+ hostname = get_hostname()
+ scheduler_job = session \
+ .query(Job) \
+ .filter_by(job_type=SchedulerJobRunner.job_type) \
+ .filter_by(hostname=hostname) \
+ .order_by(Job.latest_heartbeat.desc()) \
+ .limit(1) \
+ .first()
+ if (scheduler_job is not None) and scheduler_job.is_alive():
+ pass
+ else:
+ sys.exit(f"The SchedulerJob (id={scheduler_job.id}) for hostname '{hostname}' is not alive")
+ failureThreshold: 5
+ initialDelaySeconds: 10
+ periodSeconds: 30
+ timeoutSeconds: 60
+ name: airflow-scheduler
+ resources: {}
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ - mountPath: /opt/airflow/pod_templates/pod_template.yaml
+ name: pod-template
+ readOnly: true
+ subPath: pod_template.yaml
+ - args:
+ - bash
+ - -c
+ - |
+ set -euo pipefail
+
+ # break the infinite loop when we receive SIGINT or SIGTERM
+ trap "exit 0" SIGINT SIGTERM
+
+ while true; do
+ START_EPOCH=$(date --utc +%s)
+ echo "[$(date --utc +%FT%T.%3N)] deleting log files older than $RETENTION_MINUTES minutes..."
+
+ # delete all writable files ending in ".log" with modified-time older than $RETENTION_MINUTES
+ # NOTE: `-printf "."` prints a "." for each deleted file, which we count the bytes of with `wc -c`
+ DELETED_COUNT=$(
+ find "$LOG_PATH" \
+ -type f \
+ -name "*.log" \
+ -mmin +"$RETENTION_MINUTES" \
+ -writable \
+ -delete \
+ -printf "." \
+ | wc -c
+ )
+
+ END_EPOCH=$(date --utc +%s)
+ LOOP_DURATION=$((END_EPOCH - START_EPOCH))
+ echo "[$(date --utc +%FT%T.%3N)] deleted $DELETED_COUNT files in $LOOP_DURATION seconds"
+
+ SECONDS_TO_SLEEP=$((INTERVAL_SECONDS - LOOP_DURATION))
+ if (( SECONDS_TO_SLEEP > 0 )); then
+ echo "[$(date --utc +%FT%T.%3N)] waiting $SECONDS_TO_SLEEP seconds..."
+ sleep $SECONDS_TO_SLEEP
+ fi
+ done
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: LOG_PATH
+ value: /opt/airflow/logs
+ - name: RETENTION_MINUTES
+ value: "21600"
+ - name: INTERVAL_SECONDS
+ value: "900"
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: log-cleanup
+ resources: {}
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ initContainers:
+ - args:
+ - bash
+ - -c
+ - exec timeout 60s airflow db check
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: check-db
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ - args:
+ - bash
+ - -c
+ - exec airflow db check-migrations -t 60
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: wait-for-db-migrations
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ nodeSelector: {}
+ restartPolicy: Always
+ securityContext:
+ fsGroup: 0
+ serviceAccountName: dpg-processing-airflow
+ tolerations: []
+ volumes:
+ - emptyDir: {}
+ name: logs-data
+ - configMap:
+ name: dpg-processing-airflow-pod-template
+ name: pod-template
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: triggerer
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-triggerer
+ namespace: deeppharmgraph
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: airflow
+ component: triggerer
+ release: dpg-processing-airflow
+ strategy:
+ rollingUpdate:
+ maxSurge: 25%
+ maxUnavailable: 0
+ type: RollingUpdate
+ template:
+ metadata:
+ annotations:
+ checksum/secret-config-envs: 858f363428dd71df9353344009e3328775b49a39540c4652c12f6310419f5d51
+ checksum/secret-local-settings: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+ labels:
+ app: airflow
+ component: triggerer
+ release: dpg-processing-airflow
+ spec:
+ affinity: {}
+ containers:
+ - args:
+ - bash
+ - -c
+ - exec airflow triggerer
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ livenessProbe:
+ exec:
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ - python
+ - -Wignore
+ - -c
+ - |
+ import os
+ import sys
+
+ # suppress logs triggered from importing airflow packages
+ os.environ["AIRFLOW__LOGGING__LOGGING_LEVEL"] = "ERROR"
+
+ # shared imports
+ try:
+ from airflow.jobs.job import Job
+ except ImportError:
+ # `BaseJob` was renamed to `Job` in airflow 2.6.0
+ from airflow.jobs.base_job import BaseJob as Job
+ from airflow.utils.db import create_session
+ from airflow.utils.net import get_hostname
+
+ # heartbeat check imports
+ try:
+ from airflow.jobs.triggerer_job_runner import TriggererJobRunner
+ except ImportError:
+ # `TriggererJob` is wrapped by `TriggererJobRunner` since airflow 2.6.0
+ from airflow.jobs.triggerer_job import TriggererJob as TriggererJobRunner
+
+ with create_session() as session:
+ # ensure the TriggererJob with most recent heartbeat for this `hostname` is alive
+ hostname = get_hostname()
+ triggerer_job = session \
+ .query(Job) \
+ .filter_by(job_type=TriggererJobRunner.job_type) \
+ .filter_by(hostname=hostname) \
+ .order_by(Job.latest_heartbeat.desc()) \
+ .limit(1) \
+ .first()
+ if (triggerer_job is not None) and triggerer_job.is_alive():
+ pass
+ else:
+ sys.exit(f"The TriggererJob (id={triggerer_job.id}) for hostname '{hostname}' is not alive")
+ failureThreshold: 5
+ initialDelaySeconds: 10
+ periodSeconds: 30
+ timeoutSeconds: 60
+ name: airflow-triggerer
+ resources: {}
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ initContainers:
+ - args:
+ - bash
+ - -c
+ - exec timeout 60s airflow db check
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: check-db
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ - args:
+ - bash
+ - -c
+ - exec airflow db check-migrations -t 60
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: wait-for-db-migrations
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ nodeSelector: {}
+ restartPolicy: Always
+ securityContext:
+ fsGroup: 0
+ serviceAccountName: dpg-processing-airflow
+ tolerations: []
+ volumes:
+ - emptyDir: {}
+ name: logs-data
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app: airflow
+ chart: airflow-8.8.0
+ component: web
+ heritage: Helm
+ release: dpg-processing-airflow
+ name: dpg-processing-airflow-web
+ namespace: deeppharmgraph
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: airflow
+ component: web
+ release: dpg-processing-airflow
+ strategy:
+ rollingUpdate:
+ maxSurge: 25%
+ maxUnavailable: 0
+ type: RollingUpdate
+ template:
+ metadata:
+ annotations:
+ checksum/config-webserver-config: 0c55e7421113d4db2812f65670e5c92075d1884fb1099f0bf7695e7e88af9824
+ checksum/secret-config-envs: 858f363428dd71df9353344009e3328775b49a39540c4652c12f6310419f5d51
+ checksum/secret-local-settings: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+ labels:
+ app: airflow
+ component: web
+ release: dpg-processing-airflow
+ spec:
+ affinity: {}
+ containers:
+ - args:
+ - bash
+ - -c
+ - exec airflow webserver
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ livenessProbe:
+ failureThreshold: 6
+ httpGet:
+ path: /health
+ port: web
+ scheme: HTTP
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ timeoutSeconds: 5
+ name: airflow-web
+ ports:
+ - containerPort: 8080
+ name: web
+ protocol: TCP
+ readinessProbe:
+ failureThreshold: 6
+ httpGet:
+ path: /health
+ port: web
+ scheme: HTTP
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ timeoutSeconds: 5
+ resources: {}
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ - mountPath: /opt/airflow/webserver_config.py
+ name: webserver-config
+ readOnly: true
+ subPath: webserver_config.py
+ initContainers:
+ - args:
+ - bash
+ - -c
+ - exec timeout 60s airflow db check
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: check-db
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ - args:
+ - bash
+ - -c
+ - exec airflow db check-migrations -t 60
+ command:
+ - /usr/bin/dumb-init
+ - --
+ - /entrypoint
+ env:
+ - name: DATABASE_USER
+ valueFrom:
+ secretKeyRef:
+ key: user
+ name: airflow-postgres-app
+ - name: DATABASE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ key: password
+ name: airflow-postgres-app
+ - name: CONNECTION_CHECK_MAX_COUNT
+ value: "0"
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__CORE__FERNET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ name: airflow-env-secret
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_SCOPE
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_JWKS_URL
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ name: airflow-env-configmap
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ name: airflow-env-configmap
+ envFrom:
+ - secretRef:
+ name: dpg-processing-airflow-config-envs
+ image: apache/airflow:2.6.3-python3.9
+ imagePullPolicy: IfNotPresent
+ name: wait-for-db-migrations
+ securityContext:
+ runAsGroup: 0
+ runAsUser: 50000
+ volumeMounts:
+ - mountPath: /opt/airflow/logs
+ name: logs-data
+ nodeSelector: {}
+ restartPolicy: Always
+ securityContext:
+ fsGroup: 0
+ serviceAccountName: dpg-processing-airflow
+ tolerations: []
+ volumes:
+ - emptyDir: {}
+ name: logs-data
+ - name: webserver-config
+ secret:
+ defaultMode: 420
+ secretName: dpg-processing-airflow-webserver-config
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app.kubernetes.io/name: oxigraph-primary
+ name: oxigraph-primary
+ namespace: deeppharmgraph
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: oxigraph-primary
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: oxigraph-primary
+ spec:
+ containers:
+ - args:
+ - serve
+ - --location
+ - /data
+ - --bind
+ - 0.0.0.0:7878
+ image: ghcr.io/oxigraph/oxigraph:0.4.0-alpha.3
+ name: oxigraph
+ ports:
+ - containerPort: 7878
+ volumeMounts:
+ - mountPath: /data
+ name: oxigraph-data
+ volumes:
+ - name: oxigraph-data
+ persistentVolumeClaim:
+ claimName: oxigraph-primary-pvc
+ - emptyDir: {}
+ name: busybox
+---
+apiVersion: client.keycloak.crossplane.io/v1alpha1
+kind: ProtocolMapper
+metadata:
+ name: airflow-role-mapper
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ config:
+ access.token.claim: "true"
+ claim.name: roles
+ multivalued: "true"
+ userinfo.token.claim: "true"
+ name: role-mapper
+ protocol: openid-connect
+ protocolMapper: oidc-usermodel-client-role-mapper
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: http-datastore
+ namespace: deeppharmgraph
+spec:
+ hostnames:
+ - dpg-datastore.dev.lan.shamrock.systems
+ parentRefs:
+ - group: gateway.networking.k8s.io
+ kind: Gateway
+ name: eg
+ namespace: envoy-gateway-system
+ rules:
+ - backendRefs:
+ - name: dpg-datastore-primary
+ port: 80
+ matches:
+ - path:
+ type: PathPrefix
+ value: /
+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: http-processing-webserver
+ namespace: deeppharmgraph
+spec:
+ hostnames:
+ - dpg-processing.dev.lan.shamrock.systems
+ parentRefs:
+ - group: gateway.networking.k8s.io
+ kind: Gateway
+ name: eg
+ namespace: envoy-gateway-system
+ rules:
+ - backendRefs:
+ - name: dpg-processing-airflow-web
+ port: 8080
+ matches:
+ - path:
+ type: PathPrefix
+ value: /
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-admin-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowAdmin
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-op-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowOp
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-public-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowPublic
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-user-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowUser
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-viewer-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowViewer
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Memberships
+metadata:
+ name: airflow-admin-membership
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-admin-group
+ members:
+ - admin
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-admin-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-admin-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-admin
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-op-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-op-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-op
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-public-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-public-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-public
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-user-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-user-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-user
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-viewer-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-viewer-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-viewer
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: openidclient.keycloak.crossplane.io/v1alpha1
+kind: Client
+metadata:
+ name: dpg-airflow-client
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ accessType: CONFIDENTIAL
+ clientId: application-airflow
+ clientSecretSecretRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ namespace: deeppharmgraph
+ realmId: deeppharmgraph
+ standardFlowEnabled: true
+ validRedirectUris:
+ - http://dpg-processing.dev.lan.shamrock.systems/oauth-authorized/keycloak
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: postgresql.cnpg.io/v1
+kind: Cluster
+metadata:
+ name: airflow-postgres
+ namespace: deeppharmgraph
+spec:
+ instances: 1
+ storage:
+ size: 16Gi
+---
+apiVersion: realm.keycloak.crossplane.io/v1alpha1
+kind: Realm
+metadata:
+ name: dpg-keycloak-realm
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ displayName: DeepPharmGraph Barrier
+ displayNameHtml:
DeepPharmGraph Barrier
+ enabled: true
+ realm: deeppharmgraph
+ registrationAllowed: false
+ registrationEmailAsUsername: false
+ rememberMe: true
+ resetPasswordAllowed: true
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: user.keycloak.crossplane.io/v1alpha1
+kind: User
+metadata:
+ name: dpg-admin
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ email: example@example.com
+ emailVerified: true
+ firstName: John
+ initialPassword:
+ - temporary: false
+ valueSecretRef:
+ key: password
+ name: dpg-admin-secret
+ namespace: deeppharmgraph
+ lastName: Doe
+ realmId: deeppharmgraph
+ username: admin
+ providerConfigRef:
+ name: keycloak-config
diff --git a/builds/local/deeppharmgraph/kustomization.yaml b/builds/local/deeppharmgraph/kustomization.yaml
new file mode 100644
index 0000000..a54eb2e
--- /dev/null
+++ b/builds/local/deeppharmgraph/kustomization.yaml
@@ -0,0 +1,6 @@
+# Automatically generated by Kustomanager
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./build.yaml
diff --git a/builds/local/keycloak-provider/build.yaml b/builds/local/keycloak-provider/build.yaml
index e5e2fbe..0d20410 100644
--- a/builds/local/keycloak-provider/build.yaml
+++ b/builds/local/keycloak-provider/build.yaml
@@ -28,9 +28,8 @@ spec:
value: |
{
"client_id": "crossplane",
- "url": "https://auth.shamrock.systems",
+ "client_secret": "ShamroclLocalDevSecret",
+ "url": "http://id.dev.lan.shamrock.systems",
"realm": "master"
}
- - name: KEYCLOAK_CLIENT_SECRET
- value: ShamroclLocalDevSecret
name: package-runtime
diff --git a/builds/local/keycloak/build.yaml b/builds/local/keycloak/build.yaml
index 6b0b54b..72ba3ae 100644
--- a/builds/local/keycloak/build.yaml
+++ b/builds/local/keycloak/build.yaml
@@ -2161,7 +2161,7 @@ spec:
spec:
containers:
- args:
- - start
+ - start-dev
env:
- name: KEYCLOAK_ADMIN
value: admin
@@ -2169,10 +2169,6 @@ spec:
value: password
- name: KC_HOSTNAME
value: id.dev.lan.shamrock.systems
- - name: KC_PROXY
- value: edge
- - name: KC_HOSTNAME_STRICT_HTTPS
- value: "false"
- name: KC_DB
value: postgres
- name: KC_DB_URL
diff --git a/builds/local/whoami/build.yaml b/builds/local/whoami/build.yaml
new file mode 100644
index 0000000..a9b88b1
--- /dev/null
+++ b/builds/local/whoami/build.yaml
@@ -0,0 +1,70 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ labels:
+ name: whoami
+ name: whoami
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: whoami
+ namespace: whoami
+spec:
+ ports:
+ - port: 80
+ protocol: TCP
+ targetPort: 80
+ selector:
+ app: whoami
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: whoami
+ namespace: whoami
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: whoami
+ template:
+ metadata:
+ labels:
+ app: whoami
+ spec:
+ containers:
+ - image: traefik/whoami:latest
+ imagePullPolicy: IfNotPresent
+ name: whoami
+ ports:
+ - containerPort: 80
+ resources:
+ limits:
+ cpu: 100m
+ memory: 100Mi
+ requests:
+ cpu: 50m
+ memory: 60Mi
+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: http-whoami
+ namespace: whoami
+spec:
+ hostnames:
+ - whoami.dev.lan.shamrock.systems
+ parentRefs:
+ - group: gateway.networking.k8s.io
+ kind: Gateway
+ name: eg
+ namespace: envoy-gateway-system
+ rules:
+ - backendRefs:
+ - name: whoami
+ port: 80
+ matches:
+ - path:
+ type: PathPrefix
+ value: /
diff --git a/builds/local/whoami/kustomization.yaml b/builds/local/whoami/kustomization.yaml
new file mode 100644
index 0000000..a54eb2e
--- /dev/null
+++ b/builds/local/whoami/kustomization.yaml
@@ -0,0 +1,6 @@
+# Automatically generated by Kustomanager
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./build.yaml
diff --git a/cluster-local/coredns/configmap.yaml b/cluster-local/coredns/configmap.yaml
new file mode 100644
index 0000000..7941a73
--- /dev/null
+++ b/cluster-local/coredns/configmap.yaml
@@ -0,0 +1,8 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: coredns-custom
+ namespace: kube-system
+data:
+ keycloak.override: |
+ rewrite name substring id.dev.lan.shamrock.systems keycloak.keycloak.svc.cluster.local
diff --git a/cluster-local/coredns/kustomization.yaml b/cluster-local/coredns/kustomization.yaml
new file mode 100644
index 0000000..5ef224a
--- /dev/null
+++ b/cluster-local/coredns/kustomization.yaml
@@ -0,0 +1,5 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./configmap.yaml
diff --git a/cluster-local/debug/deployment.yaml b/cluster-local/debug/deployment.yaml
new file mode 100644
index 0000000..705616d
--- /dev/null
+++ b/cluster-local/debug/deployment.yaml
@@ -0,0 +1,22 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: curl-debug
+ namespace: default
+ labels:
+ app.kubernetes.io/name: curl-debug
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: curl-debug
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: curl-debug
+ spec:
+ containers:
+ - name: curl
+ image: quay.io/curl/curl:latest
+ command: ["sleep"]
+ args: ["infinity"]
diff --git a/cluster-local/debug/kustomization.yaml b/cluster-local/debug/kustomization.yaml
new file mode 100644
index 0000000..51fa9bd
--- /dev/null
+++ b/cluster-local/debug/kustomization.yaml
@@ -0,0 +1,5 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./deployment.yaml
diff --git a/cluster-local/deeppharmgraph/authentication/client.yaml b/cluster-local/deeppharmgraph/authentication/client.yaml
new file mode 100644
index 0000000..b204733
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/client.yaml
@@ -0,0 +1,20 @@
+apiVersion: openidclient.keycloak.crossplane.io/v1alpha1
+kind: Client
+metadata:
+ name: dpg-airflow-client
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ accessType: CONFIDENTIAL
+ clientId: application-airflow
+ clientSecretSecretRef:
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ name: airflow-env-secret
+ namespace: deeppharmgraph
+ realmId: deeppharmgraph
+ standardFlowEnabled: true
+ validRedirectUris:
+ - http://dpg-processing.dev.lan.shamrock.systems/oauth-authorized/keycloak
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/authentication/group.yaml b/cluster-local/deeppharmgraph/authentication/group.yaml
new file mode 100644
index 0000000..58cb8e2
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/group.yaml
@@ -0,0 +1,64 @@
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-admin-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowAdmin
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-public-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowPublic
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-viewer-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowViewer
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-user-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowUser
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Group
+metadata:
+ name: airflow-op-group
+ namespace: deeppharmgraph
+spec:
+ deletionPolicy: Delete
+ forProvider:
+ name: AirflowOp
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/authentication/kustomization.yaml b/cluster-local/deeppharmgraph/authentication/kustomization.yaml
new file mode 100644
index 0000000..81ceaf6
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/kustomization.yaml
@@ -0,0 +1,13 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./realm.yaml
+ - ./client.yaml
+ - ./secret.admin.yaml
+ - ./role.yaml
+ - ./protocolmapper.yaml
+ - ./user.yaml
+ - ./group.yaml
+ - ./membership.yaml
+ - ./roles.group.yaml
diff --git a/cluster-local/deeppharmgraph/authentication/membership.yaml b/cluster-local/deeppharmgraph/authentication/membership.yaml
new file mode 100644
index 0000000..11ce349
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/membership.yaml
@@ -0,0 +1,14 @@
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Memberships
+metadata:
+ name: airflow-admin-membership
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-admin-group
+ members:
+ - admin
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/authentication/protocolmapper.yaml b/cluster-local/deeppharmgraph/authentication/protocolmapper.yaml
new file mode 100644
index 0000000..6f04231
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/protocolmapper.yaml
@@ -0,0 +1,20 @@
+apiVersion: client.keycloak.crossplane.io/v1alpha1
+kind: ProtocolMapper
+metadata:
+ name: airflow-role-mapper
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ config:
+ claim.name: roles
+ multivalued: "true"
+ userinfo.token.claim: "true"
+ access.token.claim: "true"
+ name: role-mapper
+ protocol: openid-connect
+ protocolMapper: oidc-usermodel-client-role-mapper
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/authentication/realm.yaml b/cluster-local/deeppharmgraph/authentication/realm.yaml
new file mode 100644
index 0000000..888d1be
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/realm.yaml
@@ -0,0 +1,17 @@
+apiVersion: realm.keycloak.crossplane.io/v1alpha1
+kind: Realm
+metadata:
+ name: dpg-keycloak-realm
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ realm: deeppharmgraph
+ displayName: DeepPharmGraph Barrier
+ displayNameHtml: DeepPharmGraph Barrier
+ enabled: true
+ registrationAllowed: false
+ registrationEmailAsUsername: false
+ rememberMe: true
+ resetPasswordAllowed: true
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/authentication/role.yaml b/cluster-local/deeppharmgraph/authentication/role.yaml
new file mode 100644
index 0000000..75f29b5
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/role.yaml
@@ -0,0 +1,64 @@
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-admin
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: admin
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-public
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: public
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-viewer
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: viewer
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-user
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: user
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: role.keycloak.crossplane.io/v1alpha1
+kind: Role
+metadata:
+ name: airflow-op
+spec:
+ forProvider:
+ clientIdRef:
+ name: dpg-airflow-client
+ name: op
+ realmId: deeppharmgraph
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/authentication/roles.group.yaml b/cluster-local/deeppharmgraph/authentication/roles.group.yaml
new file mode 100644
index 0000000..3bae871
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/roles.group.yaml
@@ -0,0 +1,74 @@
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-admin-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-admin-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-admin
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-public-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-public-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-public
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-viewer-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-viewer-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-viewer
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-user-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-user-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-user
+ providerConfigRef:
+ name: keycloak-config
+---
+apiVersion: group.keycloak.crossplane.io/v1alpha1
+kind: Roles
+metadata:
+ name: airflow-op-group-roles
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ groupIdRef:
+ name: airflow-op-group
+ realmId: deeppharmgraph
+ roleIdsRefs:
+ - name: airflow-op
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/authentication/secret.admin.yaml b/cluster-local/deeppharmgraph/authentication/secret.admin.yaml
new file mode 100644
index 0000000..54c3217
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/secret.admin.yaml
@@ -0,0 +1,7 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: dpg-admin-secret
+ namespace: deeppharmgraph
+stringData:
+ password: "password"
diff --git a/cluster-local/deeppharmgraph/authentication/user.yaml b/cluster-local/deeppharmgraph/authentication/user.yaml
new file mode 100644
index 0000000..c2fe7ea
--- /dev/null
+++ b/cluster-local/deeppharmgraph/authentication/user.yaml
@@ -0,0 +1,21 @@
+apiVersion: user.keycloak.crossplane.io/v1alpha1
+kind: User
+metadata:
+ name: dpg-admin
+ namespace: deeppharmgraph
+spec:
+ forProvider:
+ initialPassword:
+ - temporary: false
+ valueSecretRef:
+ key: password
+ name: dpg-admin-secret
+ namespace: deeppharmgraph
+ realmId: deeppharmgraph
+ username: admin
+ firstName: John
+ lastName: Doe
+ email: example@example.com
+ emailVerified: true
+ providerConfigRef:
+ name: keycloak-config
diff --git a/cluster-local/deeppharmgraph/datastore/deployment.yaml b/cluster-local/deeppharmgraph/datastore/deployment.yaml
new file mode 100644
index 0000000..bfe7610
--- /dev/null
+++ b/cluster-local/deeppharmgraph/datastore/deployment.yaml
@@ -0,0 +1,38 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: oxigraph-primary
+ labels:
+ app.kubernetes.io/name: oxigraph-primary
+spec:
+ strategy:
+ type: Recreate
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: oxigraph-primary
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: oxigraph-primary
+ spec:
+ volumes:
+ - name: oxigraph-data
+ persistentVolumeClaim:
+ claimName: oxigraph-primary-pvc
+ - name: busybox
+ emptyDir: {}
+ containers:
+ - name: oxigraph
+ image: ghcr.io/oxigraph/oxigraph:0.4.0-alpha.3
+ args:
+ - serve
+ - --location
+ - /data
+ - --bind
+ - 0.0.0.0:7878
+ ports:
+ - containerPort: 7878
+ volumeMounts:
+ - mountPath: /data
+ name: oxigraph-data
diff --git a/cluster-local/deeppharmgraph/datastore/httproute.yaml b/cluster-local/deeppharmgraph/datastore/httproute.yaml
new file mode 100644
index 0000000..af1ab00
--- /dev/null
+++ b/cluster-local/deeppharmgraph/datastore/httproute.yaml
@@ -0,0 +1,20 @@
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: http-datastore
+ namespace: deeppharmgraph
+spec:
+ parentRefs:
+ - group: gateway.networking.k8s.io
+ kind: Gateway
+ name: eg
+ namespace: envoy-gateway-system
+ hostnames: [dpg-datastore.dev.lan.shamrock.systems]
+ rules:
+ - matches:
+ - path:
+ type: PathPrefix
+ value: /
+ backendRefs:
+ - name: dpg-datastore-primary
+ port: 80
diff --git a/cluster-local/deeppharmgraph/datastore/kustomization.yaml b/cluster-local/deeppharmgraph/datastore/kustomization.yaml
new file mode 100644
index 0000000..8abb750
--- /dev/null
+++ b/cluster-local/deeppharmgraph/datastore/kustomization.yaml
@@ -0,0 +1,9 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+namespace: deeppharmgraph
+resources:
+ - ./persistentvolumeclaim.yaml
+ - ./deployment.yaml
+ - ./service.yaml
+ - ./httproute.yaml
diff --git a/cluster-local/deeppharmgraph/datastore/persistentvolumeclaim.yaml b/cluster-local/deeppharmgraph/datastore/persistentvolumeclaim.yaml
new file mode 100644
index 0000000..e50f9c5
--- /dev/null
+++ b/cluster-local/deeppharmgraph/datastore/persistentvolumeclaim.yaml
@@ -0,0 +1,10 @@
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: oxigraph-primary-pvc
+spec:
+ resources:
+ requests:
+ storage: 32Gi
+ accessModes:
+ - ReadWriteOnce
diff --git a/cluster-local/deeppharmgraph/datastore/service.yaml b/cluster-local/deeppharmgraph/datastore/service.yaml
new file mode 100644
index 0000000..d1a9b57
--- /dev/null
+++ b/cluster-local/deeppharmgraph/datastore/service.yaml
@@ -0,0 +1,14 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: dpg-datastore-primary
+ namespace: deeppharmgraph
+spec:
+ type: ClusterIP
+ selector:
+ app.kubernetes.io/name: oxigraph-primary
+ ports:
+ - name: http
+ protocol: TCP
+ port: 80
+ targetPort: 7878
diff --git a/cluster-local/deeppharmgraph/kustomization.yaml b/cluster-local/deeppharmgraph/kustomization.yaml
new file mode 100644
index 0000000..6ba658c
--- /dev/null
+++ b/cluster-local/deeppharmgraph/kustomization.yaml
@@ -0,0 +1,8 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./namespace.yaml
+ - ./authentication
+ - ./datastore
+ - ./processing
diff --git a/cluster-local/deeppharmgraph/namespace.yaml b/cluster-local/deeppharmgraph/namespace.yaml
new file mode 100644
index 0000000..6f4ad55
--- /dev/null
+++ b/cluster-local/deeppharmgraph/namespace.yaml
@@ -0,0 +1,6 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: deeppharmgraph
+ labels:
+ name: deeppharmgraph
diff --git a/cluster-local/deeppharmgraph/processing/cluster.postgres.yaml b/cluster-local/deeppharmgraph/processing/cluster.postgres.yaml
new file mode 100644
index 0000000..aa72c01
--- /dev/null
+++ b/cluster-local/deeppharmgraph/processing/cluster.postgres.yaml
@@ -0,0 +1,9 @@
+apiVersion: postgresql.cnpg.io/v1
+kind: Cluster
+metadata:
+ name: airflow-postgres
+ namespace: deeppharmgraph
+spec:
+ instances: 1
+ storage:
+ size: 16Gi
diff --git a/cluster-local/deeppharmgraph/processing/configmap.yaml b/cluster-local/deeppharmgraph/processing/configmap.yaml
new file mode 100644
index 0000000..987a838
--- /dev/null
+++ b/cluster-local/deeppharmgraph/processing/configmap.yaml
@@ -0,0 +1,14 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: airflow-env-configmap
+ namespace: deeppharmgraph
+data:
+ AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX: "true"
+ AUTH_KEYCLOAK_API_BASE_URL: "http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/"
+ AUTH_KEYCLOAK_SCOPE: "openid"
+ AUTH_KEYCLOAK_ACCESS_TOKEN_URL: "http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/openid-connect/token"
+ AUTH_KEYCLOAK_AUTHORIZE_URL: "http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/openid-connect/auth"
+ AUTH_KEYCLOAK_JWKS_URL: "http://id.dev.lan.shamrock.systems/realms/deeppharmgraph/protocol/openid-connect/certs"
+ AUTH_KEYCLOAK_CLIENT_ID: "application-airflow"
+ AUTH_KEYCLOAK_AIRFLOW_BASE_URL: "http://dpg-processing.dev.lan.shamrock.systems/"
diff --git a/cluster-local/deeppharmgraph/processing/httproute.yaml b/cluster-local/deeppharmgraph/processing/httproute.yaml
new file mode 100644
index 0000000..c76589b
--- /dev/null
+++ b/cluster-local/deeppharmgraph/processing/httproute.yaml
@@ -0,0 +1,20 @@
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: http-processing-webserver
+ namespace: deeppharmgraph
+spec:
+ parentRefs:
+ - group: gateway.networking.k8s.io
+ kind: Gateway
+ name: eg
+ namespace: envoy-gateway-system
+ hostnames: [dpg-processing.dev.lan.shamrock.systems]
+ rules:
+ - matches:
+ - path:
+ type: PathPrefix
+ value: /
+ backendRefs:
+ - name: dpg-processing-airflow-web
+ port: 8080
diff --git a/cluster-local/deeppharmgraph/processing/kustomization.yaml b/cluster-local/deeppharmgraph/processing/kustomization.yaml
new file mode 100644
index 0000000..86eecdb
--- /dev/null
+++ b/cluster-local/deeppharmgraph/processing/kustomization.yaml
@@ -0,0 +1,18 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+namespace: deeppharmgraph
+
+resources:
+ - ./secret.airflow.yaml
+ - ./configmap.yaml
+ - ./cluster.postgres.yaml
+ - ./httproute.yaml
+
+helmCharts:
+ - releaseName: dpg-processing-airflow
+ namespace: deeppharmgraph
+ name: airflow
+ repo: https://airflow-helm.github.io/charts
+ version: 8.8.0
+ valuesFile: values.airflow.yaml
diff --git a/cluster-local/deeppharmgraph/processing/secret.airflow.yaml b/cluster-local/deeppharmgraph/processing/secret.airflow.yaml
new file mode 100644
index 0000000..83b16d4
--- /dev/null
+++ b/cluster-local/deeppharmgraph/processing/secret.airflow.yaml
@@ -0,0 +1,9 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: airflow-env-secret
+ namespace: deeppharmgraph
+stringData:
+ AIRFLOW__CORE__FERNET_KEY: "su8TakfoyJ3Mv6i136Y-i6vcJqhlthL8Q60F9M6GLJM="
+ AIRFLOW__WEBSERVER__SECRET_KEY: "e5EqEnDH4wkWxnMf97n7RK7mAyBG2qdu"
+ AUTH_KEYCLOAK_CLIENT_SECRET: "HxLbmeGmDDcDGuC5eh9MrkQFWYAE3cZE"
diff --git a/cluster-local/deeppharmgraph/processing/values.airflow.yaml b/cluster-local/deeppharmgraph/processing/values.airflow.yaml
new file mode 100644
index 0000000..df88214
--- /dev/null
+++ b/cluster-local/deeppharmgraph/processing/values.airflow.yaml
@@ -0,0 +1,2368 @@
+########################################
+## CONFIG | Airflow Configs
+########################################
+airflow:
+ ## if we use legacy 1.10 airflow commands
+ ##
+ legacyCommands: false
+
+ ## configs for the airflow container image
+ ##
+ image:
+ repository: apache/airflow
+ tag: 2.6.3-python3.9
+ pullPolicy: IfNotPresent
+ pullSecret: ""
+ uid: 50000
+ gid: 0
+
+ ## the airflow executor type to use
+ ## - allowed values: "CeleryExecutor", "KubernetesExecutor", "CeleryKubernetesExecutor"
+ ## - customize the "KubernetesExecutor" pod-template with `airflow.kubernetesPodTemplate.*`
+ ##
+ executor: KubernetesExecutor
+
+ ## the fernet encryption key (sets `AIRFLOW__CORE__FERNET_KEY`)
+ ## - [WARNING] you must change this value to ensure the security of your airflow
+ ## - set `AIRFLOW__CORE__FERNET_KEY` with `airflow.extraEnv` from a Secret to avoid storing this in your values
+ ## - use this command to generate your own fernet key:
+ ## python -c "from cryptography.fernet import Fernet; FERNET_KEY = Fernet.generate_key().decode(); print(FERNET_KEY)"
+ ##
+ fernetKey: ~
+
+ ## the secret_key for flask (sets `AIRFLOW__WEBSERVER__SECRET_KEY`)
+ ## - [WARNING] you must change this value to ensure the security of your airflow
+ ## - set `AIRFLOW__WEBSERVER__SECRET_KEY` with `airflow.extraEnv` from a Secret to avoid storing this in your values
+ ##
+ webserverSecretKey: ~
+
+ ## environment variables for airflow configs
+ ## - airflow env-vars are structured: "AIRFLOW__{config_section}__{config_name}"
+ ## - airflow configuration reference:
+ ## https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html
+ ##
+ ## ____ EXAMPLE _______________
+ ## config:
+ ## # dag configs
+ ## AIRFLOW__CORE__LOAD_EXAMPLES: "False"
+ ## AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL: "30"
+ ##
+ ## # email configs
+ ## AIRFLOW__EMAIL__EMAIL_BACKEND: "airflow.utils.email.send_email_smtp"
+ ## AIRFLOW__SMTP__SMTP_HOST: "smtpmail.example.com"
+ ## AIRFLOW__SMTP__SMTP_MAIL_FROM: "admin@example.com"
+ ## AIRFLOW__SMTP__SMTP_PORT: "25"
+ ## AIRFLOW__SMTP__SMTP_SSL: "False"
+ ## AIRFLOW__SMTP__SMTP_STARTTLS: "False"
+ ##
+ ## # domain used in airflow emails
+ ## AIRFLOW__WEBSERVER__BASE_URL: "http://airflow.example.com"
+ ##
+ ## # ether environment variables
+ ## HTTP_PROXY: "http://proxy.example.com:8080"
+ ##
+ config: {}
+
+ ## a list of users to create
+ ## - templates can ONLY be used in: `password`, `email`, `firstName`, `lastName`
+ ## - templates used a bash-like syntax: ${MY_USERNAME}, $MY_USERNAME
+ ## - templates are defined in `usersTemplates`
+ ## - `role` can be a single role or a list of roles
+ ##
+ users: []
+
+ ## bash-like templates to be used in `airflow.users`
+ ## - [WARNING] if a Secret or ConfigMap is missing, the sync Pod will crash
+ ## - [WARNING] all keys must match the regex: ^[a-zA-Z_][a-zA-Z0-9_]*$
+ ##
+ ## ____ EXAMPLE _______________
+ ## usersTemplates
+ ## MY_USERNAME:
+ ## kind: configmap
+ ## name: my-configmap
+ ## key: username
+ ## MY_PASSWORD:
+ ## kind: secret
+ ## name: my-secret
+ ## key: password
+ ##
+ usersTemplates: {}
+
+ ## if we create a Deployment to perpetually sync `airflow.users`
+ ## - when `true`, users are updated in real-time, as ConfigMaps/Secrets change
+ ## - when `true`, users changes from the WebUI will be reverted automatically
+ ## - when `false`, users will only update one-time, after each `helm upgrade`
+ ##
+ usersUpdate: true
+
+ ## a list airflow connections to create
+ ## - templates can ONLY be used in: `host`, `login`, `password`, `schema`, `extra`
+ ## - templates used a bash-like syntax: ${AWS_ACCESS_KEY} or $AWS_ACCESS_KEY
+ ## - templates are defined in `connectionsTemplates`
+ ##
+ ## ____ EXAMPLE _______________
+ ## connections:
+ ## - id: my_aws
+ ## type: aws
+ ## description: my AWS connection
+ ## extra: |-
+ ## { "aws_access_key_id": "${AWS_KEY_ID}",
+ ## "aws_secret_access_key": "${AWS_ACCESS_KEY}",
+ ## "region_name":"eu-central-1" }
+ ##
+ connections: []
+
+ ## bash-like templates to be used in `airflow.connections`
+ ## - see docs for `airflow.usersTemplates`
+ ##
+ connectionsTemplates: {}
+
+ ## if we create a Deployment to perpetually sync `airflow.connections`
+ ## - see docs for `airflow.usersUpdate`
+ ##
+ connectionsUpdate: true
+
+ ## a list airflow variables to create
+ ## - templates can ONLY be used in: `value`
+ ## - templates used a bash-like syntax: ${MY_VALUE} or $MY_VALUE
+ ## - templates are defined in `connectionsTemplates`
+ ##
+ ## ____ EXAMPLE _______________
+ ## variables:
+ ## - key: "var_1"
+ ## value: "my_value_1"
+ ## - key: "var_2"
+ ## value: "my_value_2"
+ ##
+ variables: []
+
+ ## bash-like templates to be used in `airflow.variables`
+ ## - see docs for `airflow.usersTemplates`
+ ##
+ variablesTemplates: {}
+
+ ## if we create a Deployment to perpetually sync `airflow.variables`
+ ## - see docs for `airflow.usersUpdate`
+ ##
+ variablesUpdate: true
+
+ ## a list airflow pools to create
+ ##
+ ## ____ EXAMPLE _______________
+ ## pools:
+ ## - name: "pool_1"
+ ## description: "example pool with 5 slots"
+ ## slots: 5
+ ## - name: "pool_2"
+ ## description: "example pool with 2 cron policies"
+ ## slots: 0
+ ## ## if deferred tasks count towards the slot limit, requires airflow 2.7.0+ (default: false)
+ ## include_deferred: false
+ ## ## at each sync interval, the policy with the most recently past `recurrence` is applied
+ ## policies:
+ ## - name: "scale up at 7pm UTC"
+ ## slots: 50
+ ## recurrence: "0 19 * * *"
+ ## - name: "scale down at 6am UTC"
+ ## slots: 10
+ ## recurrence: "0 6 * * *"
+ ##
+ pools: []
+
+ ## if we create a Deployment to perpetually sync `airflow.pools`
+ ## - see docs for `airflow.usersUpdate`
+ ##
+ poolsUpdate: true
+
+ ## default nodeSelector for airflow Pods (is overridden by pod-specific values)
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ defaultNodeSelector: {}
+
+ ## default affinity configs for airflow Pods (is overridden by pod-specific values)
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ defaultAffinity: {}
+
+ ## default toleration configs for airflow Pods (is overridden by pod-specific values)
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ defaultTolerations: []
+
+ ## default securityContext configs for airflow Pods (is overridden by pod-specific values)
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ defaultSecurityContext:
+ ## sets the filesystem owner group of files/folders in mounted volumes
+ ## this does NOT give root permissions to Pods, only the "root" group
+ fsGroup: 0
+
+ ## extra annotations for airflow Pods
+ ##
+ podAnnotations: {}
+
+ ## extra pip packages to install in airflow Pods
+ ##
+ ## ____ EXAMPLE _______________
+ ## extraPipPackages:
+ ## - "SomeProject==1.0.0"
+ ##
+ extraPipPackages: []
+
+ ## pip packages that are protected from upgrade/downgrade by `extraPipPackages`
+ ## - [WARNING] Pods will fail to start if `extraPipPackages` would cause these packages to change versions
+ ##
+ protectedPipPackages:
+ - "apache-airflow"
+
+ ## extra environment variables for the airflow Pods
+ ## - spec for EnvVar:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#envvar-v1-core
+ ##
+ extraEnv:
+ - name: AIRFLOW__CORE__FERNET_KEY
+ valueFrom:
+ secretKeyRef:
+ name: airflow-env-secret
+ key: AIRFLOW__CORE__FERNET_KEY
+ - name: AIRFLOW__WEBSERVER__SECRET_KEY
+ valueFrom:
+ secretKeyRef:
+ name: airflow-env-secret
+ key: AIRFLOW__WEBSERVER__SECRET_KEY
+ - name: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AIRFLOW__WEBSERVER__ENABLE_PROXY_FIX
+ - name: AUTH_KEYCLOAK_API_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AUTH_KEYCLOAK_API_BASE_URL
+ - name: AUTH_KEYCLOAK_SCOPE
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AUTH_KEYCLOAK_SCOPE
+ - name: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AUTH_KEYCLOAK_ACCESS_TOKEN_URL
+ - name: AUTH_KEYCLOAK_AUTHORIZE_URL
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AUTH_KEYCLOAK_AUTHORIZE_URL
+ - name: AUTH_KEYCLOAK_JWKS_URL
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AUTH_KEYCLOAK_JWKS_URL
+ - name: AUTH_KEYCLOAK_CLIENT_ID
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AUTH_KEYCLOAK_CLIENT_ID
+ - name: AUTH_KEYCLOAK_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ name: airflow-env-secret
+ key: AUTH_KEYCLOAK_CLIENT_SECRET
+ - name: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+ valueFrom:
+ configMapKeyRef:
+ name: airflow-env-configmap
+ key: AUTH_KEYCLOAK_AIRFLOW_BASE_URL
+
+ ## extra containers for the airflow Pods
+ ## - spec for Container:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#container-v1-core
+ ##
+ extraContainers: []
+
+ ## extra VolumeMounts for the airflow Pods
+ ## - spec for VolumeMount:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volumemount-v1-core
+ ##
+ extraVolumeMounts: []
+
+ ## extra Volumes for the airflow Pods
+ ## - spec for Volume:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volume-v1-core
+ ##
+ extraVolumes: []
+
+ ## kubernetes cluster domain name
+ ## - configured in the kubelet with `--cluster-domain` flag (deprecated):
+ ## https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
+ ## - or configured in the kubelet with configuration file `clusterDomain` option:
+ ## https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/
+ ##
+ clusterDomain: "cluster.local"
+
+ ########################################
+ ## FILE | airflow_local_settings.py
+ ########################################
+ ##
+ localSettings:
+ ## the full content of the `airflow_local_settings.py` file (as a string)
+ ## - docs for airflow cluster policies:
+ ## https://airflow.apache.org/docs/apache-airflow/stable/concepts/cluster-policies.html
+ ##
+ ## ____ EXAMPLE _______________
+ ## stringOverride: |
+ ## # use a custom `xcom_sidecar` image for KubernetesPodOperator()
+ ## from airflow.kubernetes.pod_generator import PodDefaults
+ ## PodDefaults.SIDECAR_CONTAINER.image = "gcr.io/PROJECT-ID/custom-sidecar-image"
+ ##
+ stringOverride: ""
+
+ ## the name of a Secret containing a `airflow_local_settings.py` key
+ ## - if set, this disables `airflow.localSettings.stringOverride`
+ ##
+ existingSecret: ""
+
+ ########################################
+ ## FILE | pod_template.yaml
+ ########################################
+ ## - generates a file for `AIRFLOW__KUBERNETES__POD_TEMPLATE_FILE`
+ ## - the `dags.gitSync` values will create a git-sync init-container in the pod
+ ## - the `airflow.extraPipPackages` will NOT be installed
+ ##
+ kubernetesPodTemplate:
+ ## the full content of the pod-template file (as a string)
+ ## - [WARNING] all other `kubernetesPodTemplate.*` are disabled when this is set
+ ## - docs for pod-template file:
+ ## https://airflow.apache.org/docs/apache-airflow/stable/executor/kubernetes.html#pod-template-file
+ ##
+ ## ____ EXAMPLE _______________
+ ## stringOverride: |-
+ ## apiVersion: v1
+ ## kind: Pod
+ ## spec: ...
+ ##
+ stringOverride: ""
+
+ ## resource requests/limits for the Pod template "base" container
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the Pod template
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the Pod template
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the Pod template
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## labels for the Pod template
+ ##
+ podLabels: {}
+
+ ## annotations for the Pod template
+ ##
+ podAnnotations: {}
+
+ ## the security context for the Pod template
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## the shareProcessNamespace config for the Pod template
+ ## - docs for shareProcessNamespace:
+ ## https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
+ ##
+ shareProcessNamespace: false
+
+ ## extra pip packages to install in the Pod template
+ ##
+ ## ____ EXAMPLE _______________
+ ## extraPipPackages:
+ ## - "SomeProject==1.0.0"
+ ##
+ extraPipPackages: []
+
+ ## extra containers for the pod template
+ ## - spec for Container:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#container-v1-core
+ ##
+ extraContainers: []
+
+ ## extra init-containers for the Pod template
+ ## - spec of Container:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#container-v1-core
+ ##
+ extraInitContainers: []
+
+ ## extra VolumeMounts for the Pod template
+ ## - spec for VolumeMount:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volumemount-v1-core
+ ##
+ extraVolumeMounts: []
+
+ ## extra Volumes for the Pod template
+ ## - spec for Volume:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volume-v1-core
+ ##
+ extraVolumes: []
+
+ ########################################
+ ## COMPONENT | db-migrations Deployment
+ ########################################
+ dbMigrations:
+ ## if the db-migrations Deployment/Job is created
+ ## - [WARNING] if `false`, you have to MANUALLY run `airflow db upgrade` when required
+ ##
+ enabled: true
+
+ ## if a post-install helm Job should be used (instead of a Deployment)
+ ## - [WARNING] setting `true` will NOT work with the helm `--wait` flag,
+ ## this is because post-install helm Jobs run AFTER the main resources become Ready,
+ ## which will cause a deadlock, as other resources require db-migrations to become Ready
+ ##
+ runAsJob: false
+
+ ## resource requests/limits for the db-migrations Pods
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the db-migrations Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the db-migrations Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the db-migrations Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## the security context for the db-migrations Pods
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## Labels for the db-migrations Deployment
+ ##
+ labels: {}
+
+ ## Pod labels for the db-migrations Deployment
+ ##
+ podLabels: {}
+
+ ## annotations for the db-migrations Deployment/Job
+ ##
+ annotations: {}
+
+ ## Pod annotations for the db-migrations Deployment/Job
+ ##
+ podAnnotations: {}
+
+ ## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+ ##
+ safeToEvict: true
+
+ ## the number of seconds between checks for unapplied db migrations
+ ## - only applies if `airflow.dbMigrations.runAsJob` is `false`
+ ##
+ checkInterval: 300
+
+ ########################################
+ ## COMPONENT | Sync Deployments
+ ########################################
+ ## - used by the Deployments/Jobs used by `airflow.{connections,pools,users,variables}`
+ ##
+ sync:
+ ## resource requests/limits for the sync Pods
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the sync Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the sync Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the sync Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## the security context for the sync Pods
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## Labels for the sync Deployments/Jobs
+ ##
+ labels: {}
+
+ ## Pod labels for the sync Deployments/Jobs
+ ##
+ podLabels: {}
+
+ ## annotations for the sync Deployments/Jobs
+ ##
+ annotations: {}
+
+ ## Pod annotations for the sync Deployments/Jobs
+ ##
+ podAnnotations: {}
+
+ ## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+ ##
+ safeToEvict: true
+
+###################################
+## COMPONENT | Airflow Scheduler
+###################################
+scheduler:
+ ## the number of scheduler Pods to run
+ ## - if you set this >1 we recommend defining a `scheduler.podDisruptionBudget`
+ ##
+ replicas: 1
+
+ ## resource requests/limits for the scheduler Pod
+ ## - spec of ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the scheduler Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the scheduler Pods
+ ## - spec of Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the scheduler Pods
+ ## - spec of Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## the security context for the scheduler Pods
+ ## - spec of PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## labels for the scheduler Deployment
+ ##
+ labels: {}
+
+ ## Pod labels for the scheduler Deployment
+ ##
+ podLabels: {}
+
+ ## annotations for the scheduler Deployment
+ ##
+ annotations: {}
+
+ ## Pod annotations for the scheduler Deployment
+ ##
+ podAnnotations: {}
+
+ ## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+ ##
+ safeToEvict: true
+
+ ## configs for the PodDisruptionBudget of the scheduler
+ ##
+ podDisruptionBudget:
+ ## if a PodDisruptionBudget resource is created for the scheduler
+ ##
+ enabled: false
+
+ ## the `apiVersion` to use for PodDisruptionBudget resources
+ ## - for Kubernetes 1.21 and later: "policy/v1"
+ ## - for Kubernetes 1.20 and before: "policy/v1beta1"
+ ##
+ apiVersion: policy/v1
+
+ ## the maximum unavailable pods/percentage for the scheduler
+ ##
+ maxUnavailable: ""
+
+ ## the minimum available pods/percentage for the scheduler
+ ##
+ minAvailable: ""
+
+ ## configs for the log-cleanup sidecar of the scheduler
+ ## - helps prevent excessive log buildup by regularly deleting old files
+ ##
+ logCleanup:
+ ## if the log-cleanup sidecar is enabled
+ ## - [WARNING] must be disabled if `logs.persistence.enabled` is `true`
+ ##
+ enabled: true
+
+ ## resource requests/limits for the log-cleanup container
+ ## - spec of ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the number of minutes to retain log files (by last-modified time)
+ ##
+ retentionMinutes: 21600
+
+ ## the number of seconds between each check for files to delete
+ ##
+ intervalSeconds: 900
+
+ ## sets `airflow --num_runs` parameter used to run the airflow scheduler
+ ##
+ numRuns: -1
+
+ ## configs for the scheduler Pods' liveness probe
+ ## - "unhealthy" means the SchedulerJob has not had a heartbeat for
+ ## AIRFLOW__SCHEDULER__SCHEDULER_HEALTH_CHECK_THRESHOLD seconds
+ ## - `periodSeconds` x `failureThreshold` = max seconds a scheduler can be in an "unhealthy" state
+ ##
+ livenessProbe:
+ enabled: true
+ initialDelaySeconds: 10
+ periodSeconds: 30
+ timeoutSeconds: 60
+ failureThreshold: 5
+
+ ## configs for an additional check that ensures tasks are being created by the scheduler
+ ## - this check works by ensuring that the most recent LocalTaskJob had a `start_date` no more than
+ ## `taskCreationCheck.thresholdSeconds` seconds ago
+ ## - this check is useful because the scheduler can deadlock with a heartbeat, but not be scheduling new tasks:
+ ## https://github.com/apache/airflow/issues/7935 - patched in airflow `2.0.2`
+ ## https://github.com/apache/airflow/issues/15938 - patched in airflow `2.1.1`
+ ##
+ taskCreationCheck:
+ ## if the task creation check is enabled
+ ##
+ enabled: false
+
+ ## the maximum number of seconds since the start_date of the most recent LocalTaskJob
+ ## - [WARNING] must be AT LEAST equal to your shortest DAG schedule_interval
+ ## - [WARNING] DummyOperator tasks will NOT be seen by this probe
+ ##
+ thresholdSeconds: 300
+
+ ## minimum number of seconds the scheduler must have run before the task creation check begins
+ ## - [WARNING] must be long enough for the scheduler to boot and create a task
+ ##
+ schedulerAgeBeforeCheck: 180
+
+ ## extra pip packages to install in the scheduler Pods
+ ##
+ ## ____ EXAMPLE _______________
+ ## extraPipPackages:
+ ## - "SomeProject==1.0.0"
+ ##
+ extraPipPackages: []
+
+ ## extra VolumeMounts for the scheduler Pods
+ ## - spec of VolumeMount:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volumemount-v1-core
+ ##
+ extraVolumeMounts: []
+
+ ## extra Volumes for the scheduler Pods
+ ## - spec of Volume:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volume-v1-core
+ ##
+ extraVolumes: []
+
+ ## extra init containers to run in the scheduler Pods
+ ## - spec of Container:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#container-v1-core
+ ##
+ extraInitContainers: []
+
+###################################
+## COMPONENT | Airflow Webserver
+###################################
+web:
+ ########################################
+ ## FILE | webserver_config.py
+ ########################################
+ ##
+ webserverConfig:
+ ## if the `webserver_config.py` file is mounted
+ ## - set to false if you wish to mount your own `webserver_config.py` file
+ ##
+ enabled: true
+
+ ## the full content of the `webserver_config.py` file (as a string)
+ ## - docs for Flask-AppBuilder security configs:
+ ## https://flask-appbuilder.readthedocs.io/en/latest/security.html
+ ##
+ ## ____ EXAMPLE _______________
+ ## stringOverride: |
+ ## from airflow import configuration as conf
+ ## from flask_appbuilder.security.manager import AUTH_DB
+ ##
+ ## # the SQLAlchemy connection string
+ ## SQLALCHEMY_DATABASE_URI = conf.get('core', 'SQL_ALCHEMY_CONN')
+ ##
+ ## # use embedded DB for auth
+ ## AUTH_TYPE = AUTH_DB
+ ##
+ stringOverride: |
+ import os
+ from typing import Any, Union
+
+ from airflow.www.security import AirflowSecurityManager
+ from flask_appbuilder.security.manager import AUTH_OAUTH
+
+
+ class KeycloakAuthorizer(AirflowSecurityManager):
+ def get_oauth_user_info(
+ self, provider: str, resp: Any
+ ) -> dict[str, Union[str, list[str]]]:
+ me = self.appbuilder.sm.oauth_remotes[provider].get("openid-connect/userinfo")
+ me.raise_for_status()
+ data = me.json()
+ payload = {
+ "first_name": data.get("given_name", ""),
+ "last_name": data.get("family_name", ""),
+ "email": data.get("email", ""),
+ "name": data.get("name", ""),
+ "username": data.get("preferred_username", ""),
+ "role_keys": data.get("roles", []),
+ }
+ print(payload)
+ return payload
+
+
+ AUTH_TYPE = AUTH_OAUTH
+
+ AUTH_ROLES_MAPPING = {
+ "admin": ["Admin"],
+ "public": ["Public"],
+ "viewer": ["Viewer"],
+ "user": ["User"],
+ "op": ["Op"],
+ }
+
+ AUTH_ROLES_SYNC_AT_LOGIN = True
+ AUTH_USER_REGISTRATION = True
+
+ OAUTH_PROVIDERS = [
+ {
+ "name": "keycloak",
+ "icon": "fa-key",
+ "token_key": "access_token",
+ "remote_app": {
+ "api_base_url": os.environ["AUTH_KEYCLOAK_API_BASE_URL"],
+ "client_kwargs": {"scope": os.environ["AUTH_KEYCLOAK_SCOPE"]},
+ "request_token_url": None,
+ "access_token_url": os.environ["AUTH_KEYCLOAK_ACCESS_TOKEN_URL"],
+ "authorize_url": os.environ["AUTH_KEYCLOAK_AUTHORIZE_URL"],
+ "jwks_uri": os.environ["AUTH_KEYCLOAK_JWKS_URL"],
+ "client_id": os.environ["AUTH_KEYCLOAK_CLIENT_ID"],
+ "client_secret": os.environ["AUTH_KEYCLOAK_CLIENT_SECRET"],
+ "airflow_base_url": os.environ["AUTH_KEYCLOAK_AIRFLOW_BASE_URL"],
+ },
+ }
+ ]
+
+ SECURITY_MANAGER_CLASS = KeycloakAuthorizer
+
+## the name of a Secret containing a `webserver_config.py` key
+##
+existingSecret: ""
+
+## the number of web Pods to run
+## - if you set this >1 we recommend defining a `web.podDisruptionBudget`
+##
+replicas: 1
+
+## resource requests/limits for the web Pod
+## - spec for ResourceRequirements:
+## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+##
+resources: {}
+
+## the nodeSelector configs for the web Pods
+## - docs for nodeSelector:
+## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+##
+nodeSelector: {}
+
+## the affinity configs for the web Pods
+## - spec for Affinity:
+## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+##
+affinity: {}
+
+## the toleration configs for the web Pods
+## - spec for Toleration:
+## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+##
+tolerations: []
+
+## the security context for the web Pods
+## - spec for PodSecurityContext:
+## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+##
+securityContext: {}
+
+## labels for the web Deployment
+##
+labels: {}
+
+## Pod labels for the web Deployment
+##
+podLabels: {}
+
+## annotations for the web Deployment
+##
+annotations: {}
+
+## Pod annotations for the web Deployment
+##
+podAnnotations: {}
+
+## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+##
+safeToEvict: true
+
+## configs for the PodDisruptionBudget of the web Deployment
+##
+podDisruptionBudget:
+ ## if a PodDisruptionBudget resource is created for the web Deployment
+ ##
+ enabled: false
+
+ ## the `apiVersion` to use for PodDisruptionBudget resources
+ ## - for Kubernetes 1.21 and later: "policy/v1"
+ ## - for Kubernetes 1.20 and before: "policy/v1beta1"
+ ##
+ apiVersion: policy/v1
+
+ ## the maximum unavailable pods/percentage for the web Deployment
+ ##
+ maxUnavailable: ""
+
+ ## the minimum available pods/percentage for the web Deployment
+ ##
+ minAvailable: ""
+
+## configs for the Service of the web Pods
+##
+service:
+ annotations: {}
+ sessionAffinity: "None"
+ sessionAffinityConfig: {}
+ type: ClusterIP
+ externalPort: 8080
+ loadBalancerIP: ""
+ loadBalancerSourceRanges: []
+ nodePort:
+ http: ""
+
+## configs for the web Pods' readiness probe
+##
+readinessProbe:
+ enabled: true
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ timeoutSeconds: 5
+ failureThreshold: 6
+
+## configs for the web Pods' liveness probe
+##
+livenessProbe:
+ enabled: true
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ timeoutSeconds: 5
+ failureThreshold: 6
+
+## extra pip packages to install in the web Pods
+##
+## ____ EXAMPLE _______________
+## extraPipPackages:
+## - "SomeProject==1.0.0"
+##
+extraPipPackages: []
+
+## extra VolumeMounts for the web Pods
+## - spec for VolumeMount:
+## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volumemount-v1-core
+##
+extraVolumeMounts: []
+
+## extra Volumes for the web Pods
+## - spec for Volume:
+## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volume-v1-core
+##
+extraVolumes: []
+
+###################################
+## COMPONENT | Airflow Workers
+###################################
+workers:
+ ## if the airflow workers StatefulSet should be deployed
+ ##
+ enabled: false
+
+ ## the number of worker Pods to run
+ ## - if you set this >1 we recommend defining a `workers.podDisruptionBudget`
+ ## - this is the minimum when `workers.autoscaling.enabled` is true
+ ##
+ replicas: 1
+
+ ## resource requests/limits for the worker Pod
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the worker Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the worker Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the worker Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## the security context for the worker Pods
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## labels for the worker StatefulSet
+ ##
+ labels: {}
+
+ ## Pod labels for the worker StatefulSet
+ ##
+ podLabels: {}
+
+ ## annotations for the worker StatefulSet
+ ##
+ annotations: {}
+
+ ## Pod annotations for the worker StatefulSet
+ ##
+ podAnnotations: {}
+
+ ## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+ ##
+ safeToEvict: true
+
+ ## configs for the PodDisruptionBudget of the worker StatefulSet
+ ##
+ podDisruptionBudget:
+ ## if a PodDisruptionBudget resource is created for the worker StatefulSet
+ ##
+ enabled: false
+
+ ## the `apiVersion` to use for PodDisruptionBudget resources
+ ## - for Kubernetes 1.21 and later: "policy/v1"
+ ## - for Kubernetes 1.20 and before: "policy/v1beta1"
+ ##
+ apiVersion: policy/v1
+
+ ## the maximum unavailable pods/percentage for the worker StatefulSet
+ ##
+ maxUnavailable: ""
+
+ ## the minimum available pods/percentage for the worker StatefulSet
+ ##
+ minAvailable: ""
+
+ ## configs for the HorizontalPodAutoscaler of the worker Pods
+ ## - [WARNING] if using git-sync, ensure `dags.gitSync.resources` is set
+ ## - [WARNING] if using worker log-cleanup, ensure `workers.logCleanup.resources` is set
+ ##
+ ## ____ EXAMPLE _______________
+ ## autoscaling:
+ ## enabled: true
+ ## maxReplicas: 16
+ ## metrics:
+ ## - type: Resource
+ ## resource:
+ ## name: memory
+ ## target:
+ ## type: Utilization
+ ## averageUtilization: 80
+ ##
+ autoscaling:
+ enabled: false
+ maxReplicas: 2
+ metrics: []
+
+ ## the `apiVersion` to use for HorizontalPodAutoscaler resources
+ ## - for Kubernetes 1.23 and later: "autoscaling/v2"
+ ## - for Kubernetes 1.22 and before: "autoscaling/v2beta2"
+ ##
+ apiVersion: autoscaling/v2
+
+ ## configs for the celery worker Pods
+ ##
+ celery:
+ ## if celery worker Pods are gracefully terminated
+ ## - consider defining a `workers.podDisruptionBudget` to prevent there not being
+ ## enough available workers during graceful termination waiting periods
+ ##
+ ## graceful termination process:
+ ## 1. prevent worker accepting new tasks
+ ## 2. wait AT MOST `workers.celery.gracefullTerminationPeriod` for tasks to finish
+ ## 3. send SIGTERM to worker
+ ## 4. wait AT MOST `workers.terminationPeriod` for kill to finish
+ ## 5. send SIGKILL to worker
+ ##
+ gracefullTermination: false
+
+ ## how many seconds to wait for tasks to finish before SIGTERM of the celery worker
+ ##
+ gracefullTerminationPeriod: 600
+
+ ## how many seconds to wait after SIGTERM before SIGKILL of the celery worker
+ ## - [WARNING] tasks that are still running during SIGKILL will be orphaned, this is important
+ ## to understand with KubernetesPodOperator(), as Pods may continue running
+ ##
+ terminationPeriod: 60
+
+ ## configs for the log-cleanup sidecar of the worker Pods
+ ## - helps prevent excessive log buildup by regularly deleting old files
+ ##
+ logCleanup:
+ ## if the log-cleanup sidecar is enabled
+ ## - [WARNING] must be disabled if `logs.persistence.enabled` is `true`
+ ##
+ enabled: true
+
+ ## resource requests/limits for the log-cleanup container
+ ## - spec of ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the number of minutes to retain log files (by last-modified time)
+ ##
+ retentionMinutes: 21600
+
+ ## the number of seconds between each check for files to delete
+ ##
+ intervalSeconds: 900
+
+ ## configs for the worker Pods' liveness probe
+ ##
+ livenessProbe:
+ enabled: true
+ initialDelaySeconds: 10
+ periodSeconds: 30
+ timeoutSeconds: 60
+ failureThreshold: 5
+
+ ## extra pip packages to install in the worker Pod
+ ##
+ ## ____ EXAMPLE _______________
+ ## extraPipPackages:
+ ## - "SomeProject==1.0.0"
+ ##
+ extraPipPackages: []
+
+ ## extra VolumeMounts for the worker Pods
+ ## - spec for VolumeMount:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volumemount-v1-core
+ ##
+ extraVolumeMounts: []
+
+ ## extra Volumes for the worker Pods
+ ## - spec for Volume:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volume-v1-core
+ ##
+ extraVolumes: []
+
+###################################
+## COMPONENT | Triggerer
+###################################
+triggerer:
+ ## if the airflow triggerer should be deployed
+ ## - [WARNING] the triggerer component was added in airflow 2.2.0
+ ## - [WARNING] if `airflow.legacyCommands` is `true` the triggerer will NOT be deployed
+ ##
+ enabled: true
+
+ ## the number of triggerer Pods to run
+ ## - if you set this >1 we recommend defining a `triggerer.podDisruptionBudget`
+ ##
+ replicas: 1
+
+ ## resource requests/limits for the triggerer Pods
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the triggerer Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the triggerer Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the triggerer Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## the security context for the triggerer Pods
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## labels for the triggerer Deployment
+ ##
+ labels: {}
+
+ ## Pod labels for the triggerer Deployment
+ ##
+ podLabels: {}
+
+ ## annotations for the triggerer Deployment
+ ##
+ annotations: {}
+
+ ## Pod annotations for the triggerer Deployment
+ ##
+ podAnnotations: {}
+
+ ## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+ ##
+ safeToEvict: true
+
+ ## configs for the PodDisruptionBudget of the triggerer Deployment
+ ##
+ podDisruptionBudget:
+ ## if a PodDisruptionBudget resource is created for the triggerer Deployment
+ ##
+ enabled: false
+
+ ## the `apiVersion` to use for PodDisruptionBudget resources
+ ## - for Kubernetes 1.21 and later: "policy/v1"
+ ## - for Kubernetes 1.20 and before: "policy/v1beta1"
+ ##
+ apiVersion: policy/v1
+
+ ## the maximum unavailable pods/percentage for the triggerer Deployment
+ ##
+ maxUnavailable: ""
+
+ ## the minimum available pods/percentage for the triggerer Deployment
+ ##
+ minAvailable: ""
+
+ ## maximum number of triggers each triggerer will run at once (sets `AIRFLOW__TRIGGERER__DEFAULT_CAPACITY`)
+ ##
+ capacity: 1000
+
+ ## configs for the triggerer Pods' liveness probe
+ ##
+ livenessProbe:
+ enabled: true
+ initialDelaySeconds: 10
+ periodSeconds: 30
+ timeoutSeconds: 60
+ failureThreshold: 5
+
+ ## extra pip packages to install in the triggerer Pod
+ ##
+ ## ____ EXAMPLE _______________
+ ## extraPipPackages:
+ ## - "SomeProject==1.0.0"
+ ##
+ extraPipPackages: []
+
+ ## extra VolumeMounts for the triggerer Pods
+ ## - spec for VolumeMount:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volumemount-v1-core
+ ##
+ extraVolumeMounts: []
+
+ ## extra Volumes for the triggerer Pods
+ ## - spec for Volume:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volume-v1-core
+ ##
+ extraVolumes: []
+
+###################################
+## COMPONENT | Flower
+###################################
+flower:
+ ## if the airflow flower UI should be deployed
+ ##
+ enabled: false
+
+ ## the number of flower Pods to run
+ ## - if you set this >1 we recommend defining a `flower.podDisruptionBudget`
+ ##
+ replicas: 1
+
+ ## resource requests/limits for the flower Pod
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the flower Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the flower Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the flower Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## the security context for the flower Pods
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## labels for the flower Deployment
+ ##
+ labels: {}
+
+ ## Pod labels for the flower Deployment
+ ##
+ podLabels: {}
+
+ ## annotations for the flower Deployment
+ ##
+ annotations: {}
+
+ ## Pod annotations for the flower Deployment
+ ##
+ podAnnotations: {}
+
+ ## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+ ##
+ safeToEvict: true
+
+ ## configs for the PodDisruptionBudget of the flower Deployment
+ ##
+ podDisruptionBudget:
+ ## if a PodDisruptionBudget resource is created for the flower Deployment
+ ##
+ enabled: false
+
+ ## the `apiVersion` to use for PodDisruptionBudget resources
+ ## - for Kubernetes 1.21 and later: "policy/v1"
+ ## - for Kubernetes 1.20 and before: "policy/v1beta1"
+ ##
+ apiVersion: policy/v1
+
+ ## the maximum unavailable pods/percentage for the flower Deployment
+ ##
+ maxUnavailable: ""
+
+ ## the minimum available pods/percentage for the flower Deployment
+ ##
+ minAvailable: ""
+
+ ## the name of a pre-created secret containing the basic authentication value for flower
+ ## - this will override any value of `config.AIRFLOW__CELERY__FLOWER_BASIC_AUTH`
+ ##
+ basicAuthSecret: ""
+
+ ## the key within `flower.basicAuthSecret` containing the basic authentication string
+ ##
+ basicAuthSecretKey: ""
+
+ ## configs for the Service of the flower Pods
+ ##
+ service:
+ annotations: {}
+ type: ClusterIP
+ externalPort: 5555
+ loadBalancerIP: ""
+ loadBalancerSourceRanges: []
+ nodePort:
+ http:
+
+ ## configs for the flower Pods' readinessProbe probe
+ ##
+ readinessProbe:
+ enabled: true
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ timeoutSeconds: 5
+ failureThreshold: 6
+
+ ## configs for the flower Pods' liveness probe
+ ##
+ livenessProbe:
+ enabled: true
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ timeoutSeconds: 5
+ failureThreshold: 6
+
+ ## extra pip packages to install in the flower Pod
+ ##
+ ## ____ EXAMPLE _______________
+ ## extraPipPackages:
+ ## - "SomeProject==1.0.0"
+ ##
+ extraPipPackages: []
+
+ ## extra VolumeMounts for the flower Pods
+ ## - spec for VolumeMount:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volumemount-v1-core
+ ##
+ extraVolumeMounts: []
+
+ ## extra Volumes for the flower Pods
+ ## - spec for Volume:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#volume-v1-core
+ ##
+ extraVolumes: []
+
+###################################
+## CONFIG | Airflow Logs
+###################################
+logs:
+ ## the airflow logs folder
+ ##
+ path: /opt/airflow/logs
+
+ ## configs for the logs PVC
+ ##
+ persistence:
+ ## if a persistent volume is mounted at `logs.path`
+ ##
+ enabled: false
+
+ ## the name of an existing PVC to use
+ ##
+ existingClaim: ""
+
+ ## sub-path under `logs.persistence.existingClaim` to use
+ ##
+ subPath: ""
+
+ ## the name of the StorageClass used by the PVC
+ ## - if set to "", then `PersistentVolumeClaim/spec.storageClassName` is omitted
+ ## - if set to "-", then `PersistentVolumeClaim/spec.storageClassName` is set to ""
+ ##
+ storageClass: ""
+
+ ## the access mode of the PVC
+ ## - [WARNING] must be "ReadWriteMany" or airflow pods will fail to start
+ ##
+ accessMode: ReadWriteMany
+
+ ## the size of PVC to request
+ ##
+ size: 1Gi
+
+###################################
+## CONFIG | Airflow DAGs
+###################################
+dags:
+ ## the airflow dags folder
+ ##
+ path: /opt/airflow/dags
+
+ ## configs for the dags PVC
+ ##
+ persistence:
+ ## if a persistent volume is mounted at `dags.path`
+ ##
+ enabled: false
+
+ ## the name of an existing PVC to use
+ ##
+ existingClaim: ""
+
+ ## sub-path under `dags.persistence.existingClaim` to use
+ ##
+ subPath: ""
+
+ ## the name of the StorageClass used by the PVC
+ ## - if set to "", then `PersistentVolumeClaim/spec.storageClassName` is omitted
+ ## - if set to "-", then `PersistentVolumeClaim/spec.storageClassName` is set to ""
+ ##
+ storageClass: ""
+
+ ## the access mode of the PVC
+ ## - [WARNING] must be "ReadOnlyMany" or "ReadWriteMany" otherwise airflow pods will fail to start
+ ##
+ accessMode: ReadOnlyMany
+
+ ## the size of PVC to request
+ ##
+ size: 1Gi
+
+ ## configs for the git-sync sidecar (https://github.com/kubernetes/git-sync)
+ ##
+ gitSync:
+ ## if the git-sync sidecar container is enabled
+ ##
+ enabled: false
+
+ ## the git-sync container image
+ ##
+ image:
+ repository: registry.k8s.io/git-sync/git-sync
+ tag: v3.6.5
+ pullPolicy: IfNotPresent
+ uid: 65533
+ gid: 65533
+
+ ## resource requests/limits for the git-sync container
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the url of the git repo
+ ##
+ ## ____ EXAMPLE _______________
+ ## # https git repo
+ ## repo: "https://github.com/USERNAME/REPOSITORY.git"
+ ##
+ ## ____ EXAMPLE _______________
+ ## # ssh git repo
+ ## repo: "git@github.com:USERNAME/REPOSITORY.git"
+ ##
+ repo: "https://github.com/DeepPharmGraph/dpg-processing-dags"
+
+ ## the sub-path within your repo where dags are located
+ ## - only dags under this path within your repo will be seen by airflow,
+ ## (note, the full repo will still be cloned)
+ ##
+ repoSubPath: "dags"
+
+ ## the git branch to check out
+ ##
+ branch: forging.cc
+
+ ## the git revision (tag or hash) to check out
+ ##
+ revision: HEAD
+
+ ## shallow clone with a history truncated to the specified number of commits
+ ##
+ depth: 1
+
+ ## the number of seconds between syncs
+ ##
+ syncWait: 60
+
+ ## the max number of seconds allowed for a complete sync
+ ##
+ syncTimeout: 120
+
+ ## the git submodule behavior
+ ## - allowed values: "recursive", "shallow", "off"
+ ##
+ submodules: recursive
+
+ ## the name of a pre-created Secret with git http credentials
+ ##
+ httpSecret: ""
+
+ ## the key in `dags.gitSync.httpSecret` with your git username
+ ##
+ httpSecretUsernameKey: username
+
+ ## the key in `dags.gitSync.httpSecret` with your git password/token
+ ##
+ httpSecretPasswordKey: password
+
+ ## the name of a pre-created Secret with git ssh credentials
+ ##
+ sshSecret: ""
+
+ ## the key in `dags.gitSync.sshSecret` with your ssh-key file
+ ##
+ sshSecretKey: id_rsa
+
+ ## the string value of a "known_hosts" file (for SSH only)
+ ## - [WARNING] known_hosts verification will be disabled if left empty, making you more
+ ## vulnerable to repo spoofing attacks
+ ##
+ ## ____ EXAMPLE _______________
+ ## sshKnownHosts: |-
+ ## ssh-rsa
+ ##
+ sshKnownHosts: ""
+
+ ## the number of consecutive failures allowed before aborting
+ ## - the first sync must succeed
+ ## - a value of -1 will retry forever after the initial sync
+ ##
+ maxFailures: 0
+
+###################################
+## CONFIG | Kubernetes Ingress
+###################################
+ingress:
+ ## if we should deploy Ingress resources
+ ##
+ enabled: false
+
+ ## the `apiVersion` to use for Ingress resources
+ ## - for Kubernetes 1.19 and later: "networking.k8s.io/v1"
+ ## - for Kubernetes 1.18 and before: "networking.k8s.io/v1beta1"
+ ##
+ apiVersion: networking.k8s.io/v1
+
+ ## configs for the Ingress of the web Service
+ ##
+ web:
+ ## annotations for the web Ingress
+ ##
+ annotations: {}
+
+ ## additional labels for the web Ingress
+ ##
+ labels: {}
+
+ ## the path for the web Ingress
+ ## - [WARNING] do NOT include the trailing slash (for root, set an empty string)
+ ##
+ ## ____ EXAMPLE _______________
+ ## # webserver URL: http://example.com/airflow
+ ## path: "/airflow"
+ ##
+ path: ""
+
+ ## the hostname for the web Ingress
+ ##
+ host: ""
+
+ ## the Ingress Class for the web Ingress
+ ## - [WARNING] requires Kubernetes 1.18 or later, use "kubernetes.io/ingress.class" annotation for older versions
+ ##
+ ingressClassName: ""
+
+ ## configs for web Ingress TLS
+ ##
+ tls:
+ ## enable TLS termination for the web Ingress
+ ##
+ enabled: false
+
+ ## the name of a pre-created Secret containing a TLS private key and certificate
+ ##
+ secretName: ""
+
+ ## http paths to add to the web Ingress before the default path
+ ##
+ ## ____ EXAMPLE _______________
+ ## precedingPaths:
+ ## - path: "/*"
+ ## serviceName: "my-service"
+ ## servicePort: "port-name"
+ ##
+ precedingPaths: []
+
+ ## http paths to add to the web Ingress after the default path
+ ##
+ ## ____ EXAMPLE _______________
+ ## succeedingPaths:
+ ## - path: "/extra-service"
+ ## serviceName: "my-service"
+ ## servicePort: "port-name"
+ ##
+ succeedingPaths: []
+
+ ## configs for the Ingress of the flower Service
+ ##
+ flower:
+ ## annotations for the flower Ingress
+ ##
+ annotations: {}
+
+ ## additional labels for the flower Ingress
+ ##
+ labels: {}
+
+ ## the path for the flower Ingress
+ ## - [WARNING] do NOT include the trailing slash (for root, set an empty string)
+ ##
+ ## ____ EXAMPLE _______________
+ ## # flower URL: http://example.com/airflow/flower
+ ## path: "/airflow/flower"
+ ##
+ path: ""
+
+ ## the hostname for the flower Ingress
+ ##
+ host: ""
+
+ ## the Ingress Class for the flower Ingress
+ ## - [WARNING] requires Kubernetes 1.18 or later, use "kubernetes.io/ingress.class" annotation for older versions
+ ##
+ ingressClassName: ""
+
+ ## configs for flower Ingress TLS
+ ##
+ tls:
+ ## enable TLS termination for the flower Ingress
+ ##
+ enabled: false
+
+ ## the name of a pre-created Secret containing a TLS private key and certificate
+ ##
+ secretName: ""
+
+ ## http paths to add to the flower Ingress before the default path
+ ##
+ ## ____ EXAMPLE _______________
+ ## precedingPaths:
+ ## - path: "/*"
+ ## serviceName: "my-service"
+ ## servicePort: "port-name"
+ ##
+ precedingPaths: []
+
+ ## http paths to add to the flower Ingress after the default path
+ ##
+ ## ____ EXAMPLE _______________
+ ## succeedingPaths:
+ ## - path: "/extra-service"
+ ## serviceName: "my-service"
+ ## servicePort: "port-name"
+ ##
+ succeedingPaths: []
+
+###################################
+## CONFIG | Kubernetes RBAC
+###################################
+rbac:
+ ## if Kubernetes RBAC resources are created
+ ## - these allow the service account to create/delete Pods in the airflow namespace,
+ ## which is required for the KubernetesPodOperator() to function
+ ##
+ create: true
+
+ ## if the created RBAC Role has GET/LIST on Event resources
+ ## - this is needed for KubernetesPodOperator() to use `log_events_on_failure=True`
+ ##
+ events: true
+
+###################################
+## CONFIG | Kubernetes ServiceAccount
+###################################
+serviceAccount:
+ ## if a Kubernetes ServiceAccount is created
+ ## - if `false`, you must create the service account outside this chart with name: `serviceAccount.name`
+ ##
+ create: true
+
+ ## the name of the ServiceAccount
+ ## - by default the name is generated using the `airflow.serviceAccountName` template in `_helpers/common.tpl`
+ ##
+ name: ""
+
+ ## annotations for the ServiceAccount
+ ##
+ ## ____ EXAMPLE _______________
+ ## # EKS - IAM Roles for Service Accounts
+ ## annotations:
+ ## eks.amazonaws.com/role-arn: "arn:aws:iam::XXXXXXXXXX:role/<>"
+ ##
+ ## ____ EXAMPLE _______________
+ ## # GKE - WorkloadIdentity
+ ## annotations:
+ ## iam.gke.io/gcp-service-account: "<>@<>.iam.gserviceaccount.com"
+ ##
+ annotations: {}
+
+###################################
+## CONFIG | Kubernetes Extra Manifests
+###################################
+## a list of extra Kubernetes manifests that will be deployed alongside the chart
+## - helm templates within these strings will be rendered
+##
+## ____ EXAMPLE _______________
+## extraManifests:
+## - |
+## apiVersion: v1
+## kind: Secret
+## metadata:
+## name: airflow-postgres
+## data:
+## postgresql-password: {{ `password1` | b64enc | quote }}
+## - |
+## apiVersion: apps/v1
+## kind: Deployment
+## metadata:
+## name: {{ include "airflow.fullname" . }}-busybox
+## labels:
+## app: {{ include "airflow.labels.app" . }}
+## component: busybox
+## chart: {{ include "airflow.labels.chart" . }}
+## release: {{ .Release.Name }}
+## heritage: {{ .Release.Service }}
+## spec:
+## replicas: 1
+## selector:
+## matchLabels:
+## app: {{ include "airflow.labels.app" . }}
+## component: busybox
+## release: {{ .Release.Name }}
+## template:
+## metadata:
+## labels:
+## app: {{ include "airflow.labels.app" . }}
+## component: busybox
+## release: {{ .Release.Name }}
+## spec:
+## containers:
+## - name: busybox
+## image: busybox:1.35
+## command:
+## - "/bin/sh"
+## - "-c"
+## args:
+## - |
+## ## to break the infinite loop when we receive SIGTERM
+## trap "exit 0" SIGTERM;
+## ## keep the container running (so people can `kubectl exec -it` into it)
+## while true; do
+## echo "I am alive...";
+## sleep 30;
+## done
+##
+extraManifests: []
+
+###################################
+## DATABASE | PgBouncer
+###################################
+pgbouncer:
+ ## if the pgbouncer Deployment is created
+ ##
+ enabled: true
+
+ ## configs for the pgbouncer container image
+ ##
+ image:
+ repository: ghcr.io/airflow-helm/pgbouncer
+ tag: 1.18.0-patch.1
+ pullPolicy: IfNotPresent
+ uid: 1001
+ gid: 1001
+
+ ## resource requests/limits for the pgbouncer Pods
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the pgbouncer Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the pgbouncer Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the pgbouncer Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## the security context for the pgbouncer Pods
+ ## - spec for PodSecurityContext:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core
+ ##
+ securityContext: {}
+
+ ## Labels for the pgbouncer Deployment
+ ##
+ labels: {}
+
+ ## Pod labels for the pgbouncer Deployment
+ ##
+ podLabels: {}
+
+ ## annotations for the pgbouncer Deployment
+ ##
+ annotations: {}
+
+ ## Pod annotations for the pgbouncer Deployment
+ ##
+ podAnnotations: {}
+
+ ## if we add the annotation: "cluster-autoscaler.kubernetes.io/safe-to-evict" = "true"
+ ##
+ safeToEvict: true
+
+ ## configs for the PodDisruptionBudget of the pgbouncer Deployment
+ ##
+ podDisruptionBudget:
+ ## if a PodDisruptionBudget resource is created for the pgbouncer Deployment
+ ##
+ enabled: false
+
+ ## the `apiVersion` to use for PodDisruptionBudget resources
+ ## - for Kubernetes 1.21 and later: "policy/v1"
+ ## - for Kubernetes 1.20 and before: "policy/v1beta1"
+ ##
+ apiVersion: policy/v1
+
+ ## the maximum unavailable pods/percentage for the pgbouncer Deployment
+ ##
+ maxUnavailable:
+
+ ## the minimum available pods/percentage for the pgbouncer Deployment
+ ##
+ minAvailable:
+
+ ## configs for the pgbouncer Pods' liveness probe
+ ##
+ livenessProbe:
+ enabled: true
+ initialDelaySeconds: 5
+ periodSeconds: 30
+ timeoutSeconds: 60
+ failureThreshold: 3
+
+ ## configs for the pgbouncer Pods' startup probe
+ ##
+ startupProbe:
+ enabled: true
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ timeoutSeconds: 15
+ failureThreshold: 30
+
+ ## the maximum number of seconds to wait for queries upon pod termination, before force killing
+ ##
+ terminationGracePeriodSeconds: 120
+
+ ## sets pgbouncer config: `auth_type`
+ ##
+ authType: md5
+
+ ## sets pgbouncer config: `max_client_conn`
+ ##
+ maxClientConnections: 1000
+
+ ## sets pgbouncer config: `default_pool_size`
+ ##
+ poolSize: 20
+
+ ## sets pgbouncer config: `log_disconnections`
+ ##
+ logDisconnections: 0
+
+ ## sets pgbouncer config: `log_connections`
+ ##
+ logConnections: 0
+
+ ## ssl configs for: clients -> pgbouncer
+ ##
+ clientSSL:
+ ## sets pgbouncer config: `client_tls_sslmode`
+ ##
+ mode: prefer
+
+ ## sets pgbouncer config: `client_tls_ciphers`
+ ##
+ ciphers: normal
+
+ ## sets pgbouncer config: `client_tls_ca_file`
+ ##
+ caFile:
+ existingSecret: ""
+ existingSecretKey: root.crt
+
+ ## sets pgbouncer config: `client_tls_key_file`
+ ## - [WARNING] a self-signed cert & key are generated if left empty
+ ##
+ keyFile:
+ existingSecret: ""
+ existingSecretKey: client.key
+
+ ## sets pgbouncer config: `client_tls_cert_file`
+ ## - [WARNING] a self-signed cert & key are generated if left empty
+ ##
+ certFile:
+ existingSecret: ""
+ existingSecretKey: client.crt
+
+ ## ssl configs for: pgbouncer -> postgres
+ ##
+ serverSSL:
+ ## sets pgbouncer config: `server_tls_sslmode`
+ ##
+ mode: prefer
+
+ ## sets pgbouncer config: `server_tls_ciphers`
+ ##
+ ciphers: normal
+
+ ## sets pgbouncer config: `server_tls_ca_file`
+ ##
+ caFile:
+ existingSecret: ""
+ existingSecretKey: root.crt
+
+ ## sets pgbouncer config: `server_tls_key_file`
+ ##
+ keyFile:
+ existingSecret: ""
+ existingSecretKey: server.key
+
+ ## sets pgbouncer config: `server_tls_cert_file`
+ ##
+ certFile:
+ existingSecret: ""
+ existingSecretKey: server.crt
+
+###################################
+## DATABASE | Embedded Postgres
+###################################
+postgresql:
+ ## if the `stable/postgresql` chart is used
+ ## - [WARNING] the embedded Postgres is NOT SUITABLE for production deployments of Airflow
+ ## - [WARNING] consider using an external database with `externalDatabase.*`
+ ## - set to `false` if using `externalDatabase.*`
+ ##
+ enabled: false
+
+ ## configs for the postgres container image
+ ##
+ image:
+ registry: ghcr.io
+ repository: airflow-helm/postgresql-bitnami
+ tag: 11.16-patch.0
+ pullPolicy: IfNotPresent
+
+ ## the postgres database to use
+ ##
+ postgresqlDatabase: airflow
+
+ ## the postgres user to create
+ ##
+ postgresqlUsername: postgres
+
+ ## the postgres user's password
+ ##
+ postgresqlPassword: airflow
+
+ ## the name of a pre-created secret containing the postgres password
+ ##
+ existingSecret: ""
+
+ ## the key within `postgresql.existingSecret` containing the password string
+ ##
+ existingSecretKey: "postgresql-password"
+
+ ## configs for the PVC of postgresql
+ ##
+ persistence:
+ ## if postgres will use Persistent Volume Claims to store data
+ ## - [WARNING] if false, data will be LOST as postgres Pods restart
+ ##
+ enabled: true
+
+ ## the name of the StorageClass used by the PVC
+ ##
+ storageClass: ""
+
+ ## the access modes of the PVC
+ ##
+ accessModes:
+ - ReadWriteOnce
+
+ ## the size of PVC to request
+ ##
+ size: 8Gi
+
+ ## configs for the postgres StatefulSet
+ ##
+ master:
+ ## the nodeSelector configs for the postgres Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the postgres Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the postgres Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## annotations for the postgres Pods
+ ##
+ podAnnotations:
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+
+###################################
+## DATABASE | External Database
+###################################
+externalDatabase:
+ ## the type of external database
+ ## - allowed values: "mysql", "postgres"
+ ##
+ type: postgres
+
+ ## the host of the external database
+ ##
+ host: airflow-postgres-rw
+
+ ## the port of the external database
+ ##
+ port: 5432
+
+ ## the database/scheme to use within the external database
+ ##
+ database: app
+
+ ## the username for the external database
+ ##
+ user: ""
+
+ ## the name of a pre-created secret containing the external database user
+ ## - if set, this overrides `externalDatabase.user`
+ ##
+ userSecret: "airflow-postgres-app"
+
+ ## the key within `externalDatabase.userSecret` containing the user string
+ ##
+ userSecretKey: "user"
+
+ ## the password for the external database
+ ## - [WARNING] to avoid storing the password in plain-text within your values,
+ ## create a Kubernetes secret and use `externalDatabase.passwordSecret`
+ ##
+ password: ""
+
+ ## the name of a pre-created secret containing the external database password
+ ## - if set, this overrides `externalDatabase.password`
+ ##
+ passwordSecret: "airflow-postgres-app"
+
+ ## the key within `externalDatabase.passwordSecret` containing the password string
+ ##
+ passwordSecretKey: "password"
+
+ ## extra connection-string properties for the external database
+ ##
+ ## ____ EXAMPLE _______________
+ ## # require SSL (only for Postgres)
+ ## properties: "?sslmode=require"
+ ##
+ properties: ""
+
+###################################
+## DATABASE | Embedded Redis
+###################################
+redis:
+ ## if the `stable/redis` chart is used
+ ## - set to `false` if `airflow.executor` is `KubernetesExecutor`
+ ## - set to `false` if using `externalRedis.*`
+ ##
+ enabled: false
+
+ ## configs for the redis container image
+ ##
+ image:
+ registry: docker.io
+ repository: bitnami/redis
+ tag: 5.0.14-debian-10-r173
+ pullPolicy: IfNotPresent
+
+ ## the redis password
+ ##
+ password: airflow
+
+ ## the name of a pre-created secret containing the redis password
+ ##
+ existingSecret: ""
+
+ ## the key within `redis.existingSecret` containing the password string
+ ##
+ existingSecretPasswordKey: "redis-password"
+
+ ## configs for redis cluster mode
+ ##
+ cluster:
+ ## if redis runs in cluster mode
+ ##
+ enabled: false
+
+ ## the number of redis slaves
+ ##
+ slaveCount: 1
+
+ ## configs for the redis master StatefulSet
+ ##
+ master:
+ ## resource requests/limits for the redis master Pods
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the redis master Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the redis master Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the redis master Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## annotations for the redis master Pods
+ ##
+ podAnnotations:
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+
+ ## configs for the PVC of the redis master Pods
+ ##
+ persistence:
+ ## use a PVC to persist data
+ ##
+ enabled: false
+
+ ## the name of the StorageClass used by the PVC
+ ##
+ storageClass: ""
+
+ ## the access mode of the PVC
+ ##
+ accessModes:
+ - ReadWriteOnce
+
+ ## the size of PVC to request
+ ##
+ size: 8Gi
+
+ ## configs for the redis slave StatefulSet
+ ## - only used if `redis.cluster.enabled` is `true`
+ ##
+ slave:
+ ## resource requests/limits for the slave Pods
+ ## - spec for ResourceRequirements:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#resourcerequirements-v1-core
+ ##
+ resources: {}
+
+ ## the nodeSelector configs for the redis slave Pods
+ ## - docs for nodeSelector:
+ ## https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
+ ##
+ nodeSelector: {}
+
+ ## the affinity configs for the redis slave Pods
+ ## - spec for Affinity:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#affinity-v1-core
+ ##
+ affinity: {}
+
+ ## the toleration configs for the redis slave Pods
+ ## - spec for Toleration:
+ ## https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#toleration-v1-core
+ ##
+ tolerations: []
+
+ ## annotations for the slave Pods
+ ##
+ podAnnotations:
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+
+ ## configs for the PVC of the redis slave Pods
+ ##
+ persistence:
+ ## use a PVC to persist data
+ ##
+ enabled: false
+
+ ## the name of the StorageClass used by the PVC
+ ##
+ storageClass: ""
+
+ ## the access mode of the PVC
+ ##
+ accessModes:
+ - ReadWriteOnce
+
+ ## the size of PVC to request
+ ##
+ size: 8Gi
+
+###################################
+## DATABASE | External Redis
+###################################
+externalRedis:
+ ## the host of the external redis
+ ##
+ host: ~
+
+ ## the port of the external redis
+ ##
+ port: ~
+
+ ## the database number to use within the external redis
+ ##
+ databaseNumber: 1
+
+ ## the password for the external redis
+ ## - [WARNING] to avoid storing the password in plain-text within your values,
+ ## create a Kubernetes secret and use `externalRedis.passwordSecret`
+ ##
+ password: ""
+
+ ## the name of a pre-created secret containing the external redis password
+ ## - if set, this overrides `externalRedis.password`
+ ##
+ passwordSecret: ~
+
+ ## the key within `externalRedis.passwordSecret` containing the password string
+ ##
+ passwordSecretKey: ~
+
+ ## extra connection-string properties for the external redis
+ ##
+ ## ____ EXAMPLE _______________
+ ## properties: "?ssl_cert_reqs=CERT_OPTIONAL"
+ ##
+ properties: ""
+
+###################################
+## CONFIG | ServiceMonitor (Prometheus Operator)
+###################################
+serviceMonitor:
+ ## if ServiceMonitor resources should be deployed for airflow webserver
+ ## - [WARNING] you will need a metrics exporter in your `airflow.image`, for example:
+ ## https://github.com/epoch8/airflow-exporter
+ ## - ServiceMonitor is a resource from prometheus-operator:
+ ## https://github.com/prometheus-operator/prometheus-operator
+ ##
+ enabled: false
+
+ ## labels for ServiceMonitor, so that Prometheus can select it
+ ##
+ selector:
+ prometheus: kube-prometheus
+
+ ## the ServiceMonitor web endpoint path
+ ##
+ path: /admin/metrics
+
+ ## the ServiceMonitor web endpoint interval
+ ##
+ interval: "30s"
+
+###################################
+## CONFIG | PrometheusRule (Prometheus Operator)
+###################################
+prometheusRule:
+ ## if PrometheusRule resources should be deployed for airflow webserver
+ ## - [WARNING] you will need a metrics exporter in your `airflow.image`, for example:
+ ## https://github.com/epoch8/airflow-exporter
+ ## - PrometheusRule is a resource from prometheus-operator:
+ ## https://github.com/prometheus-operator/prometheus-operator
+ ##
+ enabled: false
+
+ ## labels for PrometheusRule, so that Prometheus can select it
+ ##
+ additionalLabels: {}
+
+ ## alerting rules for Prometheus
+ ## - docs for alerting rules: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
+ ##
+ groups: []
diff --git a/cluster-local/keycloak-provider/deploymentruntimeconfig.yaml b/cluster-local/keycloak-provider/deploymentruntimeconfig.yaml
index 7e561f1..b3b48ea 100644
--- a/cluster-local/keycloak-provider/deploymentruntimeconfig.yaml
+++ b/cluster-local/keycloak-provider/deploymentruntimeconfig.yaml
@@ -18,8 +18,7 @@ spec:
value: |
{
"client_id": "crossplane",
- "url": "https://auth.shamrock.systems",
+ "client_secret": "ShamroclLocalDevSecret",
+ "url": "http://id.dev.lan.shamrock.systems",
"realm": "master"
}
- - name: KEYCLOAK_CLIENT_SECRET
- value: ShamroclLocalDevSecret
diff --git a/cluster-local/keycloak/deployment.yaml b/cluster-local/keycloak/deployment.yaml
index 37d2726..2faa251 100644
--- a/cluster-local/keycloak/deployment.yaml
+++ b/cluster-local/keycloak/deployment.yaml
@@ -21,7 +21,7 @@ spec:
containers:
- name: keycloak
image: quay.io/keycloak/keycloak:23.0
- args: ["start"]
+ args: ["start-dev"]
env:
- name: KEYCLOAK_ADMIN
value: "admin"
@@ -29,10 +29,6 @@ spec:
value: "password"
- name: KC_HOSTNAME
value: "id.dev.lan.shamrock.systems"
- - name: KC_PROXY
- value: "edge"
- - name: KC_HOSTNAME_STRICT_HTTPS
- value: "false"
- name: KC_DB
value: "postgres"
- name: KC_DB_URL
diff --git a/cluster-local/whoami/deployment.yaml b/cluster-local/whoami/deployment.yaml
new file mode 100644
index 0000000..c77a560
--- /dev/null
+++ b/cluster-local/whoami/deployment.yaml
@@ -0,0 +1,28 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: whoami
+ namespace: whoami
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: whoami
+ template:
+ metadata:
+ labels:
+ app: whoami
+ spec:
+ containers:
+ - name: whoami
+ image: traefik/whoami:latest
+ imagePullPolicy: IfNotPresent
+ resources:
+ requests:
+ cpu: 50m
+ memory: 60Mi
+ limits:
+ cpu: 100m
+ memory: 100Mi
+ ports:
+ - containerPort: 80
diff --git a/cluster-local/whoami/httproute.yaml b/cluster-local/whoami/httproute.yaml
new file mode 100644
index 0000000..6a2384d
--- /dev/null
+++ b/cluster-local/whoami/httproute.yaml
@@ -0,0 +1,20 @@
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: http-whoami
+ namespace: whoami
+spec:
+ parentRefs:
+ - group: gateway.networking.k8s.io
+ kind: Gateway
+ name: eg
+ namespace: envoy-gateway-system
+ hostnames: [whoami.dev.lan.shamrock.systems]
+ rules:
+ - matches:
+ - path:
+ type: PathPrefix
+ value: /
+ backendRefs:
+ - name: whoami
+ port: 80
diff --git a/cluster-local/whoami/kustomization.yaml b/cluster-local/whoami/kustomization.yaml
new file mode 100644
index 0000000..42e8fa2
--- /dev/null
+++ b/cluster-local/whoami/kustomization.yaml
@@ -0,0 +1,8 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+resources:
+ - ./namespace.yaml
+ - ./deployment.yaml
+ - ./service.yaml
+ - ./httproute.yaml
diff --git a/cluster-local/whoami/namespace.yaml b/cluster-local/whoami/namespace.yaml
new file mode 100644
index 0000000..435d009
--- /dev/null
+++ b/cluster-local/whoami/namespace.yaml
@@ -0,0 +1,6 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: whoami
+ labels:
+ name: whoami
diff --git a/cluster-local/whoami/service.yaml b/cluster-local/whoami/service.yaml
new file mode 100644
index 0000000..686bc94
--- /dev/null
+++ b/cluster-local/whoami/service.yaml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: whoami
+ namespace: whoami
+spec:
+ selector:
+ app: whoami
+ ports:
+ - protocol: TCP
+ port: 80
+ targetPort: 80
diff --git a/kustomanager/templates/cluster-local.localgen.yaml.j2 b/kustomanager/templates/cluster-local.localgen.yaml.j2
index a1209bd..af08135 100644
--- a/kustomanager/templates/cluster-local.localgen.yaml.j2
+++ b/kustomanager/templates/cluster-local.localgen.yaml.j2
@@ -24,6 +24,9 @@ ports:
- # Envoy Gateway
port: 80:30000
nodeFilters: ["server:0:direct"]
+registries:
+ create:
+ name: registry.dev.lan.shamrock.systems
options:
k3d:
disableLoadbalancer: true