Skip to content

Commit 355cd90

Browse files
eamonnmoloneyclaudedistro-ci[bot]
authored
fix(8.8): back Web Modeler restapi /tmp with a per-pod ephemeral volume (#6408)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: distro-ci[bot] <122795778+distro-ci[bot]@users.noreply.github.com>
1 parent a93335f commit 355cd90

6 files changed

Lines changed: 117 additions & 152 deletions

File tree

charts/camunda-platform-8.8/README.md

Lines changed: 89 additions & 89 deletions
Large diffs are not rendered by default.

charts/camunda-platform-8.8/templates/web-modeler/deployment-restapi.yaml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
{{- fail "webModeler.persistence.deploymentStrategy value must be one of 'RollingUpdate', 'Recreate'" -}}
55
{{- end -}}
66
{{- if and (eq $deploymentStrategy "Recreate") (not .Values.webModeler.persistence.enabled) -}}
7-
{{- fail "webModeler.persistence.deploymentStrategy: Recreate requires webModeler.persistence.enabled: true (it avoids a Multi-Attach deadlock on the chart-managed RWO PVC; without persistence it only adds upgrade downtime)" -}}
7+
{{- fail "webModeler.persistence.deploymentStrategy: Recreate requires webModeler.persistence.enabled: true. The default chart-managed path uses a per-pod ephemeral volume with no Multi-Attach contention, so Recreate is only useful when existingClaim points to a ReadWriteOnce volume; without persistence it only adds upgrade downtime" -}}
88
{{- end -}}
99
apiVersion: apps/v1
1010
kind: Deployment
@@ -202,8 +202,23 @@ spec:
202202
persistentVolumeClaim:
203203
claimName: {{ .Values.webModeler.persistence.existingClaim }}
204204
{{- else if .Values.webModeler.persistence.enabled }}
205-
persistentVolumeClaim:
206-
claimName: {{ include "camundaPlatform.fullname" . }}-webmodeler-data
205+
ephemeral:
206+
volumeClaimTemplate:
207+
{{- with .Values.webModeler.persistence.annotations }}
208+
metadata:
209+
annotations: {{- toYaml . | nindent 18 }}
210+
{{- end }}
211+
spec:
212+
accessModes: {{ .Values.webModeler.persistence.accessModes | default (list "ReadWriteOnce") | toYaml | nindent 18 }}
213+
{{- with .Values.webModeler.persistence.storageClassName }}
214+
storageClassName: {{ . | quote }}
215+
{{- end }}
216+
{{- with .Values.webModeler.persistence.selector }}
217+
selector: {{- toYaml . | nindent 18 }}
218+
{{- end }}
219+
resources:
220+
requests:
221+
storage: {{ .Values.webModeler.persistence.size | default "1Gi" | quote }}
207222
{{- else }}
208223
emptyDir: {}
209224
{{- end }}

charts/camunda-platform-8.8/templates/web-modeler/persistentvolumeclaim-restapi.yaml

Lines changed: 0 additions & 24 deletions
This file was deleted.

charts/camunda-platform-8.8/test/unit/web-modeler/persistence_test.go

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,12 @@ func (s *PersistenceTemplateTest) TestPersistenceConfiguration() {
107107

108108
// then
109109
s.Require().NotNil(tmpVolume, "tmp volume should exist")
110-
s.Require().NotNil(tmpVolume.PersistentVolumeClaim, "should use PVC when persistence is enabled")
110+
s.Require().NotNil(tmpVolume.Ephemeral, "should use a per-pod ephemeral volume when persistence is enabled")
111111
s.Require().Nil(tmpVolume.EmptyDir, "should not use emptyDir when persistence is enabled")
112-
s.Require().Equal("camunda-platform-test-webmodeler-data", tmpVolume.PersistentVolumeClaim.ClaimName)
112+
s.Require().Nil(tmpVolume.PersistentVolumeClaim, "should not reference a shared PVC when persistence is enabled")
113+
spec := tmpVolume.Ephemeral.VolumeClaimTemplate.Spec
114+
s.Require().Equal("5Gi", spec.Resources.Requests.Storage().String())
115+
s.Require().Equal(corev1.ReadWriteOnce, spec.AccessModes[0])
113116
},
114117
},
115118
{
@@ -178,39 +181,10 @@ func (s *PersistenceTemplateTest) TestPersistenceConfiguration() {
178181
}
179182
}
180183

181-
func TestPVCManifestCreated(t *testing.T) {
182-
t.Parallel()
183-
184-
chartPath, err := filepath.Abs("../../../")
185-
require.NoError(t, err)
186-
187-
testCase := testhelpers.TestCase{
188-
Name: "TestPVCManifestCreated",
189-
Values: map[string]string{
190-
"identity.enabled": "true",
191-
"webModeler.enabled": "true",
192-
"webModeler.restapi.mail.fromAddress": "test@test.com",
193-
"webModeler.persistence.enabled": "true",
194-
"webModeler.persistence.size": "5Gi",
195-
"webModeler.persistence.accessModes[0]": "ReadWriteOnce",
196-
},
197-
Verifier: func(t *testing.T, output string, err error) {
198-
var pvc corev1.PersistentVolumeClaim
199-
helm.UnmarshalK8SYaml(t, output, &pvc)
200-
require.Equal(t, "camunda-platform-test-webmodeler-data", pvc.Name)
201-
require.Equal(t, "5Gi", pvc.Spec.Resources.Requests.Storage().String())
202-
require.Equal(t, corev1.ReadWriteOnce, pvc.Spec.AccessModes[0])
203-
},
204-
}
205-
206-
testhelpers.RunTestCasesE(t, chartPath, "camunda-platform-test", "camunda-platform-webmodeler", []string{"templates/web-modeler/persistentvolumeclaim-restapi.yaml"}, []testhelpers.TestCase{testCase})
207-
}
208-
209184
// TestDeploymentStrategyDefaultsToRollingUpdate asserts the default strategy
210-
// is RollingUpdate (preserves zero-downtime upgrade for users with RWX/
211-
// existingClaim setups). Users with chart-managed RWO PVCs hit a Multi-Attach
212-
// deadlock with RollingUpdate and must opt into "Recreate" — see
213-
// TestDeploymentStrategyRecreateOptIn.
185+
// is RollingUpdate. The restapi /tmp volume is a per-pod ephemeral volume, so
186+
// rollouts never contend for a shared RWO volume and zero-downtime RollingUpdate
187+
// is always safe.
214188
func TestDeploymentStrategyDefaultsToRollingUpdate(t *testing.T) {
215189
t.Parallel()
216190
chartPath, err := filepath.Abs("../../../")

charts/camunda-platform-8.8/values.schema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4617,7 +4617,7 @@
46174617
},
46184618
"deploymentStrategy": {
46194619
"type": "string",
4620-
"description": "update strategy for the restapi Deployment. Defaults to RollingUpdate (zero-downtime), which only works when the PVC supports concurrent attach (RWX storage, or accessModes including ReadWriteMany). For chart-managed PVCs on RWO storage, set to \"Recreate\" to avoid Multi-Attach deadlocks during helm upgrade (introduces brief downtime per upgrade).",
4620+
"description": "update strategy for the restapi Deployment. Defaults to RollingUpdate, which is always safe because the default chart-managed persistence path uses a per-pod ephemeral volume (no concurrent-attach contention). Set to \"Recreate\" only when using existingClaim with a ReadWriteOnce volume that cannot tolerate concurrent attach during a rollout (introduces brief downtime per upgrade).",
46214621
"default": "RollingUpdate",
46224622
"enum": [
46234623
"RollingUpdate",

charts/camunda-platform-8.8/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2141,7 +2141,7 @@ webModeler:
21412141
annotations: {}
21422142
## @param webModeler.persistence.selector can be used to define a label selector for the persistent volume claim
21432143
selector: {}
2144-
## @param webModeler.persistence.deploymentStrategy update strategy for the restapi Deployment. Defaults to RollingUpdate (zero-downtime), which only works when the PVC supports concurrent attach (RWX storage, or accessModes including ReadWriteMany). For chart-managed PVCs on RWO storage, set to "Recreate" to avoid Multi-Attach deadlocks during helm upgrade (introduces brief downtime per upgrade).
2144+
## @param webModeler.persistence.deploymentStrategy update strategy for the restapi Deployment. Defaults to RollingUpdate, which is always safe because the default chart-managed persistence path uses a per-pod ephemeral volume (no concurrent-attach contention). Set to "Recreate" only when using existingClaim with a ReadWriteOnce volume that cannot tolerate concurrent attach during a rollout (introduces brief downtime per upgrade).
21452145
deploymentStrategy: RollingUpdate
21462146

21472147
## @extra webModeler.serviceAccount configuration for the service account the WebModeler pods are assigned to

0 commit comments

Comments
 (0)