Add openmetadata chart

This commit is contained in:
wbsong111
2026-02-27 14:51:57 +09:00
parent b2855ccba3
commit 864f99a589
323 changed files with 54891 additions and 0 deletions
@@ -0,0 +1,23 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
@@ -0,0 +1,53 @@
# OpenMetadata 버전 갱신 가이드
## 1. git 작업 환경 구성
- 서비스 카탈로그 git 다운로드
```
$ git clone https://github.com/paasup/dip-catalog.git
```
## 2. helm chart 업데이트
### 1) 차트 버전 변경
- BUILD-README.md, CUSTOM-README.md, custom-values.yaml을 제외한 파일 삭제
``` sh
# chart 디렉토리로 이동
cd ~/dip-catalog/manifests/helm/openmetadata/1.12.1
# 파일 삭제 전 삭제할 파일 목록 확인
find . -mindepth 1 \( -name "CUSTOM-README.md" -o -name "BUILD-README.md" -o -name "custom-values.yaml" \) -prune -o -print
# 파일 삭제
find . -mindepth 1 \( -name "CUSTOM-README.md" -o -name "BUILD-README.md" -o -name "custom-values.yaml" \) -prune -o -exec rm -rf {} +
```
- openmetadata 차트 다운로드
``` sh
# manifests/helm 디렉토리로 이동
cd ~/dip-catalog/manifests/helm
# helm repo 추가
helm repo add open-metadata https://helm.open-metadata.org/
helm repo update
# helm 차트 조회
helm search repo open-metadata/openmetadata --versions
# helm 차트 pull
helm pull open-metadata/openmetadata --version=1.12.1 --untar --untardir openmetadata/1.12.1-tmp
# 차트 파일 이동 및 정리
mv openmetadata/1.12.1-tmp/openmetadata/* openmetadata/1.12.1/
rm -rf openmetadata/1.12.1-tmp
```
## 3. github에 push
- 갱신작업 진행후 commit 및 push
```
$ git add .
$ git commit -m "update openmetadata/1.12.1"
$ git push origin main
```
@@ -0,0 +1,179 @@
# OpenMetadata 배포
## 1. 배포 방법
### 1) 배포 시 주의 사항
- openmetadata를 배포하기 전에 `openmetadata-dependencies`(MySQL, OpenSearch, Airflow)가 먼저 배포되어 있어야 한다.
- HTTPS 접근을 위해 `java-truststore` Secret이 배포 네임스페이스에 사전 생성되어 있어야 한다.
- Keycloak OIDC 연동 시 `oidc-secrets` Secret이 사전 생성되어 있어야 한다.
### 2) Secret 사전 생성
- java-truststore Secret 생성 (내부 CA 인증서 포함 truststore)
``` sh
kubectl create secret generic java-truststore \
--from-file=cacerts=<path-to-cacerts> \
-n openmetadata
```
- Keycloak OIDC 연동 시 oidc-secrets Secret 생성
``` sh
kubectl create secret generic oidc-secrets \
--from-literal=openmetadata-oidc-client-id=<client-id> \
--from-literal=openmetadata-oidc-client-secret=<client-secret> \
-n openmetadata
```
### 3) 배포 방법
``` sh
git clone https://github.com/paasup/dip-catalog.git
cd manifests/helm/openmetadata/1.12.1
helm upgrade openmetadata ./ -f custom-values.yaml --install -n openmetadata --create-namespace
```
---
## 2. custom-values.yaml 설명
### 1) 인가(Authorizer) 설정
| Name | 설명 | 기본값 |
| ---- | ---- | ------ |
| `openmetadata.config.authorizer.initialAdmins` | 최초 관리자 계정 목록. 이메일의 `@` 앞 부분을 입력 | `["admin", "paasup"]` |
| `openmetadata.config.authorizer.principalDomain` | 조직의 기본 도메인 (예: `paasup.io`) | `"paasup.io"` |
| `openmetadata.config.authorizer.allowedDomains` | 로그인을 허용할 도메인 목록 | `["paasup.io"]` |
### 2) 인증(Authentication) 설정
#### 2.1) Basic 인증 (기본값)
- OpenMetadata 자체 계정/비밀번호 인증을 사용한다.
``` yaml
openmetadata:
config:
authentication:
provider: "basic"
callbackUrl: "https://open-metadata.example.org/callback"
authority: "https://open-metadata.example.org"
publicKeys:
- "https://open-metadata.example.org/api/v1/system/config/jwks"
```
#### 2.2) Keycloak OIDC 연동
- `provider`를 `custom-oidc`로 변경하고 `oidcConfiguration`을 활성화한다.
- 사전에 `oidc-secrets` Secret이 생성되어 있어야 한다.
``` yaml
openmetadata:
config:
authentication:
clientType: confidential
provider: "custom-oidc"
publicKeys:
- "https://open-metadata.example.org/api/v1/system/config/jwks"
- "https://keycloak.example.org/realms/paasup/protocol/openid-connect/certs"
clientId: "open-metadata"
callbackUrl: "https://open-metadata.example.org/callback"
jwtPrincipalClaims:
- "email"
- "preferred_username"
- "sub"
oidcConfiguration:
enabled: true
oidcType: "Keycloak"
clientId:
secretRef: oidc-secrets
secretKey: openmetadata-oidc-client-id
clientSecret:
secretRef: oidc-secrets
secretKey: openmetadata-oidc-client-secret
discoveryUri: "https://keycloak.example.org/realms/paasup/.well-known/openid-configuration"
serverUrl: "https://open-metadata.example.org"
callbackUrl: "https://open-metadata.example.org/callback"
```
### 3) Ingress 설정
#### 3.1) cert-manager를 이용한 자동 생성
- cert-manager를 통해 인증서 자동 생성 시 `custom-values.yaml`을 수정한다.
- `ingress.annotations.cert-manager.io/cluster-issuer`에 미리 배포된 Cluster Issuer의 이름으로 변경한다.
- Kong Ingress Controller를 사용하며 HTTPS 리다이렉트를 적용한다.
``` yaml
ingress:
enabled: true
className: "kong"
annotations:
cert-manager.io/cluster-issuer: root-ca-issuer
cert-manager.io/duration: 8760h
cert-manager.io/renew-before: 720h
konghq.com/protocols: https
konghq.com/https-redirect-status-code: "301"
hosts:
- host: open-metadata.example.org # 사용할 도메인으로 변경
paths:
- path: /
pathType: ImplementationSpecific
tls:
- secretName: openmetadata-tls
hosts:
- open-metadata.example.org # 사용할 도메인으로 변경
```
#### 3.2) TLS Secret 직접 생성
- 인증서를 직접 관리하는 경우 Secret을 생성하여 제공한다.
``` sh
kubectl create secret tls openmetadata-tls \
--cert=<path-to-cert-file> \
--key=<path-to-key-file> \
-n openmetadata
```
### 4) Java TrustStore 설정
- 내부 CA 인증서를 신뢰하기 위해 `java-truststore` Secret을 마운트하고 JVM 옵션을 설정한다.
``` yaml
extraVolumes:
- name: java-truststore
secret:
secretName: java-truststore
extraVolumeMounts:
- name: java-truststore
mountPath: /etc/ssl/java
readOnly: true
extraEnvs:
- name: OPENMETADATA_OPTS
value: >
-Djavax.net.ssl.trustStore=/etc/ssl/java/cacerts
-Djavax.net.ssl.trustStorePassword=changeit
```
### 5) 리소스 설정
``` yaml
resources:
limits:
cpu: 1
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
```
### 6) 환경변수 설정
| Name | 설명 | 기본값 |
| ---- | ---- | ------ |
| `OPENMETADATA_PUBLIC_URL` | 외부에서 접근하는 OpenMetadata URL. HTTPS 환경에서 반드시 설정 | `"https://open-metadata.example.org"` |
| `LOG_LEVEL` | 로그 레벨 (`INFO`, `DEBUG`, `WARN`, `ERROR`) | `"INFO"` |
| `OPENMETADATA_OPTS` | JVM 옵션. TrustStore 경로 및 패스워드 설정 | `custom-values.yaml 참조` |
@@ -0,0 +1,45 @@
annotations:
artifacthub.io/images: |
- name: openmetadata-server
image: docker.io/openmetadata/server:1.12.1
artifacthub.io/license: Apache-2.0
artifacthub.io/recommendations: |
- name: bitnami/mysql
- name: apache/airflow
- name: opensearchproject/opensearch
artifacthub.io/support: https://github.com/open-metadata/openmetadata-helm-charts/issues
kubeVersion: '>=1.24'
apiVersion: v2
appVersion: 1.12.1
description: A Helm chart for OpenMetadata on Kubernetes
home: https://open-metadata.org/
icon: https://open-metadata.org/assets/favicon.png
keywords:
- metadata
- data-science
- data
- machine-learning
- automation
- big-data
- bigdata
- artificial-intelligence
- datascience
- data-engineering
- data-catalog
- metadata-api
- governance
- data-profiling
- metadata-management
- dataengineering
- dataquality
- bigdataanalytics
- datadiscovery
maintainers:
- email: support@open-metadata.org
name: OpenMetadata
name: openmetadata
sources:
- https://github.com/open-metadata/OpenMetadata
- https://github.com/open-metadata/openmetadata-helm-charts
type: application
version: 1.12.1
@@ -0,0 +1,169 @@
# OMJob Operator for OpenMetadata
## Overview
The OMJob Operator is a Kubernetes operator that manages ingestion pipeline jobs with guaranteed exit handler execution. It ensures that pipeline status is properly updated in OpenMetadata regardless of how the main ingestion pod terminates (success, failure, OOM, external kill, etc.).
## Architecture
```
OMJob CR → OMJob Operator → Main Pod → Exit Handler Pod
```
1. **OMJob Custom Resource**: Defines the pipeline job specification
2. **OMJob Operator**: Watches OMJob resources and manages pod lifecycle
3. **Main Pod**: Runs the actual ingestion pipeline
4. **Exit Handler Pod**: Automatically created after main pod completion to update pipeline status
## Installation
### Enable the operator in values.yaml:
```yaml
omjobOperator:
enabled: true
image:
repository: docker.getcollate.io/openmetadata/omjob-operator
tag: latest
pullPolicy: IfNotPresent
logLevel: INFO
```
### Deploy using Helm:
```bash
helm upgrade --install openmetadata openmetadata-helm-charts/charts/openmetadata \
--namespace openmetadata \
--set omjobOperator.enabled=true
```
## Usage
The K8sPipelineClient will automatically create OMJob resources instead of regular Jobs when the operator is enabled. The OMJob resource structure mirrors a Kubernetes Job but with additional guarantees for exit handler execution.
### OMJob Lifecycle
1. **Pending**: OMJob created, waiting to start
2. **Running**: Main ingestion pod is running
3. **ExitHandlerRunning**: Main pod completed, exit handler is running
4. **Succeeded/Failed**: Both pods completed, final status determined
### Status Fields
- `phase`: Current phase of the OMJob
- `mainPodName`: Name of the main ingestion pod
- `exitHandlerPodName`: Name of the exit handler pod
- `mainPodExitCode`: Exit code from the main pod
- `startTime`: When the job started
- `completionTime`: When the job completed
- `message`: Human-readable status message
## Key Features
### Guaranteed Exit Handler Execution
The exit handler pod is **always** created after the main pod completes, regardless of:
- Normal completion (exit code 0)
- Application failures (exit code != 0)
- Out of Memory (OOM) kills
- External pod termination (`kubectl delete pod`)
- Node failures
- Resource limit violations
### Debug-Friendly
- Pods are retained based on TTL configuration (default: 24 hours)
- Exit handler logs are preserved separately from main pod logs
- Clear status progression through phases
- Kubernetes events track all state transitions
### Production Ready
- Single responsibility: operator only manages pod lifecycle
- No complex lifecycle hooks or sidecar containers
- Clean separation between ingestion and status reporting
- Resilient to operator restarts
- Handles edge cases (pod deletions, node failures)
## Monitoring
### View OMJob status:
```bash
kubectl get omjobs -n openmetadata
```
### Detailed status:
```bash
kubectl describe omjob <job-name> -n openmetadata
```
### Watch exit handler logs:
```bash
kubectl logs -l app.kubernetes.io/component=exit-handler -n openmetadata
```
## Configuration
### Pipeline Service Client Settings
The operator respects all existing `pipelineServiceClient` configurations:
```yaml
pipelineServiceClient:
enabled: true
ingestionImage: docker.getcollate.io/openmetadata/ingestion:latest
serviceAccountName: openmetadata-ingestion
ttlSecondsAfterFinished: 86400 # 24 hours
resources:
requests:
cpu: "100m"
memory: "512Mi"
limits:
cpu: "1"
memory: "2Gi"
```
### Security Context
Both main and exit handler pods use the same security context:
```yaml
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
```
## Troubleshooting
### OMJob stuck in Running state
Check if the main pod is still running:
```bash
kubectl get pods -l omjob=<job-name> -n openmetadata
```
### Exit handler not created
Check operator logs:
```bash
kubectl logs deployment/openmetadata-omjob-operator -n openmetadata
```
### View operator events
```bash
kubectl get events --field-selector reason=OMJobOperator -n openmetadata
```
## Benefits Over Lifecycle Hooks
1. **Reliable**: Exit handler runs for ALL termination scenarios
2. **Debuggable**: Separate pods with distinct logs
3. **Simple**: No complex hooks or sidecars
4. **Kubernetes-native**: Uses standard operator pattern
5. **Maintainable**: Clean separation of concerns
@@ -0,0 +1,592 @@
# Open Metadata
[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/open-metadata)](https://artifacthub.io/packages/search?repo=open-metadata)
A Helm Chart for Open Metadata.
## Install OpenMetadata
Assuming kubectl context points to the correct kubernetes cluster, first create kubernetes secrets that contain MySQL and Airflow passwords as secrets.
```
kubectl create secret generic mysql-secrets --from-literal=openmetadata-mysql-password=openmetadata_password
kubectl create secret generic airflow-secrets --from-literal=openmetadata-airflow-password=admin
```
The above commands sets the passwords as an example. Change to any password of choice.
Run the following command to install openmetadata with default configuration.
```
helm repo add open-metadata https://helm.open-metadata.org
helm install openmetadata open-metadata/openmetadata
```
If the default configuration is not applicable, you can update the values listed below in a `values.yaml` file and run
```
helm install openmetadata open-metadata/openmetadata --values <<path-to-values-file>>
```
---
## Openmetadata Config Chart Values
| Key | Type | Default | Conf/Openmetadata.yaml |
|-----|------|---------| ---------------------- |
| openmetadata.config.authentication.enabled | bool | `true` | |
| openmetadata.config.authentication.clientType | string | `public` | AUTHENTICATION_CLIENT_TYPE |
| openmetadata.config.authentication.provider | string | `basic` | AUTHENTICATION_PROVIDER |
| openmetadata.config.authentication.publicKeys | list | `[http://openmetadata:8585/api/v1/system/config/jwks]` | AUTHENTICATION_PUBLIC_KEYS |
| openmetadata.config.authentication.authority | string | `https://accounts.google.com` | AUTHENTICATION_AUTHORITY |
| openmetadata.config.authentication.clientId | string | `Empty String` | AUTHENTICATION_CLIENT_ID |
| openmetadata.config.authentication.callbackUrl | string | `Empty String` | AUTHENTICATION_CALLBACK_URL |
| openmetadata.config.authentication.enableSelfSignup | bool | `true` | AUTHENTICATION_ENABLE_SELF_SIGNUP |
| openmetadata.config.authentication.jwtPrincipalClaims | list | `[email,preferred_username,sub]` | AUTHENTICATION_JWT_PRINCIPAL_CLAIMS |
| openmetadata.config.authentication.jwtPrincipalClaimsMapping | list | `[]` | AUTHENTICATION_JWT_PRINCIPAL_CLAIMS_MAPPING |
| openmetadata.config.authentication.ldapConfiguration.host | string | `localhost` | AUTHENTICATION_LDAP_HOST |
| openmetadata.config.authentication.ldapConfiguration.port |int | 10636 | AUTHENTICATION_LDAP_PORT |
| openmetadata.config.authentication.ldapConfiguration.dnAdminPrincipal | string | `cn=admin,dc=example,dc=com` | AUTHENTICATION_LOOKUP_ADMIN_DN |
| openmetadata.config.authentication.ldapConfiguration.dnAdminPassword.secretRef | string | `ldap-secret` | AUTHENTICATION_LOOKUP_ADMIN_PWD |
| openmetadata.config.authentication.ldapConfiguration.dnAdminPassword.secretKey | string | `openmetadata-ldap-secret` | AUTHENTICATION_LOOKUP_ADMIN_PWD |
| openmetadata.config.authentication.ldapConfiguration.userBaseDN | string | `ou=people,dc=example,dc=com` | AUTHENTICATION_USER_LOOKUP_BASEDN |
| openmetadata.config.authentication.ldapConfiguration.groupBaseDN | string | `Empty String` | AUTHENTICATION_GROUP_LOOKUP_BASEDN |
| openmetadata.config.authentication.ldapConfiguration.roleAdminName | string | `Empty String` | AUTHENTICATION_USER_ROLE_ADMIN_NAME |
| openmetadata.config.authentication.ldapConfiguration.allAttributeName | string | `Empty String` | AUTHENTICATION_USER_ALL_ATTR |
| openmetadata.config.authentication.ldapConfiguration.usernameAttributeName | string | `Empty String` | AUTHENTICATION_USER_NAME_ATTR |
| openmetadata.config.authentication.ldapConfiguration.groupAttributeName | string | `Empty String` | AUTHENTICATION_USER_GROUP_ATTR |
| openmetadata.config.authentication.ldapConfiguration.groupAttributeValue | string | `Empty String` | AUTHENTICATION_USER_GROUP_ATTR_VALUE |
| openmetadata.config.authentication.ldapConfiguration.groupMemberAttributeName | string | `Empty String` | AUTHENTICATION_USER_GROUP_MEMBER_ATTR |
| openmetadata.config.authentication.ldapConfiguration.authRolesMapping | string | `Empty String` | AUTH_ROLES_MAPPING |
| openmetadata.config.authentication.ldapConfiguration.authReassignRoles | string | `Empty String` | AUTH_REASSIGN_ROLES |
| openmetadata.config.authentication.ldapConfiguration.mailAttributeName | string | `email` | AUTHENTICATION_USER_MAIL_ATTR |
| openmetadata.config.authentication.ldapConfiguration.maxPoolSize | int | 3 | AUTHENTICATION_LDAP_POOL_SIZE |
| openmetadata.config.authentication.ldapConfiguration.sslEnabled | bool | `true` | AUTHENTICATION_LDAP_SSL_ENABLED |
| openmetadata.config.authentication.ldapConfiguration.truststoreConfigType | string | `TrustAll` | AUTHENTICATION_LDAP_TRUSTSTORE_TYPE |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFilePath | string | `Empty String` | AUTHENTICATION_LDAP_TRUSTSTORE_PATH |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFilePassword.secretRef | string | `Empty String` | AUTHENTICATION_LDAP_KEYSTORE_PASSWORD |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFilePassword.secretKey | string | `Empty String` | AUTHENTICATION_LDAP_KEYSTORE_PASSWORD |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFileFormat | string | `Empty String` | AUTHENTICATION_LDAP_SSL_KEY_FORMAT |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.verifyHostname | string | `Empty String` | AUTHENTICATION_LDAP_SSL_VERIFY_CERT_HOST |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.examineValidityDate | bool | `true` | AUTHENTICATION_LDAP_EXAMINE_VALIDITY_DATES |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.hostNameConfig.allowWildCards | bool | `false` | AUTHENTICATION_LDAP_ALLOW_WILDCARDS |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.hostNameConfig.acceptableHostNames | string | `[Empty String]` | AUTHENTICATION_LDAP_ALLOWED_HOSTNAMES |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.jvmDefaultConfig.verifyHostname | string | `Empty String` | AUTHENTICATION_LDAP_SSL_VERIFY_CERT_HOST |
| openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.trustAllConfig.examineValidityDates | bool | `true` | AUTHENTICATION_LDAP_EXAMINE_VALIDITY_DATES |
| openmetadata.config.authentication.oidcConfiguration.callbackUrl | string | `http://openmetadata:8585/callback` | OIDC_CALLBACK |
| openmetadata.config.authentication.oidcConfiguration.clientAuthenticationMethod | string | `client_secret_post` | OIDC_CLIENT_AUTH_METHOD |
| openmetadata.config.authentication.oidcConfiguration.clientId.secretKey | string | `openmetadata-oidc-client-id` | OIDC_CLIENT_ID |
| openmetadata.config.authentication.oidcConfiguration.clientId.secretRef | string | `oidc-secrets` | OIDC_CLIENT_ID |
| openmetadata.config.authentication.oidcConfiguration.clientSecret.secretKey | string | `openmetadata-oidc-client-secret` | OIDC_CLIENT_SECRET |
| openmetadata.config.authentication.oidcConfiguration.clientSecret.secretRef | string | `oidc-secrets` | OIDC_CLIENT_SECRET |
| openmetadata.config.authentication.oidcConfiguration.customParams | string | `{}` | OIDC_CUSTOM_PARAMS |
| openmetadata.config.authentication.oidcConfiguration.maxAge | string | `0` | OIDC_MAX_AGE |
| openmetadata.config.authentication.oidcConfiguration.disablePkce | bool | true | OIDC_DISABLE_PKCE |
| openmetadata.config.authentication.oidcConfiguration.discoveryUri | string | `Empty` | OIDC_DISCOVERY_URI |
| openmetadata.config.authentication.oidcConfiguration.enabled | bool | false | |
| openmetadata.config.authentication.oidcConfiguration.maxClockSkew | string | `Empty` | OIDC_MAX_CLOCK_SKEW |
| openmetadata.config.authentication.oidcConfiguration.oidcType | string | `Empty` | OIDC_TYPE |
| openmetadata.config.authentication.oidcConfiguration.preferredJwsAlgorithm | string | `RS256` | OIDC_PREFERRED_JWS |
| openmetadata.config.authentication.oidcConfiguration.responseType | string | `code` | OIDC_RESPONSE_TYPE |
| openmetadata.config.authentication.oidcConfiguration.promptType | string | `consent` | OIDC_PROMPT_TYPE |
| openmetadata.config.authentication.oidcConfiguration.scope | string | `openid email profile` | OIDC_SCOPE |
| openmetadata.config.authentication.oidcConfiguration.serverUrl | string | `http://openmetadata:8585` | OIDC_SERVER_URL |
| openmetadata.config.authentication.oidcConfiguration.sessionExpiry | string | `604800` | OIDC_SESSION_EXPIRY |
| openmetadata.config.authentication.oidcConfiguration.tenant | string | `Empty` | OIDC_TENANT |
| openmetadata.config.authentication.oidcConfiguration.tokenValidity | string | `3600` | OIDC_OM_REFRESH_TOKEN_VALIDITY |
| openmetadata.config.authentication.oidcConfiguration.useNonce | bool | `true` | OIDC_USE_NONCE |
| openmetadata.config.authentication.saml.debugMode | bool | false | SAML_DEBUG_MODE |
| openmetadata.config.authentication.saml.idp.entityId | string | `Empty` | SAML_IDP_ENTITY_ID |
| openmetadata.config.authentication.saml.idp.ssoLoginUrl | string | `Empty` | SAML_IDP_SSO_LOGIN_URL |
| openmetadata.config.authentication.saml.idp.idpX509Certificate.secretRef | string | `Empty` | SAML_IDP_CERTIFICATE |
| openmetadata.config.authentication.saml.idp.idpX509Certificate.secretKey | string | `Empty` | SAML_IDP_CERTIFICATE |
| openmetadata.config.authentication.saml.idp.authorityUrl | string | `http://openmetadata:8585/api/v1/saml/login` | SAML_AUTHORITY_URL |
| openmetadata.config.authentication.saml.idp.nameId | string | `urn:oasis:names:tc:SAML:2.0:nameid-format:emailAddress` | SAML_IDP_NAME_ID |
| openmetadata.config.authentication.saml.sp.entityId | string | `http://openmetadata:8585/api/v1/saml/metadata` | SAML_SP_ENTITY_ID |
| openmetadata.config.authentication.saml.sp.acs | string | `http://openmetadata:8585/api/v1/saml/acs` | SAML_SP_ACS |
| openmetadata.config.authentication.saml.sp.spX509Certificate.secretRef | string | `Empty` | SAML_SP_CERTIFICATE |
| openmetadata.config.authentication.saml.sp.spX509Certificate.secretKey | string | `Empty` | SAML_SP_CERTIFICATE |
| openmetadata.config.authentication.saml.sp.callback | string | `http://openmetadata:8585/saml/callback` | SAML_SP_CALLBACK |
| openmetadata.config.authentication.saml.security.strictMode | bool | false | SAML_STRICT_MODE |
| openmetadata.config.authentication.saml.security.tokenValidity | int | 3600 | SAML_SP_TOKEN_VALIDITY |
| openmetadata.config.authentication.saml.security.sendEncryptedNameId | bool | false | SAML_SEND_ENCRYPTED_NAME_ID |
| openmetadata.config.authentication.saml.security.sendSignedAuthRequest | bool | false | SAML_SEND_SIGNED_AUTH_REQUEST |
| openmetadata.config.authentication.saml.security.signSpMetadata | bool | false | SAML_SIGNED_SP_METADATA |
| openmetadata.config.authentication.saml.security.wantMessagesSigned | bool | false | SAML_WANT_MESSAGE_SIGNED |
| openmetadata.config.authentication.saml.security.wantAssertionsSigned | bool | false | SAML_WANT_ASSERTION_SIGNED |
| openmetadata.config.authentication.saml.security.wantAssertionEncrypted | bool | false | SAML_WANT_ASSERTION_ENCRYPTED |
| openmetadata.config.authentication.saml.security.wantNameIdEncrypted | bool | false | SAML_WANT_NAME_ID_ENCRYPTED |
| openmetadata.config.authentication.saml.security.keyStoreFilePath | string | `Empty` | SAML_KEYSTORE_FILE_PATH |
| openmetadata.config.authentication.saml.security.keyStoreAlias.secretRef | string | `Empty` | SAML_KEYSTORE_ALIAS |
| openmetadata.config.authentication.saml.security.keyStoreAlias.secretKey | string | `Empty` | SAML_KEYSTORE_ALIAS |
| openmetadata.config.authentication.saml.security.keyStorePassword.secretRef | string | `Empty` | SAML_KEYSTORE_PASSWORD |
| openmetadata.config.authentication.saml.security.keyStorePassword.secretKey | string | `Empty` | SAML_KEYSTORE_PASSWORD |
| openmetadata.config.authorizer.enabled | bool | `true` | |
| openmetadata.config.authorizer.allowedEmailRegistrationDomains | list | `[all]` | AUTHORIZER_ALLOWED_REGISTRATION_DOMAIN |
| openmetadata.config.authorizer.className | string | `org.openmetadata.service.security.DefaultAuthorizer` | AUTHORIZER_CLASS_NAME |
| openmetadata.config.authorizer.containerRequestFilter | string | `org.openmetadata.service.security.JwtFilter` | AUTHORIZER_REQUEST_FILTER |
| openmetadata.config.authorizer.enforcePrincipalDomain | bool | `false` | AUTHORIZER_ENFORCE_PRINCIPAL_DOMAIN |
| openmetadata.config.authorizer.enableSecureSocketConnection | bool | `false` | AUTHORIZER_ENABLE_SECURE_SOCKET |
| openmetadata.config.authorizer.initialAdmins | list | `[admin]` | AUTHORIZER_ADMIN_PRINCIPALS |
| openmetadata.config.authorizer.allowedDomains | list | `[]` | AUTHORIZER_ALLOWED_DOMAINS |
| openmetadata.config.authorizer.principalDomain | string | `open-metadata.org` | AUTHORIZER_PRINCIPAL_DOMAIN |
| openmetadata.config.authorizer.useRolesFromProvider | bool | `false` | AUTHORIZER_USE_ROLES_FROM_PROVIDER |
| openmetadata.config.pipelineServiceClientConfig.auth.password.secretRef | string | `airflow-secrets` | AIRFLOW_PASSWORD |
| openmetadata.config.pipelineServiceClientConfig.auth.password.secretKey | string | `openmetadata-airflow-password` | AIRFLOW_PASSWORD |
| openmetadata.config.pipelineServiceClientConfig.auth.username | string | `admin` | AIRFLOW_USERNAME |
| openmetadata.config.pipelineServiceClientConfig.enabled | bool | `true` | |
| openmetadata.config.pipelineServiceClientConfig.host | string | `http://openmetadata-dependencies-web:8080` | PIPELINE_SERVICE_CLIENT_ENDPOINT |
| openmetadata.config.pipelineServiceClientConfig.openmetadata.serverHostApiUrl | string | `http://openmetadata:8585/api` | SERVER_HOST_API_URL |
| openmetadata.config.pipelineServiceClientConfig.sslCertificatePath | string | `/no/path` | PIPELINE_SERVICE_CLIENT_SSL_CERT_PATH |
| openmetadata.config.pipelineServiceClientConfig.verifySsl | string | `no-ssl` | PIPELINE_SERVICE_CLIENT_VERIFY_SSL |
| openmetadata.config.clusterName | string | `openmetadata` | OPENMETADATA_CLUSTER_NAME |
| openmetadata.config.database.enabled | bool | `true` | |
| openmetadata.config.database.auth.password.secretRef | string | `mysql-secrets` | DB_USER_PASSWORD |
| openmetadata.config.database.auth.password.secretKey | string | `openmetadata-mysql-password` | DB_USER_PASSWORD |
| openmetadata.config.database.auth.username | string | `openmetadata_user` | DB_USER|
| openmetadata.config.database.databaseName | string | `openmetadata_db` | OM_DATABASE |
| openmetadata.config.database.dbParams| string | `allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC` | DB_PARAMS |
| openmetadata.config.database.dbScheme| string | `mysql` | DB_SCHEME |
| openmetadata.config.database.driverClass| string | `com.mysql.cj.jdbc.Driver` | DB_DRIVER_CLASS |
| openmetadata.config.database.host | string | `mysql` | DB_HOST |
| openmetadata.config.database.port | int | 3306 | DB_PORT |
| openmetadata.config.elasticsearch.enabled | bool | `true` | |
| openmetadata.config.elasticsearch.auth.enabled | bool | `false` | |
| openmetadata.config.elasticsearch.auth.username | string | `elasticsearch` | ELASTICSEARCH_USER |
| openmetadata.config.elasticsearch.auth.password.secretRef | string | `elasticsearch-secrets` | ELASTICSEARCH_PASSWORD |
| openmetadata.config.elasticsearch.auth.password.secretKey | string | `openmetadata-elasticsearch-password` | ELASTICSEARCH_PASSWORD |
| openmetadata.config.elasticsearch.host | string | `opensearch` | ELASTICSEARCH_HOST |
| openmetadata.config.elasticsearch.keepAliveTimeoutSecs | int | `600` | ELASTICSEARCH_KEEP_ALIVE_TIMEOUT_SECS |
| openmetadata.config.elasticsearch.payLoadSize | int | 10485760 | ELASTICSEARCH_PAYLOAD_BYTES_SIZE |
| openmetadata.config.elasticsearch.port | int | 9200 | ELASTICSEARCH_PORT |
| openmetadata.config.elasticsearch.searchType | string | `opensearch` | SEARCH_TYPE |
| openmetadata.config.elasticsearch.scheme | string | `http` | ELASTICSEARCH_SCHEME |
| openmetadata.config.elasticsearch.clusterAlias | string | `Empty String` | ELASTICSEARCH_CLUSTER_ALIAS |
| openmetadata.config.elasticsearch.searchIndexMappingLanguage | string | `EN`| ELASTICSEARCH_INDEX_MAPPING_LANG |
| openmetadata.config.elasticsearch.trustStore.enabled | bool | `false` | |
| openmetadata.config.elasticsearch.trustStore.path | string | `Empty String` | ELASTICSEARCH_TRUST_STORE_PATH |
| openmetadata.config.elasticsearch.trustStore.password.secretRef | string | `elasticsearch-truststore-secrets` | ELASTICSEARCH_TRUST_STORE_PASSWORD |
| openmetadata.config.elasticsearch.trustStore.password.secretKey | string | `openmetadata-elasticsearch-truststore-password` | ELASTICSEARCH_TRUST_STORE_PASSWORD |
| openmetadata.config.eventMonitor.enabled | bool | `true` | |
| openmetadata.config.eventMonitor.type | string | `prometheus` | EVENT_MONITOR |
| openmetadata.config.eventMonitor.batchSize | int | `10` | EVENT_MONITOR_BATCH_SIZE |
| openmetadata.config.eventMonitor.pathPattern | list | `[/api/v1/tables/*,/api/v1/health-check]` | EVENT_MONITOR_PATH_PATTERN |
| openmetadata.config.eventMonitor.latency | list | `[]` | EVENT_MONITOR_LATENCY |
| openmetadata.config.fernetkey.value | string | `jJ/9sz0g0OHxsfxOoSfdFdmk3ysNmPRnH3TUAbz3IHA=` | FERNET_KEY |
| openmetadata.config.fernetkey.secretRef | string | `` | FERNET_KEY |
| openmetadata.config.fernetkey.secretKef | string | `` | FERNET_KEY |
| openmetadata.config.jwtTokenConfiguration.enabled | bool | `true` | |
| openmetadata.config.jwtTokenConfiguration.rsapublicKeyFilePath | string | `./conf/public_key.der` | RSA_PUBLIC_KEY_FILE_PATH |
| openmetadata.config.jwtTokenConfiguration.rsaprivateKeyFilePath | string | `./conf/private_key.der` | RSA_PRIVATE_KEY_FILE_PATH |
| openmetadata.config.jwtTokenConfiguration.jwtissuer | string | `open-metadata.org` | JWT_ISSUER |
| openmetadata.config.jwtTokenConfiguration.keyId | string | `Gb389a-9f76-gdjs-a92j-0242bk94356` | JWT_KEY_ID |
| openmetadata.config.logLevel | string | `INFO` | LOG_LEVEL |
| openmetadata.config.openmetadata.adminPort | int | 8586 | SERVER_ADMIN_PORT |
| openmetadata.config.openmetadata.maxThreads | int | 50 | SERVER_MAX_THREADS |
| openmetadata.config.openmetadata.minThreads | int | 10 | SERVER_MIN_THREADS |
| openmetadata.config.openmetadata.idleThreadTimeout | string | `1 minute` | SERVER_IDLE_THREAD_TIMEOUT |
| openmetadata.config.openmetadata.host | string | `openmetadata` | OPENMETADATA_SERVER_URL |
| openmetadata.config.openmetadata.port | int | 8585 | SERVER_PORT |
| openmetadata.config.pipelineServiceClientConfig.auth.password.secretRef | string | `airflow-secrets` | AIRFLOW_PASSWORD |
| openmetadata.config.pipelineServiceClientConfig.auth.password.secretKey | string | `openmetadata-airflow-password` | AIRFLOW_PASSWORD |
| openmetadata.config.pipelineServiceClientConfig.auth.username | string | `admin` | AIRFLOW_USERNAME |
| openmetadata.config.pipelineServiceClientConfig.auth.trustStorePath | string | `` | AIRFLOW_TRUST_STORE_PATH |
| openmetadata.config.pipelineServiceClientConfig.auth.trustStorePassword.secretRef | string | `` | AIRFLOW_TRUST_STORE_PASSWORD |
| openmetadata.config.pipelineServiceClientConfig.auth.trustStorePassword.secretKey | string | `` | AIRFLOW_TRUST_STORE_PASSWORD |
| openmetadata.config.pipelineServiceClientConfig.apiEndpoint | string | `http://openmetadata-dependencies-web:8080` | PIPELINE_SERVICE_CLIENT_ENDPOINT |
| openmetadata.config.pipelineServiceClientConfig.className | string | `org.openmetadata.service.clients.pipeline.airflow.AirflowRESTClient` | PIPELINE_SERVICE_CLIENT_CLASS_NAME |
| openmetadata.config.pipelineServiceClientConfig.enabled | bool | `true` | PIPELINE_SERVICE_CLIENT_ENABLED |
| openmetadata.config.pipelineServiceClientConfig.healthCheckInterval | int | `300` | PIPELINE_SERVICE_CLIENT_HEALTH_CHECK_INTERVAL |
| openmetadata.config.pipelineServiceClientConfig.ingestionIpInfoEnabled | bool | `false` | PIPELINE_SERVICE_IP_INFO_ENABLED |
| openmetadata.config.pipelineServiceClientConfig.metadataApiEndpoint | string | `http://openmetadata:8585/api` | SERVER_HOST_API_URL |
| openmetadata.config.pipelineServiceClientConfig.sslCertificatePath | string | `/no/path` | PIPELINE_SERVICE_CLIENT_SSL_CERT_PATH |
| openmetadata.config.pipelineServiceClientConfig.verifySsl | string | `no-ssl` | PIPELINE_SERVICE_CLIENT_VERIFY_SSL |
| openmetadata.config.pipelineServiceClientConfig.hostIp | string | `Empty` | PIPELINE_SERVICE_CLIENT_HOST_IP |
| openmetadata.config.secretsManager.enabled | bool | `true` | |
| openmetadata.config.secretsManager.provider | string | `Empty String` | SECRET_MANAGER |
| openmetadata.config.secretsManager.prefix | string | `Empty String` | SECRET_MANAGER_PREFIX |
| openmetadata.config.secretsManager.tags | list | `[]` | SECRET_MANAGER_TAGS |
| openmetadata.config.secretsManager.additionalParameters.enabled | bool | `false` | |
| openmetadata.config.secretsManager.additionalParameters.accessKeyId.secretRef | string | `aws-access-key-secret` | OM_SM_ACCESS_KEY_ID |
| openmetadata.config.secretsManager.additionalParameters.accessKeyId.secretKey | string | `aws-key-secret` | OM_SM_ACCESS_KEY_ID |
| openmetadata.config.secretsManager.additionalParameters.clientId.secretRef | string | `azure-client-id-secret` | OM_SM_CLIENT_ID |
| openmetadata.config.secretsManager.additionalParameters.clientId.secretKey | string | `azure-key-secret` | OM_SM_CLIENT_ID |
| openmetadata.config.secretsManager.additionalParameters.clientSecret.secretRef | string | `azure-client-secret` | OM_SM_CLIENT_SECRET |
| openmetadata.config.secretsManager.additionalParameters.clientSecret.secretKey | string | `azure-key-secret` | OM_SM_CLIENT_SECRET |
| openmetadata.config.secretsManager.additionalParameters.tenantId.secretRef | string | `azure-tenant-id-secret` | OM_SM_TENANT_ID |
| openmetadata.config.secretsManager.additionalParameters.tenantId.secretKey | string | `azure-key-secret` | OM_SM_TENANT_ID |
| openmetadata.config.secretsManager.additionalParameters.vaultName.secretRef | string | `azure-vault-name-secret` | OM_SM_VAULT_NAME |
| openmetadata.config.secretsManager.additionalParameters.vaultName.secretKey | string | `azure-key-secret` | OM_SM_VAULT_NAME |
| openmetadata.config.secretsManager.additionalParameters.projectId.secretRef | string | `gcp-project-id-secret` | OM_SM_PROJECT_ID |
| openmetadata.config.secretsManager.additionalParameters.projectId.secretKey | string | `gcp-key-secret` | OM_SM_PROJECT_ID |
| openmetadata.config.secretsManager.additionalParameters.region | string | `Empty String` | OM_SM_REGION |
| openmetadata.config.secretsManager.additionalParameters.secretAccessKey.secretRef | string | `aws-secret-access-key-secret` | OM_SM_ACCESS_KEY |
| openmetadata.config.secretsManager.additionalParameters.secretAccessKey.secretKey | string | `aws-key-secret` | OM_SM_ACCESS_KEY |
| openmetadata.config.upgradeMigrationConfigs.debug | bool | `false` | |
| openmetadata.config.upgradeMigrationConfigs.additionalArgs | string | `Empty String` | |
| openmetadata.config.deployPipelinesConfig.debug | bool | `false` | |
| openmetadata.config.deployPipelinesConfig.additionalArgs | string | `Empty String` | |
| openmetadata.config.reindexConfig.debug | bool | `false` | |
| openmetadata.config.reindexConfig.additionalArgs | string | `Empty String` | |
| openmetadata.config.web.enabled | bool | `true` | |
| openmetadata.config.web.contentTypeOptions.enabled | bool | `false` | WEB_CONF_CONTENT_TYPE_OPTIONS_ENABLED |
| openmetadata.config.web.csp.enabled | bool | `false` | WEB_CONF_XSS_CSP_ENABLED |
| openmetadata.config.web.csp.policy | string | `default-src 'self` | WEB_CONF_XSS_CSP_POLICY |
| openmetadata.config.web.csp.reportOnlyPolicy | string | `Empty String` | WEB_CONF_XSS_CSP_REPORT_ONLY_POLICY |
| openmetadata.config.web.frameOptions.enabled | bool | `false` | WEB_CONF_FRAME_OPTION_ENABLED |
| openmetadata.config.web.frameOptions.option | string | `SAMEORIGIN` | WEB_CONF_FRAME_OPTION |
| openmetadata.config.web.frameOptions.origin | string | `Empty String` | WEB_CONF_FRAME_ORIGIN |
| openmetadata.config.web.hsts.enabled | bool | `false` | WEB_CONF_HSTS_ENABLED |
| openmetadata.config.web.hsts.includeSubDomains | bool | `true` | WEB_CONF_HSTS_INCLUDE_SUBDOMAINS |
| openmetadata.config.web.hsts.maxAge | string | `365 days` | WEB_CONF_HSTS_MAX_AGE |
| openmetadata.config.web.hsts.preload | bool | `true` | WEB_CONF_HSTS_PRELOAD |
| openmetadata.config.web.uriPath | string | `/api` | WEB_CONF_URI_PATH |
| openmetadata.config.web.xssProtection.block | bool | `true` | WEB_CONF_XSS_PROTECTION_BLOCK |
| openmetadata.config.web.xssProtection.enabled | bool | `false` | WEB_CONF_XSS_PROTECTION_ENABLED |
| openmetadata.config.web.xssProtection.onXss | bool | `true` | WEB_CONF_XSS_PROTECTION_ON |
| openmetadata.config.web.referrer-policy.enabled | bool | `false` | WEB_CONF_REFERRER_POLICY_ENABLED |
| openmetadata.config.web.referrer-policy.option | string | `SAME_ORIGIN'` | WEB_CONF_REFERRER_POLICY_OPTION |
| openmetadata.config.web.permission-policy.enabled | bool | `false` | WEB_CONF_PERMISSION_POLICY_ENABLED |
| openmetadata.config.web.permission-policy.option | string | `Empty String` | WEB_CONF_PERMISSION_POLICY_OPTION |
| openmetadata.config.rdf.enabled | bool | `false` | RDS_ENABLED |
| openmetadata.config.rdf.baseUri | string | `https://open-metadata.org/` | RDF_BASE_URI |
| openmetadata.config.rdf.storageType | string | `FUSEKI` | RDF_STORAGE_TYPE |
| openmetadata.config.rdf.remoteEndpoint | string | `http://localhost:3030/openmetadata` | RDF_ENDPOINT |
| openmetadata.config.rdf.username | string | `Empty String` | RDF_REMOTE_USERNAME |
| openmetadata.config.rdf.password.secretRef | string | `Empty String` | RDF_REMOTE_PASSWORD |
| openmetadata.config.rdf.password.secretKey | string | `Empty String` | RDF_REMOTE_PASSWORD |
| openmetadata.config.rdf.dataset | string | `Empty String` | RDF_DATASET |
## Chart Values
| Key | Type | Default |
|-----|------|---------|
| affinity | object | `{}` |
| commonLabels | object | `{}` |
| extraEnvs | Extra [environment variables][] which will be appended to the `env:` definition for the container | `[]` |
| extraInitContainers | Templatable string of additional `initContainers` to be passed to `tpl` function | `[]` |
| extraVolumes | Templatable string of additional `volumes` to be passed to the `tpl` function | `[]` |
| extraVolumeMounts | Templatable string of additional `volumeMounts` to be passed to the `tpl` function | `[]` |
| fullnameOverride | string | `"openmetadata"` |
| image.pullPolicy | string | `"Always"` |
| image.repository | string | `"docker.getcollate.io/openmetadata/server"` |
| image.tag | string | `1.12.1` |
| imagePullSecrets | list | `[]` |
| ingress.annotations | object | `{}` |
| ingress.className | string | `""` |
| ingress.enabled | bool | `false` |
| ingress.hosts[0].host | string | `"open-metadata.local"` |
| ingress.hosts[0].paths[0].path | string | `"/"` |
| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` |
| ingress.tls | list | `[]` |
| livenessProbe.initialDelaySeconds | int | `60` |
| livenessProbe.periodSeconds | int | `30` |
| livenessProbe.failureThreshold | int | `5` |
| livenessProbe.httpGet.path | string | `/healthcheck` |
| livenessProbe.httpGet.port | string | `http-admin` |
| nameOverride | string | `""` |
| nodeSelector | object | `{}` |
| podAnnotations | object | `{}` |
| podSecurityContext | object | `{}` |
| readinessProbe.initialDelaySeconds | int | `60` |
| readinessProbe.periodSeconds | int | `30` |
| readinessProbe.failureThreshold | int | `5` |
| readinessProbe.httpGet.path | string | `/` |
| readinessProbe.httpGet.port | string | `http` |
| replicaCount | int | `1` |
| resources | object | `{}` |
| startingDeadlineSeconds | int | `100` |
| testConnection.resources | object | `{}` |
| securityContext | object | `{}` |
| service.adminPort | string | `8586` |
| service.annotations | object | `{}` |
| service.port | int | `8585` |
| service.type | string | `"ClusterIP"` |
| serviceAccount.annotations | object | `{}` |
| serviceAccount.create | bool | `true` |
| serviceAccount.name | string | `nil` |
| automountServiceAccountToken| bool | `true` |
| serviceMonitor.annotations | object | `{}` |
| serviceMonitor.enabled | bool | `false` |
| serviceMonitor.interval | string | `30s` |
| serviceMonitor.labels | object | `{}` |
| sidecars | list | `[]` |
| startupProbe.periodSeconds | int | `60` |
| startupProbe.failureThreshold | int | `5` |
| startupProbe.httpGet.path | string | `/healthcheck` |
| startupProbe.httpGet.port | string | `http-admin` |
| startupProbe.successThreshold | int | `1` |
| tolerations | list | `[]` |
| networkPolicy.enabled | bool |`false` |
| podDisruptionBudget.enabled | bool | `false` |
| podDisruptionBudget.config.maxUnavailable | String | `1` |
| podDisruptionBudget.config.minAvailable | String | `1` |
| openmetadata.config.deployPipelinesConfig.enabled | bool | `true` |
| openmetadata.config.reindexConfig.enabled | bool | `true` |
---
## 🚨 BREAKING CHANGES
### Pipeline Service Client Configuration Restructure (v1.4.0+)
**Important**: The pipeline service client configuration structure has been **completely restructured** to support both Airflow and native Kubernetes Jobs execution.
#### What Changed
The previous flat configuration structure:
```yaml
openmetadata:
config:
pipelineServiceClientConfig:
enabled: true
className: "org.openmetadata.service.clients.pipeline.airflow.AirflowRESTClient"
apiEndpoint: http://openmetadata-dependencies-api-server:8080
# ... other airflow specific configs
```
Has been replaced with a nested structure:
```yaml
openmetadata:
config:
pipelineServiceClientConfig:
enabled: true
type: "airflow" # NEW: choose "airflow" or "k8s"
airflow: # NEW: airflow configs nested here
className: "org.openmetadata.service.clients.pipeline.airflow.AirflowRESTClient"
apiEndpoint: http://openmetadata-dependencies-api-server:8080
# ... other airflow configs
k8s: # NEW: k8s configs for native execution
className: "org.openmetadata.service.clients.pipeline.k8s.K8sPipelineClient"
namespace: "openmetadata-pipelines"
# ... other k8s configs
```
#### Migration Guide
##### For Existing Airflow Users (Recommended)
1. **Update your `values.yaml`** to use the new nested structure:
```yaml
# OLD (will break in v1.4.0+)
openmetadata:
config:
pipelineServiceClientConfig:
enabled: true
className: "org.openmetadata.service.clients.pipeline.airflow.AirflowRESTClient"
apiEndpoint: http://openmetadata-dependencies-api-server:8080
metadataApiEndpoint: http://openmetadata:8585/api
verifySsl: "no-ssl"
# ... other configs
# NEW (v1.4.0+)
openmetadata:
config:
pipelineServiceClientConfig:
enabled: true
type: "airflow" # Explicitly choose airflow
airflow:
className: "org.openmetadata.service.clients.pipeline.airflow.AirflowRESTClient"
apiEndpoint: http://openmetadata-dependencies-api-server:8080
metadataApiEndpoint: http://openmetadata:8585/api
verifySsl: "no-ssl"
# ... move all existing configs under 'airflow:'
```
2. **No infrastructure changes needed** - your existing Airflow setup will continue to work
##### For New Kubernetes Native Users
Use the new Kubernetes Jobs pipeline client for cloud-native execution without Airflow:
```yaml
openmetadata:
config:
pipelineServiceClientConfig:
enabled: true
type: "k8s" # Use native Kubernetes Jobs
k8s:
className: "org.openmetadata.service.clients.pipeline.k8s.K8sPipelineClient"
namespace: "openmetadata-pipelines"
ingestionImage: "docker.getcollate.io/openmetadata/ingestion:latest"
enableFailureDiagnostics: true
# ... see K8s configuration section below
```
#### Configuration Migration Script
For complex deployments, use this script to migrate your values.yaml:
```bash
#!/bin/bash
# migrate-pipeline-config.sh
# Backup original values
cp values.yaml values.yaml.backup
# Migrate configuration (requires yq)
yq eval '
.openmetadata.config.pipelineServiceClientConfig.type = "airflow" |
.openmetadata.config.pipelineServiceClientConfig.airflow = .openmetadata.config.pipelineServiceClientConfig |
del(.openmetadata.config.pipelineServiceClientConfig.enabled) |
del(.openmetadata.config.pipelineServiceClientConfig.type) |
.openmetadata.config.pipelineServiceClientConfig.enabled = true
' values.yaml > values.yaml.migrated
mv values.yaml.migrated values.yaml
```
---
## Kubernetes Native Pipeline Execution
### Overview
OpenMetadata now supports native Kubernetes Jobs execution as an alternative to Apache Airflow. This eliminates the need for a separate Airflow deployment and provides:
- **Simplified Architecture**: No Airflow dependency
- **Cloud-Native**: Leverages Kubernetes Job scheduling
- **Better Resource Management**: Per-pipeline resource allocation
- **Failure Diagnostics**: Automatic pod log collection and error reporting
- **Security**: Pod-level isolation with RBAC
### Configuration
To use Kubernetes native pipeline execution:
```yaml
openmetadata:
config:
pipelineServiceClientConfig:
enabled: true
type: "k8s"
k8s:
# Core configuration
className: "org.openmetadata.service.clients.pipeline.k8s.K8sPipelineClient"
namespace: "openmetadata-pipelines"
ingestionImage: "docker.getcollate.io/openmetadata/ingestion:latest"
# Resource management
resources:
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "500m"
memory: "1Gi"
# Security context
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
runAsNonRoot: true
# Failure diagnostics
enableFailureDiagnostics: true
# Job configuration
ttlSecondsAfterFinished: 86400 # 24 hours
activeDeadlineSeconds: 7200 # 2 hours max runtime
backoffLimit: 3 # retry attempts
```
### K8s Pipeline Configuration Reference
| Parameter | Default | Description |
|-----------|---------|-------------|
| `k8s.namespace` | `openmetadata-pipelines` | Kubernetes namespace for pipeline jobs |
| `k8s.ingestionImage` | `docker.getcollate.io/openmetadata/ingestion:latest` | Container image for ingestion jobs |
| `k8s.imagePullPolicy` | `IfNotPresent` | Image pull policy |
| `k8s.imagePullSecrets` | `""` | Image pull secrets (comma-separated) |
| `k8s.serviceAccountName` | `openmetadata-ingestion` | Service account for ingestion jobs |
| `k8s.ttlSecondsAfterFinished` | `86400` | Time to keep completed jobs (24h) |
| `k8s.activeDeadlineSeconds` | `7200` | Maximum job runtime (2h) |
| `k8s.backoffLimit` | `3` | Maximum retry attempts |
| `k8s.successfulJobsHistoryLimit` | `3` | Keep last N successful jobs |
| `k8s.failedJobsHistoryLimit` | `3` | Keep last N failed jobs |
| `k8s.enableFailureDiagnostics` | `true` | Enable automatic failure analysis |
### RBAC and Security
The chart automatically creates the required RBAC resources when using `type: "k8s"`:
- **Namespace**: `openmetadata-pipelines` (or configured namespace)
- **ServiceAccount**: `openmetadata-ingestion`
- **Role**: Permissions for Jobs, CronJobs, ConfigMaps, Secrets, Pods, Events
- **RoleBinding**: Binds the role to the service account
### Failure Diagnostics
When enabled, the K8s pipeline client automatically:
1. **Detects job failures** in real-time
2. **Creates diagnostic jobs** that gather failure information
3. **Collects pod logs** (last 500 lines) from failed containers
4. **Gathers pod status** including exit codes and termination reasons
5. **Fetches Kubernetes events** related to the failed pod
6. **Updates pipeline status** in OpenMetadata with comprehensive diagnostics
Example diagnostic output:
```yaml
failures:
- name: "Main Container Diagnostics"
error: "Kubernetes job failed - check logs for details"
stackTrace: |
Pod Description:
Pod: om-pipeline-postgres-abc123
Status: Failed
Container Statuses:
ingestion: Ready=false, RestartCount=0
State: Terminated - Reason: Error, ExitCode: 1
Pod Logs:
2024-01-07 16:30:15,123 INFO Starting ingestion pipeline...
2024-01-07 16:30:16,456 ERROR Failed to connect to database
...
```
### Migration from Airflow to K8s
To migrate from Airflow to Kubernetes native execution:
1. **Update configuration** to use `type: "k8s"`
2. **Deploy the updated chart** - RBAC resources will be created automatically
3. **Test with a simple pipeline** to verify functionality
4. **Gradually migrate pipelines** or switch completely
5. **Remove Airflow dependencies** when no longer needed
### Comparison: Airflow vs K8s Native
| Aspect | Airflow | K8s Native |
|--------|---------|------------|
| **Dependencies** | Requires separate Airflow deployment | No external dependencies |
| **Resource Usage** | Always-on Airflow webserver + scheduler | On-demand job execution |
| **Scaling** | Airflow worker scaling | Kubernetes node scaling |
| **Monitoring** | Airflow UI + OpenMetadata | OpenMetadata + kubectl |
| **Debugging** | Airflow logs + OpenMetadata | Pod logs + diagnostics in OpenMetadata |
| **Security** | Airflow RBAC + K8s RBAC | K8s RBAC only |
| **Maintenance** | Airflow upgrades + configuration | Minimal (K8s Job API stable) |
### Troubleshooting K8s Pipelines
Common issues and solutions:
```bash
# Check pipeline jobs
kubectl get jobs -n openmetadata-pipelines
# View job logs
kubectl logs -n openmetadata-pipelines job/om-pipeline-<name>-<runId>
# Check service account permissions
kubectl auth can-i create jobs \
--as=system:serviceaccount:openmetadata-pipelines:openmetadata-ingestion \
-n openmetadata-pipelines
# View RBAC resources
kubectl get serviceaccounts,roles,rolebindings \
-n openmetadata-pipelines \
-l app.kubernetes.io/component=ingestion
```
@@ -0,0 +1,97 @@
openmetadata:
config:
authorizer:
className: "org.openmetadata.service.security.DefaultAuthorizer"
containerRequestFilter: "org.openmetadata.service.security.JwtFilter"
initialAdmins: # john.doe from john.doe@example.com
- "admin"
- "paasup"
principalDomain: "paasup.io" # Update with your Domain,The primary domain for the organization (example.com from john.doe@example.com).
allowedDomains:
- "paasup.io"
authentication:
provider: "basic"
# HTTPS로 변경: 프론트엔드가 외부 HTTPS URL로 JWT 검증
callbackUrl: "https://open-metadata.example.org/callback"
authority: "https://open-metadata.example.org"
publicKeys:
- "https://open-metadata.example.org/api/v1/system/config/jwks"
# OIDC 연동 (비활성화)
clientType: confidential
provider: "custom-oidc"
publicKeys:
- "https://open-metadata.example.org/api/v1/system/config/jwks"
- "https://keycloak.example.org/realms/paasup/protocol/openid-connect/certs"
clientId: "open-metadata"
callbackUrl: "https://open-metadata.example.org/callback"
jwtPrincipalClaims:
- "email"
- "preferred_username"
- "sub"
oidcConfiguration:
enabled: true
oidcType: "Keycloak"
clientId:
secretRef: oidc-secrets
secretKey: openmetadata-oidc-client-id
clientSecret:
secretRef: oidc-secrets
secretKey: openmetadata-oidc-client-secret
discoveryUri: "https://keycloak.example.org/realms/paasup/.well-known/openid-configuration"
serverUrl: "https://open-metadata.example.org"
callbackUrl: "https://open-metadata.example.org/callback"
tokenValidity: "3600"
sessionExpiry: "604800"
ingress:
enabled: true
className: "kong"
annotations:
cert-manager.io/cluster-issuer: root-ca-issuer
cert-manager.io/duration: 8760h
cert-manager.io/renew-before: 720h
# HTTPS 활성화: Kong이 TLS 종료 후 HTTP로 pod에 전달
konghq.com/protocols: https
konghq.com/https-redirect-status-code: "301"
# cookie-secure-modifier 제거: forward-headers-strategy=NATIVE로 Spring Boot가 자동 처리
# konghq.com/plugins: openmetadata-cors
hosts:
- host: open-metadata.example.org
paths:
- path: /
pathType: ImplementationSpecific
tls:
- secretName: openmetadata-tls
hosts:
- open-metadata.example.org
extraVolumes:
- name: java-truststore
secret:
secretName: java-truststore
extraVolumeMounts:
- name: java-truststore
mountPath: /etc/ssl/java
readOnly: true
resources: {}
# limits:
# cpu: 1
# memory: 2048Mi
# requests:
# cpu: 500m
# memory: 1024Mi
extraEnvs:
- name: OPENMETADATA_OPTS
value: >
-Djavax.net.ssl.trustStore=/etc/ssl/java/cacerts
-Djavax.net.ssl.trustStorePassword=changeit
- name: LOG_LEVEL
value: "INFO"
- name: "OPENMETADATA_PUBLIC_URL"
value: "https://open-metadata.example.org"
@@ -0,0 +1,22 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "OpenMetadata.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "OpenMetadata.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "OpenMetadata.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "OpenMetadata.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8585 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8585:$CONTAINER_PORT
{{- end }}
@@ -0,0 +1,12 @@
{{/*
Renders a value that contains template.
Usage:
{{ include "tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }}
*/}}
{{- define "tplvalues.render" -}}
{{- if typeIs "string" .value }}
{{- tpl .value .context }}
{{- else }}
{{- tpl (.value | toYaml) .context }}
{{- end }}
{{- end -}}
@@ -0,0 +1,391 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "OpenMetadata.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "OpenMetadata.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "OpenMetadata.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "OpenMetadata.labels" -}}
{{- with .Values.commonLabels }}
{{ toYaml .}}
{{- end }}
helm.sh/chart: {{ include "OpenMetadata.chart" . }}
{{ include "OpenMetadata.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "OpenMetadata.selectorLabels" -}}
app.kubernetes.io/name: {{ include "OpenMetadata.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "OpenMetadata.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "OpenMetadata.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" (tpl .Values.serviceAccount.name .) }}
{{- end }}
{{- end }}
{{/*
Quoted Array of strings with base64 encoding
*/}}
{{- define "OpenMetadata.commaJoinedQuotedEncodedList" }}
{{- $list := list }}
{{- range .value }}
{{- $list = append $list (. | quote ) }}
{{- end }}
{{- $list := join "," $list | toString }}
{{- $list := printf "[%s]" $list }}
{{- $list | b64enc }}
{{- end -}}
{{/*
Build the OpenMetadata Migration Command */}}
{{- define "OpenMetadata.buildUpgradeCommand" }}
command:
- "/bin/bash"
- "-c"
{{- if .Values.openmetadata.config.upgradeMigrationConfigs.debug }}
- "/opt/openmetadata/bootstrap/openmetadata-ops.sh -d migrate {{ .Values.openmetadata.config.upgradeMigrationConfigs.additionalArgs }}"
{{- else }}
- "/opt/openmetadata/bootstrap/openmetadata-ops.sh migrate {{ .Values.openmetadata.config.upgradeMigrationConfigs.additionalArgs }}"
{{- end }}
{{- end }}
{{/*
Warning to update openmetadata global keyword to openmetadata.config */}}
{{- define "error-message" }}
{{- printf "Error: %s" . | fail }}
{{- end }}
{{/*
Function to check if passed value is empty string or null value */}}
{{- define "OpenMetadata.utils.checkEmptyString" -}}
{{- if or (empty .) (eq . "") -}}
{{- false -}}
{{- else -}}
{{- true -}}
{{- end -}}
{{- end -}}
{{/*
OpenMetadata Configurations AWS Additional Parameters Environment Variables for Secret Manager*/}}
{{- define "OpenMetadata.configs.secretManager.aws.additionalParameters" -}}
{{- with .Values.openmetadata.config.secretsManager.additionalParameters.accessKeyId }}
{{- if .secretRef }}
- name: OM_SM_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- with .Values.openmetadata.config.secretsManager.additionalParameters.secretAccessKey }}
{{- if .secretRef }}
- name: OM_SM_ACCESS_KEY
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- end -}}
{{/*
OpenMetadata Configurations Azure Additional Parameters Environment Variables for Secret Manager
*/}}
{{- define "OpenMetadata.configs.secretManager.azure.additionalParameters" -}}
{{- with .Values.openmetadata.config.secretsManager.additionalParameters.clientId }}
{{- if .secretRef }}
- name: OM_SM_CLIENT_ID
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- with .Values.openmetadata.config.secretsManager.additionalParameters.clientSecret }}
{{- if .secretRef }}
- name: OM_SM_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- with .Values.openmetadata.config.secretsManager.additionalParameters.tenantId }}
{{- if .secretRef }}
- name: OM_SM_TENANT_ID
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- with .Values.openmetadata.config.secretsManager.additionalParameters.vaultName }}
{{- if .secretRef }}
- name: OM_SM_VAULT_NAME
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- end -}}
{{/*
OpenMetadata Configurations GCP Additional Parameters Environment Variables for Secret Manager
*/}}
{{- define "OpenMetadata.configs.secretManager.gcp.additionalParameters" -}}
{{- with .Values.openmetadata.config.secretsManager.additionalParameters.projectId }}
{{- if .secretRef }}
- name: OM_SM_PROJECT_ID
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- end -}}
{{/*
OpenMetadata Configurations Environment Variables*/}}
{{- define "OpenMetadata.configs" -}}
{{- if .Values.openmetadata.config.fernetkey.secretRef -}}
{{- with .Values.openmetadata.config.fernetkey -}}
- name: FERNET_KEY
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if and (eq .Values.openmetadata.config.authentication.clientType "confidential") (.Values.openmetadata.config.authentication.oidcConfiguration.enabled) }}
{{- with .Values.openmetadata.config.authentication.oidcConfiguration.clientId }}
- name: OIDC_CLIENT_ID
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- with .Values.openmetadata.config.authentication.oidcConfiguration.clientSecret }}
- name: OIDC_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if eq .Values.openmetadata.config.authentication.provider "ldap" }}
{{- if .Values.openmetadata.config.authentication.ldapConfiguration.dnAdminPassword.secretRef }}
{{- with .Values.openmetadata.config.authentication.ldapConfiguration.dnAdminPassword }}
- name: AUTHENTICATION_LOOKUP_ADMIN_PWD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if and ( eq .Values.openmetadata.config.authentication.ldapConfiguration.truststoreConfigType "CustomTrustStore" ) ( .Values.openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFilePassword.secretRef ) }}
{{- with .Values.openmetadata.config.authentication.ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFilePassword }}
- name: AUTHENTICATION_LDAP_KEYSTORE_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- end }}
{{- if eq .Values.openmetadata.config.authentication.provider "saml" }}
{{- if .Values.openmetadata.config.authentication.saml.idp.idpX509Certificate.secretRef }}
{{- with .Values.openmetadata.config.authentication.saml.idp.idpX509Certificate }}
- name: SAML_IDP_CERTIFICATE
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.authentication.saml.sp.spX509Certificate.secretRef }}
{{- with .Values.openmetadata.config.authentication.saml.sp.spX509Certificate }}
- name: SAML_SP_CERTIFICATE
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.authentication.saml.sp.spPrivateKey.secretRef }}
{{- with .Values.openmetadata.config.authentication.saml.sp.spPrivateKey }}
- name: SAML_SP_PRIVATE_KEY
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.authentication.saml.security.wantAssertionEncrypted }}
# Key Store should only be considered if wantAssertionEncrypted will be true
{{- if .Values.openmetadata.config.authentication.saml.security.keyStoreAlias.secretRef }}
{{- with .Values.openmetadata.config.authentication.saml.security.keyStoreAlias }}
- name: SAML_KEYSTORE_ALIAS
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.authentication.saml.security.keyStorePassword.secretRef }}
{{- with .Values.openmetadata.config.authentication.saml.security.keyStorePassword }}
- name: SAML_KEYSTORE_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- if and ( .Values.openmetadata.config.elasticsearch.auth.enabled ) ( .Values.openmetadata.config.elasticsearch.auth.password.secretRef ) }}
{{- with .Values.openmetadata.config.elasticsearch.auth.password }}
- name: ELASTICSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if and ( .Values.openmetadata.config.elasticsearch.trustStore.enabled ) ( .Values.openmetadata.config.elasticsearch.trustStore.password.secretRef ) }}
{{- with .Values.openmetadata.config.elasticsearch.trustStore.password }}
- name: ELASTICSEARCH_TRUST_STORE_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.database.auth.password.secretRef }}
{{- with .Values.openmetadata.config.database.auth.password }}
- name: DB_USER_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- $pipelineConfig := .Values.openmetadata.config.pipelineServiceClientConfig }}
{{- $authConfig := dict }}
{{- if and $pipelineConfig.type (eq $pipelineConfig.type "airflow") }}
{{- $authConfig = $pipelineConfig.airflow.auth | default dict }}
{{- else }}
{{- $authConfig = $pipelineConfig.auth | default dict }}
{{- end }}
{{- if and ($pipelineConfig.enabled | default true) ($authConfig.enabled | default false) }}
{{- if $authConfig.password.secretRef }}
{{- with $authConfig.password }}
- name: AIRFLOW_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- if $authConfig.trustStorePassword.secretRef }}
{{- with $authConfig.trustStorePassword }}
- name: AIRFLOW_TRUST_STORE_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.secretsManager.additionalParameters.enabled }}
{{- if has .Values.openmetadata.config.secretsManager.provider (list "aws" "aws-ssm" "managed-aws" "managed-aws-ssm") }}
{{ include "OpenMetadata.configs.secretManager.aws.additionalParameters" . }}
{{- end }}
{{- if has .Values.openmetadata.config.secretsManager.provider (list "managed-azure-kv" "azure-kv") }}
{{ include "OpenMetadata.configs.secretManager.azure.additionalParameters" . }}
{{- end }}
{{- if has .Values.openmetadata.config.secretsManager.provider (list "gcp") }}
{{ include "OpenMetadata.configs.secretManager.gcp.additionalParameters" . }}
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.rdf.enabled }}
{{- if .Values.openmetadata.config.rdf.password.secretRef }}
{{- with .Values.openmetadata.config.rdf.password }}
- name: RDF_REMOTE_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .secretRef }}
key: {{ .secretKey }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Build the OpenMetadata Deploy Pipelines Command using deployPipelinesConfig */}}
{{- define "OpenMetadata.buildDeployPipelinesCommand" }}
- "/bin/bash"
- "-c"
{{- if .Values.openmetadata.config.deployPipelinesConfig.debug }}
- "/opt/openmetadata/bootstrap/openmetadata-ops.sh -d deploy-pipelines {{ default "" .Values.openmetadata.config.deployPipelinesConfig.additionalArgs }}"
{{- else }}
- "/opt/openmetadata/bootstrap/openmetadata-ops.sh deploy-pipelines {{ default "" .Values.openmetadata.config.deployPipelinesConfig.additionalArgs }}"
{{- end }}
{{- end }}
{{/*
Build the OpenMetadata Deploy Pipelines Command using reindexConfig */}}
{{- define "OpenMetadata.buildReindexCommand" }}
- "/bin/bash"
- "-c"
{{- if .Values.openmetadata.config.reindexConfig.debug }}
- "/opt/openmetadata/bootstrap/openmetadata-ops.sh -d reindex {{ default "" .Values.openmetadata.config.reindexConfig.additionalArgs }}"
{{- else }}
- "/opt/openmetadata/bootstrap/openmetadata-ops.sh reindex {{ default "" .Values.openmetadata.config.reindexConfig.additionalArgs }}"
{{- end }}
{{- end }}
@@ -0,0 +1,136 @@
{{- if .Values.openmetadata.config.deployPipelinesConfig.enabled }}
apiVersion: batch/v1
kind: CronJob
metadata:
name: cron-deploy-pipelines
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
{{- with .Values.deploymentAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
suspend: true
failedJobsHistoryLimit: 1
successfulJobsHistoryLimit: 1
jobTemplate:
metadata:
name: cron-deploy-pipelines
spec:
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 12 }}
{{- end }}
labels:
{{- include "OpenMetadata.labels" . | nindent 12 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 12 }}
{{- end }}
serviceAccountName: {{ include "OpenMetadata.serviceAccountName" . }}
{{- if not (.Values.automountServiceAccountToken) }}
automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
{{- end }}
{{- with .Values.podSecurityContext }}
securityContext:
{{- toYaml . | nindent 12 }}
{{- end }}
volumes:
{{- include "tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 12 }}
containers:
- name: cron-deploy-pipelines
{{- with .Values.securityContext }}
securityContext:
{{- toYaml . | nindent 14 }}
{{- end }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
volumeMounts:
{{- with .Values.extraVolumeMounts }}
{{- toYaml . | nindent 12 }}
{{- end }}
command:
{{ include "OpenMetadata.buildDeployPipelinesCommand" . | nindent 12 }}
env:
{{- include "OpenMetadata.configs" . | nindent 12 }}
{{- with .Values.extraEnvs }}
{{- toYaml . | nindent 12 }}
{{- end }}
envFrom:
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-config-secret
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-omd-secret
{{- if .Values.openmetadata.config.database.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-db-secret
{{- end }}
{{- if .Values.openmetadata.config.elasticsearch.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-search-secret
{{- end }}
{{- if .Values.openmetadata.config.authorizer.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authorizer-secret
{{- end }}
{{- if .Values.openmetadata.config.secretsManager.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-secretsmanager-secret
{{- end }}
{{- if .Values.openmetadata.config.web.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-web-secret
{{- end }}
{{- if .Values.openmetadata.config.authentication.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authentication-secret
{{- end }}
{{- if .Values.openmetadata.config.eventMonitor.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-eventmonitor-secret
{{- end }}
{{- if .Values.openmetadata.config.pipelineServiceClientConfig.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-pipeline-secret
{{- end }}
{{- if .Values.openmetadata.config.jwtTokenConfiguration.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-jwt-secret
{{- end }}
{{- with .Values.openmetadata.config.fernetkey }}
{{- if not .secretRef }}
- secretRef:
name: {{ include "OpenMetadata.fullname" $ }}-fernetkey-secret
{{- end }}
{{- end }}
{{- with .Values.envFrom }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.resources }}
resources:
{{- toYaml . | nindent 14 }}
{{- end }}
{{- if .Values.sidecars }}
{{- include "tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 10 }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 12 }}
{{- end }}
restartPolicy: OnFailure
schedule: "0/5 * * * *"
{{- if ne .Values.startingDeadlineSeconds nil }}
startingDeadlineSeconds: {{ .Values.startingDeadlineSeconds }}
{{- end }}
{{- end }}
@@ -0,0 +1,136 @@
{{- if .Values.openmetadata.config.reindexConfig.enabled }}
apiVersion: batch/v1
kind: CronJob
metadata:
name: cron-reindex
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
{{- with .Values.deploymentAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
suspend: true
failedJobsHistoryLimit: 1
successfulJobsHistoryLimit: 1
jobTemplate:
metadata:
name: cron-reindex
spec:
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 12 }}
{{- end }}
labels:
{{- include "OpenMetadata.labels" . | indent 12 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 12 }}
{{- end }}
serviceAccountName: {{ include "OpenMetadata.serviceAccountName" . }}
{{- if not (.Values.automountServiceAccountToken) }}
automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
{{- end }}
{{- with .Values.podSecurityContext }}
securityContext:
{{- toYaml . | nindent 12 }}
{{- end }}
volumes:
{{- include "tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 12 }}
containers:
- name: cron-reindex
{{- with .Values.securityContext }}
securityContext:
{{- toYaml . | nindent 14 }}
{{- end }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
volumeMounts:
{{- with .Values.extraVolumeMounts }}
{{- toYaml . | nindent 12 }}
{{- end }}
command:
{{ include "OpenMetadata.buildReindexCommand" . | nindent 12 }}
env:
{{- include "OpenMetadata.configs" . | nindent 12 }}
{{- with .Values.extraEnvs }}
{{- toYaml . | nindent 12 }}
{{- end }}
envFrom:
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-config-secret
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-omd-secret
{{- if .Values.openmetadata.config.database.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-db-secret
{{- end }}
{{- if .Values.openmetadata.config.elasticsearch.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-search-secret
{{- end }}
{{- if .Values.openmetadata.config.authorizer.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authorizer-secret
{{- end }}
{{- if .Values.openmetadata.config.secretsManager.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-secretsmanager-secret
{{- end }}
{{- if .Values.openmetadata.config.web.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-web-secret
{{- end }}
{{- if .Values.openmetadata.config.authentication.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authentication-secret
{{- end }}
{{- if .Values.openmetadata.config.eventMonitor.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-eventmonitor-secret
{{- end }}
{{- if .Values.openmetadata.config.pipelineServiceClientConfig.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-pipeline-secret
{{- end }}
{{- if .Values.openmetadata.config.jwtTokenConfiguration.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-jwt-secret
{{- end }}
{{- with .Values.openmetadata.config.fernetkey }}
{{- if not .secretRef }}
- secretRef:
name: {{ include "OpenMetadata.fullname" $ }}-fernetkey-secret
{{- end }}
{{- end }}
{{- with .Values.envFrom }}
{{- toYaml . | nindent 14 }}
{{- end }}
{{- with .Values.resources }}
resources:
{{- toYaml . | nindent 14 }}
{{- end }}
{{- if .Values.sidecars }}
{{- include "tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 10 }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 12 }}
{{- end }}
restartPolicy: OnFailure
schedule: "0/5 * * * *"
{{- if ne .Values.startingDeadlineSeconds nil }}
startingDeadlineSeconds: {{ .Values.startingDeadlineSeconds }}
{{- end }}
{{- end }}
@@ -0,0 +1,350 @@
{{- if .Values.omjobOperator.enabled }}
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: cronomjobs.pipelines.openmetadata.org
spec:
group: pipelines.openmetadata.org
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
schedule:
type: string
description: "Cron schedule expression"
timeZone:
type: string
description: "Time zone for the schedule (default UTC)"
default: "UTC"
suspend:
type: boolean
description: "Whether to suspend scheduling"
default: false
startingDeadlineSeconds:
type: integer
description: "Deadline for starting the job if missed"
successfulJobsHistoryLimit:
type: integer
description: "Number of successful jobs to keep"
default: 3
failedJobsHistoryLimit:
type: integer
description: "Number of failed jobs to keep"
default: 3
omJobSpec:
type: object
description: "OMJob template to create for each scheduled run"
properties:
mainPodSpec:
type: object
description: "Pod specification for the main ingestion job"
properties:
image:
type: string
description: "Container image for the ingestion job"
imagePullPolicy:
type: string
description: "Image pull policy"
enum: ["Always", "Never", "IfNotPresent"]
default: "IfNotPresent"
imagePullSecrets:
type: array
items:
type: object
properties:
name:
type: string
serviceAccountName:
type: string
description: "Service account name for the pod"
command:
type: array
items:
type: string
description: "Command to execute in the container"
env:
type: array
items:
type: object
properties:
name:
type: string
description: "Name of the environment variable"
value:
type: string
description: "Direct value of the environment variable"
valueFrom:
type: object
description: "Source for the environment variable value"
properties:
configMapKeyRef:
type: object
description: "Reference to a key in a ConfigMap"
properties:
name:
type: string
description: "Name of the ConfigMap"
key:
type: string
description: "Key in the ConfigMap"
optional:
type: boolean
description: "Whether the ConfigMap must exist"
required:
- name
- key
secretKeyRef:
type: object
description: "Reference to a key in a Secret"
properties:
name:
type: string
description: "Name of the Secret"
key:
type: string
description: "Key in the Secret"
optional:
type: boolean
description: "Whether the Secret must exist"
required:
- name
- key
fieldRef:
type: object
description: "Reference to a field in the pod"
properties:
apiVersion:
type: string
description: "API version of the field reference"
fieldPath:
type: string
description: "Path to the field"
required:
- fieldPath
resourceFieldRef:
type: object
description: "Reference to a resource field"
properties:
containerName:
type: string
description: "Name of the container"
resource:
type: string
description: "Resource to select"
divisor:
type: string
description: "Divisor for the resource"
required:
- resource
required:
- name
resources:
type: object
properties:
requests:
type: object
additionalProperties:
type: string
limits:
type: object
additionalProperties:
type: string
description: "Resource requirements for the container"
nodeSelector:
type: object
additionalProperties:
type: string
securityContext:
type: object
x-kubernetes-preserve-unknown-fields: true
description: "Security context for the pod"
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
required: ["image", "serviceAccountName", "command"]
exitHandlerSpec:
type: object
description: "Pod specification for the exit handler job (runs after main pod completes)"
properties:
image:
type: string
description: "Container image for the exit handler"
imagePullPolicy:
type: string
description: "Image pull policy"
enum: ["Always", "Never", "IfNotPresent"]
default: "IfNotPresent"
command:
type: array
items:
type: string
description: "Command to execute in the exit handler container"
env:
type: array
items:
type: object
properties:
name:
type: string
description: "Name of the environment variable"
value:
type: string
description: "Direct value of the environment variable"
valueFrom:
type: object
description: "Source for the environment variable value"
properties:
configMapKeyRef:
type: object
description: "Reference to a key in a ConfigMap"
properties:
name:
type: string
description: "Name of the ConfigMap"
key:
type: string
description: "Key in the ConfigMap"
optional:
type: boolean
description: "Whether the ConfigMap must exist"
required:
- name
- key
secretKeyRef:
type: object
description: "Reference to a key in a Secret"
properties:
name:
type: string
description: "Name of the Secret"
key:
type: string
description: "Key in the Secret"
optional:
type: boolean
description: "Whether the Secret must exist"
required:
- name
- key
fieldRef:
type: object
description: "Reference to a field in the pod"
properties:
apiVersion:
type: string
description: "API version of the field reference"
fieldPath:
type: string
description: "Path to the field"
required:
- fieldPath
resourceFieldRef:
type: object
description: "Reference to a resource field"
properties:
containerName:
type: string
description: "Name of the container"
resource:
type: string
description: "Resource to select"
divisor:
type: string
description: "Divisor for the resource"
required:
- resource
required:
- name
resources:
type: object
properties:
requests:
type: object
additionalProperties:
type: string
limits:
type: object
additionalProperties:
type: string
description: "Resource requirements for the exit handler container"
serviceAccountName:
type: string
description: "Service account name for the exit handler pod"
nodeSelector:
type: object
additionalProperties:
type: string
imagePullSecrets:
type: array
items:
type: object
properties:
name:
type: string
securityContext:
type: object
x-kubernetes-preserve-unknown-fields: true
description: "Security context for the exit handler pod"
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
required: ["image", "command"]
ttlSecondsAfterFinished:
type: integer
description: "Time in seconds to keep pods after completion"
default: 86400
required: ["mainPodSpec"]
required: ["schedule", "omJobSpec"]
status:
type: object
properties:
lastScheduleTime:
type: string
format: date-time
description: "Last time the CronOMJob was scheduled"
lastOMJobName:
type: string
description: "Name of the last OMJob created"
message:
type: string
description: "Human-readable message about the current status"
subresources:
status: {}
additionalPrinterColumns:
- name: Schedule
type: string
jsonPath: .spec.schedule
- name: Suspended
type: boolean
jsonPath: .spec.suspend
- name: Last Schedule
type: date
jsonPath: .status.lastScheduleTime
- name: Age
type: date
jsonPath: .metadata.creationTimestamp
scope: Namespaced
names:
plural: cronomjobs
singular: cronomjob
kind: CronOMJob
shortNames:
- comj
{{- end }}
@@ -0,0 +1,221 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "OpenMetadata.fullname" . }}
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.deploymentAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if not .Values.hpa.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "OpenMetadata.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "OpenMetadata.labels" . | indent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "OpenMetadata.serviceAccountName" . }}
{{- if not (.Values.automountServiceAccountToken) }}
automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
{{- end }}
{{- with .Values.podSecurityContext }}
securityContext:
{{- toYaml . | nindent 8 }}
{{- end }}
initContainers:
{{- with .Values.preMigrateInitContainers }}
{{- toYaml . | nindent 6 }}
{{- end }}
- name: run-db-migrations
{{- with .Values.securityContext }}
securityContext:
{{- toYaml . | nindent 10 }}
{{- end }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
{{ include "OpenMetadata.buildUpgradeCommand" . | nindent 8 }}
volumeMounts:
{{- with .Values.extraVolumeMounts }}
{{- toYaml . | nindent 10 }}
{{- end }}
{{- with .Values.resources }}
resources:
{{- toYaml . | nindent 10 }}
{{- end }}
envFrom:
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-config-secret
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-omd-secret
{{- if .Values.openmetadata.config.database.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-db-secret
{{- end }}
{{- if .Values.openmetadata.config.elasticsearch.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-search-secret
{{- end }}
{{- if .Values.openmetadata.config.authorizer.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authorizer-secret
{{- end }}
{{- if .Values.openmetadata.config.secretsManager.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-secretsmanager-secret
{{- end }}
{{- if .Values.openmetadata.config.web.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-web-secret
{{- end }}
{{- if .Values.openmetadata.config.authentication.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authentication-secret
{{- end }}
{{- if .Values.openmetadata.config.eventMonitor.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-eventmonitor-secret
{{- end }}
{{- if .Values.openmetadata.config.pipelineServiceClientConfig.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-pipeline-secret
{{- end }}
{{- if .Values.openmetadata.config.jwtTokenConfiguration.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-jwt-secret
{{- end }}
{{- with .Values.openmetadata.config.fernetkey }}
{{- if not .secretRef }}
- secretRef:
name: {{ include "OpenMetadata.fullname" $ }}-fernetkey-secret
{{- end }}
{{- end }}
{{- if .Values.openmetadata.config.rdf.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-rdf-secret
{{- end }}
{{- with .Values.envFrom }}
{{- toYaml . | nindent 10 }}
{{- end }}
env:
{{- include "OpenMetadata.configs" . | nindent 8 }}
{{- with .Values.extraEnvs }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.extraInitContainers }}
{{- toYaml . | nindent 6 }}
{{- end }}
volumes:
{{- include "tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
{{- with .Values.securityContext }}
securityContext:
{{- toYaml . | nindent 12 }}
{{- end }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
volumeMounts:
{{- with .Values.extraVolumeMounts }}
{{- toYaml . | nindent 10 }}
{{- end }}
ports:
- name: http
containerPort: {{ .Values.openmetadata.config.openmetadata.port }}
protocol: TCP
- name: http-admin
containerPort: {{ .Values.openmetadata.config.openmetadata.adminPort }}
protocol: TCP
livenessProbe:
{{ .Values.livenessProbe | toYaml | indent 12 | trim }}
readinessProbe:
{{ .Values.readinessProbe | toYaml | indent 12 | trim }}
startupProbe:
{{ .Values.startupProbe | toYaml | indent 12 | trim }}
env:
{{- include "OpenMetadata.configs" . | nindent 10 }}
{{- with .Values.extraEnvs }}
{{- toYaml . | nindent 10 }}
{{- end }}
envFrom:
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-config-secret
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-omd-secret
{{- if .Values.openmetadata.config.database.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-db-secret
{{- end }}
{{- if .Values.openmetadata.config.elasticsearch.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-search-secret
{{- end }}
{{- if .Values.openmetadata.config.authorizer.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authorizer-secret
{{- end }}
{{- if .Values.openmetadata.config.secretsManager.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-secretsmanager-secret
{{- end }}
{{- if .Values.openmetadata.config.web.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-web-secret
{{- end }}
{{- if .Values.openmetadata.config.authentication.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-authentication-secret
{{- end }}
{{- if .Values.openmetadata.config.eventMonitor.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-eventmonitor-secret
{{- end }}
{{- if .Values.openmetadata.config.pipelineServiceClientConfig.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-pipeline-secret
{{- end }}
{{- if .Values.openmetadata.config.jwtTokenConfiguration.enabled }}
- secretRef:
name: {{ include "OpenMetadata.fullname" . }}-jwt-secret
{{- end }}
{{- with .Values.openmetadata.config.fernetkey }}
{{- if not .secretRef }}
- secretRef:
name: {{ include "OpenMetadata.fullname" $ }}-fernetkey-secret
{{- end }}
{{- end }}
{{- with .Values.envFrom }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.resources }}
resources:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- if .Values.sidecars }}
{{- include "tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 8 }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
@@ -0,0 +1,25 @@
{{- if .Values.hpa.enabled -}}
apiVersion: {{ .Values.hpa.apiVersion }}
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "OpenMetadata.fullname" . }}-hpa
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "OpenMetadata.fullname" . }}
minReplicas: {{ .Values.hpa.minReplicas }}
maxReplicas: {{ .Values.hpa.maxReplicas }}
{{- with .Values.hpa.behavior }}
behavior:
{{- toYaml . | nindent 4 }}
{{- end }}
metrics:
{{- toYaml .Values.hpa.metrics | nindent 4 }}
{{- end }}
@@ -0,0 +1,64 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "OpenMetadata.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
{{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- if semverCompare "=<1.13-0" $.Capabilities.KubeVersion.GitVersion }}
datree.skip/K8S_DEPRECATED_APIVERSION_1.16: "Ignore that deprecation in old kubernetes instances"
{{- end -}}
{{- end }}
spec:
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
ingressClassName: {{ .Values.ingress.className }}
{{- end }}
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
pathType: {{ .pathType }}
{{- end }}
backend:
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
service:
name: {{ $fullName }}
port:
number: {{ $svcPort }}
{{- else }}
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
@@ -0,0 +1,133 @@
{{- if and .Values.openmetadata.config.pipelineServiceClientConfig.enabled (eq .Values.openmetadata.config.pipelineServiceClientConfig.type "k8s") }}
{{- $namespace := .Release.Namespace }}
{{- if .Values.openmetadata.config.pipelineServiceClientConfig.k8s.rbac.enabled }}
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.serviceAccountName }}
namespace: {{ $namespace }}
labels:
app.kubernetes.io/name: openmetadata
app.kubernetes.io/component: ingestion
{{- include "OpenMetadata.labels" . | nindent 4 }}
annotations:
{{- if .Values.serviceAccount.annotations }}
{{- toYaml .Values.serviceAccount.annotations | nindent 4 }}
{{- end }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.serviceAccountName }}
namespace: {{ $namespace }}
labels:
app.kubernetes.io/name: openmetadata
app.kubernetes.io/component: ingestion
{{- include "OpenMetadata.labels" . | nindent 4 }}
rules:
# Pod management for pipeline jobs and diagnostics
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
# ConfigMaps for pipeline configuration
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
# Secrets for pipeline credentials
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
# Events for diagnostics (optional - failure diagnostics will work without this)
- apiGroups: [""]
resources: ["events"]
verbs: ["get", "list"]
# Jobs and CronJobs management
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.serviceAccountName }}
namespace: {{ $namespace }}
labels:
app.kubernetes.io/name: openmetadata
app.kubernetes.io/component: ingestion
{{- include "OpenMetadata.labels" . | nindent 4 }}
subjects:
- kind: ServiceAccount
name: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.serviceAccountName }}
namespace: {{ $namespace }}
roleRef:
kind: Role
name: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.serviceAccountName }}
apiGroup: rbac.authorization.k8s.io
---
# Cross-namespace Role for OpenMetadata server to manage pipeline jobs
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: openmetadata-server-pipeline-manager
namespace: {{ $namespace }}
labels:
app.kubernetes.io/name: openmetadata
app.kubernetes.io/component: server
{{- include "OpenMetadata.labels" . | nindent 4 }}
rules:
# Pod management for pipeline jobs and diagnostics
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
# ConfigMaps for pipeline configuration
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
# Secrets for pipeline credentials
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
# Events for diagnostics (optional - failure diagnostics will work without this)
- apiGroups: [""]
resources: ["events"]
verbs: ["get", "list"]
# Jobs and CronJobs management
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
# OMJob management for K8s pipeline client
- apiGroups: ["pipelines.openmetadata.org"]
resources: ["omjobs"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["pipelines.openmetadata.org"]
resources: ["omjobs/status"]
verbs: ["get", "patch"]
# CronOMJob management for K8s pipeline client (scheduled jobs)
- apiGroups: ["pipelines.openmetadata.org"]
resources: ["cronomjobs"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["pipelines.openmetadata.org"]
resources: ["cronomjobs/status"]
verbs: ["get", "patch"]
---
# RoleBinding for OpenMetadata server to manage pipeline resources
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: openmetadata-server-pipeline-manager
namespace: {{ $namespace }}
labels:
app.kubernetes.io/name: openmetadata
app.kubernetes.io/component: server
{{- include "OpenMetadata.labels" . | nindent 4 }}
subjects:
- kind: ServiceAccount
name: {{ include "OpenMetadata.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
roleRef:
kind: Role
name: openmetadata-server-pipeline-manager
apiGroup: rbac.authorization.k8s.io
{{- end }}
{{- end }}
@@ -0,0 +1,24 @@
{{- if .Values.networkPolicy.enabled }}
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: {{ include "OpenMetadata.fullname" . }}-networkpolicy
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
podSelector:
matchLabels: {{- include "OpenMetadata.selectorLabels" . | nindent 6 }}
policyTypes:
- Ingress
# Allow inbound connections
ingress:
- ports:
- port: {{ .Values.service.port }}
protocol: TCP
- port: {{ .Values.service.adminPort }}
protocol: TCP
{{- end }}
@@ -0,0 +1,337 @@
{{- if .Values.omjobOperator.enabled }}
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: omjobs.pipelines.openmetadata.org
spec:
group: pipelines.openmetadata.org
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
mainPodSpec:
type: object
description: "Pod specification for the main ingestion job"
properties:
image:
type: string
description: "Container image for the ingestion job"
imagePullPolicy:
type: string
description: "Image pull policy"
enum: ["Always", "Never", "IfNotPresent"]
default: "IfNotPresent"
imagePullSecrets:
type: array
items:
type: object
properties:
name:
type: string
serviceAccountName:
type: string
description: "Service account name for the pod"
command:
type: array
items:
type: string
description: "Command to execute in the container"
env:
type: array
items:
type: object
properties:
name:
type: string
description: "Name of the environment variable"
value:
type: string
description: "Direct value of the environment variable"
valueFrom:
type: object
description: "Source for the environment variable value"
properties:
configMapKeyRef:
type: object
description: "Reference to a key in a ConfigMap"
properties:
name:
type: string
description: "Name of the ConfigMap"
key:
type: string
description: "Key in the ConfigMap"
optional:
type: boolean
description: "Whether the ConfigMap must exist"
required:
- name
- key
secretKeyRef:
type: object
description: "Reference to a key in a Secret"
properties:
name:
type: string
description: "Name of the Secret"
key:
type: string
description: "Key in the Secret"
optional:
type: boolean
description: "Whether the Secret must exist"
required:
- name
- key
fieldRef:
type: object
description: "Reference to a field in the pod"
properties:
apiVersion:
type: string
description: "API version of the field reference"
fieldPath:
type: string
description: "Path to the field"
required:
- fieldPath
resourceFieldRef:
type: object
description: "Reference to a resource field"
properties:
containerName:
type: string
description: "Name of the container"
resource:
type: string
description: "Resource to select"
divisor:
type: string
description: "Divisor for the resource"
required:
- resource
required:
- name
resources:
type: object
properties:
requests:
type: object
additionalProperties:
type: string
limits:
type: object
additionalProperties:
type: string
description: "Resource requirements for the container"
nodeSelector:
type: object
additionalProperties:
type: string
securityContext:
type: object
x-kubernetes-preserve-unknown-fields: true
description: "Security context for the pod"
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
required: ["image", "serviceAccountName", "command"]
exitHandlerSpec:
type: object
description: "Pod specification for the exit handler job (runs after main pod completes)"
properties:
image:
type: string
description: "Container image for the exit handler"
imagePullPolicy:
type: string
description: "Image pull policy"
enum: ["Always", "Never", "IfNotPresent"]
default: "IfNotPresent"
command:
type: array
items:
type: string
description: "Command to execute in the exit handler container"
env:
type: array
items:
type: object
properties:
name:
type: string
description: "Name of the environment variable"
value:
type: string
description: "Direct value of the environment variable"
valueFrom:
type: object
description: "Source for the environment variable value"
properties:
configMapKeyRef:
type: object
description: "Reference to a key in a ConfigMap"
properties:
name:
type: string
description: "Name of the ConfigMap"
key:
type: string
description: "Key in the ConfigMap"
optional:
type: boolean
description: "Whether the ConfigMap must exist"
required:
- name
- key
secretKeyRef:
type: object
description: "Reference to a key in a Secret"
properties:
name:
type: string
description: "Name of the Secret"
key:
type: string
description: "Key in the Secret"
optional:
type: boolean
description: "Whether the Secret must exist"
required:
- name
- key
fieldRef:
type: object
description: "Reference to a field in the pod"
properties:
apiVersion:
type: string
description: "API version of the field reference"
fieldPath:
type: string
description: "Path to the field"
required:
- fieldPath
resourceFieldRef:
type: object
description: "Reference to a resource field"
properties:
containerName:
type: string
description: "Name of the container"
resource:
type: string
description: "Resource to select"
divisor:
type: string
description: "Divisor for the resource"
required:
- resource
required:
- name
resources:
type: object
properties:
requests:
type: object
additionalProperties:
type: string
limits:
type: object
additionalProperties:
type: string
description: "Resource requirements for the exit handler container"
serviceAccountName:
type: string
description: "Service account name for the exit handler pod"
nodeSelector:
type: object
additionalProperties:
type: string
imagePullSecrets:
type: array
items:
type: object
properties:
name:
type: string
securityContext:
type: object
x-kubernetes-preserve-unknown-fields: true
description: "Security context for the exit handler pod"
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
required: ["image", "command"]
ttlSecondsAfterFinished:
type: integer
description: "Time in seconds to keep pods after completion"
default: 86400
required: ["mainPodSpec"]
status:
type: object
properties:
phase:
type: string
description: "Current phase of the OMJob"
enum: ["Pending", "Running", "ExitHandlerRunning", "Succeeded", "Failed"]
mainPodName:
type: string
description: "Name of the main pod"
exitHandlerPodName:
type: string
description: "Name of the exit handler pod"
startTime:
type: string
format: date-time
description: "Time when the job started"
completionTime:
type: string
format: date-time
description: "Time when the job completed"
message:
type: string
description: "Human-readable message about the current status"
mainPodExitCode:
type: integer
description: "Exit code of the main pod"
subresources:
status: {}
additionalPrinterColumns:
- name: Phase
type: string
jsonPath: .status.phase
- name: Main Pod
type: string
jsonPath: .status.mainPodName
- name: Exit Handler
type: string
jsonPath: .status.exitHandlerPodName
- name: Age
type: date
jsonPath: .metadata.creationTimestamp
scope: Namespaced
names:
plural: omjobs
singular: omjob
kind: OMJob
shortNames:
- omj
{{- end }}
@@ -0,0 +1,44 @@
{{- if .Values.omjobOperator.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator-config
namespace: {{ .Release.Namespace | quote }}
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: omjob-operator
data:
operator.yaml: |
# Operator configuration
reconciliation:
interval: 10s # How often to reconcile OMJobs
retryDelay: 30s # Delay before retrying failed reconciliation
# Pod cleanup settings
cleanup:
ttlSecondsAfterFinished: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.ttlSecondsAfterFinished | default 604800 }}
preserveFailedPods: true # Keep failed pods for debugging
# Exit handler configuration (image and command come from OMJob spec)
exitHandler:
timeout: 120 # Seconds to wait for exit handler to complete
defaultResources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
# Security context defaults (matches openmetadata.yaml structure)
securityContext:
runAsNonRoot: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.runAsNonRoot | default true }}
runAsUser: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.runAsUser | default 1000 }}
runAsGroup: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.runAsGroup | default 1000 }}
fsGroup: {{ .Values.openmetadata.config.pipelineServiceClientConfig.k8s.fsGroup | default 1000 }}
# Logging configuration
logging:
level: INFO
format: json
{{- end }}
@@ -0,0 +1,69 @@
{{- if .Values.omjobOperator.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator
namespace: {{ .Release.Namespace | quote }}
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: omjob-operator
spec:
replicas: 1
selector:
matchLabels:
{{- include "OpenMetadata.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: omjob-operator
template:
metadata:
labels:
{{- include "OpenMetadata.selectorLabels" . | nindent 8 }}
app.kubernetes.io/component: omjob-operator
spec:
serviceAccountName: {{ include "OpenMetadata.fullname" . }}-omjob-operator
containers:
- name: operator
image: "{{ .Values.omjobOperator.image.repository }}:{{ .Values.omjobOperator.image.tag }}"
imagePullPolicy: {{ .Values.omjobOperator.image.pullPolicy }}
env:
- name: OPERATOR_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: LOG_LEVEL
value: {{ .Values.omjobOperator.env.logLevel | quote }}
- name: RECONCILIATION_THREADS
value: {{ .Values.omjobOperator.env.reconciliationThreads | quote }}
- name: HEALTH_CHECK_PORT
value: {{ .Values.omjobOperator.env.healthCheckPort | quote }}
- name: METRICS_PORT
value: {{ .Values.omjobOperator.env.metricsPort | quote }}
- name: WATCH_NAMESPACES
value: {{ .Values.omjobOperator.env.watchNamespaces | quote }}
- name: POLLING_INTERVAL_SECONDS
value: {{ .Values.omjobOperator.env.pollingIntervalSeconds | quote }}
- name: REQUEUE_DELAY_SECONDS
value: {{ .Values.omjobOperator.env.requeueDelaySeconds | quote }}
ports:
- name: health
containerPort: {{ .Values.omjobOperator.env.healthCheckPort }}
protocol: TCP
- name: metrics
containerPort: {{ .Values.omjobOperator.env.metricsPort }}
protocol: TCP
resources:
{{- toYaml .Values.omjobOperator.resources | nindent 10 }}
{{- if and .Values.omjobOperator.healthCheck (.Values.omjobOperator.healthCheck.enabled | default false) }}
livenessProbe:
httpGet:
path: /health
port: health
initialDelaySeconds: 30
periodSeconds: 30
readinessProbe:
httpGet:
path: /health
port: health
initialDelaySeconds: 10
periodSeconds: 10
{{- end }}
{{- end }}
@@ -0,0 +1,239 @@
{{- if .Values.omjobOperator.enabled }}
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator
namespace: {{ .Release.Namespace | quote }}
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: omjob-operator
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: omjob-operator
rules:
# OMJob CRD access (cluster-scoped)
- apiGroups:
- pipelines.openmetadata.org
resources:
- omjobs
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- pipelines.openmetadata.org
resources:
- omjobs/status
verbs:
- get
- update
- patch
# CronOMJob CRD access (cluster-scoped)
- apiGroups:
- pipelines.openmetadata.org
resources:
- cronomjobs
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- pipelines.openmetadata.org
resources:
- cronomjobs/status
verbs:
- get
- update
- patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: omjob-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator
subjects:
- kind: ServiceAccount
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator
namespace: {{ .Release.Namespace | quote }}
{{- if and .Values.omjobOperator.env.watchNamespaces (ne .Values.omjobOperator.env.watchNamespaces "ALL") }}
{{- $watchNamespaces := splitList "," .Values.omjobOperator.env.watchNamespaces }}
{{- range $namespace := $watchNamespaces }}
{{- $trimmedNamespace := trim $namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ include "OpenMetadata.fullname" $ }}-omjob-operator
namespace: {{ $trimmedNamespace | quote }}
labels:
{{- include "OpenMetadata.labels" $ | nindent 4 }}
app.kubernetes.io/component: omjob-operator
rules:
# Pod management in watched namespace
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- ""
resources:
- pods/status
verbs:
- get
- watch
- apiGroups:
- ""
resources:
- pods/log
verbs:
- get
# Events for debugging
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
# ConfigMaps for configuration
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- list
- watch
# Secrets for credentials
- apiGroups:
- ""
resources:
- secrets
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ include "OpenMetadata.fullname" $ }}-omjob-operator
namespace: {{ $trimmedNamespace | quote }}
labels:
{{- include "OpenMetadata.labels" $ | nindent 4 }}
app.kubernetes.io/component: omjob-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ include "OpenMetadata.fullname" $ }}-omjob-operator
subjects:
- kind: ServiceAccount
name: {{ include "OpenMetadata.fullname" $ }}-omjob-operator
namespace: {{ $.Release.Namespace | quote }}
{{- end }}
{{- else }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator-resources
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: omjob-operator
rules:
# Pod management for all namespaces mode
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- ""
resources:
- pods/status
verbs:
- get
- watch
- apiGroups:
- ""
resources:
- pods/log
verbs:
- get
# Events for debugging
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
# ConfigMaps for configuration
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- list
- watch
# Secrets for credentials
- apiGroups:
- ""
resources:
- secrets
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator-resources
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: omjob-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator-resources
subjects:
- kind: ServiceAccount
name: {{ include "OpenMetadata.fullname" . }}-omjob-operator
namespace: {{ .Release.Namespace | quote }}
{{- end }}
{{- end }}
@@ -0,0 +1,67 @@
{{- if and .Values.omjobOperator.enabled .Values.omjobOperator.createSample }}
# This is a sample OMJob resource for testing purposes
# It will be created only if omjobOperator.createSample is true
apiVersion: pipelines.openmetadata.org/v1
kind: OMJob
metadata:
name: sample-omjob
namespace: {{ .Release.Namespace | quote }}
labels:
{{- include "OpenMetadata.labels" . | nindent 4 }}
app.kubernetes.io/component: sample-omjob
spec:
# Container image for the ingestion job
image: {{ .Values.pipelineServiceClient.ingestionImage }}
imagePullPolicy: IfNotPresent
# Service account with necessary permissions
serviceAccountName: {{ .Values.pipelineServiceClient.serviceAccountName }}
# Command to execute
command:
- python
- -c
- |
import time
print("Sample OMJob starting...")
time.sleep(10)
print("Sample OMJob completing successfully")
# Environment variables (normally would include pipeline config)
env:
- name: pipelineType
value: "sample"
- name: pipelineRunId
value: "sample-run-001"
- name: LOG_LEVEL
value: "INFO"
# Resource requirements
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
# TTL for pod cleanup (24 hours)
ttlSecondsAfterFinished: 86400
# Security context
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
# Labels to apply to pods
labels:
app.kubernetes.io/name: openmetadata
app.kubernetes.io/component: ingestion
app.kubernetes.io/pipeline-type: sample
# Annotations for monitoring
annotations:
description: "Sample OMJob for testing operator functionality"
{{- end }}
@@ -0,0 +1,20 @@
{{- if .Values.podDisruptionBudget.enabled }}
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: {{ include "OpenMetadata.fullname" . }}-poddisruptionbudget
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
spec:
{{- with .Values.podDisruptionBudget.config }}
{{- if .minAvailable }}
minAvailable: {{ .minAvailable }}
{{- end }}
{{- if .maxUnavailable }}
maxUnavailable: {{ .maxUnavailable }}
{{- end }}
{{- end }}
selector:
matchLabels:
{{- include "OpenMetadata.selectorLabels" . | nindent 6 }}
{{- end }}
@@ -0,0 +1,28 @@
{{- if .Values.route.enabled }}
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: {{ include "OpenMetadata.fullname" . }}
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.route.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.route.host }}
host: {{ .Values.route.host }}
{{- end }}
to:
kind: Service
name: {{ include "OpenMetadata.fullname" . }}
weight: 100
port:
targetPort: http
{{- if .Values.route.tls.enabled }}
tls:
termination: {{ .Values.route.tls.termination }}
insecureEdgeTerminationPolicy: {{ .Values.route.tls.insecureEdgeTerminationPolicy }}
{{- end }}
wildcardPolicy: {{ .Values.route.wildcardPolicy }}
{{- end }}
@@ -0,0 +1,396 @@
# Below block is required to create a secret for application once pre-upgrade helm hooks are applied.
---
{{- if not .Values.openmetadata.config.fernetkey.secretRef }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-fernetkey-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.fernetkey }}
FERNET_KEY: {{ .value | b64enc | quote }}
{{ end }}
{{ end }}
{{- if .Values.openmetadata.config.database.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-db-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.database }}
DB_HOST: {{ .host | b64enc }}
DB_PORT: {{ .port | toString | b64enc }}
DB_DRIVER_CLASS: {{ .driverClass | b64enc }}
DB_SCHEME: {{ .dbScheme | b64enc }}
OM_DATABASE: {{ .databaseName | b64enc }}
DB_PARAMS: {{ .dbParams | b64enc | quote }}
DB_USER: {{ .auth.username | b64enc }}
DB_CONNECTION_POOL_MAX_SIZE: {{ .maxSize | quote | b64enc }}
DB_CONNECTION_POOL_MIN_SIZE: {{ .minSize | quote | b64enc }}
DB_CONNECTION_POOL_INITIAL_SIZE: {{ .initialSize | quote | b64enc }}
DB_CONNECTION_CHECK_CONNECTION_WHILE_IDLE: {{ .checkConnectionWhileIdle | quote | b64enc }}
DB_CONNECTION_CHECK_CONNECTION_ON_BORROW: {{ .checkConnectionOnBorrow | quote | b64enc }}
DB_CONNECTION_EVICTION_INTERVAL: {{ .evictionInterval | quote | b64enc }}
DB_CONNECTION_MIN_IDLE_TIME: {{ .minIdleTime | quote | b64enc }}
{{ end }}
{{ end }}
{{- if .Values.openmetadata.config.elasticsearch.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-search-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.elasticsearch }}
ELASTICSEARCH_HOST: {{ .host | quote | b64enc }}
SEARCH_TYPE: {{ .searchType | quote | b64enc }}
ELASTICSEARCH_PORT: {{ .port | quote | b64enc }}
ELASTICSEARCH_SCHEME: {{ .scheme | quote | b64enc }}
ELASTICSEARCH_INDEX_MAPPING_LANG: {{ .searchIndexMappingLanguage | quote| b64enc }}
ELASTICSEARCH_KEEP_ALIVE_TIMEOUT_SECS: {{ .keepAliveTimeoutSecs | quote | b64enc }}
ELASTICSEARCH_CLUSTER_ALIAS: {{ .clusterAlias | quote | b64enc }}
ELASTICSEARCH_PAYLOAD_BYTES_SIZE: {{ .payLoadSize | int | toString | b64enc }}
{{- if .trustStore.enabled }}
ELASTICSEARCH_TRUST_STORE_PATH: {{ .trustStore.path | b64enc }}
{{ end }}
{{- if .auth.enabled }}
ELASTICSEARCH_USER: {{ .auth.username | quote | b64enc }}
{{ end }}
{{ end }}
{{ end }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-pipeline-secret
type: Opaque
data:
{{- if .Values.openmetadata.config.pipelineServiceClientConfig.enabled }}
{{- with .Values.openmetadata.config.pipelineServiceClientConfig }}
PIPELINE_SERVICE_CLIENT_ENABLED: {{ .enabled | quote | b64enc }}
# Common configuration for all pipeline service clients
SERVER_HOST_API_URL: {{ .metadataApiEndpoint | b64enc }}
{{- if eq .type "airflow" }}
# Airflow configuration
{{- with .airflow }}
PIPELINE_SERVICE_CLIENT_CLASS_NAME: {{ .className | quote | b64enc }}
PIPELINE_SERVICE_CLIENT_ENDPOINT: {{ .apiEndpoint | b64enc }}
PIPELINE_SERVICE_CLIENT_VERIFY_SSL: {{ .verifySsl | quote | b64enc }}
PIPELINE_SERVICE_IP_INFO_ENABLED: {{ .ingestionIpInfoEnabled | quote | b64enc }}
PIPELINE_SERVICE_CLIENT_HEALTH_CHECK_INTERVAL: {{ .healthCheckInterval | quote | b64enc }}
PIPELINE_SERVICE_CLIENT_SSL_CERT_PATH: {{ .sslCertificatePath | quote | b64enc }}
{{- if eq (include "OpenMetadata.utils.checkEmptyString" .hostIp) "true" }}
PIPELINE_SERVICE_CLIENT_HOST_IP: {{ .hostIp | quote | b64enc }}
{{- end }}
{{- if .auth.enabled }}
AIRFLOW_USERNAME: {{ .auth.username | b64enc }}
AIRFLOW_TRUST_STORE_PATH: {{ .auth.trustStorePath | quote | b64enc }}
{{- end }}
{{- end }}
{{- else if eq .type "k8s" }}
# Kubernetes Jobs configuration
{{- with .k8s }}
PIPELINE_SERVICE_CLIENT_CLASS_NAME: {{ .className | quote | b64enc }}
K8S_NAMESPACE: {{ $.Release.Namespace | quote | b64enc }}
K8S_INGESTION_IMAGE: {{ .ingestionImage | quote | b64enc }}
K8S_IMAGE_PULL_POLICY: {{ .imagePullPolicy | quote | b64enc }}
K8S_IMAGE_PULL_SECRETS: {{ .imagePullSecrets | quote | b64enc }}
K8S_SERVICE_ACCOUNT_NAME: {{ .serviceAccountName | quote | b64enc }}
K8S_TTL_SECONDS_AFTER_FINISHED: {{ .ttlSecondsAfterFinished | quote | b64enc }}
K8S_ACTIVE_DEADLINE_SECONDS: {{ .activeDeadlineSeconds | quote | b64enc }}
K8S_BACKOFF_LIMIT: {{ .backoffLimit | quote | b64enc }}
K8S_SUCCESS_JOBS_HISTORY_LIMIT: {{ .successfulJobsHistoryLimit | quote | b64enc }}
K8S_FAILED_JOBS_HISTORY_LIMIT: {{ .failedJobsHistoryLimit | quote | b64enc }}
K8S_NODE_SELECTOR: {{ .nodeSelector | quote | b64enc }}
K8S_RUN_AS_USER: {{ .securityContext.runAsUser | quote | b64enc }}
K8S_RUN_AS_GROUP: {{ .securityContext.runAsGroup | quote | b64enc }}
K8S_FS_GROUP: {{ .securityContext.fsGroup | quote | b64enc }}
K8S_RUN_AS_NON_ROOT: {{ .securityContext.runAsNonRoot | quote | b64enc }}
K8S_LIMITS_CPU: {{ .resources.limits.cpu | quote | b64enc }}
K8S_LIMITS_MEMORY: {{ .resources.limits.memory | quote | b64enc }}
K8S_REQUESTS_CPU: {{ .resources.requests.cpu | quote | b64enc }}
K8S_REQUESTS_MEMORY: {{ .resources.requests.memory | quote | b64enc }}
K8S_POD_ANNOTATIONS: {{ .podAnnotations | quote | b64enc }}
{{- if .extraEnvVars }}
K8S_EXTRA_ENV_VARS: {{ .extraEnvVars | toJson | b64enc }}
{{- else }}
K8S_EXTRA_ENV_VARS: {{ "[]" | b64enc }}
{{- end }}
K8S_ENABLE_FAILURE_DIAGNOSTICS: {{ .enableFailureDiagnostics | quote | b64enc }}
USE_OMJOB_OPERATOR: {{ .useOMJobOperator | quote | b64enc }}
{{- end }}
{{- end }}
{{ end }}
{{- else }}
PIPELINE_SERVICE_CLIENT_ENABLED: {{ .Values.openmetadata.config.pipelineServiceClientConfig.enabled | quote | b64enc }}
{{- end }}
{{- if .Values.openmetadata.config.authorizer.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-authorizer-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.authorizer }}
AUTHORIZER_CLASS_NAME: {{ .className | quote | b64enc }}
AUTHORIZER_REQUEST_FILTER: {{ .containerRequestFilter | quote | b64enc }}
AUTHORIZER_PRINCIPAL_DOMAIN: {{ .principalDomain | quote | b64enc }}
AUTHORIZER_ENFORCE_PRINCIPAL_DOMAIN: {{ .enforcePrincipalDomain | quote | b64enc }}
AUTHORIZER_ENABLE_SECURE_SOCKET: {{ .enableSecureSocketConnection | quote | b64enc }}
AUTHORIZER_ADMIN_PRINCIPALS: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .initialAdmins ) }}
AUTHORIZER_ALLOWED_DOMAINS: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .allowedDomains) }}
AUTHORIZER_ALLOWED_REGISTRATION_DOMAIN: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .allowedEmailRegistrationDomains) }}
AUTHORIZER_USE_ROLES_FROM_PROVIDER: {{ .useRolesFromProvider | quote | b64enc }}
{{ end }}
{{ end }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-omd-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.openmetadata }}
SERVER_HOST: {{ .host | b64enc }}
SERVER_PORT: {{ .port | quote | b64enc }}
SERVER_ADMIN_PORT: {{ .adminPort | quote | b64enc }}
SERVER_MAX_THREADS: {{ .maxThreads | quote | b64enc }}
SERVER_MIN_THREADS: {{ .minThreads | quote | b64enc }}
SERVER_IDLE_THREAD_TIMEOUT: {{ .idleThreadTimeout | quote | b64enc }}
{{- end }}
{{- $aiProxyState := dict "enabled" false }}
{{- with .Values.collate }}
{{- with .aiProxy }}
{{- $_ := set $aiProxyState "enabled" (default false .enabled) }}
{{- end }}
{{- end }}
{{- if $aiProxyState.enabled }}
AI_PLATFORM_ENABLED: dHJ1ZQo=
AI_CHAT_PREVIEW: ZmFsc2U=
{{- else }}
AI_PLATFORM_ENABLED: ZmFsc2U=
AI_CHAT_PREVIEW: dHJ1ZQo=
{{ end }}
{{- if .Values.openmetadata.config.secretsManager.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-secretsmanager-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.secretsManager }}
SECRET_MANAGER: {{ .provider | quote | b64enc }}
SECRET_MANAGER_PREFIX: {{ .prefix | quote | b64enc }}
SECRET_MANAGER_TAGS: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .tags) }}
{{- if .additionalParameters.enabled }}
OM_SM_REGION: {{ .additionalParameters.region | quote | b64enc }}
{{ end }}
{{ end }}
{{ end }}
{{- if .Values.openmetadata.config.jwtTokenConfiguration.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-jwt-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.jwtTokenConfiguration }}
RSA_PUBLIC_KEY_FILE_PATH: {{ .rsapublicKeyFilePath | quote | b64enc }}
RSA_PRIVATE_KEY_FILE_PATH: {{ .rsaprivateKeyFilePath | quote | b64enc }}
JWT_ISSUER: {{ .jwtissuer | quote | b64enc }}
JWT_KEY_ID: {{ .keyId | quote | b64enc }}
{{ end }}
{{ end }}
{{- if .Values.openmetadata.config.web.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-web-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.web }}
WEB_CONF_URI_PATH: {{ .uriPath | quote | b64enc }}
WEB_CONF_HSTS_ENABLED: {{ .hsts.enabled | quote | b64enc }}
WEB_CONF_HSTS_MAX_AGE: {{ .hsts.maxAge | quote | b64enc }}
WEB_CONF_HSTS_INCLUDE_SUBDOMAINS: {{ .hsts.includeSubDomains | quote | b64enc }}
WEB_CONF_HSTS_PRELOAD: {{ .hsts.preload | quote | b64enc }}
WEB_CONF_FRAME_OPTION_ENABLED: {{ .frameOptions.enabled | quote | b64enc }}
WEB_CONF_FRAME_OPTION: {{ .frameOptions.option | quote | b64enc }}
WEB_CONF_FRAME_ORIGIN: {{ .frameOptions.origin | quote | b64enc }}
WEB_CONF_CONTENT_TYPE_OPTIONS_ENABLED: {{ .contentTypeOptions.enabled | quote | b64enc }}
WEB_CONF_XSS_PROTECTION_ENABLED: {{ .xssProtection.enabled | quote | b64enc }}
WEB_CONF_XSS_PROTECTION_ON: {{ .xssProtection.onXss | quote | b64enc }}
WEB_CONF_XSS_PROTECTION_BLOCK: {{ .xssProtection.block | quote | b64enc }}
WEB_CONF_XSS_CSP_ENABLED: {{ .csp.enabled | quote | b64enc }}
WEB_CONF_XSS_CSP_POLICY: {{ .csp.policy | quote | b64enc }}
WEB_CONF_XSS_CSP_REPORT_ONLY_POLICY: {{ .csp.reportOnlyPolicy | quote | b64enc }}
WEB_CONF_REFERRER_POLICY_ENABLED: {{ .referrerPolicy.enabled | quote | b64enc }}
WEB_CONF_REFERRER_POLICY_OPTION: {{ .referrerPolicy.option | quote | b64enc }}
WEB_CONF_PERMISSION_POLICY_ENABLED: {{ .permissionPolicy.enabled | quote | b64enc }}
WEB_CONF_PERMISSION_POLICY_OPTION: {{ .permissionPolicy.option | quote | b64enc }}
WEB_CONF_CACHE_CONTROL: {{ .cacheControl | quote | b64enc }}
WEB_CONF_PRAGMA: {{ .pragma | quote | b64enc }}
{{ end }}
{{ end }}
{{- if .Values.openmetadata.config.authentication.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-authentication-secret
type: Opaque
data:
AUTHENTICATION_PUBLIC_KEYS: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .Values.openmetadata.config.authentication.publicKeys) }}
AUTHENTICATION_JWT_PRINCIPAL_CLAIMS: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .Values.openmetadata.config.authentication.jwtPrincipalClaims) }}
{{- if .Values.openmetadata.config.authentication.jwtPrincipalClaimsMapping }}
AUTHENTICATION_JWT_PRINCIPAL_CLAIMS_MAPPING: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .Values.openmetadata.config.authentication.jwtPrincipalClaimsMapping) }}
{{- end }}
{{- with .Values.openmetadata.config.authentication }}
AUTHENTICATION_PROVIDER: {{ .provider | quote | b64enc }}
AUTHENTICATION_RESPONSE_TYPE: {{ .responseType | quote | b64enc }}
AUTHENTICATION_AUTHORITY: {{ .authority | quote | b64enc }}
AUTHENTICATION_CLIENT_ID: {{ .clientId | quote | b64enc }}
AUTHENTICATION_CLIENT_TYPE: {{ .clientType | quote | b64enc }}
AUTHENTICATION_CALLBACK_URL: {{ .callbackUrl | quote | b64enc }}
AUTHENTICATION_ENABLE_SELF_SIGNUP: {{ .enableSelfSignup | quote | b64enc }}
{{- if and (eq .clientType "confidential") (.oidcConfiguration.enabled) }}
OIDC_TYPE: {{ .oidcConfiguration.oidcType | quote | b64enc }}
OIDC_SCOPE: {{ .oidcConfiguration.scope | quote | b64enc }}
OIDC_DISCOVERY_URI: {{ .oidcConfiguration.discoveryUri | quote | b64enc }}
OIDC_USE_NONCE: {{ .oidcConfiguration.useNonce | quote | b64enc }}
OIDC_PREFERRED_JWS: {{ .oidcConfiguration.preferredJwsAlgorithm | quote | b64enc }}
OIDC_RESPONSE_TYPE: {{ .oidcConfiguration.responseType | quote | b64enc }}
OIDC_PROMPT_TYPE: {{ .oidcConfiguration.promptType | quote | b64enc }}
OIDC_DISABLE_PKCE: {{ .oidcConfiguration.disablePkce | quote | b64enc }}
OIDC_CALLBACK: {{ .oidcConfiguration.callbackUrl | quote | b64enc }}
OIDC_SERVER_URL: {{ .oidcConfiguration.serverUrl | quote | b64enc }}
OIDC_CLIENT_AUTH_METHOD: {{ .oidcConfiguration.clientAuthenticationMethod | quote | b64enc }}
OIDC_TENANT: {{ .oidcConfiguration.tenant | quote | b64enc }}
OIDC_MAX_CLOCK_SKEW: {{ .oidcConfiguration.maxClockSkew | quote | b64enc }}
OIDC_OM_REFRESH_TOKEN_VALIDITY: {{ .oidcConfiguration.tokenValidity | quote | b64enc }}
OIDC_CUSTOM_PARAMS: {{ .oidcConfiguration.customParams | b64enc }}
OIDC_MAX_AGE: {{ .oidcConfiguration.maxAge | quote | b64enc }}
OIDC_SESSION_EXPIRY: {{ .oidcConfiguration.sessionExpiry | quote | b64enc }}
{{ end }}
{{- if eq .provider "ldap" }}
AUTHENTICATION_LDAP_HOST: {{ .ldapConfiguration.host | b64enc }}
AUTHENTICATION_LDAP_PORT: {{ .ldapConfiguration.port | quote | b64enc }}
AUTHENTICATION_LOOKUP_ADMIN_DN: {{ .ldapConfiguration.dnAdminPrincipal | quote | b64enc }}
AUTHENTICATION_USER_LOOKUP_BASEDN: {{ .ldapConfiguration.userBaseDN | quote | b64enc }}
AUTHENTICATION_GROUP_LOOKUP_BASEDN: {{ .ldapConfiguration.groupBaseDN | quote | b64enc }}
AUTHENTICATION_USER_ROLE_ADMIN_NAME: {{ .ldapConfiguration.roleAdminName | quote | b64enc }}
AUTHENTICATION_USER_ALL_ATTR: {{ .ldapConfiguration.allAttributeName | quote | b64enc }}
AUTHENTICATION_USER_NAME_ATTR: {{ .ldapConfiguration.usernameAttributeName | quote | b64enc }}
AUTHENTICATION_USER_GROUP_ATTR: {{ .ldapConfiguration.groupAttributeName | quote | b64enc }}
AUTHENTICATION_USER_GROUP_ATTR_VALUE: {{ .ldapConfiguration.groupAttributeValue | quote | b64enc }}
AUTHENTICATION_USER_GROUP_MEMBER_ATTR: {{ .ldapConfiguration.groupMemberAttributeName | quote | b64enc }}
AUTH_ROLES_MAPPING: {{ .ldapConfiguration.authRolesMapping | quote | b64enc }}
AUTH_REASSIGN_ROLES: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .ldapConfiguration.authReassignRoles) }}
AUTHENTICATION_USER_MAIL_ATTR: {{ .ldapConfiguration.mailAttributeName | quote | b64enc }}
AUTHENTICATION_LDAP_POOL_SIZE: {{ .ldapConfiguration.maxPoolSize | quote | b64enc }}
AUTHENTICATION_LDAP_SSL_ENABLED: {{ .ldapConfiguration.sslEnabled | quote | b64enc }}
AUTHENTICATION_LDAP_TRUSTSTORE_TYPE: {{ .ldapConfiguration.truststoreConfigType | quote | b64enc }}
{{- if eq .ldapConfiguration.truststoreConfigType "CustomTrustStore" }}
AUTHENTICATION_LDAP_TRUSTSTORE_PATH: {{ .ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFilePath | quote | b64enc }}
AUTHENTICATION_LDAP_SSL_KEY_FORMAT: {{ .ldapConfiguration.trustStoreConfig.customTrustManagerConfig.trustStoreFileFormat | quote | b64enc }}
AUTHENTICATION_LDAP_SSL_VERIFY_CERT_HOST: {{ .ldapConfiguration.trustStoreConfig.customTrustManagerConfig.verifyHostname | quote | b64enc }}
AUTHENTICATION_LDAP_EXAMINE_VALIDITY_DATES: {{ .ldapConfiguration.trustStoreConfig.customTrustManagerConfig.examineValidityDates | quote | b64enc }}
{{ end }}
{{- if eq .ldapConfiguration.truststoreConfigType "HostName" }}
AUTHENTICATION_LDAP_ALLOW_WILDCARDS: {{ .ldapConfiguration.trustStoreConfig.hostNameConfig.allowWildCards | quote | b64enc }}
AUTHENTICATION_LDAP_ALLOWED_HOSTNAMES: {{ .ldapConfiguration.trustStoreConfig.hostNameConfig.acceptableHostNames | b64enc}}
{{ end }}
{{- if eq .ldapConfiguration.truststoreConfigType "JVMDefault" }}
AUTHENTICATION_LDAP_SSL_VERIFY_CERT_HOST: {{ .ldapConfiguration.trustStoreConfig.jvmDefaultConfig.verifyHostname | quote | b64enc }}
{{ end }}
{{- if eq .ldapConfiguration.truststoreConfigType "TrustAll" }}
AUTHENTICATION_LDAP_EXAMINE_VALIDITY_DATES: {{ .ldapConfiguration.trustStoreConfig.trustAllConfig.examineValidityDates | quote | b64enc }}
{{ end }}
{{ end }}
{{- if eq .provider "saml" }}
SAML_DEBUG_MODE: {{ .saml.debugMode | quote | b64enc }}
SAML_IDP_ENTITY_ID: {{ .saml.idp.entityId | quote | b64enc }}
SAML_IDP_SSO_LOGIN_URL: {{ .saml.idp.ssoLoginUrl | quote | b64enc }}
SAML_AUTHORITY_URL: {{ .saml.idp.authorityUrl | quote | b64enc }}
SAML_IDP_NAME_ID: {{ .saml.idp.nameId | quote | b64enc }}
SAML_SP_ENTITY_ID: {{ .saml.sp.entityId | quote | b64enc }}
SAML_SP_ACS: {{ .saml.sp.acs | quote | b64enc }}
SAML_SP_CALLBACK: {{ .saml.sp.callback | quote | b64enc }}
SAML_STRICT_MODE: {{ .saml.security.strictMode | quote | b64enc }}
SAML_VALIDATE_XML: {{ .saml.security.validateXml | quote | b64enc }}
SAML_SP_TOKEN_VALIDITY: {{ .saml.security.tokenValidity | quote | b64enc }}
SAML_SEND_ENCRYPTED_NAME_ID: {{ .saml.security.sendEncryptedNameId | quote | b64enc }}
SAML_SEND_SIGNED_AUTH_REQUEST: {{ .saml.security.sendSignedAuthRequest | quote | b64enc }}
SAML_SIGNED_SP_METADATA: {{ .saml.security.signSpMetadata | quote | b64enc }}
SAML_WANT_MESSAGE_SIGNED: {{ .saml.security.wantMessagesSigned | quote | b64enc }}
SAML_WANT_ASSERTION_SIGNED: {{ .saml.security.wantAssertionsSigned | quote | b64enc }}
SAML_WANT_ASSERTION_ENCRYPTED: {{ .saml.security.wantAssertionEncrypted | quote | b64enc }}
# Key Store should only be considered if wantAssertionEncrypted will be true
{{- if .saml.security.wantAssertionEncrypted }}
SAML_KEYSTORE_FILE_PATH: {{ .saml.security.keyStoreFilePath | quote | b64enc }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{- if .Values.openmetadata.config.eventMonitor.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-eventmonitor-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.eventMonitor }}
EVENT_MONITOR: {{ .type | b64enc }}
EVENT_MONITOR_BATCH_SIZE: {{ .batchSize | quote | b64enc }}
{{ end }}
EVENT_MONITOR_PATH_PATTERN: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .Values.openmetadata.config.eventMonitor.pathPattern) }}
EVENT_MONITOR_LATENCY: {{ include "OpenMetadata.commaJoinedQuotedEncodedList" (dict "value" .Values.openmetadata.config.eventMonitor.latency) }}
{{ end }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-config-secret
type: Opaque
data:
{{- with .Values.openmetadata.config }}
LOG_LEVEL: {{ .logLevel | b64enc }}
OPENMETADATA_CLUSTER_NAME: {{ .clusterName | b64enc }}
{{ end }}
{{- if .Values.openmetadata.config.rdf.enabled }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ include "OpenMetadata.fullname" . }}-rdf-secret
type: Opaque
data:
{{- with .Values.openmetadata.config.rdf }}
RDF_ENABLED: {{ .enabled | quote | b64enc }}
RDF_BASE_URI: {{ .baseUri | quote | b64enc }}
RDF_STORAGE_TYPE: {{ .storageType | quote | b64enc }}
RDF_REMOTE_ENDPOINT: {{ .remoteEndpoint | b64enc }}
RDF_REMOTE_USERNAME: {{ .username | quote | b64enc }}
RDF_DATASET: {{ .dataset | quote | b64enc }}
{{ end }}
{{- end}}
@@ -0,0 +1,23 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "OpenMetadata.fullname" . }}
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.service.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
- port: {{ .Values.service.adminPort }}
targetPort: http-admin
protocol: TCP
name: http-admin
selector:
{{- include "OpenMetadata.selectorLabels" . | nindent 4 }}
@@ -0,0 +1,12 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "OpenMetadata.serviceAccountName" . }}
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
@@ -0,0 +1,23 @@
{{- if .Values.serviceMonitor.enabled -}}
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: {{ include "OpenMetadata.fullname" . }}
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
{{- with .Values.serviceMonitor.labels }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- with .Values.serviceMonitor.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
selector:
matchLabels:
{{- include "OpenMetadata.selectorLabels" . | nindent 6 }}
endpoints:
- port: http-admin
path: /prometheus
interval: {{ .Values.serviceMonitor.interval }}
{{- end }}
@@ -0,0 +1,40 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "OpenMetadata.fullname" . }}-test-connection"
labels:
{{- include "OpenMetadata.labels" . | indent 4 }}
annotations:
"helm.sh/hook": test
"helm.sh/hook-delete-policy": hook-succeeded
spec:
{{- with .Values.podSecurityContext }}
securityContext:
{{- toYaml . | nindent 4 }}
{{- end }}
containers:
- name: wget
{{- with .Values.securityContext }}
securityContext:
{{- toYaml . | nindent 8 }}
{{- end }}
image: busybox
command: ['wget']
args: ['{{ include "OpenMetadata.fullname" . }}:{{ .Values.service.port }}']
{{- with .Values.testConnection.resources }}
resources:
{{- toYaml . | nindent 8 }}
{{- end }}
restartPolicy: Never
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
@@ -0,0 +1,7 @@
{{- if not (has .Values.openmetadata.config.authentication.provider (list "basic" "azure" "auth0" "custom-oidc" "google" "okta" "aws-cognito" "ldap" "saml")) }}
{{ required "The authentication provider must be basic, azure, auth0, custom-oidc, google, okta, aws-cognito, ldap, saml" nil }}
{{- end }}
{{- if not .Values.openmetadata.config.openmetadata }}
{{- include "error-message" "Global key has been replaced by openmetadata.config. Please refer docs for the further explaination." }}
{{- end }}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,683 @@
# Default values for OpenMetadata.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
# Overrides the openmetadata config file with the help of Environment Variables
# Below are defaults as per openmetadata-dependencies Helm Chart Values
openmetadata:
config:
upgradeMigrationConfigs:
debug: false
# You can pass the additional argument flags to the openmetadata-ops.sh migrate command
# Example if you want to force migration runs, use additionalArgs: "--force"
additionalArgs: ""
deployPipelinesConfig:
enabled: true
debug: false
additionalArgs: ""
reindexConfig:
enabled: true
debug: false
# You can pass the additional argument flags to the openmetadata-ops.sh reindex command
additionalArgs: ""
# Values can be OFF, ERROR, WARN, INFO, DEBUG, TRACE, or ALL
logLevel: INFO
clusterName: openmetadata
openmetadata:
host: "0.0.0.0"
port: 8585
adminPort: 8586
maxThreads: 50
minThreads: 10
idleThreadTimeout: "1 minute"
elasticsearch:
enabled: true
host: opensearch
searchType: opensearch
port: 9200
scheme: http
clusterAlias: ""
# Value in Bytes
payLoadSize: 10485760
connectionTimeoutSecs: 5
socketTimeoutSecs: 60
batchSize: 100
searchIndexMappingLanguage: "EN"
keepAliveTimeoutSecs: 600
trustStore:
enabled: false
path: ""
password:
secretRef: "elasticsearch-truststore-secrets"
secretKey: "openmetadata-elasticsearch-truststore-password"
auth:
enabled: false
username: "elasticsearch"
password:
secretRef: elasticsearch-secrets
secretKey: openmetadata-elasticsearch-password
database:
enabled: true
host: mysql
port: 3306
driverClass: com.mysql.cj.jdbc.Driver
dbScheme: mysql
databaseName: openmetadata_db
auth:
username: openmetadata_user
password:
secretRef: mysql-secrets
secretKey: openmetadata-mysql-password
dbParams: "allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC"
maxSize: 50
minSize: 10
initialSize: 10
checkConnectionWhileIdle: true
checkConnectionOnBorrow: true
evictionInterval: 5 minutes
minIdleTime: 1 minute
pipelineServiceClientConfig:
enabled: true
# Pipeline service client type - choose between "airflow" or "k8s"
type: "airflow"
# Common configurations for all pipeline service clients
# This will be the api endpoint url of OpenMetadata Server
metadataApiEndpoint: http://openmetadata:8585/api
# Airflow configuration (used when type: "airflow")
airflow:
className: "org.openmetadata.service.clients.pipeline.airflow.AirflowRESTClient"
# endpoint url for airflow (updated for Apache Airflow chart compatibility)
apiEndpoint: http://openmetadata-dependencies-api-server:8080
# possible values are "no-ssl", "ignore", "validate"
verifySsl: "no-ssl"
hostIp: ""
ingestionIpInfoEnabled: false
# healthCheckInterval in seconds
healthCheckInterval: 300
# local path in Airflow Pod
sslCertificatePath: "/no/path"
auth:
enabled: true
username: admin
password:
secretRef: airflow-secrets
secretKey: openmetadata-airflow-password
trustStorePath: ""
trustStorePassword:
secretRef: ""
secretKey: ""
# Kubernetes Jobs configuration (used when type: "k8s")
k8s:
className: "org.openmetadata.service.clients.pipeline.k8s.K8sPipelineClient"
# Container image for ingestion jobs
ingestionImage: "docker.getcollate.io/openmetadata/ingestion-base:latest"
# Image pull policy
imagePullPolicy: "IfNotPresent"
# Image pull secrets (comma-separated)
imagePullSecrets: ""
# Service account name for ingestion jobs
serviceAccountName: "openmetadata-ingestion"
# Time to keep completed jobs (seconds)
ttlSecondsAfterFinished: 86400
# Maximum job runtime (seconds)
activeDeadlineSeconds: 7200
# Maximum retry attempts
backoffLimit: 3
# Job history limits
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
# Node selector (comma-separated key=value pairs)
nodeSelector: ""
# Pod security context
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
runAsNonRoot: true
# Resource limits and requests
resources:
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "500m"
memory: "1Gi"
# Pod annotations (comma-separated key=value pairs)
podAnnotations: ""
# Extra environment variables (list of key:value pairs)
extraEnvVars: []
# Enable failure diagnostics
enableFailureDiagnostics: true
# Use OMJob operator for guaranteed exit handler execution
# Requires omjobOperator.enabled: true
useOMJobOperator: false
# RBAC configuration
rbac:
# Set to false if RBAC is managed externally
enabled: true
authorizer:
enabled: true
className: "org.openmetadata.service.security.DefaultAuthorizer"
containerRequestFilter: "org.openmetadata.service.security.JwtFilter"
initialAdmins:
- "admin"
allowedEmailRegistrationDomains:
- "all"
principalDomain: "open-metadata.org"
allowedDomains: []
enforcePrincipalDomain: false
enableSecureSocketConnection: false
useRolesFromProvider: false
authentication:
enabled: true
clientType: public
provider: "basic"
publicKeys:
- "http://openmetadata:8585/api/v1/system/config/jwks"
authority: "https://accounts.google.com"
clientId: ""
callbackUrl: ""
responseType: id_token
jwtPrincipalClaims:
- "email"
- "preferred_username"
- "sub"
jwtPrincipalClaimsMapping: []
# jwtPrincipalClaimsMapping:
# - username:sub
# - email:email
enableSelfSignup: true
oidcConfiguration:
enabled: false
oidcType: ""
clientId:
secretRef: oidc-secrets
secretKey: openmetadata-oidc-client-id
clientSecret:
secretRef: oidc-secrets
secretKey: openmetadata-oidc-client-secret
scope: "openid email profile"
discoveryUri: ""
useNonce: true
preferredJwsAlgorithm: RS256
responseType: code
promptType: "consent"
disablePkce: true
callbackUrl: http://openmetadata:8585/callback
serverUrl: http://openmetadata:8585
clientAuthenticationMethod: client_secret_post
tenant: ""
maxClockSkew: ""
tokenValidity: "3600"
customParams: '{}'
maxAge: "0"
# 7 days
sessionExpiry: "604800"
ldapConfiguration:
host: localhost
port: 10636
dnAdminPrincipal: "cn=admin,dc=example,dc=com"
dnAdminPassword:
secretRef: ldap-admin-secret
secretKey: openmetadata-ldap-secret
userBaseDN: "ou=people,dc=example,dc=com"
mailAttributeName: email
maxPoolSize: 3
sslEnabled: false
groupBaseDN: ""
roleAdminName: ""
allAttributeName: ""
usernameAttributeName: ""
groupAttributeName: ""
groupAttributeValue: ""
groupMemberAttributeName: ""
authRolesMapping: ""
authReassignRoles: []
# Possible values are CustomTrustStore, HostName, JVMDefault, TrustAll
truststoreConfigType: TrustAll
trustStoreConfig:
customTrustManagerConfig:
trustStoreFilePath: ""
trustStoreFilePassword:
secretRef: ""
secretKey: ""
trustStoreFileFormat: ""
verifyHostname: true
examineValidityDates: true
hostNameConfig:
allowWildCards: false
acceptableHostNames: []
jvmDefaultConfig:
verifyHostname: true
trustAllConfig:
examineValidityDates: true
saml:
debugMode: false
idp:
entityId: ""
ssoLoginUrl: ""
idpX509Certificate:
secretRef: ""
secretKey: ""
authorityUrl: "http://openmetadata:8585/api/v1/saml/login"
nameId: "urn:oasis:names:tc:SAML:2.0:nameid-format:emailAddress"
sp:
entityId: "http://openmetadata:8585/api/v1/saml/metadata"
acs: "http://openmetadata:8585/api/v1/saml/acs"
spX509Certificate:
secretRef: ""
secretKey: ""
spPrivateKey:
secretRef: ""
secretKey: ""
callback: "http://openmetadata:8585/saml/callback"
security:
strictMode: false
validateXml: false
tokenValidity: 3600
sendEncryptedNameId: false
sendSignedAuthRequest: false
signSpMetadata: false
wantMessagesSigned: false
wantAssertionsSigned: false
wantAssertionEncrypted: false
keyStoreFilePath: ""
keyStoreAlias:
secretRef: ""
secretKey: ""
keyStorePassword:
secretRef: ""
secretKey: ""
jwtTokenConfiguration:
enabled: true
# File Path on Airflow Container
rsapublicKeyFilePath: "./conf/public_key.der"
# File Path on Airflow Container
rsaprivateKeyFilePath: "./conf/private_key.der"
jwtissuer: "open-metadata.org"
keyId: "Gb389a-9f76-gdjs-a92j-0242bk94356"
fernetkey:
value: "jJ/9sz0g0OHxsfxOoSfdFdmk3ysNmPRnH3TUAbz3IHA="
secretRef: ""
secretKey: ""
eventMonitor:
enabled: true
# Possible values are prometheus and cloudwatch
type: prometheus
batchSize: 10
pathPattern:
- "/api/v1/tables/*"
- "/api/v1/health-check"
# For value p99=0.99, p90=0.90, p50=0.50 etc.
latency: []
# - "p99=0.99"
# - "p90=0.90"
# - "p50=0.50"
secretsManager:
enabled: true
# Possible values are db, aws, aws-ssm, managed-aws, managed-aws-ssm, in-memory, managed-azure-kv, azure-kv, gcp
provider: db
# Define the secret key ID as /<prefix>/<clusterName>/<key> for AWS
# Define the secret key ID as <prefix>-<clusterName>-<key> for Azure
prefix: ""
# Add tags to the created resource, e.g., in AWS. Format is `[key1:value1,key2:value2,...]`
tags: []
additionalParameters:
enabled: false
region: ""
# For AWS
accessKeyId:
secretRef: ""
secretKey: ""
secretAccessKey:
secretRef: ""
secretKey: ""
# accessKeyId:
# secretRef: aws-access-key-secret
# secretKey: aws-key-secret
# secretAccessKey:
# secretRef: aws-secret-access-key-secret
# secretKey: aws-key-secret
# For Azure
clientId:
secretRef: ""
secretKey: ""
clientSecret:
secretRef: ""
secretKey: ""
tenantId:
secretRef: ""
secretKey: ""
vaultName:
secretRef: ""
secretKey: ""
# clientId:
# secretRef: azure-client-id-secret
# secretKey: azure-key-secret
# clientSecret:
# secretRef: azure-client-secret
# secretKey: azure-key-secret
# tenantId:
# secretRef: azure-tenant-id-secret
# secretKey: azure-key-secret
# vaultName:
# secretRef: azure-vault-name-secret
# secretKey: azure-key-secret
# For GCP
projectId:
secretRef: ""
secretKey: ""
# projectId:
# secretRef: gcp-project-id-secret
# secretKey: gcp-key-secret
# You can create Kubernetes secrets from AWS Credentials with the below command
# kubectl create secret generic aws-key-secret \
# --from-literal=aws-access-key-secret=<access_key_id_value> \
# --from-literal=aws-secret-access-key-secret=<access_key_secret_value>
web:
enabled: true
uriPath: "/api"
hsts:
enabled: false
maxAge: "365 days"
includeSubDomains: "true"
preload: "true"
frameOptions:
enabled: false
option: "SAMEORIGIN"
origin: ""
contentTypeOptions:
enabled: false
xssProtection:
enabled: false
onXss: true
block: true
csp:
enabled: false
policy: "default-src 'self'"
reportOnlyPolicy: ""
referrerPolicy:
enabled: false
option: "SAME_ORIGIN"
permissionPolicy:
enabled: false
option: ""
cacheControl: ""
pragma: ""
rdf:
enabled: false
baseUri: "https://open-metadata.org/"
storageType: "FUSEKI"
remoteEndpoint: "http://localhost:3030/openmetadata"
username: ""
password:
secretRef: ""
secretKey: ""
dataset: "openmetadata"
networkPolicy:
# If networkPolicy is true, following values can be set
# for ingress on port 8585 and 8586
enabled: false
# Example Google SSO Auth Config
# authorizer:
# className: "org.openmetadata.service.security.DefaultAuthorizer"
# containerRequestFilter: "org.openmetadata.service.security.JwtFilter"
# initialAdmins:
# - "suresh"
# principalDomain: "open-metadata.org"
# authentication:
# provider: "google"
# publicKeys:
# - "https://www.googleapis.com/oauth2/v3/certs"
# authority: "https://accounts.google.com"
# clientId: "<client_id>"
# callbackUrl: "<callback_url>"
image:
repository: docker.getcollate.io/openmetadata/server
# Overrides the image tag whose default is the chart appVersion.
tag: ""
pullPolicy: "Always"
sidecars: []
# - name: "busybox"
# image: "busybox:1.34.1"
# imagePullPolicy: "Always"
# command: ["ls"]
# args: ["-latr", "/usr/share"]
# env:
# - name: DEMO
# value: "DEMO"
# volumeMounts:
# - name: extras
# mountPath: /usr/share/extras
# readOnly: true
imagePullSecrets: []
nameOverride: ""
fullnameOverride: "openmetadata"
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
automountServiceAccountToken: true
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 100
service:
type: ClusterIP
port: 8585
adminPort: 8586
annotations: {}
# Service monitor for Prometheus metrics
serviceMonitor:
enabled: false
interval: 30s
annotations: {}
labels: {}
ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/tls-acme: "true"
hosts:
- host: open-metadata.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
# - secretName: tls-open-metadata.local
# hosts:
# - open-metadata.local
# OpenShift Route — use instead of ingress when deploying on OpenShift.
# Requires route.openshift.io/v1 API (available on all OpenShift clusters).
route:
enabled: false
# host is optional. When omitted, OpenShift auto-assigns a hostname under
# the cluster's default subdomain (e.g. openmetadata-openmetadata.apps.<cluster>).
host: ""
annotations: {}
wildcardPolicy: None
tls:
enabled: true
# termination controls where TLS is terminated:
# edge — TLS terminated at the router; traffic to the pod is plain HTTP (recommended)
# reencrypt — TLS terminated at the router and re-encrypted to the pod
# passthrough — TLS passed through to the pod unchanged (pod must serve TLS)
termination: edge
# insecureEdgeTerminationPolicy controls HTTP traffic when termination is edge or reencrypt:
# Redirect — redirect HTTP to HTTPS (recommended)
# Allow — serve both HTTP and HTTPS
# None — drop HTTP traffic
insecureEdgeTerminationPolicy: Redirect
extraEnvs: []
# - name: MY_ENVIRONMENT_VAR
# value: the_value_goes_here
envFrom: []
# - secretRef:
# name: secret_containing_config
extraVolumes: []
# - name: extras
# emptyDir: {}
extraVolumeMounts: []
# - name: extras
# mountPath: /usr/share/extras
# readOnly: true
# Provision for InitContainers to be running after the `run-db-migration` InitContainer
extraInitContainers: []
# Provision for InitContainers to be running before the `run-db-migration` InitContainer
preMigrateInitContainers: []
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube.The resources configuration is required to enable autoscaling.
# To specify resources, uncomment the following lines, adjust them as necessary, and remove
# the curly braces after 'resources:'.
# limits:
# cpu: 1
# memory: 2048Mi
# requests:
# cpu: 500m
# memory: 1024Mi
startingDeadlineSeconds: 100
# Test connection pod configuration
testConnection:
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube.
# To specify resources, uncomment the following lines, adjust them as necessary, and remove
# the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 50m
# memory: 64Mi
nodeSelector: {}
tolerations: []
affinity: {}
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 30
failureThreshold: 5
httpGet:
path: /api/v1/system/health
port: http
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 30
failureThreshold: 5
httpGet:
path: /api/v1/system/health
port: http
startupProbe:
periodSeconds: 60
failureThreshold: 5
successThreshold: 1
httpGet:
path: /healthcheck
port: http-admin
podDisruptionBudget:
enabled: false
config:
maxUnavailable: "1"
minAvailable: "1"
commonLabels: {}
deploymentAnnotations: {}
podAnnotations: {}
# Prerequisites for enabling Horizontal Pod Autoscaler (HPA):
# 1. Install metrics-server (https://github.com/kubernetes-sigs/metrics-server)
# 2. Define resource request and limits for the pods
hpa:
enabled: false
apiVersion: autoscaling/v2
minReplicas: 1
maxReplicas: 5
behavior: {}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
# OMJob Operator Configuration
# This installs the CRD and operator for guaranteed exit handler execution
omjobOperator:
enabled: false # Set to true to install OMJob CRD and operator
# Image configuration
image:
repository: docker.getcollate.io/openmetadata/omjob-operator
tag: "1.12.0-SNAPSHOT"
pullPolicy: IfNotPresent
# Resource configuration
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
# Environment variables
env:
logLevel: "INFO"
reconciliationThreads: "5"
healthCheckPort: "8080"
metricsPort: "8081"
# Polling interval in seconds - how often the operator checks pod status
pollingIntervalSeconds: "10"
# Requeue delay in seconds - delay when requeueing after errors
requeueDelaySeconds: "30"
# Namespace watching configuration:
# - "ALL" = watch all namespaces (less secure, high resource usage)
# - "namespace1,namespace2" = watch specific namespaces (recommended)
# - Leave empty for operator's own namespace only
watchNamespaces: ""