This is an automated email from the ASF dual-hosted git repository.

adutra pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git


The following commit(s) were added to refs/heads/main by this push:
     new c5fd3683b feat: Add Pod Disruption Budget support to Helm chart (#2380)
c5fd3683b is described below

commit c5fd3683b9d225c3d0eafc67d5750af2a47c621b
Author: Bryan Maloyer <bryan.m...@gmail.com>
AuthorDate: Wed Aug 20 14:13:22 2025 +0200

    feat: Add Pod Disruption Budget support to Helm chart (#2380)
---
 helm/polaris/README.md                           |   5 +
 helm/polaris/templates/poddisruptionbudget.yaml  |  45 +++++
 helm/polaris/tests/poddisruptionbudget_test.yaml | 210 +++++++++++++++++++++++
 helm/polaris/values.yaml                         |  15 ++
 4 files changed, 275 insertions(+)

diff --git a/helm/polaris/README.md b/helm/polaris/README.md
index 1cc84f6de..192c7c3d3 100644
--- a/helm/polaris/README.md
+++ b/helm/polaris/README.md
@@ -311,6 +311,11 @@ ct install --namespace polaris --charts ./helm/polaris
 | persistence.relationalJdbc.secret.username | string | `"username"` | The 
secret key holding the database username for authentication |
 | persistence.type | string | `"in-memory"` | The type of persistence to use. 
Two built-in types are supported: in-memory and relational-jdbc. The 
eclipse-link type is also supported but is deprecated. |
 | podAnnotations | object | `{}` | Annotations to apply to polaris pods. |
+| podDisruptionBudget | object | 
`{"annotations":{},"enabled":false,"maxUnavailable":null,"minAvailable":null}` 
| Pod disruption budget settings. |
+| podDisruptionBudget.annotations | object | `{}` | Annotations to add to the 
pod disruption budget. |
+| podDisruptionBudget.enabled | bool | `false` | Specifies whether a pod 
disruption budget should be created. |
+| podDisruptionBudget.maxUnavailable | string | `nil` | The maximum number of 
pods that can be unavailable during disruptions. Can be an absolute number (ex: 
5) or a percentage of desired pods (ex: 50%). IMPORTANT: Cannot be used 
simultaneously with minAvailable. |
+| podDisruptionBudget.minAvailable | string | `nil` | The minimum number of 
pods that should remain available during disruptions. Can be an absolute number 
(ex: 5) or a percentage of desired pods (ex: 50%). IMPORTANT: Cannot be used 
simultaneously with maxUnavailable. |
 | podLabels | object | `{}` | Additional Labels to apply to polaris pods. |
 | podSecurityContext | object | 
`{"fsGroup":10001,"seccompProfile":{"type":"RuntimeDefault"}}` | Security 
context for the polaris pod. See 
https://kubernetes.io/docs/tasks/configure-pod-container/security-context/. |
 | podSecurityContext.fsGroup | int | `10001` | GID 10001 is compatible with 
Polaris OSS default images; change this if you are using a different image. |
diff --git a/helm/polaris/templates/poddisruptionbudget.yaml 
b/helm/polaris/templates/poddisruptionbudget.yaml
new file mode 100644
index 000000000..c7e9217af
--- /dev/null
+++ b/helm/polaris/templates/poddisruptionbudget.yaml
@@ -0,0 +1,45 @@
+{{/*
+  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.podDisruptionBudget.enabled -}}
+apiVersion: policy/v1
+kind: PodDisruptionBudget
+metadata:
+  name: {{ include "polaris.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    {{- include "polaris.labels" . | nindent 4 }}
+  {{- if .Values.podDisruptionBudget.annotations }}
+  annotations:
+    {{- tpl (toYaml .Values.podDisruptionBudget.annotations) . | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if and .Values.podDisruptionBudget.minAvailable 
.Values.podDisruptionBudget.maxUnavailable }}
+  {{- fail "podDisruptionBudget.minAvailable and 
podDisruptionBudget.maxUnavailable cannot be both set." -}}
+  {{- end }}
+  {{- if .Values.podDisruptionBudget.minAvailable }}
+  minAvailable: {{ .Values.podDisruptionBudget.minAvailable }}
+  {{- end }}
+  {{- if .Values.podDisruptionBudget.maxUnavailable }}
+  maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }}
+  {{- end }}
+  selector:
+    matchLabels:
+      {{- include "polaris.selectorLabels" . | nindent 6 }}
+{{- end }}
diff --git a/helm/polaris/tests/poddisruptionbudget_test.yaml 
b/helm/polaris/tests/poddisruptionbudget_test.yaml
new file mode 100644
index 000000000..b117e2978
--- /dev/null
+++ b/helm/polaris/tests/poddisruptionbudget_test.yaml
@@ -0,0 +1,210 @@
+#
+# 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:
+  - poddisruptionbudget.yaml
+
+tests:
+
+  # kind
+  - it: should not create PDB by default
+    asserts:
+      - containsDocument:
+          kind: PodDisruptionBudget
+          apiVersion: policy/v1
+        not: true
+  - it: should create PDB when enabled
+    set:
+      podDisruptionBudget.enabled: true
+    asserts:
+      - containsDocument:
+          kind: PodDisruptionBudget
+          apiVersion: policy/v1
+
+  # metadata.name (with PDB enabled)
+  - it: should set PDB name
+    set:
+      podDisruptionBudget.enabled: true
+    asserts:
+      - equal:
+          path: metadata.name
+          value: polaris-release
+  - it: should set PDB name with override
+    set:
+      podDisruptionBudget.enabled: true
+      nameOverride: polaris-override
+    asserts:
+      - equal:
+          path: metadata.name
+          value: polaris-release-polaris-override
+  - it: should set PDB name with full override
+    set:
+      podDisruptionBudget.enabled: true
+      fullnameOverride: polaris-override
+    asserts:
+      - equal:
+          path: metadata.name
+          value: polaris-override
+
+  # metadata.namespace (with PDB enabled)
+  - it: should set PDB namespace
+    set:
+      podDisruptionBudget.enabled: true
+    asserts:
+      - equal:
+          path: metadata.namespace
+          value: polaris-ns
+
+  # metadata.labels (with PDB enabled)
+  - it: should set PDB default labels
+    set:
+      podDisruptionBudget.enabled: true
+    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
+
+  # metadata.annotations (with PDB enabled)
+  - it: should not set annotations by default
+    set:
+      podDisruptionBudget.enabled: true
+    asserts:
+      - isNull:
+          path: metadata.annotations
+  - it: should set custom annotations
+    set:
+      podDisruptionBudget.enabled: true
+      podDisruptionBudget.annotations:
+        example.com/policy: "critical"
+        kubernetes.io/description: "PDB for Polaris"
+    asserts:
+      - equal:
+          path: metadata.annotations
+          value:
+            example.com/policy: "critical"
+            kubernetes.io/description: "PDB for Polaris"
+  - it: should template annotations
+    set:
+      podDisruptionBudget.enabled: true
+      podDisruptionBudget.annotations:
+        app.example.com/release: "{{ .Release.Name }}"
+    asserts:
+      - equal:
+          path: metadata.annotations
+          value:
+            app.example.com/release: "polaris-release"
+
+  - it: should set custom maxUnavailable
+    set:
+      podDisruptionBudget.enabled: true
+      podDisruptionBudget.maxUnavailable: 2
+    asserts:
+      - equal:
+          path: spec.maxUnavailable
+          value: 2
+      - isNull:
+          path: spec.minAvailable
+  - it: should set maxUnavailable percentage
+    set:
+      podDisruptionBudget.enabled: true
+      podDisruptionBudget.maxUnavailable: "50%"
+    asserts:
+      - equal:
+          path: spec.maxUnavailable
+          value: "50%"
+      - isNull:
+          path: spec.minAvailable
+
+  # spec.minAvailable
+  - it: should set minAvailable and unset maxUnavailable
+    set:
+      podDisruptionBudget.enabled: true
+      podDisruptionBudget.minAvailable: 2
+      podDisruptionBudget.maxUnavailable: null
+    asserts:
+      - equal:
+          path: spec.minAvailable
+          value: 2
+      - isNull:
+          path: spec.maxUnavailable
+  - it: should set minAvailable percentage
+    set:
+      podDisruptionBudget.enabled: true
+      podDisruptionBudget.minAvailable: "75%"
+      podDisruptionBudget.maxUnavailable: null
+    asserts:
+      - equal:
+          path: spec.minAvailable
+          value: "75%"
+      - isNull:
+          path: spec.maxUnavailable
+
+  # spec.selector.matchLabels
+  - it: should set selector labels to match deployment
+    set:
+      podDisruptionBudget.enabled: true
+    asserts:
+      - equal:
+          path: spec.selector.matchLabels
+          value:
+            app.kubernetes.io/name: polaris
+            app.kubernetes.io/instance: polaris-release
+  - it: should set selector labels with name override
+    set:
+      podDisruptionBudget.enabled: true
+      nameOverride: polaris-override
+    asserts:
+      - equal:
+          path: spec.selector.matchLabels
+          value:
+            app.kubernetes.io/name: polaris-override
+            app.kubernetes.io/instance: polaris-release
+  - it: should set selector labels with full name override
+    set:
+      podDisruptionBudget.enabled: true
+      fullnameOverride: polaris-override
+    asserts:
+      - equal:
+          path: spec.selector.matchLabels
+          value:
+            app.kubernetes.io/name: polaris
+            app.kubernetes.io/instance: polaris-release
+
+  # validation tests
+  - it: should fail when both minAvailable and maxUnavailable are set
+    set:
+      podDisruptionBudget.enabled: true
+      podDisruptionBudget.minAvailable: 1
+      podDisruptionBudget.maxUnavailable: 1
+    asserts:
+      - failedTemplate:
+          errorMessage: "podDisruptionBudget.minAvailable and 
podDisruptionBudget.maxUnavailable cannot be both set."
diff --git a/helm/polaris/values.yaml b/helm/polaris/values.yaml
index 8201d6f48..fddd9cc4e 100644
--- a/helm/polaris/values.yaml
+++ b/helm/polaris/values.yaml
@@ -62,6 +62,21 @@ podLabels: {}
 # -- Additional Labels to apply to polaris configmap.
 configMapLabels: {}
 
+# -- Pod disruption budget settings.
+podDisruptionBudget:
+  # -- Specifies whether a pod disruption budget should be created.
+  enabled: false
+  # -- The minimum number of pods that should remain available during 
disruptions.
+  # Can be an absolute number (ex: 5) or a percentage of desired pods (ex: 
50%).
+  # IMPORTANT: Cannot be used simultaneously with maxUnavailable.
+  minAvailable: ~
+  # -- The maximum number of pods that can be unavailable during disruptions.
+  # Can be an absolute number (ex: 5) or a percentage of desired pods (ex: 
50%).
+  # IMPORTANT: Cannot be used simultaneously with minAvailable.
+  maxUnavailable: ~
+  # -- Annotations to add to the pod disruption budget.
+  annotations: {}
+
 # -- The number of old ReplicaSets to retain to allow rollback (if not set, 
the default Kubernetes value is set to 10).
 revisionHistoryLimit: ~
 

Reply via email to