diff --git a/swh/templates/graphql/configmap.yaml b/swh/templates/graphql/configmap.yaml index 85795b9..75cdadf 100644 --- a/swh/templates/graphql/configmap.yaml +++ b/swh/templates/graphql/configmap.yaml @@ -1,18 +1,18 @@ {{ if .Values.graphql.enabled -}} --- apiVersion: v1 kind: ConfigMap metadata: name: graphql namespace: {{ .Values.namespace }} data: config.yml: | {{- range $backend, $backend_config := .Values.graphql.backends }} {{ $backend }}: cls: remote url: http://{{ get $backend_config "host" }}:{{ get $backend_config "port" }} {{- end }} debug: yes - server-type: wsgi + server-type: asgi {{ end }} diff --git a/swh/templates/graphql/deployment.yaml b/swh/templates/graphql/deployment.yaml index 4762f00..6249ca5 100644 --- a/swh/templates/graphql/deployment.yaml +++ b/swh/templates/graphql/deployment.yaml @@ -1,69 +1,83 @@ {{ if .Values.graphql.enabled -}} --- apiVersion: apps/v1 kind: Deployment metadata: name: graphql namespace: {{ .Values.namespace }} labels: app: graphql spec: revisionHistoryLimit: 2 replicas: {{ .Values.graphql.replicas }} selector: matchLabels: app: graphql strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 template: metadata: labels: app: graphql annotations: # Force a rollout upgrade if the configuration changes checksum/config: {{ include (print $.Template.BasePath "/graphql/configmap.yaml") . | sha256sum }} spec: containers: - name: graphql image: {{ .Values.swh_graphql_image }}:{{ .Values.swh_graphql_image_version }} imagePullPolicy: Always ports: - containerPort: 5013 + name: rpc + startupProbe: + httpGet: + path: / + port: rpc + failureThreshold: 30 + periodSeconds: 5 + livenessProbe: + httpGet: + path: / + port: rpc + initialDelaySeconds: 10 + periodSeconds: 5 env: - name: PORT value: "5013" - name: THREADS value: {{ .Values.graphql.gunicorn.threads | quote }} - name: WORKERS value: {{ .Values.graphql.gunicorn.workers | quote }} - name: LOG_LEVEL value: {{ .Values.graphql.logLevel | quote }} - name: TIMEOUT value: {{ .Values.graphql.gunicorn.timeout | quote }} {{ if .Values.graphql.sentry_enabled -}} - name: SWH_SENTRY_ENVIRONMENT value: {{ $.Values.sentry.environment }} - name: SWH_MAIN_PACKAGE value: swh.graphql - name: SWH_SENTRY_DSN valueFrom: secretKeyRef: name: graphql-sentry-secrets key: sentry-dsn - # 'name' secret must exist & include key "host" - optional: false + # 'name' secret should exist & include key "host" + # if the setting doesn't exist, sentry pushes will be disabled + optional: true {{ end }} volumeMounts: - name: config mountPath: /etc/swh/config.yml subPath: config.yml readOnly: true volumes: - name: config configMap: name: graphql defaultMode: 0444 {{ end }} diff --git a/swh/templates/listers/configmap.yaml b/swh/templates/listers/configmap.yaml index 6089526..973c26b 100644 --- a/swh/templates/listers/configmap.yaml +++ b/swh/templates/listers/configmap.yaml @@ -1,41 +1,42 @@ {{ if .Values.listers.enabled -}} {{- range $lister_type, $deployment_config := .Values.listers.deployments -}} {{- $lister_name := ( print "lister-" $lister_type ) -}} --- apiVersion: v1 kind: ConfigMap metadata: name: {{ $lister_name }}-template namespace: {{ $.Values.namespace }} data: config.yml.template: | storage: cls: remote url: http://{{ $.Values.listers.storage.host }}:{{ $.Values.listers.storage.port }}/ scheduler: cls: remote url: http://{{ $.Values.listers.scheduler.host }}:{{ $.Values.listers.scheduler.port }}/ celery: task_broker: ${host} + task_acks_late: true task_queues: {{- range $queue := get $deployment_config "queues" }} - {{ $queue }} {{- end }} credentials: init-container-entrypoint.sh: | #!/bin/bash set -e CONFIG_FILE=/etc/swh/config.yml # substitute environment variables when creating the default config.yml eval echo \""$( $CONFIG_FILE CREDS_LISTER_PATH=/etc/credentials/listers/credentials [ -f $CREDS_LISTER_PATH ] && \ sed 's/^/ /g' $CREDS_LISTER_PATH >> $CONFIG_FILE {{ end }} {{- end -}} diff --git a/swh/templates/listers/deployment.yaml b/swh/templates/listers/deployment.yaml index d5dc598..e565e90 100644 --- a/swh/templates/listers/deployment.yaml +++ b/swh/templates/listers/deployment.yaml @@ -1,120 +1,118 @@ {{ if .Values.listers.enabled -}} {{- $configurationChecksum := include (print $.Template.BasePath "/listers/configmap.yaml") . -}} {{- range $lister_type, $deployment_config := .Values.listers.deployments -}} {{- $lister_name := ( print "lister-" $lister_type ) -}} --- apiVersion: apps/v1 kind: Deployment metadata: name: {{ $lister_name }} namespace: {{ $.Values.namespace }} labels: app: {{ $lister_name }} spec: revisionHistoryLimit: 2 selector: matchLabels: app: {{ $lister_name }} strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 template: metadata: labels: app: {{ $lister_name }} annotations: # Force a rollout upgrade if the configuration changes checksum/config: {{ $configurationChecksum | sha256sum }} spec: {{- if $.Values.listers.affinity }} affinity: {{ toYaml $.Values.listers.affinity | nindent 8 }} {{- end }} initContainers: - name: prepare-configuration image: debian:bullseye imagePullPolicy: Always envFrom: - secretRef: # define the ${host) values for configuration "celery > task_broker: " key name: amqp-access-credentials command: - /entrypoint.sh volumeMounts: - name: configuration-template mountPath: /entrypoint.sh subPath: "init-container-entrypoint.sh" readOnly: true - name: configuration mountPath: /etc/swh - name: configuration-template mountPath: /etc/swh/configuration-template - name: lister-credentials-secrets mountPath: /etc/credentials/listers readOnly: true containers: - name: listers resources: requests: memory: {{ get $deployment_config "requestedMemory" | default "512Mi" }} cpu: {{ get $deployment_config "requestedCpu" | default "500m" }} limits: memory: "4000Mi" cpu: "1200m" image: {{ $.Values.swh_listers_image }}:{{ $.Values.swh_listers_image_version }} imagePullPolicy: Always command: - /bin/bash args: - -c - /opt/swh/entrypoint.sh lifecycle: preStop: exec: command: ["kill", "1"] env: - name: STATSD_HOST value: {{ $.Values.statsdExternalHost | default "prometheus-statsd-exporter" }} - name: STATSD_PORT value: {{ $.Values.statsdPort | default "9125" | quote }} - - name: CONCURRENCY - value: {{ get $deployment_config "concurrency" | default 1 | quote }} - name: MAX_TASKS_PER_CHILD value: {{ get $deployment_config "maxTasksPerChild" | default 1 | quote }} - name: LOGLEVEL value: {{ get $deployment_config "logLevel" | default "INFO" | quote }} - name: SWH_CONFIG_FILENAME value: /etc/swh/config.yml - name: SWH_SENTRY_ENVIRONMENT value: {{ $.Values.sentry.environment }} - name: SWH_MAIN_PACKAGE value: {{ $.Values.listers.sentrySwhPackage }} - name: SWH_SENTRY_DSN valueFrom: secretKeyRef: name: lister-sentry-secrets key: sentry-dsn # 'name' secret must exist & include key "host" optional: false volumeMounts: - name: configuration mountPath: /etc/swh volumes: - name: configuration emptyDir: {} - name: configuration-template configMap: name: {{ $lister_name }}-template defaultMode: 0777 items: - key: "config.yml.template" path: "config.yml.template" - key: "init-container-entrypoint.sh" path: "init-container-entrypoint.sh" - name: lister-credentials-secrets secret: secretName: lister-credentials-secrets optional: true {{ end }} {{- end -}} diff --git a/swh/templates/listers/keda-autoscaling.yaml b/swh/templates/listers/keda-autoscaling.yaml index 71a56ad..d00c521 100644 --- a/swh/templates/listers/keda-autoscaling.yaml +++ b/swh/templates/listers/keda-autoscaling.yaml @@ -1,83 +1,64 @@ {{ if .Values.listers.enabled -}} {{- range $lister_type, $deployment_config := .Values.listers.deployments -}} {{ if get $deployment_config "autoScaling" }} {{- $autoscalingConfig := get $deployment_config "autoScaling" -}} {{- $lister_name := ( print "lister-" $lister_type ) -}} --- apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: amqp-authentication-{{ $lister_name }} namespace: {{ $.Values.namespace }} spec: secretTargetRef: # Optional. - parameter: host name: amqp-access-credentials key: host --- apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: {{ $lister_name }}-operators namespace: {{ $.Values.namespace }} spec: scaleTargetRef: apiVersion: apps/v1 # Optional. Default: apps/v1 kind: Deployment # Optional. Default: Deployment # Mandatory. Must be in same namespace as ScaledObject name: {{ $lister_name }} # envSourceContainerName: {container-name} # Optional. Default: # .spec.template.spec.containers[0] pollingInterval: 30 # Optional. Default: 30 seconds - cooldownPeriod: 300 # Optional. Default: 300 seconds + cooldownPeriod: 3600 # Optional. Default: 300 seconds idleReplicaCount: 0 # Optional. Must be less than # minReplicaCount minReplicaCount: {{ get $autoscalingConfig "minReplicaCount" | default 0 }} maxReplicaCount: {{ get $autoscalingConfig "maxReplicaCount" | default 5 }} - fallback: # Optional. Section to specify fallback - # options - failureThreshold: 3 # Mandatory if fallback section is - # included - replicas: 6 # Mandatory if fallback section is - # included - advanced: # Optional. Section to specify advanced - # options - restoreToOriginalReplicaCount: false # Optional. Default: false - horizontalPodAutoscalerConfig: # Optional. Section to specify HPA - # related options - behavior: # Optional. Use to modify HPA's scaling - # behavior - scaleDown: - stabilizationWindowSeconds: 60 # default 300 - policies: - - type: Percent - value: 2 - periodSeconds: 15 triggers: {{- range $queue := get $deployment_config "queues" }} - type: rabbitmq authenticationRef: name: amqp-authentication-{{ $lister_name }} metadata: host: host # Optional. If not specified, it must be done # by using TriggerAuthentication. protocol: auto # Optional. Specifies protocol to use, # either amqp or http, or auto to # autodetect based on the `host` value. # Default value is auto. mode: QueueLength # QueueLength or MessageRate # message backlog or publish/sec. # target per instance value: {{ get $autoscalingConfig "queueThreshold" | default 100 | quote }} queueName: {{ $queue }} vhostName: / # Optional. If not specified, use the vhost in the # `host` connection string. Alternatively, you can # use existing environment variables to read # configuration from: See details in "Parameter # list" section hostFromEnv: RABBITMQ_HOST% {{- end }} {{ end }} {{ end }} {{- end -}} diff --git a/swh/templates/loaders/deployment.yaml b/swh/templates/loaders/deployment.yaml index 9417677..d275d5a 100644 --- a/swh/templates/loaders/deployment.yaml +++ b/swh/templates/loaders/deployment.yaml @@ -1,133 +1,135 @@ {{ if .Values.loaders.enabled -}} {{- $configurationChecksum := include (print $.Template.BasePath "/loaders/configmap.yaml") . -}} {{- range $loader_type, $deployment_config := .Values.loaders.deployments -}} {{- $loader_name := ( print "loader-" $loader_type ) -}} # if defined at the "typed" loader level {{- $local_container_image_key := get $deployment_config "image" }} {{- $local_container_image := get $.Values $local_container_image_key }} {{- $local_container_image_version_key := ( print $local_container_image_key "_version" ) }} {{- $local_container_image_version := get $.Values $local_container_image_version_key }} # otherwise if the global image is defined {{- $image_name_key := ( print "swh_loader_" $loader_type "_image" ) -}} {{- $image_version_key := ( print $image_name_key "_version" ) -}} {{- $container_image := get $.Values $image_name_key }} {{- $container_image_version := get $.Values $image_version_key }} --- apiVersion: apps/v1 kind: Deployment metadata: name: {{ $loader_name }} namespace: {{ $.Values.namespace }} labels: app: {{ $loader_name }} spec: revisionHistoryLimit: 2 selector: matchLabels: app: {{ $loader_name }} strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 template: metadata: labels: app: {{ $loader_name }} annotations: # Force a rollout upgrade if the configuration changes checksum/config: {{ $configurationChecksum | sha256sum }} spec: {{- if $.Values.loaders.affinity }} affinity: {{ toYaml $.Values.loaders.affinity | nindent 8 }} {{- end }} initContainers: - name: prepare-configuration image: debian:bullseye imagePullPolicy: Always envFrom: - secretRef: # define the ${host) values for configuration "celery > task_broker: " key name: amqp-access-credentials command: - /entrypoint.sh volumeMounts: - name: configuration-template mountPath: /entrypoint.sh subPath: "init-container-entrypoint.sh" readOnly: true - name: configuration mountPath: /etc/swh - name: configuration-template mountPath: /etc/swh/configuration-template - name: metadata-fetcher-credentials mountPath: /etc/credentials/metadata-fetcher readOnly: true containers: - name: loaders {{ if $local_container_image -}} image: {{ $local_container_image }}:{{ $local_container_image_version }} {{ else if $container_image -}} image: {{ $container_image }}:{{ $container_image_version }} {{ else -}} image: {{ $.Values.swh_loaders_image }}:{{ $.Values.swh_loaders_image_version }} {{ end }} imagePullPolicy: Always command: - /opt/swh/entrypoint.sh resources: requests: memory: {{ get $deployment_config "requestedMemory" | default "512Mi" }} cpu: {{ get $deployment_config "requestedCpu" | default "500m" }} limits: memory: "4000Mi" cpu: "1200m" lifecycle: preStop: exec: command: ["kill", "1"] env: - name: STATSD_HOST value: {{ $.Values.statsdExternalHost | default "prometheus-statsd-exporter" }} - name: STATSD_PORT value: {{ $.Values.statsdPort | default "9125" | quote }} - - name: CONCURRENCY - value: {{ get $deployment_config "concurrency" | default 1 | quote }} - name: MAX_TASKS_PER_CHILD value: {{ get $deployment_config "maxTasksPerChild" | default 5 | quote }} - name: LOGLEVEL value: {{ get $deployment_config "logLevel" | default "INFO" | quote }} - name: SWH_CONFIG_FILENAME value: /etc/swh/config.yml - name: SWH_SENTRY_ENVIRONMENT value: {{ $.Values.sentry.environment }} - name: SWH_MAIN_PACKAGE value: {{ get $deployment_config "sentrySwhPackage" }} - name: SWH_SENTRY_DSN valueFrom: secretKeyRef: name: {{ $loader_name }}-sentry-secrets key: sentry-dsn # 'name' secret must exist & include key "host" optional: false volumeMounts: - name: configuration mountPath: /etc/swh + - name: localstorage + mountPath: /tmp volumes: + - name: localstorage + emptyDir: {} - name: configuration emptyDir: {} - name: configuration-template configMap: name: {{ $loader_name }}-template defaultMode: 0777 items: - key: "config.yml.template" path: "config.yml.template" - key: "init-container-entrypoint.sh" path: "init-container-entrypoint.sh" - name: metadata-fetcher-credentials secret: secretName: metadata-fetcher-credentials optional: true {{ end }} {{- end -}} diff --git a/swh/templates/loaders/keda-autoscaling.yaml b/swh/templates/loaders/keda-autoscaling.yaml index bd34ac2..10e7d42 100644 --- a/swh/templates/loaders/keda-autoscaling.yaml +++ b/swh/templates/loaders/keda-autoscaling.yaml @@ -1,83 +1,64 @@ {{ if .Values.loaders.enabled -}} {{- range $loader_type, $deployment_config := .Values.loaders.deployments -}} {{ if get $deployment_config "autoScaling" }} {{- $autoscalingConfig := get $deployment_config "autoScaling" -}} {{- $loader_name := ( print "loader-" $loader_type ) -}} --- apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: amqp-authentication-{{ $loader_name }} namespace: {{ $.Values.namespace }} spec: secretTargetRef: # Optional. - parameter: host name: amqp-access-credentials key: host --- apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: {{ $loader_name }}-operators namespace: {{ $.Values.namespace }} spec: scaleTargetRef: apiVersion: apps/v1 # Optional. Default: apps/v1 kind: Deployment # Optional. Default: Deployment # Mandatory. Must be in same namespace as ScaledObject name: {{ $loader_name }} # envSourceContainerName: {container-name} # Optional. Default: # .spec.template.spec.containers[0] pollingInterval: 30 # Optional. Default: 30 seconds cooldownPeriod: 300 # Optional. Default: 300 seconds idleReplicaCount: 0 # Optional. Must be less than # minReplicaCount minReplicaCount: {{ get $autoscalingConfig "minReplicaCount" | default 0 }} maxReplicaCount: {{ get $autoscalingConfig "maxReplicaCount" | default 5 }} - fallback: # Optional. Section to specify fallback - # options - failureThreshold: 3 # Mandatory if fallback section is - # included - replicas: 6 # Mandatory if fallback section is - # included - advanced: # Optional. Section to specify advanced - # options - restoreToOriginalReplicaCount: false # Optional. Default: false - horizontalPodAutoscalerConfig: # Optional. Section to specify HPA - # related options - behavior: # Optional. Use to modify HPA's scaling - # behavior - scaleDown: - stabilizationWindowSeconds: 60 # default 300 - policies: - - type: Percent - value: 2 - periodSeconds: 15 triggers: {{- range $queue := get $deployment_config "queues" }} - type: rabbitmq authenticationRef: name: amqp-authentication-{{ $loader_name }} metadata: host: host # Optional. If not specified, it must be done # by using TriggerAuthentication. protocol: auto # Optional. Specifies protocol to use, # either amqp or http, or auto to # autodetect based on the `host` value. # Default value is auto. mode: QueueLength # QueueLength or MessageRate # message backlog or publish/sec. # target per instance value: {{ get $autoscalingConfig "queueThreshold" | default 100 | quote }} queueName: {{ $queue }} vhostName: / # Optional. If not specified, use the vhost in the # `host` connection string. Alternatively, you can # use existing environment variables to read # configuration from: See details in "Parameter # list" section hostFromEnv: RABBITMQ_HOST% {{- end }} {{ end }} {{ end }} {{- end -}} diff --git a/swh/values/staging.yaml b/swh/values/staging.yaml index 9b3aadd..a9dfcb3 100644 --- a/swh/values/staging.yaml +++ b/swh/values/staging.yaml @@ -1,166 +1,173 @@ sentry: environment: staging loaders: enabled: true storage: host: storage1.internal.staging.swh.network port: 5002 amqp: host: scheduler0.internal.staging.swh.network deployments: bzr: requestedMemory: 256Mi requestedCpu: 200m queues: - swh.loader.bzr.tasks.LoadBazaar autoScaling: queueThreshold: 10 maxReplicaCount: 1 sentrySwhPackage: swh.loader.bzr # cvs: # requestedMemory: 256Mi # requestedCpu: 200m # queues: # - swh.loader.cvs.tasks.LoadCvsRepository # autoScaling: # queueThreshold: 10 # maxReplicaCount: 3 # sentrySwhPackage: swh.loader.cvs # hg: # requestedMemory: 256Mi # requestedCpu: 200m # queues: # - swh.loader.mercurial.tasks.LoadArchiveMercurial # - swh.loader.mercurial.tasks.LoadMercurial # autoScaling: # queueThreshold: 10 # maxReplicaCount: 3 # sentrySwhPackage: swh.loader.mercurial highpriority: requestedMemory: 256Mi requestedCpu: 200m queues: - save_code_now:swh.loader.bzr.tasks.LoadBazaar - save_code_now:swh.loader.git.tasks.UpdateGitRepository - save_code_now:swh.loader.git.tasks.LoadDiskGitRepository - save_code_now:swh.loader.git.tasks.UncompressAndLoadDiskGitRepository - save_code_now:swh.loader.mercurial.tasks.LoadArchiveMercurial - save_code_now:swh.loader.mercurial.tasks.LoadMercurial - save_code_now:swh.loader.svn.tasks.LoadSvnRepository - save_code_now:swh.loader.svn.tasks.MountAndLoadSvnRepository - save_code_now:swh.loader.svn.tasks.DumpMountAndLoadSvnRepository - save_code_now:swh.loader.package.archive.tasks.LoadArchive autoScaling: queueThreshold: 10 maxReplicaCount: 3 sentrySwhPackage: swh.loader.highpriority git: requestedMemory: 256Mi requestedCpu: 200m queues: - swh.loader.git.tasks.UpdateGitRepository - swh.loader.git.tasks.LoadDiskGitRepository - swh.loader.git.tasks.UncompressAndLoadDiskGitRepository autoScaling: queueThreshold: 5 # spawn worker per increment of `value` messages maxReplicaCount: 3 sentrySwhPackage: swh.loader.git # maven: # requestedMemory: 256Mi # requestedCpu: 200m # image: swh_loader_package_image # queues: # - swh.loader.package.maven.tasks.LoadMaven # autoScaling: # queueThreshold: 10 # maxReplicaCount: 3 # sentrySwhPackage: swh.loader.core npm: requestedMemory: 256Mi requestedCpu: 200m image: swh_loader_package_image queues: - swh.loader.package.npm.tasks.LoadNpm autoScaling: queueThreshold: 10 maxReplicaCount: 1 sentrySwhPackage: swh.loader.core pypi: requestedMemory: 256Mi requestedCpu: 200m image: swh_loader_package_image queues: - swh.loader.package.pypi.tasks.LoadPyPI autoScaling: queueThreshold: 10 maxReplicaCount: 1 sentrySwhPackage: swh.loader.core pubdev: requestedMemory: 256Mi requestedCpu: 200m image: swh_loader_package_image queues: - swh.loader.package.pubdev.tasks.LoadPubDev autoScaling: queueThreshold: 10 maxReplicaCount: 1 sentrySwhPackage: swh.loader.core # svn: # requestedMemory: 256Mi # requestedCpu: 200m # queues: # - swh.loader.svn.tasks.LoadSvnRepository # - swh.loader.svn.tasks.MountAndLoadSvnRepository # - swh.loader.svn.tasks.DumpMountAndLoadSvnRepository # autoScaling: # queueThreshold: 10 # maxReplicaCount: 3 # sentrySwhPackage: swh.loader.svn listers: enabled: true sentrySwhPackage: swh.lister storage: host: storage1.internal.staging.swh.network port: 5002 scheduler: host: scheduler0.internal.staging.swh.network port: 5008 amqp: host: scheduler0.internal.staging.swh.network deployments: gnu-full: queues: - swh.lister.gnu.tasks.GNUListerTask autoScaling: queueThreshold: 10 maxReplicaCount: 1 pubdev: queues: - swh.lister.pubdev.tasks.PubDevListerTask autoScaling: queueThreshold: 10 maxReplicaCount: 1 + gogs-full: + logLevel: DEBUG + queues: + - swh.lister.gogs.tasks.FullGogsRelister + autoScaling: + queueThreshold: 10 + maxReplicaCount: 1 graphql: enabled: true sentry_enabled: true backends: storage: host: webapp.internal.staging.swh.network port: 5002 search: host: search0.internal.staging.swh.network port: 5010 replicas: 1 gunicorn: threads: 4 workers: 2 timeout: 3600 ingress: enabled: true httpPath: / host: graphql.staging.swh.network logLevel: DEBUG diff --git a/values-swh-application-versions.yaml b/values-swh-application-versions.yaml index 0ed2f57..48bb8dc 100644 --- a/values-swh-application-versions.yaml +++ b/values-swh-application-versions.yaml @@ -1,19 +1,19 @@ # This file references the last version of all the softwareheritage images # It's used to manage the automatic update of the environments swh_storage_replayer_image: softwareheritage/storage-replayer swh_storage_replayer_image_version: "20220819.1" swh_loaders_image: softwareheritage/loaders swh_loaders_image_version: "20220826.1" swh_loader_bzr_image: softwareheritage/loader_bzr swh_loader_bzr_image_version: "20220909.1" swh_loader_git_image: softwareheritage/loader_git swh_loader_git_image_version: "20220908.1" swh_loader_highpriority_image: softwareheritage/loader_highpriority swh_loader_highpriority_image_version: "20220908.1" swh_loader_package_image: softwareheritage/loader_package -swh_loader_package_image_version: "20220909.1" +swh_loader_package_image_version: "20220914.1" swh_graphql_image: softwareheritage/graphql -swh_graphql_image_version: "20220826.1" +swh_graphql_image_version: "20220913.2" swh_listers_image: softwareheritage/lister swh_listers_image_version: "20220908.1"