From efd5a3cee3a679ebd56bebc8c2328e3b3545e0db Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Tue, 26 May 2026 21:22:06 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F(helm)=20create=20a=20dedicat?= =?UTF-8?q?ed=20svc=20and=20deployment=20for=20yprovider=20converter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We want to isolate the converter service built in the yprovider server in order to not mix conversion and collaboration together. We decided to create a dedicated service and deployment, by default they use the values defined in yProvider values but all can be overridden in yProvider.converter. Also, by default these new service and deployment are not enabled, they must be explictly enabled and configured. If not it works like now with only one service and deployment for the yProvider server. --- CHANGELOG.md | 1 + src/helm/env.d/dev/values.impress.yaml.gotmpl | 8 +- .../env.d/feature/values.impress.yaml.gotmpl | 8 +- src/helm/impress/templates/_helpers.tpl | 9 + .../yprovider_deployment_converter.yaml | 189 ++++++++++++++++++ .../templates/yprovider_svc_converter.yaml | 25 +++ src/helm/impress/values.yaml | 71 +++++++ 7 files changed, 309 insertions(+), 2 deletions(-) create mode 100644 src/helm/impress/templates/yprovider_deployment_converter.yaml create mode 100644 src/helm/impress/templates/yprovider_svc_converter.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f8f3dc67..dc118a129 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to - ✨(frontend) comment side panel #2279 - ✨(buildpack) add PaaS deployment support, tested with Scalingo #2293 - 🔧(backend) allow configuring settings OIDC_OP_USER_ENDPOINT_FORMAT +- ⚡️(helm) create a dedicated svc and deployment for yprovider converter #2368 ### Changed diff --git a/src/helm/env.d/dev/values.impress.yaml.gotmpl b/src/helm/env.d/dev/values.impress.yaml.gotmpl index 19aba4c28..f4478725f 100644 --- a/src/helm/env.d/dev/values.impress.yaml.gotmpl +++ b/src/helm/env.d/dev/values.impress.yaml.gotmpl @@ -16,6 +16,7 @@ backend: replicas: 1 envVars: COLLABORATION_SERVER_SECRET: my-secret + CONVERSION_UPLOAD_ENABLED: True DJANGO_CSRF_TRUSTED_ORIGINS: https://docs.127.0.0.1.nip.io DJANGO_CONFIGURATION: Feature DJANGO_ALLOWED_HOSTS: docs.127.0.0.1.nip.io @@ -71,7 +72,7 @@ backend: STORAGES_STATICFILES_BACKEND: django.contrib.staticfiles.storage.StaticFilesStorage DOCSPEC_API_URL: http://impress-docs-docspec:4000/conversion USER_RECONCILIATION_FORM_URL: https://docs.127.0.0.1.nip.io - Y_PROVIDER_API_BASE_URL: http://impress-docs-y-provider:443/api/ + Y_PROVIDER_API_BASE_URL: http://impress-docs-y-provider-converter:443/api/ Y_PROVIDER_API_KEY: my-secret CACHES_KEY_PREFIX: "{{ now | unixEpoch }}" django: @@ -153,6 +154,11 @@ frontend: runAsNonRoot: false yProvider: + + converter: + enabled: true + replicas: 2 + replicas: 1 image: diff --git a/src/helm/env.d/feature/values.impress.yaml.gotmpl b/src/helm/env.d/feature/values.impress.yaml.gotmpl index 4ba687c9f..d179cd520 100644 --- a/src/helm/env.d/feature/values.impress.yaml.gotmpl +++ b/src/helm/env.d/feature/values.impress.yaml.gotmpl @@ -17,6 +17,7 @@ backend: replicas: 1 envVars: COLLABORATION_SERVER_SECRET: my-secret + CONVERSION_UPLOAD_ENABLED: True DJANGO_CSRF_TRUSTED_ORIGINS: https://{{ .Values.feature }}-docs.{{ .Values.domain }} DJANGO_CONFIGURATION: Feature DJANGO_ALLOWED_HOSTS: {{ .Values.feature }}-docs.{{ .Values.domain }} @@ -71,7 +72,7 @@ backend: STORAGES_STATICFILES_BACKEND: django.contrib.staticfiles.storage.StaticFilesStorage DOCSPEC_API_URL: http://impress-docs-docspec:4000/conversion USER_RECONCILIATION_FORM_URL: https://{{ .Values.feature }}-docs.{{ .Values.domain }} - Y_PROVIDER_API_BASE_URL: http://impress-docs-y-provider:443/api/ + Y_PROVIDER_API_BASE_URL: http://impress-docs-y-provider-converter:443/api/ Y_PROVIDER_API_KEY: my-secret CACHES_KEY_PREFIX: "{{ now | unixEpoch }}" migrate: @@ -131,6 +132,11 @@ frontend: tag: *tag yProvider: + + converter: + enabled: true + replicas: 1 + replicas: 1 image: diff --git a/src/helm/impress/templates/_helpers.tpl b/src/helm/impress/templates/_helpers.tpl index 29530f905..c4fe19048 100644 --- a/src/helm/impress/templates/_helpers.tpl +++ b/src/helm/impress/templates/_helpers.tpl @@ -186,6 +186,15 @@ Requires top level scope {{ include "impress.fullname" . }}-y-provider {{- end }} +{{/* +Full name for the yProvider converter + +Requires top level scope +*/}} +{{- define "impress.yProvider.converter.fullname" -}} +{{ include "impress.yProvider.fullname" . }}-converter +{{- end }} + {{/* Full name for the docSpec diff --git a/src/helm/impress/templates/yprovider_deployment_converter.yaml b/src/helm/impress/templates/yprovider_deployment_converter.yaml new file mode 100644 index 000000000..0eb3dbe3c --- /dev/null +++ b/src/helm/impress/templates/yprovider_deployment_converter.yaml @@ -0,0 +1,189 @@ +{{ if .Values.yProvider.converter.enabled -}} +{{- $yProvider := .Values.yProvider -}} +{{- $converter := .Values.yProvider.converter -}} +{{- $service := mergeOverwrite (dict) (default dict $yProvider.service) (default dict $converter.service) -}} +{{- $image := mergeOverwrite (dict) (default dict $yProvider.image) (default dict $converter.image) -}} +{{- $probes := mergeOverwrite (dict) (default dict $yProvider.probes) (default dict $converter.probes) -}} +{{- $pdb := mergeOverwrite (dict) (default dict $yProvider.pdb) (default dict $converter.pdb) -}} +{{- $dpAnnotations := mergeOverwrite (dict) (default dict $yProvider.dpAnnotations) (default dict $converter.dpAnnotations) -}} +{{- $podAnnotations := mergeOverwrite (dict) (default dict $yProvider.podAnnotations) (default dict $converter.podAnnotations) -}} +{{- $replicas := default $yProvider.replicas $converter.replicas -}} +{{- $serviceAccountName := default $yProvider.serviceAccountName $converter.serviceAccountName -}} +{{- $shareProcessNamespace := default $yProvider.shareProcessNamespace $converter.shareProcessNamespace -}} +{{- $sidecars := default $yProvider.sidecars $converter.sidecars -}} +{{- $command := default $yProvider.command $converter.command -}} +{{- $args := default $yProvider.args $converter.args -}} +{{- $envFrom := default $yProvider.envFrom $converter.envFrom -}} +{{- $securityContext := mergeOverwrite (dict) (default dict $yProvider.securityContext) (default dict $converter.securityContext) -}} +{{- $resources := mergeOverwrite (dict) (default dict $yProvider.resources) (default dict $converter.resources) -}} +{{- $nodeSelector := mergeOverwrite (dict) (default dict $yProvider.nodeSelector) (default dict $converter.nodeSelector) -}} +{{- $affinity := mergeOverwrite (dict) (default dict $yProvider.affinity) (default dict $converter.affinity) -}} +{{- $tolerations := default $yProvider.tolerations $converter.tolerations -}} +{{- $persistence := mergeOverwrite (dict) (default dict $yProvider.persistence) (default dict $converter.persistence) -}} +{{- $extraVolumeMounts := default $yProvider.extraVolumeMounts $converter.extraVolumeMounts -}} +{{- $extraVolumes := default $yProvider.extraVolumes $converter.extraVolumes -}} +{{- $envVarsScope := dict "envVars" (mergeOverwrite (dict) (default dict $yProvider.envVars) (default dict $converter.envVars)) -}} +{{- $envVars := include "impress.common.env" (list . $envVarsScope) -}} +{{- $fullName := include "impress.yProvider.converter.fullname" . -}} +{{- $component := "yProvider-converter" -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ $fullName }} + namespace: {{ .Release.Namespace | quote }} + annotations: + {{- with $dpAnnotations }} + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "impress.common.labels" (list . $component) | nindent 4 }} +spec: + replicas: {{ $replicas }} + selector: + matchLabels: + {{- include "impress.common.selectorLabels" (list . $component) | nindent 6 }} + template: + metadata: + annotations: + {{- with $podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "impress.common.selectorLabels" (list . $component) | nindent 8 }} + spec: + {{- if $.Values.image.credentials }} + imagePullSecrets: + - name: {{ include "impress.secret.dockerconfigjson.name" (dict "fullname" (include "impress.fullname" .) "imageCredentials" $.Values.image.credentials) }} + {{- end}} + {{- if $serviceAccountName }} + serviceAccountName: {{ $serviceAccountName }} + {{- end }} + shareProcessNamespace: {{ $shareProcessNamespace }} + containers: + {{- with $sidecars }} + {{- toYaml . | nindent 8 }} + {{- end }} + - name: {{ .Chart.Name }} + image: "{{ $image.repository | default $.Values.image.repository }}:{{ $image.tag | default $.Values.image.tag }}" + imagePullPolicy: {{ $image.pullPolicy | default $.Values.image.pullPolicy }} + {{- with $command }} + command: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with $args }} + args: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if $envVars}} + env: + {{- $envVars | indent 12 }} + {{- end }} + {{- if $envFrom }} + envFrom: + {{- toYaml $envFrom | nindent 12 }} + {{- end }} + {{- with $securityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + ports: + - name: http + containerPort: {{ $service.targetPort }} + protocol: TCP + {{- if $probes.liveness }} + livenessProbe: + {{- include "impress.probes.abstract" (merge $probes.liveness (dict "targetPort" $service.targetPort )) | nindent 12 }} + {{- end }} + {{- if $probes.readiness }} + readinessProbe: + {{- include "impress.probes.abstract" (merge $probes.readiness (dict "targetPort" $service.targetPort )) | nindent 12 }} + {{- end }} + {{- if $probes.startup }} + startupProbe: + {{- include "impress.probes.abstract" (merge $probes.startup (dict "targetPort" $service.targetPort )) | nindent 12 }} + {{- end }} + {{- with $resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + {{- range $index, $value := .Values.mountFiles }} + - name: "files-{{ $index }}" + mountPath: {{ $value.path }} + subPath: content + {{- end }} + {{- range $name, $volume := $persistence }} + - name: "{{ $name }}" + mountPath: "{{ $volume.mountPath }}" + {{- end }} + {{- range $extraVolumeMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath | default "" }} + readOnly: {{ .readOnly }} + {{- end }} + {{- with $nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with $tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + {{- range $index, $value := .Values.mountFiles }} + - name: "files-{{ $index }}" + configMap: + name: "{{ include "impress.fullname" $ }}-files-{{ $index }}" + {{- end }} + {{- range $name, $volume := $persistence }} + - name: "{{ $name }}" + {{- if eq $volume.type "emptyDir" }} + emptyDir: {} + {{- else }} + persistentVolumeClaim: + claimName: "{{ $fullName }}-{{ $name }}" + {{- end }} + {{- end }} + {{- range $extraVolumes }} + - name: {{ .name }} + {{- if .existingClaim }} + persistentVolumeClaim: + claimName: {{ .existingClaim }} + {{- else if .secret }} + secret: + {{ toYaml .secret | nindent 12 }} + {{- else if .hostPath }} + hostPath: + {{ toYaml .hostPath | nindent 12 }} + {{- else if .csi }} + csi: + {{- toYaml .csi | nindent 12 }} + {{- else if .configMap }} + configMap: + {{- toYaml .configMap | nindent 12 }} + {{- else if .emptyDir }} + emptyDir: + {{- toYaml .emptyDir | nindent 12 }} + {{- else }} + emptyDir: {} + {{- end }} + {{- end }} +--- +{{ if $pdb.enabled }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ $fullName }} + namespace: {{ .Release.Namespace | quote }} +spec: + maxUnavailable: 1 + selector: + matchLabels: + {{- include "impress.common.selectorLabels" (list . $component) | nindent 6 }} +{{ end }} +{{ end }} diff --git a/src/helm/impress/templates/yprovider_svc_converter.yaml b/src/helm/impress/templates/yprovider_svc_converter.yaml new file mode 100644 index 000000000..45cd1e7bf --- /dev/null +++ b/src/helm/impress/templates/yprovider_svc_converter.yaml @@ -0,0 +1,25 @@ +{{ if .Values.yProvider.converter.enabled -}} +{{- $yProvider := .Values.yProvider -}} +{{- $converter := .Values.yProvider.converter -}} +{{- $service := mergeOverwrite (dict) (default dict $yProvider.service) (default dict $converter.service) -}} +{{- $fullName := include "impress.yProvider.converter.fullname" . -}} +{{- $component := "yProvider-converter" -}} +apiVersion: v1 +kind: Service +metadata: + name: {{ $fullName }} + namespace: {{ .Release.Namespace | quote }} + labels: + {{- include "impress.common.labels" (list . $component) | nindent 4 }} + annotations: + {{- toYaml $service.annotations | nindent 4 }} +spec: + type: {{ $service.type }} + ports: + - port: {{ $service.port }} + targetPort: {{ $service.targetPort }} + protocol: TCP + name: http + selector: + {{- include "impress.common.selectorLabels" (list . $component) | nindent 4 }} +{{ end -}} diff --git a/src/helm/impress/values.yaml b/src/helm/impress/values.yaml index d218ad71d..a64084647 100644 --- a/src/helm/impress/values.yaml +++ b/src/helm/impress/values.yaml @@ -647,6 +647,77 @@ yProvider: pullPolicy: IfNotPresent tag: "latest" + converter: + ## @param yProvider.converter.enabled Enable the yProvider converter deployment and service + enabled: false + + ## @param yProvider.converter.replicas Amount of yProvider replicas + replicas: 3 + + ## @param yProvider.converter.resources Resource requirements for the yProvider container + resources: {} + + ## @param yProvider.converter.service.type yProvider converter Service type + ## @param yProvider.converter.service.port yProvider converter Service listening port + ## @param yProvider.converter.service.targetPort yProvider converter container listening port + ## @param yProvider.converter.service.annotations Annotations to add to the yProvider converter Service + service: {} + + ## @param yProvider.converter.command Override the yProvider converter container command + command: [] + + ## @param yProvider.converter.args Override the yProvider converter container args + args: [] + + ## @param yProvider.converter.shareProcessNamespace Enable share process namespace between containers + shareProcessNamespace: false + + ## @param yProvider.converter.sidecars Add sidecars containers to yProvider converter deployment + sidecars: [] + + ## @skip yProvider.converter.securityContext + securityContext: {} + + ## @skip yProvider.converter.envVars + envVars: {} + + ## @skip yProvider.converter.envFrom + envFrom: [] + + ## @param yProvider.converter.podAnnotations Annotations to add to the yProvider converter Pod + podAnnotations: {} + + ## @param yProvider.converter.dpAnnotations Annotations to add to the yProvider converter Deployment + dpAnnotations: {} + + ## @skip yProvider.converter.probes + probes: {} + + ## @param yProvider.converter.nodeSelector Node selector for the yProvider converter Pod + nodeSelector: {} + + ## @param yProvider.converter.tolerations Tolerations for the yProvider converter Pod + tolerations: [] + + ## @param yProvider.converter.affinity Affinity for the yProvider converter Pod + affinity: {} + + ## @param yProvider.converter.persistence Additional volumes to create and mount on the yProvider converter + persistence: {} + + ## @param yProvider.converter.extraVolumeMounts Additional volumes to mount on the yProvider converter + extraVolumeMounts: [] + + ## @param yProvider.converter.extraVolumes Additional volumes to mount on the yProvider converter + extraVolumes: [] + + ## @param yProvider.converter.pdb.enabled Enable pdb on yProvider converter + pdb: + enabled: true + + ## @param yProvider.converter.serviceAccountName Optional service account name to use for yProvider converter pods + serviceAccountName: null + ## @param yProvider.command Override the yProvider container command command: []