Repository: apache/gravitino
Pull request #6599: [#6594] feat(deploy): Provide gravitino chart for deploying different storage backend on K8S
Author: login: danhuawang
Labels: name: branch-0.9
description: Automatically cherry-pick commit to branch-0.9
Created: 2025-03-04T12:29:27Z | Merged: 2025-04-16T07:04:16Z

### What changes were proposed in this pull request?

1. Provide gravitino chart for deploying on K8S
2. Provide CI to check and test chart

### Why are the changes needed?

Fix: #6594 

### Does this PR introduce _any_ user-facing change?

N/A

### How was this patch tested?

Add CI


Diff:
diff --git a/.github/workflows/chart-test.yaml b/.github/workflows/chart-test.yaml
new file mode 100644
index 00000000000..38b09c85880
--- /dev/null
+++ b/.github/workflows/chart-test.yaml
@@ -0,0 +1,85 @@
+name: Test Charts
+
+# Controls when the workflow will run
+on:
+  pull_request:
+    branches: [ "main", "branch-*" ]
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  changes:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: dorny/paths-filter@v3.0.2
+        id: filter
+        with:
+          filters: |
+            source_changes:
+              - .github/workflows/**
+              - dev/charts/**
+    outputs:
+      source_changes: ${{ steps.filter.outputs.source_changes }}
+
+  lint-test:
+    needs: changes
+    if: needs.changes.outputs.source_changes == 'true'
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+
+      - name: Set up Helm
+        uses: azure/setup-helm@v4.3.0
+
+      - uses: actions/setup-python@v5.3.0
+        with:
+          python-version: '3.x'
+          check-latest: true
+
+      - name: Install yamale
+        run: pip install yamale
+
+      - name: Install chart-testing
+        run: |
+          curl -LO https://github.com/helm/chart-testing/releases/download/v3.12.0/chart-testing_3.12.0_linux_amd64.tar.gz
+          tar -xzf chart-testing_3.12.0_linux_amd64.tar.gz
+          sudo mv ct /usr/local/bin/
+          ct version
+
+      - name: List changed
+        id: list-changed
+        run: |
+          changed=$(ct list-changed --chart-dirs=dev/charts --target-branch ${{ github.event.repository.default_branch }})
+          if [[ -n "$changed" ]]; then
+            echo "changed=true" >> "$GITHUB_OUTPUT"
+          fi
+
+      - name: Lint
+        if: steps.list-changed.outputs.changed == 'true'
+        run: |
+          helm repo add bitnami https://charts.bitnami.com/bitnami
+          ct lint --chart-dirs=dev/charts --chart-yaml-schema=dev/ci/chart_schema.yaml --lint-conf=dev/ci/lintconf.yaml --target-branch ${{ github.event.repository.default_branch }} 
+
+      - name: Set up kind cluster
+        if: steps.list-changed.outputs.changed == 'true'
+        uses: container-tools/kind-action@v2
+        with:
+          version: v0.27.0
+          cluster_name: helm-test-cluster
+
+      - name: Set up kubectl
+        uses: azure/setup-kubectl@v4
+
+      - name: Run chart-testing (install default)
+        if: steps.list-changed.outputs.changed == 'true'
+        run: ct install --chart-dirs=dev/charts --target-branch ${{ github.event.repository.default_branch }}
+
+      - name: Run chart-testing (install mysql enable)
+        if: steps.list-changed.outputs.changed == 'true'
+        run: ct install --chart-dirs=dev/charts --helm-extra-set-args "--values dev/charts/gravitino/resources/scenarios/ci-values.yaml" --target-branch ${{ github.event.repository.default_branch }}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index e8bef4c1d37..93882720b63 100644
--- a/LICENSE
+++ b/LICENSE
@@ -305,6 +305,10 @@
    ./authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/VXUser.java
    ./authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/VXUserList.java
 
+   Helm chart-testing
+   ./dev/ci/chart_schema.yaml
+   ./dev/ci/lintconf.yaml
+
    This product bundles a third-party component under the
    MIT License.
 
diff --git a/dev/charts/gravitino/.helmignore b/dev/charts/gravitino/.helmignore
new file mode 100644
index 00000000000..504c781888e
--- /dev/null
+++ b/dev/charts/gravitino/.helmignore
@@ -0,0 +1,40 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
\ No newline at end of file
diff --git a/dev/charts/gravitino/Chart.yaml b/dev/charts/gravitino/Chart.yaml
new file mode 100644
index 00000000000..811083a62dc
--- /dev/null
+++ b/dev/charts/gravitino/Chart.yaml
@@ -0,0 +1,38 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+apiVersion: v2
+appVersion: 0.9.0-incubating-SNAPSHOT
+description: Apache Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the metadata directly in different sources, types, and regions. It also provides users with unified metadata access for data and AI assets.
+home: https://gravitino.apache.org
+annotations:
+  licenses: Apache-2.0
+dependencies:
+  - condition: mysql.enabled
+    name: mysql
+    repository: https://charts.bitnami.com/bitnami
+    version: 10.2.1
+kubeVersion: '>=1.29.0-0'
+maintainers:
+  - name: Gravitino
+    email: dev@gravitino.apache.org
+    url: https://gravitino.apache.org
+name: gravitino
+sources:
+  - https://github.com/apache/gravitino
+version: 0.9.0
diff --git a/dev/charts/gravitino/resources/config/gravitino.conf b/dev/charts/gravitino/resources/config/gravitino.conf
new file mode 100644
index 00000000000..0ff20caff1a
--- /dev/null
+++ b/dev/charts/gravitino/resources/config/gravitino.conf
@@ -0,0 +1,91 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# THE CONFIGURATION FOR Gravitino SERVER
+gravitino.server.shutdown.timeout = {{ .Values.server.shutdownTimeout | default 3000 }}
+
+# THE CONFIGURATION FOR Gravitino WEB SERVER
+gravitino.server.webserver.host = {{ .Values.webserver.host | default "0.0.0.0" }}
+gravitino.server.webserver.httpPort = {{ .Values.webserver.httpPort | default 8090 }}
+gravitino.server.webserver.minThreads = {{ .Values.webserver.minThreads | default 24 }}
+gravitino.server.webserver.maxThreads = {{ .Values.webserver.maxThreads | default 200 }}
+gravitino.server.webserver.stopTimeout = {{ .Values.webserver.stopTimeout | default 30000 }}
+gravitino.server.webserver.idleTimeout = {{ .Values.webserver.idleTimeout | default 30000 }}
+gravitino.server.webserver.threadPoolWorkQueueSize = {{ .Values.webserver.threadPoolWorkQueueSize | default 100 }}
+gravitino.server.webserver.requestHeaderSize = {{ .Values.webserver.requestHeaderSize | default 131072 }}
+gravitino.server.webserver.responseHeaderSize = {{ .Values.webserver.responseHeaderSize | default 131072 }}
+
+# Comma-separated list of filter class names to apply to the API.
+gravitino.server.webserver.customFilters = {{ .Values.webserver.customFilters }}
+
+# Comma-separated list of REST API packages to expand
+gravitino.server.rest.extensionPackages = {{ .Values.server.rest.extensionPackages }}
+
+# THE CONFIGURATION FOR Gravitino ENTITY STORE
+gravitino.entity.store = {{ .Values.entity.store | default "relational" }}
+gravitino.entity.store.maxTransactionSkewTimeMs = {{ .Values.entity.maxTransactionSkewTimeMs }}
+gravitino.entity.store.deleteAfterTimeMs = {{ (.Values.entity.deleteAfterTimeMs | default 604800000) | int }}
+gravitino.entity.store.versionRetentionCount = {{ .Values.entity.versionRetentionCount }}
+gravitino.entity.store.relational = {{ .Values.entity.relationalBackend | default "JDBCBackend" }}
+gravitino.entity.store.relational.jdbcUrl = {{ if .Values.mysql.enabled }}jdbc:mysql://{{ .Release.Name }}-mysql:3306/{{ .Values.mysql.auth.database }}{{ else }}{{ .Values.entity.jdbcUrl }}{{ end }}
+gravitino.entity.store.relational.jdbcDriver = {{ if .Values.mysql.enabled }}com.mysql.cj.jdbc.Driver{{ else }}{{ .Values.entity.jdbcDriver }}{{ end }}
+gravitino.entity.store.relational.jdbcUser = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.username }}{{ else }}{{ .Values.entity.jdbcUser }}{{ end }}
+gravitino.entity.store.relational.jdbcPassword = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.password }}{{ else }}{{ .Values.entity.jdbcPassword }}{{ end }}
+gravitino.entity.store.relational.storagePath = {{ .Values.entity.storagePath }}
+
+# THE CONFIGURATION FOR Gravitino CATALOG
+gravitino.catalog.cache.evictionIntervalMs = {{ if .Values.catalog.evictionIntervalMs }}{{ .Values.catalog.evictionIntervalMs }}{{ else }}3600000{{ end }}
+
+# THE CONFIGURATION FOR authorization
+gravitino.authorization.enable = {{ .Values.authorization.enable }}
+gravitino.authorization.serviceAdmins = {{ .Values.authorization.serviceAdmins }}
+gravitino.authenticators = {{ .Values.authenticators }}
+gravitino.authenticator.oauth.serviceAudience = {{ .Values.authenticator.oauth.serviceAudience }}
+gravitino.authenticator.oauth.defaultSignKey = {{ .Values.authenticator.oauth.defaultSignKey }}
+gravitino.authenticator.oauth.serverUri = {{ .Values.authenticator.oauth.serverUri }}
+gravitino.authenticator.oauth.tokenPath = {{ .Values.authenticator.oauth.tokenPath }}
+
+# THE CONFIGURATION FOR AUXILIARY SERVICE
+gravitino.auxService.names = {{ .Values.auxService.names | default "iceberg-rest" }}
+gravitino.iceberg-rest.classpath = {{ .Values.icebergRest.classpath | default "iceberg-rest-server/libs, iceberg-rest-server/conf"  }}
+gravitino.iceberg-rest.host = {{ .Values.icebergRest.host | default "0.0.0.0" }}
+gravitino.iceberg-rest.httpPort = {{ .Values.icebergRest.httpPort | default 9001 }}
+gravitino.iceberg-rest.catalog-backend = {{ .Values.icebergRest.catalogBackend | default "memory" }}
+gravitino.iceberg-rest.warehouse = {{ .Values.icebergRest.warehouse | default "/tmp/" }}
+
+# Audit log configuration
+gravitino.audit.enabled = {{ .Values.audit.enabled }}
+gravitino.audit.writer.className = {{ if (and .Values.audit .Values.audit.writer .Values.audit.writer.className) }}{{ .Values.audit.writer.className }}{{ else }}org.apache.gravitino.audit.FileAuditWriter{{- end }}
+gravitino.audit.formatter.className = {{ if (and .Values.audit .Values.audit.formatter .Values.audit.formatter.className) }}{{ .Values.audit.formatter.className }}{{ else }}org.apache.gravitino.audit.SimpleFormatter{{- end }}
+gravitino.audit.writer.file.fileName = {{ .Values.audit.writer.file.fileName }}
+gravitino.audit.writer.file.flushIntervalSecs = {{ .Values.audit.writer.file.flushIntervalSecs }}
+gravitino.audit.writer.file.append = {{ .Values.audit.writer.file.append }}
+
+# Metrics configuration
+gravitino.metrics.timeSlidingWindowSecs	= {{ .Values.metrics.timeSlidingWindowSecs }}
+
+{{- if .Values.visibleConfigs }}
+gravitino.server.visibleConfigs = {{ .Values.visibleConfigs }}
+{{- range $key, $val := .Values.visibleConfigsItems }}
+{{ $key }} = {{ tpl $val $ }}
+{{- end }}
+{{- end }}
+{{- range $key, $val := .Values.additionalConfigItems }}
+{{ $key }} = {{ tpl $val $ }}
+{{- end }}
\ No newline at end of file
diff --git a/dev/charts/gravitino/resources/config/init.sh b/dev/charts/gravitino/resources/config/init.sh
new file mode 100644
index 00000000000..905fcb968ac
--- /dev/null
+++ b/dev/charts/gravitino/resources/config/init.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+echo "Start to download the jar package of JDBC"
+wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar -O ${GRAVITINO_HOME}/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar
+wget https://jdbc.postgresql.org/download/postgresql-42.7.0.jar -O ${GRAVITINO_HOME}/catalogs/jdbc-postgresql/libs/postgresql-42.7.0.jar
+
+cp ${GRAVITINO_HOME}/catalogs/jdbc-postgresql/libs/postgresql-42.7.0.jar ${GRAVITINO_HOME}/catalogs/lakehouse-iceberg/libs
+cp ${GRAVITINO_HOME}/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar ${GRAVITINO_HOME}/catalogs/lakehouse-iceberg/libs
+
+cp ${GRAVITINO_HOME}/catalogs/jdbc-postgresql/libs/postgresql-42.7.0.jar ${GRAVITINO_HOME}/iceberg-rest-server/libs
+cp ${GRAVITINO_HOME}/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar ${GRAVITINO_HOME}/iceberg-rest-server/libs
+
+cp ${GRAVITINO_HOME}/catalogs/jdbc-mysql/libs/mysql-connector-java-8.0.27.jar ${GRAVITINO_HOME}/libs
+echo "Finish downloading"
+
+cp /tmp/conf/* ${GRAVITINO_HOME}/conf
+cp /tmp/conf/log4j2.properties ${GRAVITINO_HOME}/conf
+
+{{- if .Values.log.containerStdout }}
+# Redirect log files to container stdout and stderr
+ln -sf /dev/stdout ${GRAVITINO_HOME}/logs/gravitino_audit.log
+ln -sf /dev/stdout ${GRAVITINO_HOME}/logs/gravitino-server.log
+ln -sf /dev/stderr ${GRAVITINO_HOME}/logs/gravitino-server.out
+{{- end }}
+echo "Start the Gravitino Server"
+/bin/bash ${GRAVITINO_HOME}/bin/gravitino.sh start
diff --git a/dev/charts/gravitino/resources/config/log4j2.properties b/dev/charts/gravitino/resources/config/log4j2.properties
new file mode 100644
index 00000000000..20575d93336
--- /dev/null
+++ b/dev/charts/gravitino/resources/config/log4j2.properties
@@ -0,0 +1,56 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+status = {{ .Values.log4j2Properties.status | default "warn" }}
+
+# Log files location
+property.basePath = {{ .Values.log4j2Properties.basePath | default "${sys:gravitino.log.path}" }}
+property.serverName = {{ .Values.log4j2Properties.serverName | default "${sys:gravitino.server.name}" }}
+
+# RollingFileAppender name, pattern, path and rollover policy
+appender.rolling.type = {{ .Values.log4j2Properties.rollingAppenderType | default "RollingFile" }}
+appender.rolling.name = {{ .Values.log4j2Properties.rollingAppenderName | default "fileLogger" }}
+appender.rolling.fileName = {{ .Values.log4j2Properties.rollingAppenderFileName | default "${basePath}/${serverName}.log" }}
+appender.rolling.filePattern = {{ .Values.log4j2Properties.rollingAppenderFilePattern | default "${basePath}/${serverName}_%d{yyyyMMdd}.log.gz" }}
+appender.rolling.layout.type = {{ .Values.log4j2Properties.rollingAppenderLayoutType | default "PatternLayout" }}
+appender.rolling.layout.pattern = {{ .Values.log4j2Properties.rollingAppenderLayoutPattern | default "%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n" }}
+appender.rolling.policies.type = {{ .Values.log4j2Properties.rollingAppenderPoliciesType | default "Policies" }}
+
+# RollingFileAppender rotation policy
+appender.rolling.policies.size.type = {{ .Values.log4j2Properties.rollingAppenderPoliciesSizeType | default "SizeBasedTriggeringPolicy" }}
+appender.rolling.policies.size.size = {{ .Values.log4j2Properties.rollingAppenderPoliciesSizeSize | default "10MB" }}
+appender.rolling.policies.time.type = {{ .Values.log4j2Properties.rollingAppenderPoliciesTimeType | default "TimeBasedTriggeringPolicy" }}
+appender.rolling.policies.time.interval = {{ .Values.log4j2Properties.rollingAppenderPoliciesTimeInterval | default 1 }}
+appender.rolling.policies.time.modulate = {{ .Values.log4j2Properties.rollingAppenderPoliciesTimeModulate | default true }}
+appender.rolling.strategy.type = {{ .Values.log4j2Properties.rollingAppenderStrategyType | default "DefaultRolloverStrategy" }}
+appender.rolling.strategy.delete.type = {{ .Values.log4j2Properties.rollingAppenderStrategyDeleteType | default "Delete" }}
+appender.rolling.strategy.delete.basePath = {{ .Values.log4j2Properties.rollingAppenderStrategyDeleteBasePath | default "${basePath}" }}
+appender.rolling.strategy.delete.maxDepth = {{ .Values.log4j2Properties.rollingAppenderStrategyDeleteMaxDepth | default 10 }}
+appender.rolling.strategy.delete.ifLastModified.type = {{ .Values.log4j2Properties.rollingAppenderStrategyDeleteIfLastModifiedType | default "IfLastModified" }}
+
+# Delete all files older than 30 days
+appender.rolling.strategy.delete.ifLastModified.age = {{ .Values.log4j2Properties.rollingAppenderStrategyDeleteIfLastModifiedAge | default "30d" }}
+
+# Configure root logger
+rootLogger.level = {{ .Values.log4j2Properties.rootLoggerLevel | default "info" }}
+rootLogger.appenderRef.rolling.ref = {{ .Values.log4j2Properties.rootLoggerAppenderRefRollingRef | default "fileLogger" }}
+
+{{- range $key, $val := .Values.additionalLog4j2Properties }}
+{{ $key }} = {{ tpl $val $ }}
+{{- end }}
\ No newline at end of file
diff --git a/dev/charts/gravitino/resources/files/mysql b/dev/charts/gravitino/resources/files/mysql
new file mode 120000
index 00000000000..1fadad52145
--- /dev/null
+++ b/dev/charts/gravitino/resources/files/mysql
@@ -0,0 +1 @@
+../../../../../scripts/mysql
\ No newline at end of file
diff --git a/dev/charts/gravitino/resources/scenarios/ci-values.yaml b/dev/charts/gravitino/resources/scenarios/ci-values.yaml
new file mode 100644
index 00000000000..9a0ecd40463
--- /dev/null
+++ b/dev/charts/gravitino/resources/scenarios/ci-values.yaml
@@ -0,0 +1,84 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+mysql:
+  enabled: true
+
+visibleConfigs: "gravitino.datastrato.custom.authorization.ranger.admin.url,gravitino.datastrato.custom.authorization.ranger.username,gravitino.datastrato.custom.authorization.ranger.password,gravitino.datastrato.custom.authorization.ranger.auth.type"
+
+visibleConfigsItems:
+  gravitino.datastrato.custom.authorization.ranger.admin.url: "http://ranger:6080"
+  gravitino.datastrato.custom.authorization.ranger.username: admin
+  gravitino.datastrato.custom.authorization.ranger.password: "rangerR0cks!"
+  gravitino.datastrato.custom.authorization.ranger.auth.type: simple
+
+additionalConfigItems:
+  gravitino.testAdditionalConfigItems.names: audit,sync
+  gravitino.testAdditionalConfigItems.names.test: test
+
+extraVolumeMounts:
+  - name: gravitino-log
+    mountPath: /root/gravitino/logs
+  - name: extra-volume
+    mountPath: /extra-volume-path
+  - name: another-extra-volume
+    mountPath: /another-extra-volume-path
+
+extraVolumes:
+  - name: gravitino-log
+    emptyDir: {}
+  - name: extra-volume
+    emptyDir: {}
+  - name: another-extra-volume
+    emptyDir: {}
+
+replicas: 2
+
+env:
+  - name: GRAVITINO_HOME
+    value: /root/gravitino
+  - name: HADOOP_USER_NAME
+    value: hdfs
+
+audit:
+  enabled: true
+
+log:
+  containerStdout: true
+
+log4j2Properties:
+  rootLoggerLevel: warn
+  rollingAppenderStrategyDeleteIfLastModifiedAge: 2d
+
+additionalLog4j2Properties:
+  appender.console.type: Console
+  appender.console.name: console
+  appender.console.layout.type: PatternLayout
+  appender.console.layout.pattern: "%d{HH:mm:ss.SSS} %level %msg%n"
+  rootLogger.appenderRef.console.ref: console
+
+resources:
+  limits:
+    cpu: 500m
+    memory: 512Mi
+  requests:
+    cpu: 500m
+    memory: 512Mi
+
+ingress:
+  enabled: true
\ No newline at end of file
diff --git a/dev/charts/gravitino/templates/NOTES.txt b/dev/charts/gravitino/templates/NOTES.txt
new file mode 100644
index 00000000000..f7ccb337b07
--- /dev/null
+++ b/dev/charts/gravitino/templates/NOTES.txt
@@ -0,0 +1,25 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+{{ $.Chart.Name }} has been installed. Check its status by running:
+
+  kubectl get pods --namespace {{ include "gravitino.namespace" . }}
+
+Check the "gravitino.conf" by running:
+
+  kubectl get cm {{ include "gravitino.fullname" . }} -n {{ include "gravitino.namespace" . }} -o json | jq -r '.data["gravitino.conf"]'
diff --git a/dev/charts/gravitino/templates/_helpers.tpl b/dev/charts/gravitino/templates/_helpers.tpl
new file mode 100644
index 00000000000..edf00f207e5
--- /dev/null
+++ b/dev/charts/gravitino/templates/_helpers.tpl
@@ -0,0 +1,67 @@
+{{/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+*/}}
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "gravitino.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 "gravitino.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 "gravitino.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "gravitino.labels" -}}
+app: {{ template "gravitino.name" . }}
+chart: {{ template "gravitino.chart" . }}
+release: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Define the gravitino.namespace
+*/}}
+{{- define "gravitino.namespace" -}}
+    {{- .Release.Namespace -}}
+{{- end -}}
diff --git a/dev/charts/gravitino/templates/configmap-mysql-init.yaml b/dev/charts/gravitino/templates/configmap-mysql-init.yaml
new file mode 100644
index 00000000000..089c47ca00d
--- /dev/null
+++ b/dev/charts/gravitino/templates/configmap-mysql-init.yaml
@@ -0,0 +1,46 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+
+{{- if .Values.mysql.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: gravitino-mysql-init
+  namespace: {{ include "gravitino.namespace" . }}
+  labels:
+    {{- include "gravitino.labels" . | nindent 4 }}
+data:
+  {{- $sqlFiles := .Files.Glob "resources/files/mysql/schema-*-mysql.sql" }}
+  {{- $maxVersionFile := "" }}
+  {{- $maxVersion := "0.0.0" }}
+  {{- range $path, $content := $sqlFiles }}
+    {{- $fileName := base $path }}
+    {{- $version := regexFind "schema-(\\d+\\.\\d+\\.\\d+)-mysql\\.sql" $fileName | replace "schema-" "" | replace "-mysql.sql" "" }}
+    {{- if (semverCompare ">= 0.0.0" $version) }}
+        {{- if (semverCompare (printf "> %s" $maxVersion) $version) }}
+          {{- $maxVersion = $version }}
+          {{- $maxVersionFile = $path }}
+        {{- end }}
+    {{- end }}
+  {{- end }}
+  {{- if $maxVersionFile }}
+  {{ base $maxVersionFile }}: |-
+    {{- tpl (.Files.Get $maxVersionFile | toString) $ | nindent 4 }}
+  {{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/dev/charts/gravitino/templates/configmap.yaml b/dev/charts/gravitino/templates/configmap.yaml
new file mode 100644
index 00000000000..a76f65fb357
--- /dev/null
+++ b/dev/charts/gravitino/templates/configmap.yaml
@@ -0,0 +1,33 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "gravitino.fullname" . }}
+  namespace: {{ include "gravitino.namespace" . }}
+  labels:
+    {{- include "gravitino.labels" . | nindent 4 }}
+data:
+  init.sh: |-
+    {{- tpl (.Files.Get "resources/config/init.sh") . | nindent 4 }}
+  gravitino.conf: |
+    {{- tpl (.Files.Get "resources/config/gravitino.conf") . | nindent 4 }}
+  log4j2.properties: |-
+    {{- tpl (.Files.Get "resources/config/log4j2.properties") . | nindent 4 }}
\ No newline at end of file
diff --git a/dev/charts/gravitino/templates/deployment.yaml b/dev/charts/gravitino/templates/deployment.yaml
new file mode 100644
index 00000000000..a509cef23e9
--- /dev/null
+++ b/dev/charts/gravitino/templates/deployment.yaml
@@ -0,0 +1,136 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "gravitino.fullname" . }}
+  namespace: {{ include "gravitino.namespace" . }}
+  labels:
+    {{- include "gravitino.labels" . | nindent 4 }}
+  annotations:
+    {{- toYaml .Values.annotations | nindent 4 }}
+spec:
+  replicas: {{ .Values.replicas }}
+  selector:
+    matchLabels:
+      app: {{ include "gravitino.name" . }}
+      release: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "gravitino.name" . }}
+        name: {{ include "gravitino.fullname" . }}
+        release: {{ .Release.Name }}
+        {{- with .Values.podLabels }}
+        {{- toYaml . | nindent 8 }}
+        {{- end }}
+      annotations:
+        {{- with .Values.podAnnotations }}
+          {{- toYaml . | nindent 8 }}
+          {{- end }}
+    spec:
+      {{- with .Values.image.pullSecrets }}
+      imagePullSecrets:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      containers:
+        - name: {{ include "gravitino.name" . }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+          command:
+            - "/bin/bash"
+            - "/tmp/conf/init.sh"
+          livenessProbe:
+            {{- toYaml .Values.livenessProbe | nindent 12 }}
+          readinessProbe:
+            {{- toYaml .Values.readinessProbe | nindent 12 }}
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+          securityContext:
+            {{- toYaml .Values.containerSecurityContext | nindent 12 }}
+        {{- if or .Values.env .Values.envWithTpl }}
+          env:
+          {{- with .Values.env }}
+            {{- toYaml . | nindent 12 }}
+          {{- end }}
+          {{- range $item := .Values.envWithTpl }}
+            - name: {{ $item.name }}
+              value: {{ tpl $item.value $ | quote }}
+          {{- end }}
+        {{- end }}
+        {{- if .Values.envFrom }}
+          envFrom:
+            {{- toYaml .Values.envFrom | nindent 12 }}
+        {{- end }}            
+          ports:
+            - name: {{ .Values.service.portName }}
+              containerPort: {{ .Values.service.targetPort }}
+              protocol: TCP
+            {{- if .Values.extraExposePorts }}
+            {{- range $item := .Values.extraExposePorts }}
+            - name: {{ $item.name }}
+              containerPort: {{ $item.targetPort }}
+              protocol: {{ $item.protocol }}
+            {{- end }}
+            {{- end }}              
+          volumeMounts:
+            - name: gravitino-conf
+              mountPath: /tmp/conf
+            - name: storage
+              mountPath: {{ .Values.entity.storagePath }}
+        {{- if .Values.extraVolumeMounts }}
+              {{- toYaml .Values.extraVolumeMounts | nindent 12 }}
+            {{- end }}  
+      nodeSelector:
+        {{- toYaml .Values.nodeSelector | nindent 8 }}
+      affinity:
+        {{- toYaml .Values.affinity | nindent 8 }}
+      tolerations:
+        {{- toYaml .Values.tolerations | nindent 8 }}
+      volumes:
+        - name: gravitino-conf
+          configMap:
+            name: {{ include "gravitino.fullname" . }}
+        {{- if not .Values.persistence.enabled }}
+        - name: storage
+          emptyDir: {}
+        {{- else if .Values.persistence.existingClaim }}
+        - name: storage
+          persistentVolumeClaim:
+            claimName: {{ .Values.persistence.existingClaim }}
+        {{- else }}
+        volumeClaimTemplates:
+          - metadata:
+              name: storage
+              labels:
+                {{- toYaml .Values.persistence.labels | nindent 8 }}
+              annotations:
+                {{- toYaml .Values.persistence.annotations | nindent 8 }}
+            spec:
+              accessModes:
+                {{- toYaml .Values.persistence.accessModes | nindent 8 }}
+              resources:
+                requests:
+                  storage: {{ .Values.persistence.size | quote }}
+              storageClassName: {{ .Values.persistence.storageClassName }}
+        {{- end }}
+        {{- if .Values.extraVolumes }}
+          {{- toYaml .Values.extraVolumes | nindent 8 }}
+        {{- end }}
\ No newline at end of file
diff --git a/dev/charts/gravitino/templates/ingress.yaml b/dev/charts/gravitino/templates/ingress.yaml
new file mode 100644
index 00000000000..64252ee8148
--- /dev/null
+++ b/dev/charts/gravitino/templates/ingress.yaml
@@ -0,0 +1,80 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+
+  {{- if .Values.ingress.enabled -}}
+{{- $fullName := include "gravitino.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 "gravitino.labels" . | nindent 4 }}
+  {{- with .Values.ingress.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
+  ingressClassName: {{ .Values.ingress.className }}
+  {{- end }}
+  {{- if .Values.ingress.tls }}
+  tls:
+    {{- range .Values.ingress.tls }}
+    - hosts:
+        {{- range .hosts }}
+        - {{ . | quote }}
+        {{- end }}
+      secretName: {{ .secretName }}
+    {{- end }}
+  {{- end }}
+  rules:
+    {{- range .Values.ingress.hosts }}
+    - host: {{ .host | quote }}
+      http:
+        paths:
+          {{- range .paths }}
+          - path: {{ .path }}
+            {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
+            pathType: {{ .pathType }}
+            {{- end }}
+            backend:
+              {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
+              service:
+                name: {{ $fullName }}
+                port:
+                  number: {{ $svcPort }}
+              {{- else }}
+              serviceName: {{ $fullName }}
+              servicePort: {{ $svcPort }}
+              {{- end }}
+          {{- end }}
+    {{- end }}
+{{- end }}
diff --git a/dev/charts/gravitino/templates/service.yaml b/dev/charts/gravitino/templates/service.yaml
new file mode 100644
index 00000000000..3ccc7eaa6c8
--- /dev/null
+++ b/dev/charts/gravitino/templates/service.yaml
@@ -0,0 +1,67 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Values.service.name }}
+  namespace: {{ include "gravitino.namespace" . }}
+  labels:
+    {{- include "gravitino.labels" . | nindent 4 }}
+      {{- with .Values.service.labels }}
+      {{- toYaml . | nindent 4 }}
+      {{- end }}
+  annotations:
+    {{- toYaml .Values.service.annotations | nindent 4 }}
+spec:
+  {{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }}
+  type: ClusterIP
+    {{- if .Values.service.clusterIP }}
+  clusterIP: {{ .Values.service.clusterIP }}
+    {{- end }}
+  {{- else if eq .Values.service.type "LoadBalancer" }}
+  type: {{ .Values.service.type }}
+    {{- if .Values.service.loadBalancerIP }}
+  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+    {{- end }}
+    {{- if .Values.service.loadBalancerSourceRanges }}
+  loadBalancerSourceRanges:
+    {{- toYaml .Values.service.loadBalancerSourceRanges | nindent 4 }}
+      {{- end }}
+  {{- else }}
+  type: {{ .Values.service.type }}
+  {{- end }}
+  {{- if .Values.service.externalIPs }}
+  externalIPs:
+    {{- toYaml .Values.service.externalIPs | nindent 4 }}
+  {{- end }}
+  ports:
+    - name: {{ .Values.service.portName }}
+      port: {{ .Values.service.port }}
+      protocol: TCP
+      targetPort: {{ .Values.service.targetPort }}
+      {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }}
+      nodePort: {{ .Values.service.nodePort }}
+      {{- end }}
+    {{- if .Values.extraExposePorts }}
+    {{- tpl (toYaml .Values.extraExposePorts) . | nindent 4 }}
+    {{- end }}
+  selector:
+    app: {{ include "gravitino.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/dev/charts/gravitino/templates/tests/test-connection.yaml b/dev/charts/gravitino/templates/tests/test-connection.yaml
new file mode 100644
index 00000000000..88c51b8dbc4
--- /dev/null
+++ b/dev/charts/gravitino/templates/tests/test-connection.yaml
@@ -0,0 +1,64 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+
+apiVersion: v1
+kind: Pod
+metadata:
+  name: {{ include "gravitino.fullname" . }}-test-connection
+  namespace: {{ include "gravitino.namespace" . }}
+  annotations:
+    helm.sh/hook: test
+    helm.sh/hook-delete-policy: hook-succeeded
+spec:
+  containers:
+    - name: test-connection
+      image: curlimages/curl:latest
+      command:
+        - /bin/sh
+        - -c
+        - |
+          max_attempts=10
+          attempt=0
+          success=false
+
+          while [ $attempt -lt $max_attempts ]; do
+            response=$(curl -X GET -H "Content-Type: application/json" http://${SERVICE_NAME}:${SERVICE_PORT}/api/version)
+
+            if echo "$response" | grep -q "\"code\":0"; then
+              success=true
+              break
+            else
+              echo "Attempt $((attempt + 1)) failed..."
+              sleep 1
+            fi
+
+            ((attempt++))
+          done
+
+          if [ "$success" = true ]; then
+            exit 0
+          else
+            exit 1
+          fi
+      env:
+        - name: SERVICE_NAME
+          value: "{{ .Values.service.name }}"
+        - name: SERVICE_PORT
+          value: "{{ .Values.service.port }}"
+  restartPolicy: Never
diff --git a/dev/charts/gravitino/values.yaml b/dev/charts/gravitino/values.yaml
new file mode 100644
index 00000000000..daa5bc08a97
--- /dev/null
+++ b/dev/charts/gravitino/values.yaml
@@ -0,0 +1,417 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+image:
+  repository: apache/gravitino
+  tag: 0.9.0-incubating-SNAPSHOT
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of pullSecrets (secrets must be manually created in the namespace)
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Example:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+## MySQL chart configuration
+## ref: https://github.com/bitnami/charts/blob/main/bitnami/mysql/values.yaml
+##
+mysql:
+  ## @param mysql.enabled Deploy MySQL container(s)
+  ##
+  enabled: false
+  ## Bitnami MySQL image version
+  ## ref: https://hub.docker.com/r/bitnami/mysql/tags/
+  ## @param image.registry MySQL image registry
+  ## @param image.repository MySQL image repository
+  ## @param image.tag MySQL image tag
+  ##
+  image:
+    tag: 8.0.36-debian-12-r12
+  ## @param initdbScriptsConfigMap ConfigMap with the initdb scripts
+  ##
+  initdbScriptsConfigMap: gravitino-mysql-init
+  ## MySQL Authentication parameters
+  ##
+  auth:
+    ## @param auth.rootPassword Password for the `root` user.
+    ##
+    rootPassword: admin
+    ## @param auth.createDatabase Whether to create the .Values.auth.database or not
+    ##
+    createDatabase: true
+    ## @param auth.database Name for a custom database to create
+    ##
+    database: gravitino
+    ## @param auth.username Name for a custom user to create
+    ##
+    username: gravitino
+    ## @param auth.password Password for the new user.
+    ##
+    password: gravitino
+
+## THE CONFIGURATION FOR Gravitino ENTITY STORE
+##
+entity:
+  ## The entity store to use, we only supports relational
+  ##
+  store: relational
+  maxTransactionSkewTimeMs: 2000
+  deleteAfterTimeMs: 604800000
+  versionRetentionCount: 1
+  ## The backend for the entity store, we only supports JDBC
+  ##
+  relationalBackend: JDBCBackend
+  ## The JDBC URL for the entity store
+  ##
+  jdbcUrl: jdbc:h2
+  ## The JDBC driver class name
+  ##
+  jdbcDriver: org.h2.Driver
+  ## The JDBC user name
+  ##
+  jdbcUser: gravitino
+  ## The JDBC password
+  ##
+  jdbcPassword: gravitino
+  storagePath: /root/gravitino/data/jdbc
+
+## THE CONFIGURATION FOR Gravitino SERVER
+##
+server:
+  shutdownTimeout: 3000
+  rest:
+    extensionPackages: ""
+## THE CONFIGURATION FOR Gravitino WEB SERVER
+##
+webserver:
+  ## The host name of the built-in web server
+  ##
+  host: 0.0.0.0
+  ## The http port number of the built-in web server
+  ##
+  httpPort: 8090
+  ## The min thread size of the built-in web server
+  ##
+  minThreads: 24
+  ## The max thread size of the built-in web server
+  ##
+  maxThreads: 200
+  ## The stop timeout of the built-in web server
+  ##
+  stopTimeout: 30000
+  ## The timeout of idle connections
+  ##
+  idleTimeout: 30000
+  ## The executor thread pool work queue size of the built-in web server
+  ##
+  threadPoolWorkQueueSize: 100
+  ## The request header size of the built-in web server
+  ##
+  requestHeaderSize: 131072
+  ## The response header size of the built-in web server
+  ##
+  responseHeaderSize: 131072
+  customFilters: ""
+
+## THE CONFIGURATION FOR Gravitino CATALOG
+##
+catalog:
+  ## The interval in milliseconds to evict the catalog cache
+  ##
+  cacheEvictionIntervalMs: 3600000
+
+## THE CONFIGURATION FOR authorization
+##
+authorization:
+  ## Whether Gravitino enable authorization or not
+  ##
+  enable: false
+  ## The admins of Gravitino service, multiple admins are spitted by comma.
+  ##
+  serviceAdmins: anonymous
+
+## THE CONFIGURATION FOR AUXILIARY SERVICE
+##
+auxService:
+  ## Auxiliary service names, separate by ','
+  ##
+  names: iceberg-rest
+
+icebergRest:
+  ## Iceberg REST service classpath
+  ##
+  classpath: "iceberg-rest-server/libs, iceberg-rest-server/conf"
+  ## Iceberg REST service host
+  ##
+  host: 0.0.0.0
+  ## Iceberg REST service http port
+  ##
+  httpPort: 9001
+  ## The backend Iceberg catalog for Iceberg REST service, it's recommended to change to hive or jdbc
+  ##
+  catalogBackend: memory
+  ## The warehouse directory of Iceberg catalog for Iceberg REST service
+  ##
+  warehouse: /tmp/
+
+## Authentication mechanisms configuration. Support simple, OAuth and Kerberos.
+##
+authenticators: simple
+
+## OAuth mode configuration
+##
+authenticator:
+  oauth:
+    serviceAudience: test
+    defaultSignKey: ""
+    serverUri: ""
+    tokenPath: /realms/myrealm/protocol/openid-connect/token
+
+## Audit log configuration
+##
+audit:
+  enabled: false
+  writer:
+    file:
+      fileName: gravitino_audit.log
+      flushIntervalSecs: 10
+      append: true
+
+## Metrics configuration
+##
+metrics:
+  timeSlidingWindowSecs: 60
+
+## Custom Gravitino configuration items
+##
+visibleConfigs: ""
+# visibleConfigs: "gravitino.datastrato.custom.authorization.ranger.admin.url,gravitino.datastrato.custom.authorization.ranger.username,gravitino.datastrato.custom.authorization.ranger.password,gravitino.datastrato.custom.authorization.ranger.auth.type"
+
+visibleConfigsItems: {}
+  # gravitino.datastrato.custom.authorization.ranger.admin.url: "http://ranger:6080"
+  # gravitino.datastrato.custom.authorization.ranger.username: admin
+  # gravitino.datastrato.custom.authorization.ranger.password: "rangerR0cks!"
+  # gravitino.datastrato.custom.authorization.ranger.auth.type: simple
+
+## Additional Gravitino configuration items in gravitino.conf can be added
+##
+additionalConfigItems: {}
+#  gravitino.eventListener.names: "audit,sync"
+
+## Additional volumes
+##
+extraVolumes:
+  - name: gravitino-log
+    emptyDir: {}
+
+## Additional volume mounts
+##
+extraVolumeMounts:
+  - name: gravitino-log
+    mountPath: /root/gravitino/logs
+
+## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
+## If you set enabled as "True", you need :
+## - create a pv which above 10Gi
+## - keep storageClassName same with below setting
+##
+persistence:
+  enabled: false
+  accessModes:
+    - ReadWriteOnce
+  size: 10Gi
+  labels: {}
+  annotations: {}
+  # existingClaim:
+  # storageClassName:
+
+## Whether redirect the log files to the container stdout and stderr
+##
+log:
+  containerStdout: false
+
+## Gravitino log4j2 configuration items in log4j2.properties can be customized
+##
+log4j2Properties: {}
+  # status: warn
+
+  ## Log files location
+  # basePath: "${sys:gravitino.log.path}"
+  # serverName: "${sys:gravitino.server.name}"
+
+  ## RollingFileAppender name, pattern, path and rollover policy
+  # rollingAppenderType: RollingFile
+  # rollingAppenderName: fileLogger
+  # rollingAppenderFileName: "${basePath}/${serverName}.log"
+  # rollingAppenderFilePattern: "${basePath}/${serverName}_%d{yyyyMMdd}.log.gz"
+  # rollingAppenderLayoutType: PatternLayout
+  # rollingAppenderLayoutPattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n"
+  # rollingAppenderPoliciesType: Policies
+
+  ## RollingFileAppender rotation policy
+  # rollingAppenderPoliciesSizeType: SizeBasedTriggeringPolicy
+  # rollingAppenderPoliciesSizeSize: 10MB
+  # rollingAppenderPoliciesTimeType: TimeBasedTriggeringPolicy
+  # rollingAppenderPoliciesTimeInterval: 1
+  # rollingAppenderPoliciesTimeModulate: true
+  # rollingAppenderStrategyType: DefaultRolloverStrategy
+  # rollingAppenderStrategyDeleteType: Delete
+  # rollingAppenderStrategyDeleteBasePath: "${basePath}"
+  # rollingAppenderStrategyDeleteMaxDepth: 10
+  # rollingAppenderStrategyDeleteIfLastModifiedType: IfLastModified
+
+  ## Delete all files older than 30 days
+  # rollingAppenderStrategyDeleteIfLastModifiedAge: 30d
+
+  ## Configure root logger
+  # rootLoggerLevel: info
+  # rootLoggerAppenderRefRollingRef: fileLogger
+
+## Additional log4j2 configuration items in log4j2.properties can be added
+##
+additionalLog4j2Properties: {}
+  # appender.console.type: Console
+  # appender.console.name: console
+  # appender.console.layout.type: PatternLayout
+  # appender.console.layout.pattern: "%d{HH:mm:ss.SSS} %level %msg%n"
+  # rootLogger.appenderRef.console.ref: console
+
+## Expose the gravitino service to be accessed from outside the cluster (LoadBalancer service).
+## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
+## ref: http://kubernetes.io/docs/user-guide/services/
+##
+service:
+  name: gravitino
+  type: ClusterIP
+  port: 8090
+  targetPort: 8090
+  annotations: {}
+  labels: {}
+  portName: http
+  nodePort: ""
+
+## Additional ports to the gravitino services. Useful to expose extra container ports.
+##
+extraExposePorts:
+  - port: 9001
+    protocol: TCP
+    name: http1
+    targetPort: 9001
+
+ingress:
+  enabled: false
+  className: "nginx"
+  annotations: {}
+  # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: chart-gravitino.local
+      paths:
+        - path: /
+          pathType: ImplementationSpecific
+  tls: []
+  #  - secretName: chart-gravitino-tls
+  #    hosts:
+  #      - chart-gravitino.local
+
+## Deployment annotations
+##
+annotations: {}
+
+## Deployment replicas
+##
+replicas: 1
+
+## Pod Annotations
+##
+podAnnotations: {}
+
+## Pod Labels
+##
+podLabels: {}
+
+## Readiness probe for the Gravitino deployment
+##
+readinessProbe:
+  httpGet:
+    path: /
+    port: http
+  initialDelaySeconds: 20
+  timeoutSeconds: 5
+
+## Liveness probe for the Gravitino deployment
+##
+livenessProbe:
+  httpGet:
+    path: /
+    port: http
+  initialDelaySeconds: 20
+  timeoutSeconds: 5
+
+## Container-specific security context configuration
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
+##
+containerSecurityContext:
+  runAsNonRoot: false
+  runAsUser: 0
+
+## Container Environment
+##
+env:
+  - name: GRAVITINO_HOME
+    value: /root/gravitino
+  - name: GRAVITINO_MEM
+    value: "-Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=512m"
+
+## The envWithTpl array below has the same usage as "env", but is using the tpl function to support templatable string.
+## This can be useful when you want to pass dynamic values to the Chart using the helm argument "--set <variable>=<value>"
+## https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function
+##
+envWithTpl: []
+#  - name: FOO_2
+#    value: "{{ .Values.foo2 }}"
+
+# foo2: bar2
+
+envFrom: []
+
+## Resource limits & requests
+##
+resources: {}
+#   requests:
+#     cpu: 1000m
+#     memory: 2Gi
+#   limits:
+#     cpu: 2000m
+#     memory: 3Gi
+
+## Node labels for pod assignment
+## ref: https://kubernetes.io/docs/user-guide/node-selection/
+##
+nodeSelector: {}
+
+## Tolerations for pod assignment
+## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+##
+tolerations: []
+
+## Affinity for pod assignment (evaluated as template)
+## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+##
+affinity: {}
diff --git a/dev/ci/chart_schema.yaml b/dev/ci/chart_schema.yaml
new file mode 100644
index 00000000000..c209822a194
--- /dev/null
+++ b/dev/ci/chart_schema.yaml
@@ -0,0 +1,55 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+name: str()
+home: str(required=False)
+version: str()
+apiVersion: str()
+appVersion: any(str(), num(), required=False)
+description: str(required=False)
+keywords: list(str(), required=False)
+sources: list(str(), required=False)
+maintainers: list(include('maintainer'), required=False)
+dependencies: list(include('dependency'), required=False)
+icon: str(required=False)
+engine: str(required=False)
+condition: str(required=False)
+tags: str(required=False)
+deprecated: bool(required=False)
+kubeVersion: str(required=False)
+annotations: map(str(), str(), required=False)
+type: str(required=False)
+---
+maintainer:
+  name: str()
+  email: str(required=False)
+  url: str(required=False)
+---
+dependency:
+  name: str()
+  version: str()
+  repository: str(required=False)
+  condition: str(required=False)
+  tags: list(str(), required=False)
+  enabled: bool(required=False)
+  import-values: any(list(str()), list(include('import-value')), required=False)
+  alias: str(required=False)
+---
+import-value:
+  child: str()
+  parent: str()
\ No newline at end of file
diff --git a/dev/ci/lintconf.yaml b/dev/ci/lintconf.yaml
new file mode 100644
index 00000000000..c5c904f3e24
--- /dev/null
+++ b/dev/ci/lintconf.yaml
@@ -0,0 +1,60 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+---
+rules:
+  braces:
+    min-spaces-inside: 0
+    max-spaces-inside: 0
+    min-spaces-inside-empty: -1
+    max-spaces-inside-empty: -1
+  brackets:
+    min-spaces-inside: 0
+    max-spaces-inside: 0
+    min-spaces-inside-empty: -1
+    max-spaces-inside-empty: -1
+  colons:
+    max-spaces-before: 0
+    max-spaces-after: 1
+  commas:
+    max-spaces-before: 0
+    min-spaces-after: 1
+    max-spaces-after: 1
+  comments:
+    require-starting-space: true
+    min-spaces-from-content: 2
+  document-end: disable
+  document-start: disable           # No --- to start a file
+  empty-lines:
+    max: 2
+    max-start: 0
+    max-end: 0
+  hyphens:
+    max-spaces-after: 1
+  indentation:
+    spaces: consistent
+    indent-sequences: whatever      # - list indentation will handle both indentation and without
+    check-multi-line-strings: false
+  key-duplicates: enable
+  line-length: disable              # Lines can be any length
+  new-line-at-end-of-file: enable
+  new-lines:
+    type: unix
+  trailing-spaces: enable
+  truthy:
+    level: warning
\ No newline at end of file
diff --git a/docs/chart.md b/docs/chart.md
new file mode 100644
index 00000000000..d3a6d272b70
--- /dev/null
+++ b/docs/chart.md
@@ -0,0 +1,135 @@
+---
+title: "Apache Gravitino Helm Chart"
+slug: /chart
+keyword: chart
+license: "This software is licensed under the Apache License version 2."
+---
+
+# Apache Gravitino Helm Chart
+
+This Helm chart deploys Apache Gravitino on Kubernetes with customizable configurations.
+
+**Homepage:** <https://gravitino.apache.org/>
+
+## Prerequisites
+
+- Kubernetes 1.29+
+- Helm 3+
+
+## Maintainers
+
+| Name             | Email                    | Url                          |
+|------------------|--------------------------|------------------------------|
+| Apache Gravitino | dev@gravitino.apache.org | https://gravitino.apache.org |
+
+## Source Code
+
+* <https://github.com/apache/gravitino>
+
+## Update Chart Dependency
+
+If the chart has not been released yet, navigate to the chart directory and update its dependencies:
+
+```console
+helm dependency update [CHART]
+```
+
+## View Chart values
+
+You can customize values.yaml parameters to override chart default settings. Additionally, Gravitino configurations in gravitino.conf can be modified through Helm values.yaml.
+
+To display the default values of the Gravitino chart, run:
+
+```console
+helm show values [CHART]
+```
+
+## Install Helm Chart
+
+```console
+helm install [RELEASE_NAME] [CHART] [flags]
+```
+
+### Deploy with Default Configuration
+
+Run the following command to deploy Gravitino using the default settings:
+
+```console
+helm upgrade --install gravitino ./gravitino -n gravitino --create-namespace
+```
+
+### Deploy with Custom Configuration
+
+To customize the deployment, use the --set flag to override specific values:
+
+```console
+helm upgrade --install gravitino ./gravitino -n gravitino --create-namespace \
+  --set key1=val1,key2=val2,...
+```
+
+Alternatively, you can provide a custom values.yaml file:
+
+```console
+helm upgrade --install gravitino ./gravitino -n gravitino --create-namespace -f /path/to/chart/resources/scenarios/ci-values.yaml
+```
+
+_Note: \
+/path/to/chart/resources/scenarios/ci-values.yaml is an example scenario to deploy._
+
+### Deploying Gravitino with MySQL as the Storage Backend
+
+To deploy both Gravitino and MySQL, where MySQL is used as the storage backend, enable the built-in MySQL instance:
+
+```console
+helm upgrade --install gravitino ./gravitino -n gravitino --create-namespace \
+  --set mysql.enabled=true
+```
+
+#### Disable Dynamic Storage Provisioning
+
+By default, the MySQL PersistentVolumeClaim(PVC) storage class is local-path. To disable dynamic provisioning, set the storage class to "-":
+
+```console
+helm upgrade --install gravitino ./gravitino -n gravitino --create-namespace \
+  --set mysql.enabled=true \
+  --set global.defaultStorageClass="-"
+```
+
+You must then manually create a PersistentVolume (PV).
+
+### Deploy Gravitino using an existed MySQL Database
+
+Ensure you have the following MySQL credentials ready: Username, Password, Database Name. When creating your database, we recommend calling it `gravitino`.
+
+Before deploying Gravitino, initialize your existing MySQL instance and create the necessary tables required for Gravitino to function properly.
+
+```console
+mysql -h database-1.***.***.rds.amazonaws.com -P 3306 -u <YOUR-USERNAME> -p <YOUR-PASSWORD> < schema-0.*.0-mysql.sql
+```
+
+Use Helm to install or upgrade Gravitino, specifying the MySQL connection details.
+
+```console
+helm upgrade --install gravitino ./gravitino -n gravitino --create-namespace \
+  --set entity.jdbcUrl="jdbc:mysql://database-1.***.***.rds.amazonaws.com:3306/gravitino" \
+  --set entity.jdbcDriver="com.mysql.cj.jdbc.Driver" \
+  --set entity.jdbcUser="admin" \
+  --set entity.jdbcPassword="admin123"
+```
+
+_Note: \
+Replace database-1.***.***.rds.amazonaws.com with your actual MySQL host. \
+Change admin and admin123 to your actual MySQL username and password. \
+Ensure the target MySQL database (gravitino) exists before deployment._
+
+## Uninstall Helm Chart
+
+```console
+helm uninstall [RELEASE_NAME] -n [NAMESPACE]
+```
+
+## Package Helm Chart
+
+```console
+helm package [CHART_PATH]
+```
\ No newline at end of file


Reviews:
user: login: jerryshao
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-12T13:33:14Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T02:11:38Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T02:12:53Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T02:18:15Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T02:36:33Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T02:51:17Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T02:54:43Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T02:56:53Z
user: login: roryqi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T03:19:10Z
user: login: roryqi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T03:20:43Z
user: login: roryqi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T03:21:17Z
user: login: roryqi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T03:26:52Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T08:14:05Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T08:49:47Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T08:49:58Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T09:14:05Z
user: login: roryqi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T09:18:58Z
user: login: roryqi
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T03:00:10Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T03:23:50Z
user: login: jerryshao
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T08:50:36Z
user: login: jerryshao
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T09:15:41Z
user: login: jerryshao
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T09:17:22Z
user: login: FANNG1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T09:29:14Z
user: login: jerryshao
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T10:02:28Z
user: login: jerryshao
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T10:05:05Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T03:05:14Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T03:13:59Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T04:17:03Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T04:24:22Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T07:38:49Z
user: login: danhuawang
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T02:13:56Z
user: login: jerryshao
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T07:03:41Z

Review comments:
diff_hunk: @@ -305,6 +305,10 @@
    ./authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/VXUser.java
    ./authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/VXUserList.java
 
+   Helm chart-testing
path: LICENSE
user: login: jerryshao
body: What Is the license of helm chart-testing?
created_at: 2025-03-12T12:51:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,38 @@
+#
path: dev/charts/gravitino/Chart.yaml
user: login: jerryshao
body: Is this capital "C" the requirement of chart?
created_at: 2025-03-12T12:56:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,118 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+# gravitino
path: dev/charts/gravitino/README.md
user: login: jerryshao
body: Capitalize "G" for Gravitino, also add "Apache" for the first time it appears.
created_at: 2025-03-12T12:58:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,118 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+# gravitino
+
+Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the
+metadata directly in
+different sources, types, and regions. It also provides users with unified metadata access
+for data and AI assets.
+
+**Homepage:** <https://gravitino.apache.org/>
+
+## Maintainers
+
+| Name      | Email                    | Url                          |
+|-----------|--------------------------|------------------------------|
+| Gravitino | dev@gravitino.apache.org | https://gravitino.apache.org |
+
+## Source Code
+
+* <https://github.com/apache/gravitino>
+* <https://github.com/apache/gravitino-playground>
+
+## Values
+
+| Key                 | Default                       | Description                                                           |
+|---------------------|-------------------------------|-----------------------------------------------------------------------|
+| image.repository    | `"apache/gravitino"`          |                                                                       |
+| image.tag           | `"0.9.0-incubating-SNAPSHOT"` |                                                                       |
+| image.pullPolicy    | `"IfNotPresent"`              |                                                                       |
+| image.pullSecrets   | `[]       `                   | Optionally specify secrets for pulling images from a private registry |                            
+| mysql.enabled       | `false`                       | Flag to enable MySQL as the storage backend for Gravitino             |
+| entity.jdbcUrl      | `"jdbc:h2"`                   | The JDBC URL for the database                                         |
+| entity.jdbcDriver   | `"org.h2.Driver"`             | The JDBC driver class name                                            |
+| entity.jdbcUser     | `"gravitino"`                 | The username for the JDBC connection                                  |
+| entity.jdbcPassword | `"gravitino"`                 | The password for the JDBC connection                                  |
+| env                 | `HADOOP_USER_NAME: hdfs `     | Environment variables to pass to the container                        |
path: dev/charts/gravitino/README.md
user: login: jerryshao
body: Why do we need this env variable?
created_at: 2025-03-12T12:59:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,118 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+# gravitino
+
+Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the
+metadata directly in
+different sources, types, and regions. It also provides users with unified metadata access
+for data and AI assets.
+
+**Homepage:** <https://gravitino.apache.org/>
+
+## Maintainers
+
+| Name      | Email                    | Url                          |
+|-----------|--------------------------|------------------------------|
+| Gravitino | dev@gravitino.apache.org | https://gravitino.apache.org |
+
+## Source Code
+
+* <https://github.com/apache/gravitino>
+* <https://github.com/apache/gravitino-playground>
+
+## Values
+
+| Key                 | Default                       | Description                                                           |
+|---------------------|-------------------------------|-----------------------------------------------------------------------|
+| image.repository    | `"apache/gravitino"`          |                                                                       |
+| image.tag           | `"0.9.0-incubating-SNAPSHOT"` |                                                                       |
+| image.pullPolicy    | `"IfNotPresent"`              |                                                                       |
+| image.pullSecrets   | `[]       `                   | Optionally specify secrets for pulling images from a private registry |                            
+| mysql.enabled       | `false`                       | Flag to enable MySQL as the storage backend for Gravitino             |
+| entity.jdbcUrl      | `"jdbc:h2"`                   | The JDBC URL for the database                                         |
+| entity.jdbcDriver   | `"org.h2.Driver"`             | The JDBC driver class name                                            |
+| entity.jdbcUser     | `"gravitino"`                 | The username for the JDBC connection                                  |
+| entity.jdbcPassword | `"gravitino"`                 | The password for the JDBC connection                                  |
+| env                 | `HADOOP_USER_NAME: hdfs `     | Environment variables to pass to the container                        |
+| resources           | `{}            `              | esource requests and limits for the container                         |
+
+## Deploy gravitino to your cluster
path: dev/charts/gravitino/README.md
user: login: jerryshao
body: "Gravitino"
created_at: 2025-03-12T13:00:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+The gravitino has been deployed to your cluster.
path: dev/charts/gravitino/templates/NOTES.txt
user: login: jerryshao
body: What is the usage of this file?
created_at: 2025-03-12T13:04:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,208 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+image:
+  repository: apache/gravitino
+  tag: 0.9.0-incubating-SNAPSHOT
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of imagePullSecrets (secrets must be manually created in the namespace)
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Example:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+# Deploy mysql on K8S cluster as gravitino storage backend.
+mysql:
+  enabled: false
+  image:
+    pullSecrets: []
+  initdbScriptsConfigMap: gravitino-mysql-init
+  auth:
+    rootPassword: "admin"
+    createDatabase: true
+    database: "gravitino"
+    username: "gravitino"
+    password: "gravitino"
+
+# Use H2 as the default embedded database, or set up an external database for enhanced scalability and performance.
+# schema-0.*.0-mysql.sql is the data init script that should be executed in the external database manually.
+entity:
+  store: "relational"
+  maxTransactionSkewTimeMs: 2000
+  deleteAfterTimeMs: 604800000
+  versionRetentionCount: 1
+  relationalBackend: "JDBCBackend"
+  jdbcUrl: jdbc:h2
+  jdbcDriver: org.h2.Driver
+  jdbcUser: gravitino
+  jdbcPassword: gravitino
+  storagePath: /root/gravitino/data
+
+server:
+  shutdownTimeout: 3000
+  rest:
+    extensionPackages: ""
+
+webserver:
+  host: "0.0.0.0"
+  httpPort: 8090
+  minThreads: 24
+  maxThreads: 200
+  stopTimeout: 30000
+  idleTimeout: 30000
+  threadPoolWorkQueueSize: 100
+  requestHeaderSize: 131072
+  responseHeaderSize: 131072
+  customFilters: ""
+
+catalog:
+  cacheEvictionIntervalMs: 3600000
+  classloader:
+    isolated: true
+
+authorization:
+  enable: false
+  serviceAdmins: "anonymous"
+
+auxService:
+  names: "iceberg-rest"
+
+icebergRest:
+  classpath: "iceberg-rest-server/libs, iceberg-rest-server/conf"
+  host: "0.0.0.0"
+  httpPort: 9001
+  catalogBackend: "memory"
+  warehouse: "/tmp/"
+
+authenticators: simple
+
+authenticator:
+  oauth:
+    serviceAudience: test
+    defaultSignKey: MIIAIjBNBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmmqfSy8vH9BMKZLIjPHNTClH7yyykV/J/dfNwwicoYCBQgLOLRq59nAiJ9/WOkIq7zIXQ8iZU5XmI0bRSo3Ah7G4uF6CUbpny+n4zxwTfEEJ3dVC1Aa1g3DZbf8mN76B2ykf6z4FEbTWVBp0xMZ14YBOIuOUkN4F/x8bQNYRPl0yepLBZf6uY26f2o5+yKBcpAk7K/pGoD4v+DKpt/A8bvf4fy3JpZERsMPS/veeyIqR6f+455KLjRabBpxl5xIo8iUer5O0Ci8xbQMci4ErRRemm5n1e74Kqpz5u/TcLIPdMLXJ57fLl9t7V9BtLyRTjyooJpnl/lz+kJ+VIt1kQICNPMB
+    serverUri: http://57.185.211.74:8080
+    tokenPath: /realms/myrealm/protocol/openid-connect/token
+
+audit:
+  enabled: false
+  writer:
+    className: "org.apache.gravitino.audit.FileAuditWriter"
+    file:
+      fileName: "gravitino_audit.log"
+      flushIntervalSecs: 10
+      append: true
+  formatter:
+    className: "org.apache.gravitino.audit.SimpleFormatter"
+
+metrics:
+  timeSlidingWindowSecs: 60
path: dev/charts/gravitino/values.yaml
user: login: jerryshao
body: Can we configure these when launch the Gravitino service?
created_at: 2025-03-12T13:13:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -305,6 +305,10 @@
    ./authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/VXUser.java
    ./authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/reference/VXUserList.java
 
+   Helm chart-testing
path: LICENSE
user: login: danhuawang
body: Apache-2.0 license
created_at: 2025-03-17T02:11:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,38 @@
+#
path: dev/charts/gravitino/Chart.yaml
user: login: danhuawang
body: Yes, it's created by `helm create my-chart` by default.
created_at: 2025-03-17T02:12:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,118 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+# gravitino
path: dev/charts/gravitino/README.md
user: login: danhuawang
body: Fixed.
created_at: 2025-03-17T02:18:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,118 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+# gravitino
+
+Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the
+metadata directly in
+different sources, types, and regions. It also provides users with unified metadata access
+for data and AI assets.
+
+**Homepage:** <https://gravitino.apache.org/>
+
+## Maintainers
+
+| Name      | Email                    | Url                          |
+|-----------|--------------------------|------------------------------|
+| Gravitino | dev@gravitino.apache.org | https://gravitino.apache.org |
+
+## Source Code
+
+* <https://github.com/apache/gravitino>
+* <https://github.com/apache/gravitino-playground>
+
+## Values
+
+| Key                 | Default                       | Description                                                           |
+|---------------------|-------------------------------|-----------------------------------------------------------------------|
+| image.repository    | `"apache/gravitino"`          |                                                                       |
+| image.tag           | `"0.9.0-incubating-SNAPSHOT"` |                                                                       |
+| image.pullPolicy    | `"IfNotPresent"`              |                                                                       |
+| image.pullSecrets   | `[]       `                   | Optionally specify secrets for pulling images from a private registry |                            
+| mysql.enabled       | `false`                       | Flag to enable MySQL as the storage backend for Gravitino             |
+| entity.jdbcUrl      | `"jdbc:h2"`                   | The JDBC URL for the database                                         |
+| entity.jdbcDriver   | `"org.h2.Driver"`             | The JDBC driver class name                                            |
+| entity.jdbcUser     | `"gravitino"`                 | The username for the JDBC connection                                  |
+| entity.jdbcPassword | `"gravitino"`                 | The password for the JDBC connection                                  |
+| env                 | `HADOOP_USER_NAME: hdfs `     | Environment variables to pass to the container                        |
path: dev/charts/gravitino/README.md
user: login: danhuawang
body: Maybe no need. Set empty as default value.
created_at: 2025-03-17T02:36:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,118 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+# gravitino
+
+Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the
+metadata directly in
+different sources, types, and regions. It also provides users with unified metadata access
+for data and AI assets.
+
+**Homepage:** <https://gravitino.apache.org/>
+
+## Maintainers
+
+| Name      | Email                    | Url                          |
+|-----------|--------------------------|------------------------------|
+| Gravitino | dev@gravitino.apache.org | https://gravitino.apache.org |
+
+## Source Code
+
+* <https://github.com/apache/gravitino>
+* <https://github.com/apache/gravitino-playground>
+
+## Values
+
+| Key                 | Default                       | Description                                                           |
+|---------------------|-------------------------------|-----------------------------------------------------------------------|
+| image.repository    | `"apache/gravitino"`          |                                                                       |
+| image.tag           | `"0.9.0-incubating-SNAPSHOT"` |                                                                       |
+| image.pullPolicy    | `"IfNotPresent"`              |                                                                       |
+| image.pullSecrets   | `[]       `                   | Optionally specify secrets for pulling images from a private registry |                            
+| mysql.enabled       | `false`                       | Flag to enable MySQL as the storage backend for Gravitino             |
+| entity.jdbcUrl      | `"jdbc:h2"`                   | The JDBC URL for the database                                         |
+| entity.jdbcDriver   | `"org.h2.Driver"`             | The JDBC driver class name                                            |
+| entity.jdbcUser     | `"gravitino"`                 | The username for the JDBC connection                                  |
+| entity.jdbcPassword | `"gravitino"`                 | The password for the JDBC connection                                  |
+| env                 | `HADOOP_USER_NAME: hdfs `     | Environment variables to pass to the container                        |
+| resources           | `{}            `              | esource requests and limits for the container                         |
+
+## Deploy gravitino to your cluster
path: dev/charts/gravitino/README.md
user: login: danhuawang
body: Fixed.
created_at: 2025-03-17T02:51:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+{{- /*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  */}}
+The gravitino has been deployed to your cluster.
path: dev/charts/gravitino/templates/NOTES.txt
user: login: danhuawang
body: This file is used to define the NOTES that need to be printed on the console when run install the chart, like the last line in the following example.
```
 helm upgrade --install gravitino ./gravitino -n gravitino --create-namespace

walk.go:74: found symbolic link in path: /Users/wangdanhua/Workspace/gravitino/dev/charts/gravitino/resources/files/mysql resolves to /Users/wangdanhua/Workspace/gravitino/scripts/mysql. Contents of linked file included and used
Release "gravitino" has been upgraded. Happy Helming!
NAME: gravitino
LAST DEPLOYED: Mon Mar 17 10:52:26 2025
NAMESPACE: gravitino
STATUS: deployed
REVISION: 2
NOTES:
The gravitino has been deployed to your cluster.
```
created_at: 2025-03-17T02:54:43Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,208 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+image:
+  repository: apache/gravitino
+  tag: 0.9.0-incubating-SNAPSHOT
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of imagePullSecrets (secrets must be manually created in the namespace)
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Example:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+# Deploy mysql on K8S cluster as gravitino storage backend.
+mysql:
+  enabled: false
+  image:
+    pullSecrets: []
+  initdbScriptsConfigMap: gravitino-mysql-init
+  auth:
+    rootPassword: "admin"
+    createDatabase: true
+    database: "gravitino"
+    username: "gravitino"
+    password: "gravitino"
+
+# Use H2 as the default embedded database, or set up an external database for enhanced scalability and performance.
+# schema-0.*.0-mysql.sql is the data init script that should be executed in the external database manually.
+entity:
+  store: "relational"
+  maxTransactionSkewTimeMs: 2000
+  deleteAfterTimeMs: 604800000
+  versionRetentionCount: 1
+  relationalBackend: "JDBCBackend"
+  jdbcUrl: jdbc:h2
+  jdbcDriver: org.h2.Driver
+  jdbcUser: gravitino
+  jdbcPassword: gravitino
+  storagePath: /root/gravitino/data
+
+server:
+  shutdownTimeout: 3000
+  rest:
+    extensionPackages: ""
+
+webserver:
+  host: "0.0.0.0"
+  httpPort: 8090
+  minThreads: 24
+  maxThreads: 200
+  stopTimeout: 30000
+  idleTimeout: 30000
+  threadPoolWorkQueueSize: 100
+  requestHeaderSize: 131072
+  responseHeaderSize: 131072
+  customFilters: ""
+
+catalog:
+  cacheEvictionIntervalMs: 3600000
+  classloader:
+    isolated: true
+
+authorization:
+  enable: false
+  serviceAdmins: "anonymous"
+
+auxService:
+  names: "iceberg-rest"
+
+icebergRest:
+  classpath: "iceberg-rest-server/libs, iceberg-rest-server/conf"
+  host: "0.0.0.0"
+  httpPort: 9001
+  catalogBackend: "memory"
+  warehouse: "/tmp/"
+
+authenticators: simple
+
+authenticator:
+  oauth:
+    serviceAudience: test
+    defaultSignKey: MIIAIjBNBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmmqfSy8vH9BMKZLIjPHNTClH7yyykV/J/dfNwwicoYCBQgLOLRq59nAiJ9/WOkIq7zIXQ8iZU5XmI0bRSo3Ah7G4uF6CUbpny+n4zxwTfEEJ3dVC1Aa1g3DZbf8mN76B2ykf6z4FEbTWVBp0xMZ14YBOIuOUkN4F/x8bQNYRPl0yepLBZf6uY26f2o5+yKBcpAk7K/pGoD4v+DKpt/A8bvf4fy3JpZERsMPS/veeyIqR6f+455KLjRabBpxl5xIo8iUer5O0Ci8xbQMci4ErRRemm5n1e74Kqpz5u/TcLIPdMLXJ57fLl9t7V9BtLyRTjyooJpnl/lz+kJ+VIt1kQICNPMB
+    serverUri: http://57.185.211.74:8080
+    tokenPath: /realms/myrealm/protocol/openid-connect/token
+
+audit:
+  enabled: false
+  writer:
+    className: "org.apache.gravitino.audit.FileAuditWriter"
+    file:
+      fileName: "gravitino_audit.log"
+      flushIntervalSecs: 10
+      append: true
+  formatter:
+    className: "org.apache.gravitino.audit.SimpleFormatter"
+
+metrics:
+  timeSlidingWindowSecs: 60
path: dev/charts/gravitino/values.yaml
user: login: danhuawang
body: Yes , all the items in values.yaml  can be customized when run the `helm install` command.
created_at: 2025-03-17T02:56:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,85 @@
+name: Test Charts
+
+# Controls when the workflow will run
+on:
+  pull_request:
+    branches: [ "main", "branch-*" ]
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  changes:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: dorny/paths-filter@v2
path: .github/workflows/chart-test.yaml
user: login: roryqi
body: Maybe you need to update this plugin. The legacy version can't used any more.
created_at: 2025-04-11T03:19:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,151 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+# Apache Gravitino
path: dev/charts/gravitino/README.md
user: login: roryqi
body: Could you put the documents in our docs directory instead of managing it in a single directory?
created_at: 2025-04-11T03:20:43Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,151 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+# Apache Gravitino
+
+Apache Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the
+metadata directly in
+different sources, types, and regions. It also provides users with unified metadata access
+for data and AI assets.
+
+**Homepage:** <https://gravitino.apache.org/>
+
+## Prerequisites
+
+- Kubernetes 1.30+
+- Helm 3+
+
+## Maintainers
+
+| Name             | Email                    | Url                          |
+|------------------|--------------------------|------------------------------|
+| Apache Gravitino | dev@gravitino.apache.org | https://gravitino.apache.org |
+
+## Source Code
+
+* <https://github.com/apache/gravitino>
+* <https://github.com/apache/gravitino-playground>
path: dev/charts/gravitino/README.md
user: login: roryqi
body: Why do we need playground repo?
created_at: 2025-04-11T03:21:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,422 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+image:
+  repository: apache/gravitino
+  tag: 0.9.0-incubating-SNAPSHOT
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of pullSecrets (secrets must be manually created in the namespace)
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Example:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+## MySQL chart configuration
+## ref: https://github.com/bitnami/charts/blob/main/bitnami/mysql/values.yaml
+##
+mysql:
+  ## @param mysql.enabled Deploy MySQL container(s)
+  ##
+  enabled: false
+  ## Bitnami MySQL image version
+  ## ref: https://hub.docker.com/r/bitnami/mysql/tags/
+  ## @param image.registry MySQL image registry
+  ## @param image.repository MySQL image repository
+  ## @param image.tag MySQL image tag
+  ##
+  image:
+    tag: 8.0.36-debian-12-r12
+  ## @param initdbScriptsConfigMap ConfigMap with the initdb scripts
+  ##
+  initdbScriptsConfigMap: gravitino-mysql-init
+  ## MySQL Authentication parameters
+  ##
+  auth:
+    ## @param auth.rootPassword Password for the `root` user.
+    ##
+    rootPassword: admin
+    ## @param auth.createDatabase Whether to create the .Values.auth.database or not
+    ##
+    createDatabase: true
+    ## @param auth.database Name for a custom database to create
+    ##
+    database: gravitino
+    ## @param auth.username Name for a custom user to create
+    ##
+    username: gravitino
+    ## @param auth.password Password for the new user.
+    ##
+    password: gravitino
+
+## THE CONFIGURATION FOR Gravitino ENTITY STORE
+##
+entity:
+  ## The entity store to use, we only supports relational
+  ##
+  store: relational
+  maxTransactionSkewTimeMs: 2000
+  deleteAfterTimeMs: 604800000
+  versionRetentionCount: 1
+  ## The backend for the entity store, we only supports JDBC
+  ##
+  relationalBackend: JDBCBackend
+  ## The JDBC URL for the entity store
+  ##
+  jdbcUrl: jdbc:h2
+  ## The JDBC driver class name
+  ##
+  jdbcDriver: org.h2.Driver
+  ## The JDBC user name
+  ##
+  jdbcUser: gravitino
+  ## The JDBC password
+  ##
+  jdbcPassword: gravitino
+  storagePath: /root/gravitino/data/jdbc
+
+## THE CONFIGURATION FOR Gravitino SERVER
+##
+server:
+  shutdownTimeout: 3000
+  rest:
+    extensionPackages: ""
+## THE CONFIGURATION FOR Gravitino WEB SERVER
+##
+webserver:
+  ## The host name of the built-in web server
+  ##
+  host: 0.0.0.0
+  ## The http port number of the built-in web server
+  ##
+  httpPort: 8090
+  ## The min thread size of the built-in web server
+  ##
+  minThreads: 24
+  ## The max thread size of the built-in web server
+  ##
+  maxThreads: 200
+  ## The stop timeout of the built-in web server
+  ##
+  stopTimeout: 30000
+  ## The timeout of idle connections
+  ##
+  idleTimeout: 30000
+  ## The executor thread pool work queue size of the built-in web server
+  ##
+  threadPoolWorkQueueSize: 100
+  ## The request header size of the built-in web server
+  ##
+  requestHeaderSize: 131072
+  ## The response header size of the built-in web server
+  ##
+  responseHeaderSize: 131072
+  customFilters: ""
+
+## THE CONFIGURATION FOR Gravitino CATALOG
+##
+catalog:
+  ## The interval in milliseconds to evict the catalog cache
+  ##
+  cacheEvictionIntervalMs: 3600000
+  classloader:
+    isolated: true
+
+## THE CONFIGURATION FOR authorization
+##
+authorization:
+  ## Whether Gravitino enable authorization or not
+  ##
+  enable: false
+  ## The admins of Gravitino service, multiple admins are spitted by comma.
+  ##
+  serviceAdmins: anonymous
+
+## THE CONFIGURATION FOR AUXILIARY SERVICE
+##
+auxService:
+  ## Auxiliary service names, separate by ','
+  ##
+  names: iceberg-rest
+
+icebergRest:
+  ## Iceberg REST service classpath
+  ##
+  classpath: "iceberg-rest-server/libs, iceberg-rest-server/conf"
+  ## Iceberg REST service host
+  ##
+  host: 0.0.0.0
+  ## Iceberg REST service http port
+  ##
+  httpPort: 9001
+  ## The backend Iceberg catalog for Iceberg REST service, it's recommended to change to hive or jdbc
+  ##
+  catalogBackend: memory
+  ## The warehouse directory of Iceberg catalog for Iceberg REST service
+  ##
+  warehouse: /tmp/
+
+## Authentication mechanisms configuration. Support simple, OAuth and Kerberos.
+##
+authenticators: simple
+
+## OAuth mode configuration
+##
+authenticator:
+  oauth:
+    serviceAudience: test
+    defaultSignKey: MIIAIjBNBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmmqfSy8vH9BMKZLIjPHNTClH7yyykV/J/dfNwwicoYCBQgLOLRq59nAiJ9/WOkIq7zIXQ8iZU5XmI0bRSo3Ah7G4uF6CUbpny+n4zxwTfEEJ3dVC1Aa1g3DZbf8mN76B2ykf6z4FEbTWVBp0xMZ14YBOIuOUkN4F/x8bQNYRPl0yepLBZf6uY26f2o5+yKBcpAk7K/pGoD4v+DKpt/A8bvf4fy3JpZERsMPS/veeyIqR6f+455KLjRabBpxl5xIo8iUer5O0Ci8xbQMci4ErRRemm5n1e74Kqpz5u/TcLIPdMLXJ57fLl9t7V9BtLyRTjyooJpnl/lz+kJ+VIt1kQICNPMB
path: dev/charts/gravitino/values.yaml
user: login: roryqi
body: Do we need to configure this key?
created_at: 2025-04-11T03:26:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,85 @@
+name: Test Charts
+
+# Controls when the workflow will run
+on:
+  pull_request:
+    branches: [ "main", "branch-*" ]
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  changes:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: dorny/paths-filter@v2
path: .github/workflows/chart-test.yaml
user: login: danhuawang
body: Fix.
created_at: 2025-04-11T08:14:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,151 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+# Apache Gravitino
path: dev/charts/gravitino/README.md
user: login: danhuawang
body: Fix.
created_at: 2025-04-11T08:49:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,151 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+# Apache Gravitino
+
+Apache Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the
+metadata directly in
+different sources, types, and regions. It also provides users with unified metadata access
+for data and AI assets.
+
+**Homepage:** <https://gravitino.apache.org/>
+
+## Prerequisites
+
+- Kubernetes 1.30+
+- Helm 3+
+
+## Maintainers
+
+| Name             | Email                    | Url                          |
+|------------------|--------------------------|------------------------------|
+| Apache Gravitino | dev@gravitino.apache.org | https://gravitino.apache.org |
+
+## Source Code
+
+* <https://github.com/apache/gravitino>
+* <https://github.com/apache/gravitino-playground>
path: dev/charts/gravitino/README.md
user: login: danhuawang
body: Remove.
created_at: 2025-04-11T08:49:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,422 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+image:
+  repository: apache/gravitino
+  tag: 0.9.0-incubating-SNAPSHOT
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of pullSecrets (secrets must be manually created in the namespace)
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Example:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+## MySQL chart configuration
+## ref: https://github.com/bitnami/charts/blob/main/bitnami/mysql/values.yaml
+##
+mysql:
+  ## @param mysql.enabled Deploy MySQL container(s)
+  ##
+  enabled: false
+  ## Bitnami MySQL image version
+  ## ref: https://hub.docker.com/r/bitnami/mysql/tags/
+  ## @param image.registry MySQL image registry
+  ## @param image.repository MySQL image repository
+  ## @param image.tag MySQL image tag
+  ##
+  image:
+    tag: 8.0.36-debian-12-r12
+  ## @param initdbScriptsConfigMap ConfigMap with the initdb scripts
+  ##
+  initdbScriptsConfigMap: gravitino-mysql-init
+  ## MySQL Authentication parameters
+  ##
+  auth:
+    ## @param auth.rootPassword Password for the `root` user.
+    ##
+    rootPassword: admin
+    ## @param auth.createDatabase Whether to create the .Values.auth.database or not
+    ##
+    createDatabase: true
+    ## @param auth.database Name for a custom database to create
+    ##
+    database: gravitino
+    ## @param auth.username Name for a custom user to create
+    ##
+    username: gravitino
+    ## @param auth.password Password for the new user.
+    ##
+    password: gravitino
+
+## THE CONFIGURATION FOR Gravitino ENTITY STORE
+##
+entity:
+  ## The entity store to use, we only supports relational
+  ##
+  store: relational
+  maxTransactionSkewTimeMs: 2000
+  deleteAfterTimeMs: 604800000
+  versionRetentionCount: 1
+  ## The backend for the entity store, we only supports JDBC
+  ##
+  relationalBackend: JDBCBackend
+  ## The JDBC URL for the entity store
+  ##
+  jdbcUrl: jdbc:h2
+  ## The JDBC driver class name
+  ##
+  jdbcDriver: org.h2.Driver
+  ## The JDBC user name
+  ##
+  jdbcUser: gravitino
+  ## The JDBC password
+  ##
+  jdbcPassword: gravitino
+  storagePath: /root/gravitino/data/jdbc
+
+## THE CONFIGURATION FOR Gravitino SERVER
+##
+server:
+  shutdownTimeout: 3000
+  rest:
+    extensionPackages: ""
+## THE CONFIGURATION FOR Gravitino WEB SERVER
+##
+webserver:
+  ## The host name of the built-in web server
+  ##
+  host: 0.0.0.0
+  ## The http port number of the built-in web server
+  ##
+  httpPort: 8090
+  ## The min thread size of the built-in web server
+  ##
+  minThreads: 24
+  ## The max thread size of the built-in web server
+  ##
+  maxThreads: 200
+  ## The stop timeout of the built-in web server
+  ##
+  stopTimeout: 30000
+  ## The timeout of idle connections
+  ##
+  idleTimeout: 30000
+  ## The executor thread pool work queue size of the built-in web server
+  ##
+  threadPoolWorkQueueSize: 100
+  ## The request header size of the built-in web server
+  ##
+  requestHeaderSize: 131072
+  ## The response header size of the built-in web server
+  ##
+  responseHeaderSize: 131072
+  customFilters: ""
+
+## THE CONFIGURATION FOR Gravitino CATALOG
+##
+catalog:
+  ## The interval in milliseconds to evict the catalog cache
+  ##
+  cacheEvictionIntervalMs: 3600000
+  classloader:
+    isolated: true
+
+## THE CONFIGURATION FOR authorization
+##
+authorization:
+  ## Whether Gravitino enable authorization or not
+  ##
+  enable: false
+  ## The admins of Gravitino service, multiple admins are spitted by comma.
+  ##
+  serviceAdmins: anonymous
+
+## THE CONFIGURATION FOR AUXILIARY SERVICE
+##
+auxService:
+  ## Auxiliary service names, separate by ','
+  ##
+  names: iceberg-rest
+
+icebergRest:
+  ## Iceberg REST service classpath
+  ##
+  classpath: "iceberg-rest-server/libs, iceberg-rest-server/conf"
+  ## Iceberg REST service host
+  ##
+  host: 0.0.0.0
+  ## Iceberg REST service http port
+  ##
+  httpPort: 9001
+  ## The backend Iceberg catalog for Iceberg REST service, it's recommended to change to hive or jdbc
+  ##
+  catalogBackend: memory
+  ## The warehouse directory of Iceberg catalog for Iceberg REST service
+  ##
+  warehouse: /tmp/
+
+## Authentication mechanisms configuration. Support simple, OAuth and Kerberos.
+##
+authenticators: simple
+
+## OAuth mode configuration
+##
+authenticator:
+  oauth:
+    serviceAudience: test
+    defaultSignKey: MIIAIjBNBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmmqfSy8vH9BMKZLIjPHNTClH7yyykV/J/dfNwwicoYCBQgLOLRq59nAiJ9/WOkIq7zIXQ8iZU5XmI0bRSo3Ah7G4uF6CUbpny+n4zxwTfEEJ3dVC1Aa1g3DZbf8mN76B2ykf6z4FEbTWVBp0xMZ14YBOIuOUkN4F/x8bQNYRPl0yepLBZf6uY26f2o5+yKBcpAk7K/pGoD4v+DKpt/A8bvf4fy3JpZERsMPS/veeyIqR6f+455KLjRabBpxl5xIo8iUer5O0Ci8xbQMci4ErRRemm5n1e74Kqpz5u/TcLIPdMLXJ57fLl9t7V9BtLyRTjyooJpnl/lz+kJ+VIt1kQICNPMB
path: dev/charts/gravitino/values.yaml
user: login: danhuawang
body: No ,remove the key.
created_at: 2025-04-11T09:14:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,84 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+mysql:
+  enabled: true
+
+visibleConfigs: "gravitino.datastrato.custom.authorization.ranger.admin.url,gravitino.datastrato.custom.authorization.ranger.username,gravitino.datastrato.custom.authorization.ranger.password,gravitino.datastrato.custom.authorization.ranger.auth.type"
+
+visibleConfigsItems:
+  gravitino.datastrato.custom.authorization.ranger.admin.url: "http://ranger:6080"
+  gravitino.datastrato.custom.authorization.ranger.username: admin
+  gravitino.datastrato.custom.authorization.ranger.password: "rangerR0cks!"
+  gravitino.datastrato.custom.authorization.ranger.auth.type: simple
+
+additionalConfigItems:
+  gravitino.testAdditionalConfigItems.names: audit,sync
+  gravitino.testAdditionalConfigItems.names.test: test
+
+extraVolumeMounts:
+  - name: gravitino-log
+    mountPath: /root/gravitino/logs
+  - name: extra-volume
+    mountPath: /extra-volume-path
+  - name: another-extra-volume
+    mountPath: /another-extra-volume-path
+
+extraVolumes:
+  - name: gravitino-log
+    emptyDir: {}
+  - name: extra-volume
+    emptyDir: {}
+  - name: another-extra-volume
+    emptyDir: {}
+
+replicas: 2
path: dev/charts/gravitino/resources/scenarios/ci-values.yaml
user: login: roryqi
body: Our gravitino default replica is 1?
created_at: 2025-04-11T09:18:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,84 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+mysql:
+  enabled: true
+
+visibleConfigs: "gravitino.datastrato.custom.authorization.ranger.admin.url,gravitino.datastrato.custom.authorization.ranger.username,gravitino.datastrato.custom.authorization.ranger.password,gravitino.datastrato.custom.authorization.ranger.auth.type"
+
+visibleConfigsItems:
+  gravitino.datastrato.custom.authorization.ranger.admin.url: "http://ranger:6080"
+  gravitino.datastrato.custom.authorization.ranger.username: admin
+  gravitino.datastrato.custom.authorization.ranger.password: "rangerR0cks!"
+  gravitino.datastrato.custom.authorization.ranger.auth.type: simple
+
+additionalConfigItems:
+  gravitino.testAdditionalConfigItems.names: audit,sync
+  gravitino.testAdditionalConfigItems.names.test: test
+
+extraVolumeMounts:
+  - name: gravitino-log
+    mountPath: /root/gravitino/logs
+  - name: extra-volume
+    mountPath: /extra-volume-path
+  - name: another-extra-volume
+    mountPath: /another-extra-volume-path
+
+extraVolumes:
+  - name: gravitino-log
+    emptyDir: {}
+  - name: extra-volume
+    emptyDir: {}
+  - name: another-extra-volume
+    emptyDir: {}
+
+replicas: 2
path: dev/charts/gravitino/resources/scenarios/ci-values.yaml
user: login: danhuawang
body: This is the values for CI test
created_at: 2025-04-14T03:23:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,38 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+apiVersion: v2
+appVersion: 0.9.0-incubating-SNAPSHOT
+description: Apache Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the metadata directly in different sources, types, and regions. It also provides users with unified metadata access for data and AI assets.
+home: https://gravitino.apache.org
+annotations:
+  licenses: Apache-2.0
+dependencies:
+  - condition: mysql.enabled
+    name: mysql
+    repository: https://charts.bitnami.com/bitnami
+    version: 10.2.1
+kubeVersion: '>=1.29.0-0'
+maintainers:
+  - name: Gravitino
+    email: dev@gravitino.apache.org
+    url: https://gravitino.apache.org
+name: gravitino
+sources:
+  - https://github.com/apache/gravitino
+version: 0.9.0
path: dev/charts/gravitino/Chart.yaml
user: login: jerryshao
body: What is the meaning of this version "0.9.0"? Is it related to Gravitino version?
created_at: 2025-04-14T08:50:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# THE CONFIGURATION FOR Gravitino SERVER
+gravitino.server.shutdown.timeout = {{ .Values.server.shutdownTimeout | default 3000 }}
+
+# THE CONFIGURATION FOR Gravitino WEB SERVER
+gravitino.server.webserver.host = {{ .Values.webserver.host | default "0.0.0.0" }}
+gravitino.server.webserver.httpPort = {{ .Values.webserver.httpPort | default 8090 }}
+gravitino.server.webserver.minThreads = {{ .Values.webserver.minThreads | default 24 }}
+gravitino.server.webserver.maxThreads = {{ .Values.webserver.maxThreads | default 200 }}
+gravitino.server.webserver.stopTimeout = {{ .Values.webserver.stopTimeout | default 30000 }}
+gravitino.server.webserver.idleTimeout = {{ .Values.webserver.idleTimeout | default 30000 }}
+gravitino.server.webserver.threadPoolWorkQueueSize = {{ .Values.webserver.threadPoolWorkQueueSize | default 100 }}
+gravitino.server.webserver.requestHeaderSize = {{ .Values.webserver.requestHeaderSize | default 131072 }}
+gravitino.server.webserver.responseHeaderSize = {{ .Values.webserver.responseHeaderSize | default 131072 }}
+
+# Comma-separated list of filter class names to apply to the API.
+gravitino.server.webserver.customFilters = {{ .Values.webserver.customFilters }}
+
+# Comma-separated list of REST API packages to expand
+gravitino.server.rest.extensionPackages = {{ .Values.server.rest.extensionPackages }}
+
+# THE CONFIGURATION FOR Gravitino ENTITY STORE
+gravitino.entity.store = {{ .Values.entity.store | default "relational" }}
+gravitino.entity.store.maxTransactionSkewTimeMs = {{ .Values.entity.maxTransactionSkewTimeMs }}
+gravitino.entity.store.deleteAfterTimeMs = {{ (.Values.entity.deleteAfterTimeMs | default 604800000) | int }}
+gravitino.entity.store.versionRetentionCount = {{ .Values.entity.versionRetentionCount }}
+gravitino.entity.store.relational = {{ .Values.entity.relationalBackend | default "JDBCBackend" }}
+gravitino.entity.store.relational.jdbcUrl = {{ if .Values.mysql.enabled }}jdbc:mysql://{{ .Release.Name }}-mysql:3306/{{ .Values.mysql.auth.database }}{{ else }}{{ .Values.entity.jdbcUrl }}{{ end }}
+gravitino.entity.store.relational.jdbcDriver = {{ if .Values.mysql.enabled }}com.mysql.cj.jdbc.Driver{{ else }}{{ .Values.entity.jdbcDriver }}{{ end }}
+gravitino.entity.store.relational.jdbcUser = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.username }}{{ else }}{{ .Values.entity.jdbcUser }}{{ end }}
+gravitino.entity.store.relational.jdbcPassword = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.password }}{{ else }}{{ .Values.entity.jdbcPassword }}{{ end }}
+gravitino.entity.store.relational.storagePath = {{ .Values.entity.storagePath }}
+
+# THE CONFIGURATION FOR Gravitino CATALOG
+gravitino.catalog.cache.evictionIntervalMs = {{ if .Values.catalog.evictionIntervalMs }}{{ .Values.catalog.evictionIntervalMs }}{{ else }}3600000{{ end }}
+gravitino.catalog.classloader.isolated = {{ .Values.catalog.classloader.isolated }}
path: dev/charts/gravitino/resources/config/gravitino.conf
user: login: jerryshao
body: This is "true" by default, and I think we don't need to let users to set this, this is a configuration mostly for test.
created_at: 2025-04-14T09:15:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# THE CONFIGURATION FOR Gravitino SERVER
+gravitino.server.shutdown.timeout = {{ .Values.server.shutdownTimeout | default 3000 }}
+
+# THE CONFIGURATION FOR Gravitino WEB SERVER
+gravitino.server.webserver.host = {{ .Values.webserver.host | default "0.0.0.0" }}
+gravitino.server.webserver.httpPort = {{ .Values.webserver.httpPort | default 8090 }}
+gravitino.server.webserver.minThreads = {{ .Values.webserver.minThreads | default 24 }}
+gravitino.server.webserver.maxThreads = {{ .Values.webserver.maxThreads | default 200 }}
+gravitino.server.webserver.stopTimeout = {{ .Values.webserver.stopTimeout | default 30000 }}
+gravitino.server.webserver.idleTimeout = {{ .Values.webserver.idleTimeout | default 30000 }}
+gravitino.server.webserver.threadPoolWorkQueueSize = {{ .Values.webserver.threadPoolWorkQueueSize | default 100 }}
+gravitino.server.webserver.requestHeaderSize = {{ .Values.webserver.requestHeaderSize | default 131072 }}
+gravitino.server.webserver.responseHeaderSize = {{ .Values.webserver.responseHeaderSize | default 131072 }}
+
+# Comma-separated list of filter class names to apply to the API.
+gravitino.server.webserver.customFilters = {{ .Values.webserver.customFilters }}
+
+# Comma-separated list of REST API packages to expand
+gravitino.server.rest.extensionPackages = {{ .Values.server.rest.extensionPackages }}
+
+# THE CONFIGURATION FOR Gravitino ENTITY STORE
+gravitino.entity.store = {{ .Values.entity.store | default "relational" }}
+gravitino.entity.store.maxTransactionSkewTimeMs = {{ .Values.entity.maxTransactionSkewTimeMs }}
+gravitino.entity.store.deleteAfterTimeMs = {{ (.Values.entity.deleteAfterTimeMs | default 604800000) | int }}
+gravitino.entity.store.versionRetentionCount = {{ .Values.entity.versionRetentionCount }}
+gravitino.entity.store.relational = {{ .Values.entity.relationalBackend | default "JDBCBackend" }}
+gravitino.entity.store.relational.jdbcUrl = {{ if .Values.mysql.enabled }}jdbc:mysql://{{ .Release.Name }}-mysql:3306/{{ .Values.mysql.auth.database }}{{ else }}{{ .Values.entity.jdbcUrl }}{{ end }}
+gravitino.entity.store.relational.jdbcDriver = {{ if .Values.mysql.enabled }}com.mysql.cj.jdbc.Driver{{ else }}{{ .Values.entity.jdbcDriver }}{{ end }}
+gravitino.entity.store.relational.jdbcUser = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.username }}{{ else }}{{ .Values.entity.jdbcUser }}{{ end }}
+gravitino.entity.store.relational.jdbcPassword = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.password }}{{ else }}{{ .Values.entity.jdbcPassword }}{{ end }}
+gravitino.entity.store.relational.storagePath = {{ .Values.entity.storagePath }}
+
+# THE CONFIGURATION FOR Gravitino CATALOG
+gravitino.catalog.cache.evictionIntervalMs = {{ if .Values.catalog.evictionIntervalMs }}{{ .Values.catalog.evictionIntervalMs }}{{ else }}3600000{{ end }}
+gravitino.catalog.classloader.isolated = {{ .Values.catalog.classloader.isolated }}
+
+# THE CONFIGURATION FOR authorization
+gravitino.authorization.enable = {{ .Values.authorization.enable }}
+gravitino.authorization.serviceAdmins = {{ .Values.authorization.serviceAdmins }}
+gravitino.authenticators = {{ .Values.authenticators }}
+gravitino.authenticator.oauth.serviceAudience = {{ .Values.authenticator.oauth.serviceAudience }}
+gravitino.authenticator.oauth.defaultSignKey = {{ .Values.authenticator.oauth.defaultSignKey }}
+gravitino.authenticator.oauth.serverUri = {{ .Values.authenticator.oauth.serverUri }}
+gravitino.authenticator.oauth.tokenPath = {{ .Values.authenticator.oauth.tokenPath }}
+
+# THE CONFIGURATION FOR AUXILIARY SERVICE
+gravitino.auxService.names = {{ .Values.auxService.names | default "iceberg-rest" }}
+gravitino.iceberg-rest.classpath = {{ .Values.icebergRest.classpath | default "iceberg-rest-server/libs, iceberg-rest-server/conf"  }}
+gravitino.iceberg-rest.host = {{ .Values.icebergRest.host | default "0.0.0.0" }}
+gravitino.iceberg-rest.httpPort = {{ .Values.icebergRest.httpPort | default 9001 }}
+gravitino.iceberg-rest.catalog-backend = {{ .Values.icebergRest.catalogBackend | default "memory" }}
+gravitino.iceberg-rest.warehouse = {{ .Values.icebergRest.warehouse | default "/tmp/" }}
+
+# Audit log configuration
+gravitino.audit.enabled = {{ .Values.audit.enabled }}
+gravitino.audit.writer.className = {{ .Values.audit.writer.className }}
+gravitino.audit.formatter.className = {{ .Values.audit.formatter.className }}
+gravitino.audit.writer.file.fileName = {{ .Values.audit.writer.file.fileName }}
+gravitino.audit.writer.file.flushIntervalSecs = {{ .Values.audit.writer.file.flushIntervalSecs }}
+gravitino.audit.writer.file.append = {{ .Values.audit.writer.file.append }}
path: dev/charts/gravitino/resources/config/gravitino.conf
user: login: jerryshao
body: @FANNG1 can you please help to check these configurations?
created_at: 2025-04-14T09:17:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# THE CONFIGURATION FOR Gravitino SERVER
+gravitino.server.shutdown.timeout = {{ .Values.server.shutdownTimeout | default 3000 }}
+
+# THE CONFIGURATION FOR Gravitino WEB SERVER
+gravitino.server.webserver.host = {{ .Values.webserver.host | default "0.0.0.0" }}
+gravitino.server.webserver.httpPort = {{ .Values.webserver.httpPort | default 8090 }}
+gravitino.server.webserver.minThreads = {{ .Values.webserver.minThreads | default 24 }}
+gravitino.server.webserver.maxThreads = {{ .Values.webserver.maxThreads | default 200 }}
+gravitino.server.webserver.stopTimeout = {{ .Values.webserver.stopTimeout | default 30000 }}
+gravitino.server.webserver.idleTimeout = {{ .Values.webserver.idleTimeout | default 30000 }}
+gravitino.server.webserver.threadPoolWorkQueueSize = {{ .Values.webserver.threadPoolWorkQueueSize | default 100 }}
+gravitino.server.webserver.requestHeaderSize = {{ .Values.webserver.requestHeaderSize | default 131072 }}
+gravitino.server.webserver.responseHeaderSize = {{ .Values.webserver.responseHeaderSize | default 131072 }}
+
+# Comma-separated list of filter class names to apply to the API.
+gravitino.server.webserver.customFilters = {{ .Values.webserver.customFilters }}
+
+# Comma-separated list of REST API packages to expand
+gravitino.server.rest.extensionPackages = {{ .Values.server.rest.extensionPackages }}
+
+# THE CONFIGURATION FOR Gravitino ENTITY STORE
+gravitino.entity.store = {{ .Values.entity.store | default "relational" }}
+gravitino.entity.store.maxTransactionSkewTimeMs = {{ .Values.entity.maxTransactionSkewTimeMs }}
+gravitino.entity.store.deleteAfterTimeMs = {{ (.Values.entity.deleteAfterTimeMs | default 604800000) | int }}
+gravitino.entity.store.versionRetentionCount = {{ .Values.entity.versionRetentionCount }}
+gravitino.entity.store.relational = {{ .Values.entity.relationalBackend | default "JDBCBackend" }}
+gravitino.entity.store.relational.jdbcUrl = {{ if .Values.mysql.enabled }}jdbc:mysql://{{ .Release.Name }}-mysql:3306/{{ .Values.mysql.auth.database }}{{ else }}{{ .Values.entity.jdbcUrl }}{{ end }}
+gravitino.entity.store.relational.jdbcDriver = {{ if .Values.mysql.enabled }}com.mysql.cj.jdbc.Driver{{ else }}{{ .Values.entity.jdbcDriver }}{{ end }}
+gravitino.entity.store.relational.jdbcUser = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.username }}{{ else }}{{ .Values.entity.jdbcUser }}{{ end }}
+gravitino.entity.store.relational.jdbcPassword = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.password }}{{ else }}{{ .Values.entity.jdbcPassword }}{{ end }}
+gravitino.entity.store.relational.storagePath = {{ .Values.entity.storagePath }}
+
+# THE CONFIGURATION FOR Gravitino CATALOG
+gravitino.catalog.cache.evictionIntervalMs = {{ if .Values.catalog.evictionIntervalMs }}{{ .Values.catalog.evictionIntervalMs }}{{ else }}3600000{{ end }}
+gravitino.catalog.classloader.isolated = {{ .Values.catalog.classloader.isolated }}
+
+# THE CONFIGURATION FOR authorization
+gravitino.authorization.enable = {{ .Values.authorization.enable }}
+gravitino.authorization.serviceAdmins = {{ .Values.authorization.serviceAdmins }}
+gravitino.authenticators = {{ .Values.authenticators }}
+gravitino.authenticator.oauth.serviceAudience = {{ .Values.authenticator.oauth.serviceAudience }}
+gravitino.authenticator.oauth.defaultSignKey = {{ .Values.authenticator.oauth.defaultSignKey }}
+gravitino.authenticator.oauth.serverUri = {{ .Values.authenticator.oauth.serverUri }}
+gravitino.authenticator.oauth.tokenPath = {{ .Values.authenticator.oauth.tokenPath }}
+
+# THE CONFIGURATION FOR AUXILIARY SERVICE
+gravitino.auxService.names = {{ .Values.auxService.names | default "iceberg-rest" }}
+gravitino.iceberg-rest.classpath = {{ .Values.icebergRest.classpath | default "iceberg-rest-server/libs, iceberg-rest-server/conf"  }}
+gravitino.iceberg-rest.host = {{ .Values.icebergRest.host | default "0.0.0.0" }}
+gravitino.iceberg-rest.httpPort = {{ .Values.icebergRest.httpPort | default 9001 }}
+gravitino.iceberg-rest.catalog-backend = {{ .Values.icebergRest.catalogBackend | default "memory" }}
+gravitino.iceberg-rest.warehouse = {{ .Values.icebergRest.warehouse | default "/tmp/" }}
+
+# Audit log configuration
+gravitino.audit.enabled = {{ .Values.audit.enabled }}
+gravitino.audit.writer.className = {{ .Values.audit.writer.className }}
+gravitino.audit.formatter.className = {{ .Values.audit.formatter.className }}
+gravitino.audit.writer.file.fileName = {{ .Values.audit.writer.file.fileName }}
+gravitino.audit.writer.file.flushIntervalSecs = {{ .Values.audit.writer.file.flushIntervalSecs }}
+gravitino.audit.writer.file.append = {{ .Values.audit.writer.file.append }}
path: dev/charts/gravitino/resources/config/gravitino.conf
user: login: FANNG1
body: I'm ok with the configuration items, the main concern is we should maintenance the default value in two places, one in Gravitino code base, the other in `values.yaml`,  this may lead inconsistent, and is it necessary to export `gravitino.audit.writer.className` to user? 
created_at: 2025-04-14T09:29:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,422 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+image:
+  repository: apache/gravitino
+  tag: 0.9.0-incubating-SNAPSHOT
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of pullSecrets (secrets must be manually created in the namespace)
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Example:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+## MySQL chart configuration
+## ref: https://github.com/bitnami/charts/blob/main/bitnami/mysql/values.yaml
+##
+mysql:
+  ## @param mysql.enabled Deploy MySQL container(s)
+  ##
+  enabled: false
+  ## Bitnami MySQL image version
+  ## ref: https://hub.docker.com/r/bitnami/mysql/tags/
+  ## @param image.registry MySQL image registry
+  ## @param image.repository MySQL image repository
+  ## @param image.tag MySQL image tag
+  ##
+  image:
+    tag: 8.0.36-debian-12-r12
+  ## @param initdbScriptsConfigMap ConfigMap with the initdb scripts
+  ##
+  initdbScriptsConfigMap: gravitino-mysql-init
+  ## MySQL Authentication parameters
+  ##
+  auth:
+    ## @param auth.rootPassword Password for the `root` user.
+    ##
+    rootPassword: admin
+    ## @param auth.createDatabase Whether to create the .Values.auth.database or not
+    ##
+    createDatabase: true
+    ## @param auth.database Name for a custom database to create
+    ##
+    database: gravitino
+    ## @param auth.username Name for a custom user to create
+    ##
+    username: gravitino
+    ## @param auth.password Password for the new user.
+    ##
+    password: gravitino
+
+## THE CONFIGURATION FOR Gravitino ENTITY STORE
+##
+entity:
+  ## The entity store to use, we only supports relational
+  ##
+  store: relational
+  maxTransactionSkewTimeMs: 2000
+  deleteAfterTimeMs: 604800000
+  versionRetentionCount: 1
+  ## The backend for the entity store, we only supports JDBC
+  ##
+  relationalBackend: JDBCBackend
+  ## The JDBC URL for the entity store
+  ##
+  jdbcUrl: jdbc:h2
+  ## The JDBC driver class name
+  ##
+  jdbcDriver: org.h2.Driver
+  ## The JDBC user name
+  ##
+  jdbcUser: gravitino
+  ## The JDBC password
+  ##
+  jdbcPassword: gravitino
+  storagePath: /root/gravitino/data/jdbc
+
+## THE CONFIGURATION FOR Gravitino SERVER
+##
+server:
+  shutdownTimeout: 3000
+  rest:
+    extensionPackages: ""
+## THE CONFIGURATION FOR Gravitino WEB SERVER
+##
+webserver:
+  ## The host name of the built-in web server
+  ##
+  host: 0.0.0.0
+  ## The http port number of the built-in web server
+  ##
+  httpPort: 8090
+  ## The min thread size of the built-in web server
+  ##
+  minThreads: 24
+  ## The max thread size of the built-in web server
+  ##
+  maxThreads: 200
+  ## The stop timeout of the built-in web server
+  ##
+  stopTimeout: 30000
+  ## The timeout of idle connections
+  ##
+  idleTimeout: 30000
+  ## The executor thread pool work queue size of the built-in web server
+  ##
+  threadPoolWorkQueueSize: 100
+  ## The request header size of the built-in web server
+  ##
+  requestHeaderSize: 131072
+  ## The response header size of the built-in web server
+  ##
+  responseHeaderSize: 131072
+  customFilters: ""
+
+## THE CONFIGURATION FOR Gravitino CATALOG
+##
+catalog:
+  ## The interval in milliseconds to evict the catalog cache
+  ##
+  cacheEvictionIntervalMs: 3600000
+  classloader:
+    isolated: true
+
+## THE CONFIGURATION FOR authorization
+##
+authorization:
+  ## Whether Gravitino enable authorization or not
+  ##
+  enable: false
+  ## The admins of Gravitino service, multiple admins are spitted by comma.
+  ##
+  serviceAdmins: anonymous
+
+## THE CONFIGURATION FOR AUXILIARY SERVICE
+##
+auxService:
+  ## Auxiliary service names, separate by ','
+  ##
+  names: iceberg-rest
+
+icebergRest:
+  ## Iceberg REST service classpath
+  ##
+  classpath: "iceberg-rest-server/libs, iceberg-rest-server/conf"
+  ## Iceberg REST service host
+  ##
+  host: 0.0.0.0
+  ## Iceberg REST service http port
+  ##
+  httpPort: 9001
+  ## The backend Iceberg catalog for Iceberg REST service, it's recommended to change to hive or jdbc
+  ##
+  catalogBackend: memory
+  ## The warehouse directory of Iceberg catalog for Iceberg REST service
+  ##
+  warehouse: /tmp/
+
+## Authentication mechanisms configuration. Support simple, OAuth and Kerberos.
+##
+authenticators: simple
+
+## OAuth mode configuration
+##
+authenticator:
+  oauth:
+    serviceAudience: test
+    defaultSignKey: ""
+    serverUri: http://57.185.211.74:8080
+    tokenPath: /realms/myrealm/protocol/openid-connect/token
+
+## Audit log configuration
+##
+audit:
+  enabled: false
+  writer:
+    className: org.apache.gravitino.audit.FileAuditWriter
+    file:
+      fileName: gravitino_audit.log
+      flushIntervalSecs: 10
+      append: true
+  formatter:
+    className: org.apache.gravitino.audit.SimpleFormatter
+
+## Metrics configuration
+##
+metrics:
+  timeSlidingWindowSecs: 60
+
+## Custom Gravitino configuration items
+##
+visibleConfigs: ""
+# visibleConfigs: "gravitino.datastrato.custom.authorization.ranger.admin.url,gravitino.datastrato.custom.authorization.ranger.username,gravitino.datastrato.custom.authorization.ranger.password,gravitino.datastrato.custom.authorization.ranger.auth.type"
+
+visibleConfigsItems: {}
+  # gravitino.datastrato.custom.authorization.ranger.admin.url: "http://ranger:6080"
+  # gravitino.datastrato.custom.authorization.ranger.username: admin
+  # gravitino.datastrato.custom.authorization.ranger.password: "rangerR0cks!"
+  # gravitino.datastrato.custom.authorization.ranger.auth.type: simple
+
+## Additional Gravitino configuration items in gravitino.conf can be added
+##
+additionalConfigItems: {}
+#  gravitino.eventListener.names: "audit,sync"
+
+## Additional volumes
+##
+extraVolumes:
+  - name: gravitino-log
+    emptyDir: {}
+
+## Additional volume mounts
+##
+extraVolumeMounts:
+  - name: gravitino-log
+    mountPath: /root/gravitino/logs
+
+## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
+## If you set enabled as "True", you need :
+## - create a pv which above 10Gi
+## - keep storageClassName same with below setting
+##
+persistence:
+  enabled: false
+  accessModes:
+    - ReadWriteOnce
+  size: 10Gi
+  labels: {}
+  annotations: {}
+  # existingClaim:
+  # storageClassName:
+
+## Whether redirect the log files to the container stdout and stderr
+##
+log:
+  containerStdout: false
+
+## Gravitino log4j2 configuration items in log4j2.properties can be customized
+##
+log4j2Properties: {}
+  # status: warn
+
+  ## Log files location
+  # basePath: "${sys:gravitino.log.path}"
+  # serverName: "${sys:gravitino.server.name}"
+
+  ## RollingFileAppender name, pattern, path and rollover policy
+  # rollingAppenderType: RollingFile
+  # rollingAppenderName: fileLogger
+  # rollingAppenderFileName: "${basePath}/${serverName}.log"
+  # rollingAppenderFilePattern: "${basePath}/${serverName}_%d{yyyyMMdd}.log.gz"
+  # rollingAppenderLayoutType: PatternLayout
+  # rollingAppenderLayoutPattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n"
+  # rollingAppenderPoliciesType: Policies
+
+  ## RollingFileAppender rotation policy
+  # rollingAppenderPoliciesSizeType: SizeBasedTriggeringPolicy
+  # rollingAppenderPoliciesSizeSize: 10MB
+  # rollingAppenderPoliciesTimeType: TimeBasedTriggeringPolicy
+  # rollingAppenderPoliciesTimeInterval: 1
+  # rollingAppenderPoliciesTimeModulate: true
+  # rollingAppenderStrategyType: DefaultRolloverStrategy
+  # rollingAppenderStrategyDeleteType: Delete
+  # rollingAppenderStrategyDeleteBasePath: "${basePath}"
+  # rollingAppenderStrategyDeleteMaxDepth: 10
+  # rollingAppenderStrategyDeleteIfLastModifiedType: IfLastModified
+
+  ## Delete all files older than 30 days
+  # rollingAppenderStrategyDeleteIfLastModifiedAge: 30d
+
+  ## Configure root logger
+  # rootLoggerLevel: info
+  # rootLoggerAppenderRefRollingRef: fileLogger
+
+## Additional log4j2 configuration items in log4j2.properties can be added
+##
+additionalLog4j2Properties: {}
+  # appender.console.type: Console
+  # appender.console.name: console
+  # appender.console.layout.type: PatternLayout
+  # appender.console.layout.pattern: "%d{HH:mm:ss.SSS} %level %msg%n"
+  # rootLogger.appenderRef.console.ref: console
+
+## Expose the gravitino service to be accessed from outside the cluster (LoadBalancer service).
+## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
+## ref: http://kubernetes.io/docs/user-guide/services/
+##
+service:
+  name: gravitino
+  type: ClusterIP
+  port: 8090
+  targetPort: 8090
+  annotations: {}
+  labels: {}
+  portName: http
+  nodePort: ""
+
+## Additional ports to the gravitino services. Useful to expose extra container ports.
+##
+extraExposePorts:
+  - port: 9001
+    protocol: TCP
+    name: http1
+    targetPort: 9001
+
+ingress:
+  enabled: false
+  className: "nginx"
+  annotations: {}
+  # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: chart-gravitino.local
+      paths:
+        - path: /
+          pathType: ImplementationSpecific
+  tls: []
+  #  - secretName: chart-gravitino-tls
+  #    hosts:
+  #      - chart-gravitino.local
+
+## Deployment annotations
+##
+annotations: {}
+
+## Deployment replicas
+##
+replicas: 1
+
+## Pod Annotations
+##
+podAnnotations: {}
+
+## Pod Labels
+##
+podLabels: {}
+
+## Readiness probe for the Gravitino deployment
+##
+readinessProbe:
+  httpGet:
+    path: /
+    port: http
+  initialDelaySeconds: 20
+  timeoutSeconds: 5
+
+## Liveness probe for the Gravitino deployment
+##
+livenessProbe:
+  httpGet:
+    path: /
+    port: http
+  initialDelaySeconds: 20
+  timeoutSeconds: 5
+
+## Container-specific security context configuration
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
+##
+containerSecurityContext:
+  runAsNonRoot: false
+  runAsUser: 0
+
+## Container Environment
+##
+env:
+  - name: GRAVITINO_HOME
+    value: /root/gravitino
+  - name: GRAVITINO_MEM
+    value: "-Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=512m"
path: dev/charts/gravitino/values.yaml
user: login: jerryshao
body: Can we configure this?
created_at: 2025-04-14T10:02:28Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+# Apache Gravitino Chart
path: docs/chart.md
user: login: jerryshao
body: This doc should follow other Docusaurus doc header, otherwise it cannot be rendered in Docusaurus.
created_at: 2025-04-14T10:05:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,38 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+apiVersion: v2
+appVersion: 0.9.0-incubating-SNAPSHOT
+description: Apache Gravitino is a high-performance, geo-distributed, and federated metadata lake. It manages the metadata directly in different sources, types, and regions. It also provides users with unified metadata access for data and AI assets.
+home: https://gravitino.apache.org
+annotations:
+  licenses: Apache-2.0
+dependencies:
+  - condition: mysql.enabled
+    name: mysql
+    repository: https://charts.bitnami.com/bitnami
+    version: 10.2.1
+kubeVersion: '>=1.29.0-0'
+maintainers:
+  - name: Gravitino
+    email: dev@gravitino.apache.org
+    url: https://gravitino.apache.org
+name: gravitino
+sources:
+  - https://github.com/apache/gravitino
+version: 0.9.0
path: dev/charts/gravitino/Chart.yaml
user: login: danhuawang
body: It's not related to Gravitino version. Just beginning with "0.9.0". If new patch in the chart ,it will be 0.9.2. 
created_at: 2025-04-15T03:05:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# THE CONFIGURATION FOR Gravitino SERVER
+gravitino.server.shutdown.timeout = {{ .Values.server.shutdownTimeout | default 3000 }}
+
+# THE CONFIGURATION FOR Gravitino WEB SERVER
+gravitino.server.webserver.host = {{ .Values.webserver.host | default "0.0.0.0" }}
+gravitino.server.webserver.httpPort = {{ .Values.webserver.httpPort | default 8090 }}
+gravitino.server.webserver.minThreads = {{ .Values.webserver.minThreads | default 24 }}
+gravitino.server.webserver.maxThreads = {{ .Values.webserver.maxThreads | default 200 }}
+gravitino.server.webserver.stopTimeout = {{ .Values.webserver.stopTimeout | default 30000 }}
+gravitino.server.webserver.idleTimeout = {{ .Values.webserver.idleTimeout | default 30000 }}
+gravitino.server.webserver.threadPoolWorkQueueSize = {{ .Values.webserver.threadPoolWorkQueueSize | default 100 }}
+gravitino.server.webserver.requestHeaderSize = {{ .Values.webserver.requestHeaderSize | default 131072 }}
+gravitino.server.webserver.responseHeaderSize = {{ .Values.webserver.responseHeaderSize | default 131072 }}
+
+# Comma-separated list of filter class names to apply to the API.
+gravitino.server.webserver.customFilters = {{ .Values.webserver.customFilters }}
+
+# Comma-separated list of REST API packages to expand
+gravitino.server.rest.extensionPackages = {{ .Values.server.rest.extensionPackages }}
+
+# THE CONFIGURATION FOR Gravitino ENTITY STORE
+gravitino.entity.store = {{ .Values.entity.store | default "relational" }}
+gravitino.entity.store.maxTransactionSkewTimeMs = {{ .Values.entity.maxTransactionSkewTimeMs }}
+gravitino.entity.store.deleteAfterTimeMs = {{ (.Values.entity.deleteAfterTimeMs | default 604800000) | int }}
+gravitino.entity.store.versionRetentionCount = {{ .Values.entity.versionRetentionCount }}
+gravitino.entity.store.relational = {{ .Values.entity.relationalBackend | default "JDBCBackend" }}
+gravitino.entity.store.relational.jdbcUrl = {{ if .Values.mysql.enabled }}jdbc:mysql://{{ .Release.Name }}-mysql:3306/{{ .Values.mysql.auth.database }}{{ else }}{{ .Values.entity.jdbcUrl }}{{ end }}
+gravitino.entity.store.relational.jdbcDriver = {{ if .Values.mysql.enabled }}com.mysql.cj.jdbc.Driver{{ else }}{{ .Values.entity.jdbcDriver }}{{ end }}
+gravitino.entity.store.relational.jdbcUser = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.username }}{{ else }}{{ .Values.entity.jdbcUser }}{{ end }}
+gravitino.entity.store.relational.jdbcPassword = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.password }}{{ else }}{{ .Values.entity.jdbcPassword }}{{ end }}
+gravitino.entity.store.relational.storagePath = {{ .Values.entity.storagePath }}
+
+# THE CONFIGURATION FOR Gravitino CATALOG
+gravitino.catalog.cache.evictionIntervalMs = {{ if .Values.catalog.evictionIntervalMs }}{{ .Values.catalog.evictionIntervalMs }}{{ else }}3600000{{ end }}
+gravitino.catalog.classloader.isolated = {{ .Values.catalog.classloader.isolated }}
path: dev/charts/gravitino/resources/config/gravitino.conf
user: login: danhuawang
body: Fixed.Remove `catalog.classloader.isolated` configuration items from values.yaml.
created_at: 2025-04-15T03:13:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,422 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+image:
+  repository: apache/gravitino
+  tag: 0.9.0-incubating-SNAPSHOT
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of pullSecrets (secrets must be manually created in the namespace)
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Example:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+## MySQL chart configuration
+## ref: https://github.com/bitnami/charts/blob/main/bitnami/mysql/values.yaml
+##
+mysql:
+  ## @param mysql.enabled Deploy MySQL container(s)
+  ##
+  enabled: false
+  ## Bitnami MySQL image version
+  ## ref: https://hub.docker.com/r/bitnami/mysql/tags/
+  ## @param image.registry MySQL image registry
+  ## @param image.repository MySQL image repository
+  ## @param image.tag MySQL image tag
+  ##
+  image:
+    tag: 8.0.36-debian-12-r12
+  ## @param initdbScriptsConfigMap ConfigMap with the initdb scripts
+  ##
+  initdbScriptsConfigMap: gravitino-mysql-init
+  ## MySQL Authentication parameters
+  ##
+  auth:
+    ## @param auth.rootPassword Password for the `root` user.
+    ##
+    rootPassword: admin
+    ## @param auth.createDatabase Whether to create the .Values.auth.database or not
+    ##
+    createDatabase: true
+    ## @param auth.database Name for a custom database to create
+    ##
+    database: gravitino
+    ## @param auth.username Name for a custom user to create
+    ##
+    username: gravitino
+    ## @param auth.password Password for the new user.
+    ##
+    password: gravitino
+
+## THE CONFIGURATION FOR Gravitino ENTITY STORE
+##
+entity:
+  ## The entity store to use, we only supports relational
+  ##
+  store: relational
+  maxTransactionSkewTimeMs: 2000
+  deleteAfterTimeMs: 604800000
+  versionRetentionCount: 1
+  ## The backend for the entity store, we only supports JDBC
+  ##
+  relationalBackend: JDBCBackend
+  ## The JDBC URL for the entity store
+  ##
+  jdbcUrl: jdbc:h2
+  ## The JDBC driver class name
+  ##
+  jdbcDriver: org.h2.Driver
+  ## The JDBC user name
+  ##
+  jdbcUser: gravitino
+  ## The JDBC password
+  ##
+  jdbcPassword: gravitino
+  storagePath: /root/gravitino/data/jdbc
+
+## THE CONFIGURATION FOR Gravitino SERVER
+##
+server:
+  shutdownTimeout: 3000
+  rest:
+    extensionPackages: ""
+## THE CONFIGURATION FOR Gravitino WEB SERVER
+##
+webserver:
+  ## The host name of the built-in web server
+  ##
+  host: 0.0.0.0
+  ## The http port number of the built-in web server
+  ##
+  httpPort: 8090
+  ## The min thread size of the built-in web server
+  ##
+  minThreads: 24
+  ## The max thread size of the built-in web server
+  ##
+  maxThreads: 200
+  ## The stop timeout of the built-in web server
+  ##
+  stopTimeout: 30000
+  ## The timeout of idle connections
+  ##
+  idleTimeout: 30000
+  ## The executor thread pool work queue size of the built-in web server
+  ##
+  threadPoolWorkQueueSize: 100
+  ## The request header size of the built-in web server
+  ##
+  requestHeaderSize: 131072
+  ## The response header size of the built-in web server
+  ##
+  responseHeaderSize: 131072
+  customFilters: ""
+
+## THE CONFIGURATION FOR Gravitino CATALOG
+##
+catalog:
+  ## The interval in milliseconds to evict the catalog cache
+  ##
+  cacheEvictionIntervalMs: 3600000
+  classloader:
+    isolated: true
+
+## THE CONFIGURATION FOR authorization
+##
+authorization:
+  ## Whether Gravitino enable authorization or not
+  ##
+  enable: false
+  ## The admins of Gravitino service, multiple admins are spitted by comma.
+  ##
+  serviceAdmins: anonymous
+
+## THE CONFIGURATION FOR AUXILIARY SERVICE
+##
+auxService:
+  ## Auxiliary service names, separate by ','
+  ##
+  names: iceberg-rest
+
+icebergRest:
+  ## Iceberg REST service classpath
+  ##
+  classpath: "iceberg-rest-server/libs, iceberg-rest-server/conf"
+  ## Iceberg REST service host
+  ##
+  host: 0.0.0.0
+  ## Iceberg REST service http port
+  ##
+  httpPort: 9001
+  ## The backend Iceberg catalog for Iceberg REST service, it's recommended to change to hive or jdbc
+  ##
+  catalogBackend: memory
+  ## The warehouse directory of Iceberg catalog for Iceberg REST service
+  ##
+  warehouse: /tmp/
+
+## Authentication mechanisms configuration. Support simple, OAuth and Kerberos.
+##
+authenticators: simple
+
+## OAuth mode configuration
+##
+authenticator:
+  oauth:
+    serviceAudience: test
+    defaultSignKey: ""
+    serverUri: http://57.185.211.74:8080
+    tokenPath: /realms/myrealm/protocol/openid-connect/token
+
+## Audit log configuration
+##
+audit:
+  enabled: false
+  writer:
+    className: org.apache.gravitino.audit.FileAuditWriter
+    file:
+      fileName: gravitino_audit.log
+      flushIntervalSecs: 10
+      append: true
+  formatter:
+    className: org.apache.gravitino.audit.SimpleFormatter
+
+## Metrics configuration
+##
+metrics:
+  timeSlidingWindowSecs: 60
+
+## Custom Gravitino configuration items
+##
+visibleConfigs: ""
+# visibleConfigs: "gravitino.datastrato.custom.authorization.ranger.admin.url,gravitino.datastrato.custom.authorization.ranger.username,gravitino.datastrato.custom.authorization.ranger.password,gravitino.datastrato.custom.authorization.ranger.auth.type"
+
+visibleConfigsItems: {}
+  # gravitino.datastrato.custom.authorization.ranger.admin.url: "http://ranger:6080"
+  # gravitino.datastrato.custom.authorization.ranger.username: admin
+  # gravitino.datastrato.custom.authorization.ranger.password: "rangerR0cks!"
+  # gravitino.datastrato.custom.authorization.ranger.auth.type: simple
+
+## Additional Gravitino configuration items in gravitino.conf can be added
+##
+additionalConfigItems: {}
+#  gravitino.eventListener.names: "audit,sync"
+
+## Additional volumes
+##
+extraVolumes:
+  - name: gravitino-log
+    emptyDir: {}
+
+## Additional volume mounts
+##
+extraVolumeMounts:
+  - name: gravitino-log
+    mountPath: /root/gravitino/logs
+
+## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
+## If you set enabled as "True", you need :
+## - create a pv which above 10Gi
+## - keep storageClassName same with below setting
+##
+persistence:
+  enabled: false
+  accessModes:
+    - ReadWriteOnce
+  size: 10Gi
+  labels: {}
+  annotations: {}
+  # existingClaim:
+  # storageClassName:
+
+## Whether redirect the log files to the container stdout and stderr
+##
+log:
+  containerStdout: false
+
+## Gravitino log4j2 configuration items in log4j2.properties can be customized
+##
+log4j2Properties: {}
+  # status: warn
+
+  ## Log files location
+  # basePath: "${sys:gravitino.log.path}"
+  # serverName: "${sys:gravitino.server.name}"
+
+  ## RollingFileAppender name, pattern, path and rollover policy
+  # rollingAppenderType: RollingFile
+  # rollingAppenderName: fileLogger
+  # rollingAppenderFileName: "${basePath}/${serverName}.log"
+  # rollingAppenderFilePattern: "${basePath}/${serverName}_%d{yyyyMMdd}.log.gz"
+  # rollingAppenderLayoutType: PatternLayout
+  # rollingAppenderLayoutPattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n"
+  # rollingAppenderPoliciesType: Policies
+
+  ## RollingFileAppender rotation policy
+  # rollingAppenderPoliciesSizeType: SizeBasedTriggeringPolicy
+  # rollingAppenderPoliciesSizeSize: 10MB
+  # rollingAppenderPoliciesTimeType: TimeBasedTriggeringPolicy
+  # rollingAppenderPoliciesTimeInterval: 1
+  # rollingAppenderPoliciesTimeModulate: true
+  # rollingAppenderStrategyType: DefaultRolloverStrategy
+  # rollingAppenderStrategyDeleteType: Delete
+  # rollingAppenderStrategyDeleteBasePath: "${basePath}"
+  # rollingAppenderStrategyDeleteMaxDepth: 10
+  # rollingAppenderStrategyDeleteIfLastModifiedType: IfLastModified
+
+  ## Delete all files older than 30 days
+  # rollingAppenderStrategyDeleteIfLastModifiedAge: 30d
+
+  ## Configure root logger
+  # rootLoggerLevel: info
+  # rootLoggerAppenderRefRollingRef: fileLogger
+
+## Additional log4j2 configuration items in log4j2.properties can be added
+##
+additionalLog4j2Properties: {}
+  # appender.console.type: Console
+  # appender.console.name: console
+  # appender.console.layout.type: PatternLayout
+  # appender.console.layout.pattern: "%d{HH:mm:ss.SSS} %level %msg%n"
+  # rootLogger.appenderRef.console.ref: console
+
+## Expose the gravitino service to be accessed from outside the cluster (LoadBalancer service).
+## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
+## ref: http://kubernetes.io/docs/user-guide/services/
+##
+service:
+  name: gravitino
+  type: ClusterIP
+  port: 8090
+  targetPort: 8090
+  annotations: {}
+  labels: {}
+  portName: http
+  nodePort: ""
+
+## Additional ports to the gravitino services. Useful to expose extra container ports.
+##
+extraExposePorts:
+  - port: 9001
+    protocol: TCP
+    name: http1
+    targetPort: 9001
+
+ingress:
+  enabled: false
+  className: "nginx"
+  annotations: {}
+  # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: chart-gravitino.local
+      paths:
+        - path: /
+          pathType: ImplementationSpecific
+  tls: []
+  #  - secretName: chart-gravitino-tls
+  #    hosts:
+  #      - chart-gravitino.local
+
+## Deployment annotations
+##
+annotations: {}
+
+## Deployment replicas
+##
+replicas: 1
+
+## Pod Annotations
+##
+podAnnotations: {}
+
+## Pod Labels
+##
+podLabels: {}
+
+## Readiness probe for the Gravitino deployment
+##
+readinessProbe:
+  httpGet:
+    path: /
+    port: http
+  initialDelaySeconds: 20
+  timeoutSeconds: 5
+
+## Liveness probe for the Gravitino deployment
+##
+livenessProbe:
+  httpGet:
+    path: /
+    port: http
+  initialDelaySeconds: 20
+  timeoutSeconds: 5
+
+## Container-specific security context configuration
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
+##
+containerSecurityContext:
+  runAsNonRoot: false
+  runAsUser: 0
+
+## Container Environment
+##
+env:
+  - name: GRAVITINO_HOME
+    value: /root/gravitino
+  - name: GRAVITINO_MEM
+    value: "-Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=512m"
path: dev/charts/gravitino/values.yaml
user: login: danhuawang
body: Yes. And more environment variables can be added to the list.
created_at: 2025-04-15T04:17:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+# Apache Gravitino Chart
path: docs/chart.md
user: login: danhuawang
body: Fixed.
created_at: 2025-04-15T04:24:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# THE CONFIGURATION FOR Gravitino SERVER
+gravitino.server.shutdown.timeout = {{ .Values.server.shutdownTimeout | default 3000 }}
+
+# THE CONFIGURATION FOR Gravitino WEB SERVER
+gravitino.server.webserver.host = {{ .Values.webserver.host | default "0.0.0.0" }}
+gravitino.server.webserver.httpPort = {{ .Values.webserver.httpPort | default 8090 }}
+gravitino.server.webserver.minThreads = {{ .Values.webserver.minThreads | default 24 }}
+gravitino.server.webserver.maxThreads = {{ .Values.webserver.maxThreads | default 200 }}
+gravitino.server.webserver.stopTimeout = {{ .Values.webserver.stopTimeout | default 30000 }}
+gravitino.server.webserver.idleTimeout = {{ .Values.webserver.idleTimeout | default 30000 }}
+gravitino.server.webserver.threadPoolWorkQueueSize = {{ .Values.webserver.threadPoolWorkQueueSize | default 100 }}
+gravitino.server.webserver.requestHeaderSize = {{ .Values.webserver.requestHeaderSize | default 131072 }}
+gravitino.server.webserver.responseHeaderSize = {{ .Values.webserver.responseHeaderSize | default 131072 }}
+
+# Comma-separated list of filter class names to apply to the API.
+gravitino.server.webserver.customFilters = {{ .Values.webserver.customFilters }}
+
+# Comma-separated list of REST API packages to expand
+gravitino.server.rest.extensionPackages = {{ .Values.server.rest.extensionPackages }}
+
+# THE CONFIGURATION FOR Gravitino ENTITY STORE
+gravitino.entity.store = {{ .Values.entity.store | default "relational" }}
+gravitino.entity.store.maxTransactionSkewTimeMs = {{ .Values.entity.maxTransactionSkewTimeMs }}
+gravitino.entity.store.deleteAfterTimeMs = {{ (.Values.entity.deleteAfterTimeMs | default 604800000) | int }}
+gravitino.entity.store.versionRetentionCount = {{ .Values.entity.versionRetentionCount }}
+gravitino.entity.store.relational = {{ .Values.entity.relationalBackend | default "JDBCBackend" }}
+gravitino.entity.store.relational.jdbcUrl = {{ if .Values.mysql.enabled }}jdbc:mysql://{{ .Release.Name }}-mysql:3306/{{ .Values.mysql.auth.database }}{{ else }}{{ .Values.entity.jdbcUrl }}{{ end }}
+gravitino.entity.store.relational.jdbcDriver = {{ if .Values.mysql.enabled }}com.mysql.cj.jdbc.Driver{{ else }}{{ .Values.entity.jdbcDriver }}{{ end }}
+gravitino.entity.store.relational.jdbcUser = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.username }}{{ else }}{{ .Values.entity.jdbcUser }}{{ end }}
+gravitino.entity.store.relational.jdbcPassword = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.password }}{{ else }}{{ .Values.entity.jdbcPassword }}{{ end }}
+gravitino.entity.store.relational.storagePath = {{ .Values.entity.storagePath }}
+
+# THE CONFIGURATION FOR Gravitino CATALOG
+gravitino.catalog.cache.evictionIntervalMs = {{ if .Values.catalog.evictionIntervalMs }}{{ .Values.catalog.evictionIntervalMs }}{{ else }}3600000{{ end }}
+gravitino.catalog.classloader.isolated = {{ .Values.catalog.classloader.isolated }}
+
+# THE CONFIGURATION FOR authorization
+gravitino.authorization.enable = {{ .Values.authorization.enable }}
+gravitino.authorization.serviceAdmins = {{ .Values.authorization.serviceAdmins }}
+gravitino.authenticators = {{ .Values.authenticators }}
+gravitino.authenticator.oauth.serviceAudience = {{ .Values.authenticator.oauth.serviceAudience }}
+gravitino.authenticator.oauth.defaultSignKey = {{ .Values.authenticator.oauth.defaultSignKey }}
+gravitino.authenticator.oauth.serverUri = {{ .Values.authenticator.oauth.serverUri }}
+gravitino.authenticator.oauth.tokenPath = {{ .Values.authenticator.oauth.tokenPath }}
+
+# THE CONFIGURATION FOR AUXILIARY SERVICE
+gravitino.auxService.names = {{ .Values.auxService.names | default "iceberg-rest" }}
+gravitino.iceberg-rest.classpath = {{ .Values.icebergRest.classpath | default "iceberg-rest-server/libs, iceberg-rest-server/conf"  }}
+gravitino.iceberg-rest.host = {{ .Values.icebergRest.host | default "0.0.0.0" }}
+gravitino.iceberg-rest.httpPort = {{ .Values.icebergRest.httpPort | default 9001 }}
+gravitino.iceberg-rest.catalog-backend = {{ .Values.icebergRest.catalogBackend | default "memory" }}
+gravitino.iceberg-rest.warehouse = {{ .Values.icebergRest.warehouse | default "/tmp/" }}
+
+# Audit log configuration
+gravitino.audit.enabled = {{ .Values.audit.enabled }}
+gravitino.audit.writer.className = {{ .Values.audit.writer.className }}
+gravitino.audit.formatter.className = {{ .Values.audit.formatter.className }}
+gravitino.audit.writer.file.fileName = {{ .Values.audit.writer.file.fileName }}
+gravitino.audit.writer.file.flushIntervalSecs = {{ .Values.audit.writer.file.flushIntervalSecs }}
+gravitino.audit.writer.file.append = {{ .Values.audit.writer.file.append }}
path: dev/charts/gravitino/resources/config/gravitino.conf
user: login: danhuawang
body: Remove `gravitino.audit.writer.className` and `gravitino.audit.formatter.className` from values.yaml. And if user add these 2 items to values.yaml ,it also will take effect.
But inconsistent  default values issue, I hadn't find a good solution.
created_at: 2025-04-15T07:38:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# THE CONFIGURATION FOR Gravitino SERVER
+gravitino.server.shutdown.timeout = {{ .Values.server.shutdownTimeout | default 3000 }}
+
+# THE CONFIGURATION FOR Gravitino WEB SERVER
+gravitino.server.webserver.host = {{ .Values.webserver.host | default "0.0.0.0" }}
+gravitino.server.webserver.httpPort = {{ .Values.webserver.httpPort | default 8090 }}
+gravitino.server.webserver.minThreads = {{ .Values.webserver.minThreads | default 24 }}
+gravitino.server.webserver.maxThreads = {{ .Values.webserver.maxThreads | default 200 }}
+gravitino.server.webserver.stopTimeout = {{ .Values.webserver.stopTimeout | default 30000 }}
+gravitino.server.webserver.idleTimeout = {{ .Values.webserver.idleTimeout | default 30000 }}
+gravitino.server.webserver.threadPoolWorkQueueSize = {{ .Values.webserver.threadPoolWorkQueueSize | default 100 }}
+gravitino.server.webserver.requestHeaderSize = {{ .Values.webserver.requestHeaderSize | default 131072 }}
+gravitino.server.webserver.responseHeaderSize = {{ .Values.webserver.responseHeaderSize | default 131072 }}
+
+# Comma-separated list of filter class names to apply to the API.
+gravitino.server.webserver.customFilters = {{ .Values.webserver.customFilters }}
+
+# Comma-separated list of REST API packages to expand
+gravitino.server.rest.extensionPackages = {{ .Values.server.rest.extensionPackages }}
+
+# THE CONFIGURATION FOR Gravitino ENTITY STORE
+gravitino.entity.store = {{ .Values.entity.store | default "relational" }}
+gravitino.entity.store.maxTransactionSkewTimeMs = {{ .Values.entity.maxTransactionSkewTimeMs }}
+gravitino.entity.store.deleteAfterTimeMs = {{ (.Values.entity.deleteAfterTimeMs | default 604800000) | int }}
+gravitino.entity.store.versionRetentionCount = {{ .Values.entity.versionRetentionCount }}
+gravitino.entity.store.relational = {{ .Values.entity.relationalBackend | default "JDBCBackend" }}
+gravitino.entity.store.relational.jdbcUrl = {{ if .Values.mysql.enabled }}jdbc:mysql://{{ .Release.Name }}-mysql:3306/{{ .Values.mysql.auth.database }}{{ else }}{{ .Values.entity.jdbcUrl }}{{ end }}
+gravitino.entity.store.relational.jdbcDriver = {{ if .Values.mysql.enabled }}com.mysql.cj.jdbc.Driver{{ else }}{{ .Values.entity.jdbcDriver }}{{ end }}
+gravitino.entity.store.relational.jdbcUser = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.username }}{{ else }}{{ .Values.entity.jdbcUser }}{{ end }}
+gravitino.entity.store.relational.jdbcPassword = {{ if .Values.mysql.enabled }}{{ .Values.mysql.auth.password }}{{ else }}{{ .Values.entity.jdbcPassword }}{{ end }}
+gravitino.entity.store.relational.storagePath = {{ .Values.entity.storagePath }}
+
+# THE CONFIGURATION FOR Gravitino CATALOG
+gravitino.catalog.cache.evictionIntervalMs = {{ if .Values.catalog.evictionIntervalMs }}{{ .Values.catalog.evictionIntervalMs }}{{ else }}3600000{{ end }}
+gravitino.catalog.classloader.isolated = {{ .Values.catalog.classloader.isolated }}
path: dev/charts/gravitino/resources/config/gravitino.conf
user: login: danhuawang
body: Remove `catalog.classloader.isolated` from conf file.
created_at: 2025-04-16T02:13:56Z
author_association: CONTRIBUTOR

PR comments:
user: login: roryqi
created_at: 2025-04-14T03:31:39Z
body: @jerryshao If u don't have an another suggestion, I will merge this PR tomorrow.
author_association: CONTRIBUTOR
user: login: jerryshao
created_at: 2025-04-14T07:39:34Z
body: I also need to take a look, please give me one or two days.
author_association: CONTRIBUTOR
user: login: jerryshao
created_at: 2025-04-16T03:19:27Z
body: I'm OK with the current changes, @danhuawang do you have any more to update?
author_association: CONTRIBUTOR
user: login: danhuawang
created_at: 2025-04-16T06:18:38Z
body: > I'm OK with the current changes, @danhuawang do you have any more to update?

No more update.
author_association: CONTRIBUTOR