Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/ci/persistence-values.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/ci/persistence-values.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/ci/persistence-values.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,39 @@ +# +# 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: + pullPolicy: Never + +authentication: + tokenBroker: + secret: + name: polaris-token-broker + +logging: + file: + enabled: true + json: true + storage: + size: 50Mi + +persistence: + type: eclipse-link + eclipseLink: + secret: + name: polaris-persistence
Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/ci/simple-values.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/ci/simple-values.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/ci/simple-values.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,27 @@ +# +# 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: + pullPolicy: Never + +storage: + secret: + name: polaris-storage + awsAccessKeyId: access-key + awsSecretAccessKey: secret-key Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/_helpers.tpl ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/_helpers.tpl (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/_helpers.tpl Wed Jun 25 17:55:39 2025 @@ -0,0 +1,320 @@ +{{/* + Copyright (C) 2024 Dremio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/}} + +{{/* + Expand the name of the chart. +*/}} +{{- define "polaris.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 "polaris.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* + Create a default fully qualified app name, with a custom suffix. Useful when the name will + have a suffix appended to it, such as for the management service name. +*/}} +{{- define "polaris.fullnameWithSuffix" -}} +{{- $global := index . 0 }} +{{- $suffix := index . 1 }} +{{- if not (hasPrefix "-" $suffix) }} +{{- $suffix = printf "-%s" $suffix }} +{{- end }} +{{- $length := int (sub 63 (len $suffix)) }} +{{- if $global.Values.fullnameOverride }} +{{- $global.Values.fullnameOverride | trunc $length }}{{ $suffix }} +{{- else }} +{{- $name := default $global.Chart.Name $global.Values.nameOverride }} +{{- if contains $name $global.Release.Name }} +{{- $global.Release.Name | trunc $length }}{{ $suffix }} +{{- else }} +{{- printf "%s-%s" $global.Release.Name $name | trunc $length }}{{ $suffix }} +{{- end }} +{{- end }} +{{- end }} + +{{/* + Create chart name and version as used by the chart label. +*/}} +{{- define "polaris.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* + Common labels +*/}} +{{- define "polaris.labels" -}} +helm.sh/chart: {{ include "polaris.chart" . }} +{{ include "polaris.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* + Selector labels +*/}} +{{- define "polaris.selectorLabels" -}} +app.kubernetes.io/name: {{ include "polaris.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* + Create the name of the service account to use +*/}} +{{- define "polaris.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "polaris.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Merges a configuration tree into the destination configuration map. See configmap.yaml template. +Two styles of configuration trees are supported: +- Flattened configuration tree: The configuration option names are specified as a dot-separated + string, and the configuration option values are the values of the configuration options. E.g.: + "key1.subkey1": "value1" + "key1.subkey2.subsubkey1": "value2" +- Nested configuration tree: The configuration option names are specified as a nested structure. + The resulting option names are formed by concatenating the nested keys with a dot separator. + E.g.: + key1: + subkey1: "value1" + subkey2: + subsubkey1: "value2" +The configuration option values are evaluated as templates against the global context before being +printed. +*/}} +{{- define "polaris.mergeConfigTree" -}} +{{- $advConfig := index . 0 -}} +{{- $prefix := index . 1 -}} +{{- $dest := index . 2 -}} +{{- range $key, $val := $advConfig -}} +{{- $name := ternary $key (print $prefix "." $key) (eq $prefix "") -}} +{{- if kindOf $val | eq "map" -}} +{{- list $val $name $dest | include "polaris.mergeConfigTree" -}} +{{- else -}} +{{- $_ := set $dest $name $val -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Prints the configuration option to the destination configmap entry. See configmap.yaml template. +Any nil values will be printed as empty config options; otherwise, the value will be evaluated +as a template against the global context, then printed. Furthermore, if the value contains +line breaks, they will be escaped and a multi-line option will be printed. +*/}} +{{- define "polaris.appendConfigOption" -}} +{{- $key := index . 0 -}} +{{- $value := index . 1 -}} +{{- $global := index . 2 -}} +{{- $valAsString := "" -}} +{{- if ne $value nil -}} +{{- $valAsString = tpl (toString $value) $global -}} +{{- if contains "\r\n" $valAsString -}} +{{- $valAsString = $valAsString | nindent 4 | replace "\r\n" "\\\r\n" -}} +{{- else if contains "\n" $valAsString -}} +{{- $valAsString = $valAsString | nindent 4 | replace "\n" "\\\n" -}} +{{- end -}} +{{- end -}} +{{ print $key "=" $valAsString }} +{{- end -}} + +{{/* +Convert a dict into a string formed by a comma-separated list of key-value pairs: key1=value1,key2=value2, ... +*/}} +{{- define "polaris.dictToString" -}} +{{- $list := list -}} +{{- range $k, $v := . -}} +{{- $list = append $list (printf "%s=%s" $k $v) -}} +{{- end -}} +{{ join "," $list }} +{{- end -}} + +{{/* +Prints the config volume definition for deployments and jobs. +*/}} +{{- define "polaris.configVolume" -}} +- name: config-volume + projected: + sources: + - configMap: + name: {{ include "polaris.fullname" . }} + items: + - key: application.properties + path: application.properties + {{- if .Values.authentication.tokenBroker.secret.name }} + - secret: + name: {{ tpl .Values.authentication.tokenBroker.secret.name . }} + items: + {{- if eq .Values.authentication.tokenBroker.type "rsa-key-pair" }} + - key: {{ tpl .Values.authentication.tokenBroker.secret.publicKey . }} + path: public.pem + - key: {{ tpl .Values.authentication.tokenBroker.secret.privateKey . }} + path: private.pem + {{- end }} + {{- if eq .Values.authentication.tokenBroker.type "symmetric-key" }} + - key: {{ tpl .Values.authentication.tokenBroker.secret.secretKey . }} + path: symmetric.key + {{- end }} + {{- end }} + {{- if and ( eq .Values.persistence.type "eclipse-link" ) .Values.persistence.eclipseLink.secret.name }} + - secret: + name: {{ tpl .Values.persistence.eclipseLink.secret.name . }} + items: + - key: {{ tpl .Values.persistence.eclipseLink.secret.key . }} + path: persistence.xml + {{- end }} +{{- end -}} + +{{/* +Prints an environment variable for a secret key reference. +*/}} +{{- define "polaris.secretToEnv" -}} +{{- $secret := index . 0 -}} +{{- $keyRef := index . 1 -}} +{{- $varName := index . 2 -}} +{{- $key := get $secret $keyRef -}} +{{- if and $secret.name $key }} +- name: {{ $varName }} + valueFrom: + secretKeyRef: + name: {{ $secret.name }} + key: {{ $key }} +{{- end -}} +{{- end -}} + +{{/* +Converts a Kubernetes quantity to a number (int64 if possible or float64 otherwise). +It handles raw numbers as well as quantities with suffixes +like m, k, M, G, T, P, E, ki, Mi, Gi, Ti, Pi, Ei. +It also handles scientific notation. +Quantities should be positive, so negative values, zero, or any unparseable number +will result in a failure. +https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/ +*/}} +{{- define "polaris.quantity" -}} +{{- $quantity := . -}} +{{- $n := $quantity | float64 -}} +{{- if kindIs "string" $quantity -}} +{{- if hasSuffix "m" $quantity -}} +{{- $n = divf (trimSuffix "m" $quantity | float64) 1000.0 -}} +{{- else if hasSuffix "k" $quantity -}} +{{- $n = trimSuffix "k" $quantity | int64 | mul 1000 -}} +{{- else if hasSuffix "M" $quantity -}} +{{- $n = trimSuffix "M" $quantity | int64 | mul 1000000 -}} +{{- else if hasSuffix "G" $quantity -}} +{{- $n = trimSuffix "G" $quantity | int64 | mul 1000000000 -}} +{{- else if hasSuffix "T" $quantity -}} +{{- $n = trimSuffix "T" $quantity | int64 | mul 1000000000000 -}} +{{- else if hasSuffix "P" $quantity -}} +{{- $n = trimSuffix "P" $quantity | int64 | mul 1000000000000000 -}} +{{- else if hasSuffix "E" $quantity -}} +{{- $n = trimSuffix "E" $quantity | int64 | mul 1000000000000000000 -}} +{{- else if hasSuffix "ki" $quantity -}} +{{- $n = trimSuffix "ki" $quantity | int64 | mul 1024 -}} +{{- else if hasSuffix "Mi" $quantity -}} +{{- $n = trimSuffix "Mi" $quantity | int64 | mul 1048576 -}} +{{- else if hasSuffix "Gi" $quantity -}} +{{- $n = trimSuffix "Gi" $quantity | int64 | mul 1073741824 -}} +{{- else if hasSuffix "Ti" $quantity -}} +{{- $n = trimSuffix "Ti" $quantity | int64 | mul 1099511627776 -}} +{{- else if hasSuffix "Pi" $quantity -}} +{{- $n = trimSuffix "Pi" $quantity | int64 | mul 1125899906842624 -}} +{{- else if hasSuffix "Ei" $quantity -}} +{{- $n = trimSuffix "Ei" $quantity | int64 | mul 1152921504606846976 -}} +{{- end -}} +{{- end -}} +{{- if le ($n | float64) 0.0 -}} +{{- fail (print "invalid quantity: " $quantity) -}} +{{- end -}} +{{- if kindIs "float64" $n -}} +{{- printf "%f" $n -}} +{{- else -}} +{{- printf "%v" $n -}} +{{- end -}} +{{- end -}} + +{{/* +Prints the ports section of the container spec. Also validates all port names to ensure +that they are unique. +*/}} +{{- define "polaris.containerPorts" -}} +{{- $ports := dict -}} +{{- $protocols := dict -}} +{{- /* Main service ports */ -}} +{{- range $i, $port := .Values.service.ports -}} +{{- if hasKey $ports $port.name -}} +{{- fail (printf "service.ports[%d]: port name already taken: %v" $i $port.name) -}} +{{- end -}} +{{- $portNumber := coalesce $port.targetPort $port.port -}} +{{- $_ := set $ports $port.name $portNumber -}} +{{- $_ = set $protocols $port.name ($port.protocol | default "TCP") -}} +{{- end -}} +{{- /* Management service ports */ -}} +{{- range $i, $port := .Values.managementService.ports -}} +{{- if hasKey $ports $port.name -}} +{{- fail (printf "managementService.ports[%d]: port name already taken: %v" $i $port.name) -}} +{{- end -}} +{{- $portNumber := coalesce $port.targetPort $port.port -}} +{{- $_ := set $ports $port.name $portNumber }} +{{- $_ = set $protocols $port.name ($port.protocol | default "TCP") -}} +{{- end -}} +{{- /* Extra service ports */ -}} +{{- range $i, $svc := .Values.extraServices -}} +{{- range $j, $port := $svc.ports -}} +{{- $portNumber := coalesce $port.targetPort $port.port -}} +{{- if hasKey $ports $port.name -}} +{{- if ne $portNumber (get $ports $port.name) -}} +{{- fail (printf "extraServices[%d].ports[%d]: wrong port number for port %s, expected %v, got %v" $i $j $port.name (get $ports $port.name) $portNumber) -}} +{{- end -}} +{{- end -}} +{{- if hasKey $protocols $port.name -}} +{{- if ne ($port.protocol | default "TCP") (get $protocols $port.name) -}} +{{- fail (printf "extraServices[%d].ports[%d]: wrong protocol for port %s, expected %v, got %v" $i $j $port.name (get $protocols $port.name) $port.protocol) -}} +{{- end -}} +{{- end -}} +{{- $_ := set $ports $port.name $portNumber -}} +{{- $_ = set $protocols $port.name ($port.protocol | default "TCP") -}} +{{- end -}} +{{- end }} +ports: +{{- range $portName, $portNumber := $ports }} + - name: {{ $portName }} + containerPort: {{ $portNumber }} + protocol: {{ get $protocols $portName }} +{{- end }} +{{- end -}} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/configmap.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/configmap.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/configmap.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,205 @@ +{{/* + 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 "polaris.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} + {{- if .Values.configMapLabels }} + {{- tpl (toYaml .Values.configMapLabels) . | nindent 4 }} + {{- end }} +data: + application.properties: |- + {{- $map := dict -}} + + {{- /* Realm Context */ -}} + {{- $_ := set $map "polaris.realm-context.type" .Values.realmContext.type -}} + {{- $_ = set $map "polaris.realm-context.realms" (join "," .Values.realmContext.realms) -}} + + {{- /* Features */ -}} + {{- range $k, $v := .Values.features -}} + {{- if ( ne $k "realmOverrides" ) -}} + {{- $_ = set $map (printf "polaris.features.\"%s\"" $k) (toJson $v) -}} + {{- end -}} + {{- end -}} + {{- range $realm, $overrides := .Values.features.realmOverrides -}} + {{- range $k, $v := $overrides -}} + {{- $_ = set $map (printf "polaris.features.realm-overrides.\"%s\".\"%s\"" $realm $k) (toJson $v) -}} + {{- end -}} + {{- end -}} + + {{- /* Persistence */ -}} + {{- $_ = set $map "polaris.persistence.type" .Values.persistence.type -}} + {{- if and ( eq .Values.persistence.type "eclipse-link" ) .Values.persistence.eclipseLink.secret.name -}} + {{- $_ = set $map "polaris.persistence.eclipselink.persistence-unit" .Values.persistence.eclipseLink.persistenceUnit -}} + {{- $_ = set $map "polaris.persistence.eclipselink.configuration-file" (printf "%s/persistence.xml" .Values.image.configDir ) -}} + {{- end -}} + + {{- /* File IO */ -}} + {{- $_ = set $map "polaris.file-io.type" .Values.fileIo.type -}} + + {{- /* Storage */ -}} + {{- if .Values.storage.secret.gcpTokenLifespan -}} + {{- $_ = set $map "polaris.storage.gcp.lifespan" .Values.storage.secret.gcpTokenLifespan -}} + {{- end -}} + + {{- /* Rate Limiter */ -}} + {{- $_ = set $map "polaris.rate-limiter.filter.type" .Values.rateLimiter.type -}} + {{- if ne .Values.rateLimiter.type "no-op" -}} + {{- $_ = set $map "polaris.rate-limiter.token-bucket.type" .Values.rateLimiter.tokenBucket.type -}} + {{- $_ = set $map "polaris.rate-limiter.token-bucket.requests-per-second" .Values.rateLimiter.tokenBucket.requestsPerSecond -}} + {{- $_ = set $map "polaris.rate-limiter.token-bucket.window" .Values.rateLimiter.tokenBucket.window -}} + {{- end -}} + + {{- /* Tasks */ -}} + {{- if .Values.tasks.maxConcurrentTasks -}} + {{- $_ = set $map "polaris.tasks.max-concurrent-tasks" .Values.tasks.maxConcurrentTasks -}} + {{- end -}} + {{- if .Values.tasks.maxQueuedTasks -}} + {{- $_ = set $map "polaris.tasks.max-queued-tasks" .Values.tasks.maxQueuedTasks -}} + {{- end -}} + + {{- /* Authentication */ -}} + {{- $_ = set $map "polaris.authentication.authenticator.type" .Values.authentication.authenticator.type -}} + {{- $_ = set $map "polaris.authentication.token-service.type" .Values.authentication.tokenService.type -}} + {{- $_ = set $map "polaris.authentication.token-broker.type" .Values.authentication.tokenBroker.type -}} + {{- $_ = set $map "polaris.authentication.token-broker.max-token-generation" .Values.authentication.tokenBroker.maxTokenGeneration -}} + {{- if .Values.authentication.tokenBroker.secret.name -}} + {{- if eq .Values.authentication.tokenBroker.type "rsa-key-pair" -}} + {{- $_ = set $map "polaris.authentication.token-broker.rsa-key-pair.public-key-file" (printf "%s/public.pem" .Values.image.configDir ) -}} + {{- $_ = set $map "polaris.authentication.token-broker.rsa-key-pair.private-key-file" (printf "%s/private.pem" .Values.image.configDir ) -}} + {{- end -}} + {{- if eq .Values.authentication.tokenBroker.type "symmetric-key" -}} + {{- $_ = set $map "polaris.authentication.token-broker.symmetric-key.file" (printf "%s/symmetric.key" .Values.image.configDir ) -}} + {{- end -}} + {{- end -}} + + {{- /* HTTP ports */ -}} + {{- $_ = set $map "quarkus.http.port" (get (first .Values.service.ports) "port") -}} + {{- $_ = set $map "quarkus.management.port" (get (first .Values.managementService.ports) "port") -}} + + {{- /* CORS */ -}} + {{- if .Values.cors.allowedOrigins -}} + {{- $_ = set $map "quarkus.http.cors.origins" (join "," .Values.cors.allowedOrigins) -}} + {{- end -}} + {{- if .Values.cors.allowedMethods -}} + {{- $_ = set $map "quarkus.http.cors.methods" (join "," .Values.cors.allowedMethods) -}} + {{- end -}} + {{- if .Values.cors.allowedHeaders -}} + {{- $_ = set $map "quarkus.http.cors.headers" (join "," .Values.cors.allowedHeaders) -}} + {{- end -}} + {{- if .Values.cors.exposedHeaders -}} + {{- $_ = set $map "quarkus.http.cors.exposed-headers" (join "," .Values.cors.exposedHeaders) -}} + {{- end -}} + {{- if .Values.cors.accessControlMaxAge -}} + {{- $_ = set $map "quarkus.http.cors.access-control-max-age" .Values.cors.accessControlMaxAge -}} + {{- end -}} + {{- if ne .Values.cors.accessControlAllowCredentials nil -}} + {{- $_ = set $map "quarkus.http.cors.access-control-allow-credentials" .Values.cors.accessControlAllowCredentials -}} + {{- end -}} + + {{- /* Logging */ -}} + {{- $_ = set $map "quarkus.log.level" .Values.logging.level -}} + {{- if .Values.logging.console.enabled -}} + {{- $_ = set $map "quarkus.log.console.enable" "true" -}} + {{- $_ = set $map "quarkus.log.console.level" .Values.logging.console.threshold -}} + {{- if .Values.logging.console.json -}} + {{- $_ = set $map "quarkus.log.console.json" "true" -}} + {{- else -}} + {{- $_ = set $map "quarkus.log.console.format" .Values.logging.console.format -}} + {{- end -}} + {{- else -}} + {{- $_ = set $map "quarkus.log.console.enable" "false" -}} + {{- end -}} + {{- if .Values.logging.file.enabled -}} + {{- $_ = set $map "quarkus.log.file.enable" "true" -}} + {{- $_ = set $map "quarkus.log.file.level" .Values.logging.file.threshold -}} + {{- $_ = set $map "quarkus.log.file.path" (printf "%s/%s" .Values.logging.file.logsDir .Values.logging.file.fileName) -}} + {{- $_ = set $map "quarkus.log.file.rotation.max-file-size" (include "polaris.quantity" .Values.logging.file.rotation.maxFileSize) -}} + {{- $_ = set $map "quarkus.log.file.rotation.max-backup-index" .Values.logging.file.rotation.maxBackupIndex -}} + {{- if .Values.logging.file.rotation.fileSuffix -}} + {{- $_ = set $map "quarkus.log.file.rotation.file-suffix" .Values.logging.file.rotation.fileSuffix -}} + {{- end -}} + {{- if .Values.logging.file.json -}} + {{- $_ = set $map "quarkus.log.file.json" "true" -}} + {{- else -}} + {{- $_ = set $map "quarkus.log.file.format" .Values.logging.file.format -}} + {{- end -}} + {{- else -}} + {{- $_ = set $map "quarkus.log.file.enable" "false" -}} + {{- end -}} + {{- $categories := dict -}} + {{- list .Values.logging.categories "" $categories | include "polaris.mergeConfigTree" -}} + {{- range $k, $v := $categories -}} + {{- $_ = set $map (printf "quarkus.log.category.\"%s\".level" $k) $v -}} + {{- end -}} + {{- $_ = set $map "polaris.log.request-id-header-name" .Values.logging.requestIdHeaderName -}} + {{- $mdc := dict -}} + {{- list .Values.logging.mdc "" $mdc | include "polaris.mergeConfigTree" -}} + {{- range $k, $v := $mdc -}} + {{- $_ = set $map (printf "polaris.log.mdc.\"%s\"" $k) $v -}} + {{- end -}} + + {{- /* Telemetry */ -}} + {{- if .Values.tracing.enabled -}} + {{- $_ = set $map "quarkus.otel.exporter.otlp.endpoint" .Values.tracing.endpoint -}} + {{- if .Values.tracing.attributes -}} + {{- $attributes := dict -}} + {{- list .Values.tracing.attributes "" $attributes | include "polaris.mergeConfigTree" -}} + {{- $i := 0 -}} + {{- range $k, $v := $attributes -}} + {{- $_ = set $map (printf "quarkus.otel.resource.attributes[%d]" $i) (printf "%s=%s" $k $v) -}} + {{- $i = add1 $i -}} + {{- end -}} + {{- end -}} + {{- if .Values.tracing.sample -}} + {{- $sample := toString .Values.tracing.sample -}} + {{ if eq $sample "all" -}} + {{- $_ = set $map "quarkus.otel.traces.sampler" "parentbased_always_on" -}} + {{- else if eq $sample "none" -}} + {{- $_ = set $map "quarkus.otel.traces.sampler" "always_off" -}} + {{- else -}} + {{- $_ = set $map "quarkus.otel.traces.sampler" "parentbased_traceidratio" -}} + {{- $_ = set $map "quarkus.otel.traces.sampler.arg" $sample -}} + {{- end -}} + {{- end -}} + {{- else -}} + {{- $_ = set $map "quarkus.otel.sdk.disabled" true -}} + {{- end -}} + + {{- /* Metrics */ -}} + {{- if .Values.metrics.enabled -}} + {{- range $name, $value := .Values.metrics.tags -}} + {{- $_ = set $map (print "polaris.metrics.tags." $name) $value -}} + {{- end -}} + {{- else -}} + {{- $_ = set $map "quarkus.micrometer.enabled" "false" -}} + {{- end -}} + + {{- /* Advanced Configuration (must be done last since it can override any of the settings above) */ -}} + {{- list .Values.advancedConfig "" $map | include "polaris.mergeConfigTree" -}} + + {{- /* Print the resulting configmap; each configuration option is templatized */ -}} + {{- $global := . -}} + {{- range $k, $v := $map }} + {{ include "polaris.appendConfigOption" (list $k $v $global) }} + {{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/deployment.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/deployment.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/deployment.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,148 @@ +{{/* + 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 "polaris.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} + {{- if .Values.podLabels }} + {{- tpl (toYaml .Values.podLabels) . | nindent 4 }} + {{- end }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + {{- if not (has (quote .Values.revisionHistoryLimit) (list "" (quote ""))) }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + {{- end }} + selector: + matchLabels: + {{- include "polaris.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- if .Values.podAnnotations }} + annotations: + {{- tpl (toYaml .Values.podAnnotations) . | nindent 8 }} + {{- end }} + labels: + {{- include "polaris.selectorLabels" . | nindent 8 }} + {{- if .Values.podLabels }} + {{- tpl (toYaml .Values.podLabels) . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{- range .Values.imagePullSecrets }} + - name: {{ . | quote }} + {{- end }} + {{- end }} + serviceAccountName: {{ include "polaris.serviceAccountName" . }} + {{- if .Values.podSecurityContext }} + securityContext: + {{- tpl (toYaml .Values.podSecurityContext) . | nindent 8 }} + {{- end }} + {{- if .Values.extraInitContainers }} + initContainers: + {{- tpl (toYaml .Values.extraInitContainers) . | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + {{- if .Values.containerSecurityContext }} + securityContext: + {{- tpl (toYaml .Values.containerSecurityContext) . | nindent 12 }} + {{- end }} + image: "{{ tpl .Values.image.repository . }}:{{ tpl .Values.image.tag . | default .Chart.Version }}" + imagePullPolicy: {{ tpl .Values.image.pullPolicy . }} + {{ if or .Values.storage.secret.name .Values.extraEnv -}} + env: + {{- include "polaris.secretToEnv" (list .Values.storage.secret "awsAccessKeyId" "polaris.storage.aws.access-key") | indent 12 -}} + {{- include "polaris.secretToEnv" (list .Values.storage.secret "awsSecretAccessKey" "polaris.storage.aws.secret-key") | indent 12 -}} + {{- include "polaris.secretToEnv" (list .Values.storage.secret "gcpToken" "polaris.storage.gcp.token") | indent 12 -}} + {{- if .Values.extraEnv -}} + {{- tpl (toYaml .Values.extraEnv) . | nindent 12 -}} + {{- end -}} + {{- end }} + volumeMounts: + - name: config-volume + mountPath: {{ trimSuffix "/" .Values.image.configDir }} + readOnly: true + {{- if .Values.logging.file.enabled }} + - name: logs-storage + mountPath: {{ .Values.logging.file.logsDir }} + readOnly: false + {{- end }} + - name: temp-dir + mountPath: /tmp + readOnly: false + {{- if .Values.extraVolumeMounts }} + {{- tpl (toYaml .Values.extraVolumeMounts) . | nindent 12 }} + {{- end }} + {{- include "polaris.containerPorts" . | trim | nindent 10 }} + livenessProbe: + httpGet: + path: /q/health/live + port: {{ get (first .Values.managementService.ports) "name" }} + scheme: HTTP + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + terminationGracePeriodSeconds: {{ .Values.livenessProbe.terminationGracePeriodSeconds }} + readinessProbe: + httpGet: + path: /q/health/ready + port: {{ get (first .Values.managementService.ports) "name" }} + scheme: HTTP + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + {{- if .Values.resources }} + resources: + {{- tpl (toYaml .Values.resources) . | nindent 12 }} + {{- end }} + volumes: + {{- include "polaris.configVolume" . | nindent 8 }} + {{- if .Values.logging.file.enabled }} + - name: logs-storage + persistentVolumeClaim: + claimName: {{ include "polaris.fullnameWithSuffix" (list . "logs") }} + {{- end }} + - name: temp-dir + emptyDir: {} + {{- if .Values.extraVolumes }} + {{- tpl (toYaml .Values.extraVolumes) . | nindent 8 }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: + {{- tpl (toYaml .Values.nodeSelector) . | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: + {{- tpl (toYaml .Values.affinity) . | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: + {{- tpl (toYaml .Values.tolerations) . | nindent 8 }} + {{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/hpa.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/hpa.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/hpa.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,52 @@ +{{/* + 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.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "polaris.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "polaris.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/ingress.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/ingress.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/ingress.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,63 @@ +{{/* + 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 "polaris.fullname" . }} +{{- $svcPort := get (first .Values.service.ports) "port" }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} + {{- if .Values.ingress.annotations }} + annotations: + {{- tpl (toYaml .Values.ingress.annotations) . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ingress.className }} + ingressClassName: {{ .Values.ingress.className | quote }} + {{- 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 }} + pathType: {{ .pathType }} + backend: + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} \ No newline at end of file Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service-extra.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service-extra.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service-extra.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,69 @@ +{{/* + 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. +*/}} + +{{- range $i, $svc := .Values.extraServices }} +{{- if not $svc.nameSuffix }} +{{- fail (printf "extraServices[%d]: missing required nameSuffix" $i) }} +{{- else if or (eq $svc.nameSuffix "-mgmt") (eq $svc.nameSuffix "mgmt") }} +{{- fail (printf "extraServices[%d]: invalid nameSuffix" $i) }} +{{- end }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ include "polaris.fullnameWithSuffix" (list $ $svc.nameSuffix) }} + namespace: {{ $.Release.Namespace }} + labels: + {{- include "polaris.labels" $ | nindent 4 }} + {{- with $svc.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ $svc.type }} + selector: + {{- include "polaris.selectorLabels" $ | nindent 4 }} + ports: + {{- range $svc.ports }} + - name: {{ .name }} + port: {{ .port }} + {{- if .targetPort }} + targetPort: {{ .targetPort }} + {{- end }} + {{- if .nodePort }} + nodePort: {{ .nodePort }} + {{- end }} + protocol: {{ default "TCP" .protocol }} + {{- end }} + {{- if $svc.sessionAffinity }} + sessionAffinity: {{ $svc.sessionAffinity }} + {{- end }} + {{- if $svc.clusterIP }} + clusterIP: {{ $svc.clusterIP }} + {{- end }} + {{- if and $svc.externalTrafficPolicy (or (eq $svc.type "LoadBalancer") (eq $svc.type "NodePort")) }} + externalTrafficPolicy: {{ $svc.externalTrafficPolicy }} + {{- end }} + {{- if $svc.internalTrafficPolicy }} + internalTrafficPolicy: {{ $svc.internalTrafficPolicy }} + {{- end }} + {{- if and $svc.trafficDistribution (ge (int $.Capabilities.KubeVersion.Minor) 31) }} + trafficDistribution: {{ $svc.trafficDistribution }} + {{- end }} +{{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service-mgmt.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service-mgmt.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service-mgmt.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,61 @@ +{{/* + 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: {{ include "polaris.fullnameWithSuffix" (list . "mgmt") }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} + {{- with .Values.managementService.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.managementService.type }} + selector: + {{- include "polaris.selectorLabels" . | nindent 4 }} + ports: + {{- range .Values.managementService.ports }} + - name: {{ .name }} + port: {{ .port }} + {{- if .targetPort }} + targetPort: {{ .targetPort }} + {{- end }} + {{- if .nodePort }} + nodePort: {{ .nodePort }} + {{- end }} + protocol: {{ default "TCP" .protocol }} + {{- end }} + {{- if .Values.managementService.sessionAffinity }} + sessionAffinity: {{ .Values.managementService.sessionAffinity }} + {{- end }} + {{- if .Values.managementService.clusterIP }} + clusterIP: {{ .Values.managementService.clusterIP }} + {{- end }} + {{- if and .Values.managementService.externalTrafficPolicy (or (eq .Values.managementService.type "LoadBalancer") (eq .Values.managementService.type "NodePort")) }} + externalTrafficPolicy: {{ .Values.managementService.externalTrafficPolicy }} + {{- end }} + {{- if .Values.managementService.internalTrafficPolicy }} + internalTrafficPolicy: {{ .Values.managementService.internalTrafficPolicy }} + {{- end }} + {{- if and .Values.managementService.trafficDistribution (ge (int $.Capabilities.KubeVersion.Minor) 31) }} + trafficDistribution: {{ .Values.managementService.trafficDistribution }} + {{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/service.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,61 @@ +{{/* + 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: {{ include "polaris.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + selector: + {{- include "polaris.selectorLabels" . | nindent 4 }} + ports: + {{- range .Values.service.ports }} + - name: {{ .name }} + port: {{ .port }} + {{- if .targetPort }} + targetPort: {{ .targetPort }} + {{- end }} + {{- if and (eq $.Values.service.type "NodePort") .nodePort }} + nodePort: {{ .nodePort }} + {{- end }} + protocol: {{ default "TCP" .protocol }} + {{- end }} + {{- if .Values.service.sessionAffinity }} + sessionAffinity: {{ .Values.service.sessionAffinity }} + {{- end }} + {{- if .Values.service.clusterIP }} + clusterIP: {{ .Values.service.clusterIP }} + {{- end }} + {{- if and .Values.service.externalTrafficPolicy (or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort")) }} + externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }} + {{- end }} + {{- if .Values.service.internalTrafficPolicy }} + internalTrafficPolicy: {{ .Values.service.internalTrafficPolicy }} + {{- end }} + {{- if and .Values.service.trafficDistribution (ge (int .Capabilities.KubeVersion.Minor) 31) }} + trafficDistribution: {{ .Values.service.trafficDistribution }} + {{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/serviceaccount.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/serviceaccount.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/serviceaccount.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,29 @@ +{{/* + Copyright (C) 2024 Dremio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/}} + +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "polaris.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} + {{- if .Values.serviceAccount.annotations }} + annotations: + {{- tpl (toYaml .Values.serviceAccount.annotations) . | nindent 4 }} + {{- end }} +{{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/servicemonitor.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/servicemonitor.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/servicemonitor.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,46 @@ +{{/** + Copyright (C) 2024 Dremio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +**/}} + +{{- if and ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) .Values.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "polaris.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} + {{- if .Values.serviceMonitor.labels }} + {{ toYaml .Values.serviceMonitor.labels | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: {{ get (first .Values.managementService.ports) "name" }} + scheme: http + {{- if .Values.serviceMonitor.interval }} + interval: {{ .Values.serviceMonitor.interval }} + {{- end }} + path: /q/metrics + {{- with .Values.serviceMonitor.metricRelabelings }} + metricRelabelings: + {{- toYaml . | nindent 8 }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + {{- include "polaris.selectorLabels" . | nindent 6 }} +{{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/storage.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/storage.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/storage.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,38 @@ +{{/** + Copyright (C) 2024 Dremio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +**/}} + +{{- if .Values.logging.file.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "polaris.fullnameWithSuffix" (list . "logs") }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "polaris.labels" . | nindent 4 }} +spec: + accessModes: + - ReadWriteOnce + volumeMode: Filesystem + storageClassName: {{ .Values.logging.file.storage.className }} + resources: + requests: + storage: "{{ .Values.logging.file.storage.size }}" +{{- if .Values.logging.file.storage.selectorLabels }} + selector: + matchLabels: + {{- toYaml .Values.logging.file.storage.selectorLabels | nindent 6 }} +{{- end }} +{{- end }} Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/tests/test-connection.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/tests/test-connection.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/templates/tests/test-connection.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,44 @@ +{{/* + 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 "polaris.fullname" . }}-test-connection" + namespace: {{ .Release.Namespace }} + labels: + helm.sh/chart: {{ include "polaris.chart" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + {{- if .Chart.AppVersion }} + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + {{- end }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: check-connection + image: busybox + command: ['sh', '-c'] + args: + - | + for i in $(seq 1 10); do + wget --spider '{{ include "polaris.fullnameWithSuffix" (list . "mgmt") }}:{{ get (first .Values.managementService.ports) "port" }}/q/health/ready' && exit 0 || sleep 3; + done; + exit 1 + restartPolicy: Never \ No newline at end of file Added: dev/incubator/polaris/helm-chart/1.0.0-incubating/tests/configmap_test.yaml ============================================================================== --- dev/incubator/polaris/helm-chart/1.0.0-incubating/tests/configmap_test.yaml (added) +++ dev/incubator/polaris/helm-chart/1.0.0-incubating/tests/configmap_test.yaml Wed Jun 25 17:55:39 2025 @@ -0,0 +1,340 @@ +# +# 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: + version: 1.2.3 + appVersion: 4.5.6 + +release: + name: polaris-release + namespace: polaris-ns + +templates: + - configmap.yaml + +tests: + + # metadata.name + - it: should set config map name + asserts: + - equal: + path: metadata.name + value: polaris-release + - it: should set config map name with override + set: + nameOverride: polaris-override + asserts: + - equal: + path: metadata.name + value: polaris-release-polaris-override + - it: should set config map name with full override + set: + fullnameOverride: polaris-override + asserts: + - equal: + path: metadata.name + value: polaris-override + + # metadata.namespace + - it: should set config map namespace + asserts: + - equal: + path: metadata.namespace + value: polaris-ns + + # metadata.labels + - it: should set config map default labels + asserts: + - isSubset: + path: metadata.labels + content: + app.kubernetes.io/name: polaris + app.kubernetes.io/instance: polaris-release + app.kubernetes.io/version: 4.5.6 + app.kubernetes.io/managed-by: Helm + helm.sh/chart: polaris-1.2.3 + - it: should set include podLabels in deployment labels + set: + configMapLabels: + app.kubernetes.io/component: polaris + asserts: + - isSubset: + path: metadata.labels + content: + app.kubernetes.io/component: polaris + + - it: should configure realm context + set: + realmContext: { type: "custom", realms: [ "realm1", "realm2" ] } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.realm-context.type=custom" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.realm-context.realms=realm1,realm2" } + + - it: should configure features + set: + features: + feature1: true + feature2: 42 + realmOverrides: + realm1: + feature1: false + realm2: + feature2: 43 + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.features.\"feature1\"=true" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.features.\"feature2\"=42" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.features.realm-overrides.\"realm1\".\"feature1\"=false" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.features.realm-overrides.\"realm2\".\"feature2\"=43" } + + - it: should configure persistence + set: + persistence: { type: "eclipse-link", eclipseLink: { persistenceUnit: "polaris", secret: { name: "polaris-persistence" } } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.persistence.type=eclipse-link" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.persistence.eclipselink.persistence-unit=polaris" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.persistence.eclipselink.configuration-file=/deployments/config/persistence.xml" } + + - it: should configure file-io + set: + fileIo.type: "custom" + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.file-io.type=custom" } + + - it: should configure GCP token lifespan + set: + storage: { secret: { gcpTokenLifespan: "PT2H" } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.storage.gcp.lifespan=PT2H" } + + - it: should configure authentication with RSA key pair + set: + authentication: { authenticator: { type: custom }, tokenService: { type: custom }, tokenBroker: { type: rsa-key-pair, maxTokenGeneration: PT2H, secret: { name: polaris-auth } } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.authenticator.type=custom" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-service.type=custom" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-broker.type=rsa-key-pair" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-broker.max-token-generation=PT2H" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-broker.rsa-key-pair.public-key-file=/deployments/config/public.pem" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-broker.rsa-key-pair.private-key-file=/deployments/config/private.pem" } + + - it: should configure authentication with symmetric key + set: + authentication: { tokenBroker: { type: symmetric-key, secret: { name: polaris-auth } } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.authenticator.type=default" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-service.type=default" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-broker.type=symmetric-key" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-broker.max-token-generation=PT1H" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.authentication.token-broker.symmetric-key.file=/deployments/config/symmetric.key" } + + - it: should derive HTTP ports from service configuration + set: + service: { ports: [ { port: 8080 } ] } + managementService: { ports: [ { port: 8081 } ] } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.port=8080" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.management.port=8081" } + + - it: should configure console logging + set: + logging: { level: DEBUG, console: { enabled: true, threshold: INFO, format: custom } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.level=DEBUG" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.console.enable=true" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.console.level=INFO" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.console.format=custom" } + + - it: should configure file logging + set: + logging: { file: { enabled: true, threshold: DEBUG, format: custom, logsDir: /mnt/logs, fileName: custom.log, rotation: { maxFileSize: 50Mi, maxBackupIndex: 2, fileSuffix: .yyyy-MM-dd } } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.enable=true" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.level=DEBUG" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.path=/mnt/logs/custom.log" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.rotation.max-file-size=52428800" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.rotation.max-backup-index=2" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.rotation.file-suffix=.yyyy-MM-dd" } + + - it: should disable logging + set: + logging: { file: { enabled: false }, console: { enabled: false } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.enable=false" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.console.enable=false" } + + - it: should enable JSON logging + set: + logging: { file: { enabled: true, json: true }, console: { enabled: true, json: true } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.enable=true" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.console.enable=true" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.file.json=true" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.console.json=true" } + + - it: should include logging categories + set: + logging: + categories: + # compact style + org.acme: DEBUG + # expanded style + org: + acme: + service: INFO + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.category.\"org.acme\".level=DEBUG" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.log.category.\"org.acme.service\".level=INFO" } + + - it: should include MDC context + set: + logging: + mdc: + # compact style + org.acme: foo + # expanded style + org: + acme: + service: foo + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.log.mdc.\"org.acme\"=foo" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.log.mdc.\"org.acme.service\"=foo" } + + - it: should include telemetry configuration + set: + tracing: { enabled: true, endpoint: http://custom:4317, attributes: { service.name: custom, foo: bar } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.exporter.otlp.endpoint=http://custom:4317" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.resource.attributes\\[\\d\\]=service.name=custom" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.resource.attributes\\[\\d\\]=foo=bar" } + + - it: should include set sample rate numeric + set: + tracing: { enabled: true, sample: "0.123" } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.traces.sampler=parentbased_traceidratio" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.traces.sampler.arg=0.123" } + + - it: should include set sample rate "all" + set: + tracing: { enabled: true, sample: "all" } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.traces.sampler=parentbased_always_on" } + + - it: should include set sample rate "none" + set: + tracing: { enabled: true, sample: "none" } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.traces.sampler=always_off" } + + - it: should disable tracing by default + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.sdk.disabled=true" } + + - it: should disable tracing + set: + tracing: { enabled: false } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.otel.sdk.disabled=true" } + + - it: should include custom metrics + set: + metrics: { enabled: true, tags: { app: custom, foo: bar } } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.metrics.tags.app=custom" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.metrics.tags.foo=bar" } + + - it: should disable metrics + set: + metrics: { enabled: false } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.micrometer.enabled=false" } + + - it: should include advanced configuration + set: + advancedConfig: + # compact style + quarkus.compact.custom: true + # expanded style + quarkus: + expanded: + custom: foo + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.compact.custom=true" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.expanded.custom=foo" } + + - it: should not include CORS configuration by default + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.cors" } + not: true + + - it: should include CORS configuration if defined + set: + cors: { allowedOrigins: [ "http://localhost:3000", "https://localhost:4000" ], allowedMethods: [ "GET", "POST" ], allowedHeaders: [ "X-Custom1", "X-Custom2" ], exposedHeaders: [ "X-Exposed-Custom1", "X-Exposed-Custom2" ], accessControlMaxAge: "PT1H", accessControlAllowCredentials: false } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.cors.origins=http://localhost:3000,https://localhost:4000" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.cors.methods=GET,POST" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.cors.headers=X-Custom1,X-Custom2" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.cors.exposed-headers=X-Exposed-Custom1,X-Exposed-Custom2" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.cors.access-control-max-age=PT1H" } + - matchRegex: { path: 'data["application.properties"]', pattern: "quarkus.http.cors.access-control-allow-credentials=false" } + + - it: should configure rate-limiter with default values + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.filter.type=no-op" } + + - it: should configure rate-limiter no-op + set: + rateLimiter.type: no-op + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.filter.type=no-op" } + + - it: should configure rate-limiter with default token bucket values + set: + rateLimiter.type: default + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.filter.type=default" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.token-bucket.type=default" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.token-bucket.requests-per-second=9999" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.token-bucket.window=PT10S" } + + - it: should configure rate-limiter with custom token bucket values + set: + rateLimiter: + type: custom + tokenBucket: + type: custom + requestsPerSecond: 1234 + window: PT5S + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.filter.type=custom" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.token-bucket.type=custom" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.token-bucket.requests-per-second=1234" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.rate-limiter.token-bucket.window=PT5S" } + + - it: should not include tasks configuration by default + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.tasks" } + not: true + + - it: should include tasks configuration if defined + set: + tasks: { maxConcurrentTasks: 10, maxQueuedTasks: 20 } + asserts: + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.tasks.max-concurrent-tasks=10" } + - matchRegex: { path: 'data["application.properties"]', pattern: "polaris.tasks.max-queued-tasks=20" }