From ccb52c094d5b3a0f7acda0c1bac332aa78e28e4a Mon Sep 17 00:00:00 2001 From: Ida Novindasari Date: Tue, 20 May 2025 16:31:26 +0200 Subject: [PATCH 01/15] [UI] Remove deprecated WAL-E library and enable WAL-G backup support in UI backend (#2915) --- charts/postgres-operator-ui/values.yaml | 4 -- ui/manifests/deployment.yaml | 4 -- ui/operator_ui/main.py | 15 +---- ui/operator_ui/spiloutils.py | 78 ++++++++++++++++++------- ui/requirements.txt | 1 - 5 files changed, 57 insertions(+), 45 deletions(-) diff --git a/charts/postgres-operator-ui/values.yaml b/charts/postgres-operator-ui/values.yaml index da3c4baaf..9923ff023 100644 --- a/charts/postgres-operator-ui/values.yaml +++ b/charts/postgres-operator-ui/values.yaml @@ -62,8 +62,6 @@ podAnnotations: extraEnvs: [] # Exemple of settings to make snapshot view working in the ui when using AWS - # - name: WALE_S3_ENDPOINT - # value: https+path://s3.us-east-1.amazonaws.com:443 # - name: SPILO_S3_BACKUP_PREFIX # value: spilo/ # - name: AWS_ACCESS_KEY_ID @@ -83,8 +81,6 @@ extraEnvs: # key: AWS_DEFAULT_REGION # - name: SPILO_S3_BACKUP_BUCKET # value: - # - name: "USE_AWS_INSTANCE_PROFILE" - # value: "true" # configure UI service service: diff --git a/ui/manifests/deployment.yaml b/ui/manifests/deployment.yaml index e09dd1e4f..3b3097416 100644 --- a/ui/manifests/deployment.yaml +++ b/ui/manifests/deployment.yaml @@ -81,8 +81,6 @@ spec: ] } # Exemple of settings to make snapshot view working in the ui when using AWS - # - name: WALE_S3_ENDPOINT - # value: https+path://s3.us-east-1.amazonaws.com:443 # - name: SPILO_S3_BACKUP_PREFIX # value: spilo/ # - name: AWS_ACCESS_KEY_ID @@ -102,5 +100,3 @@ spec: # key: AWS_DEFAULT_REGION # - name: SPILO_S3_BACKUP_BUCKET # value: - # - name: "USE_AWS_INSTANCE_PROFILE" - # value: "true" diff --git a/ui/operator_ui/main.py b/ui/operator_ui/main.py index e02c2995c..bf28df6eb 100644 --- a/ui/operator_ui/main.py +++ b/ui/operator_ui/main.py @@ -95,14 +95,6 @@ DEFAULT_MEMORY_LIMIT = getenv('DEFAULT_MEMORY_LIMIT', '300Mi') DEFAULT_CPU = getenv('DEFAULT_CPU', '10m') DEFAULT_CPU_LIMIT = getenv('DEFAULT_CPU_LIMIT', '300m') -WALE_S3_ENDPOINT = getenv( - 'WALE_S3_ENDPOINT', - 'https+path://s3.eu-central-1.amazonaws.com:443', -) - -USE_AWS_INSTANCE_PROFILE = ( - getenv('USE_AWS_INSTANCE_PROFILE', 'false').lower() != 'false' -) AWS_ENDPOINT = getenv('AWS_ENDPOINT') @@ -784,8 +776,6 @@ def get_versions(pg_cluster: str): bucket=SPILO_S3_BACKUP_BUCKET, pg_cluster=pg_cluster, prefix=SPILO_S3_BACKUP_PREFIX, - s3_endpoint=WALE_S3_ENDPOINT, - use_aws_instance_profile=USE_AWS_INSTANCE_PROFILE, ), ) @@ -797,9 +787,8 @@ def get_basebackups(pg_cluster: str, uid: str): bucket=SPILO_S3_BACKUP_BUCKET, pg_cluster=pg_cluster, prefix=SPILO_S3_BACKUP_PREFIX, - s3_endpoint=WALE_S3_ENDPOINT, uid=uid, - use_aws_instance_profile=USE_AWS_INSTANCE_PROFILE, + postgresql_versions=OPERATOR_UI_CONFIG.get('postgresql_versions', DEFAULT_UI_CONFIG['postgresql_versions']), ), ) @@ -991,8 +980,6 @@ def main(port, debug, clusters: list): logger.info(f'Superuser team: {SUPERUSER_TEAM}') logger.info(f'Target namespace: {TARGET_NAMESPACE}') logger.info(f'Teamservice URL: {TEAM_SERVICE_URL}') - logger.info(f'Use AWS instance_profile: {USE_AWS_INSTANCE_PROFILE}') - logger.info(f'WAL-E S3 endpoint: {WALE_S3_ENDPOINT}') logger.info(f'AWS S3 endpoint: {AWS_ENDPOINT}') if TARGET_NAMESPACE is None: diff --git a/ui/operator_ui/spiloutils.py b/ui/operator_ui/spiloutils.py index f715430a1..6a2f03bb2 100644 --- a/ui/operator_ui/spiloutils.py +++ b/ui/operator_ui/spiloutils.py @@ -6,9 +6,8 @@ from os import environ, getenv from requests import Session from urllib.parse import urljoin from uuid import UUID -from wal_e.cmd import configure_backup_cxt -from .utils import Attrs, defaulting, these +from .utils import defaulting, these from operator_ui.adapters.logger import logger session = Session() @@ -284,10 +283,8 @@ def read_stored_clusters(bucket, prefix, delimiter='/'): def read_versions( pg_cluster, bucket, - s3_endpoint, prefix, delimiter='/', - use_aws_instance_profile=False, ): return [ 'base' if uid == 'wal' else uid @@ -305,35 +302,72 @@ def read_versions( if uid == 'wal' or defaulting(lambda: UUID(uid)) ] -BACKUP_VERSION_PREFIXES = ['', '10/', '11/', '12/', '13/', '14/', '15/', '16/', '17/'] +def lsn_to_wal_segment_stop(finish_lsn, start_segment, wal_segment_size=16 * 1024 * 1024): + timeline = int(start_segment[:8], 16) + log_id = finish_lsn >> 32 + seg_id = (finish_lsn & 0xFFFFFFFF) // wal_segment_size + return f"{timeline:08X}{log_id:08X}{seg_id:08X}" + +def lsn_to_offset_hex(lsn, wal_segment_size=16 * 1024 * 1024): + return f"{lsn % wal_segment_size:08X}" def read_basebackups( pg_cluster, uid, bucket, - s3_endpoint, prefix, - delimiter='/', - use_aws_instance_profile=False, + postgresql_versions, ): - environ['WALE_S3_ENDPOINT'] = s3_endpoint suffix = '' if uid == 'base' else '/' + uid backups = [] - for vp in BACKUP_VERSION_PREFIXES: + for vp in postgresql_versions: + backup_prefix = f'{prefix}{pg_cluster}{suffix}/wal/{vp}/basebackups_005/' + logger.info(f"{bucket}/{backup_prefix}") - backups = backups + [ - { - key: value - for key, value in basebackup.__dict__.items() - if isinstance(value, str) or isinstance(value, int) - } - for basebackup in Attrs.call( - f=configure_backup_cxt, - aws_instance_profile=use_aws_instance_profile, - s3_prefix=f's3://{bucket}/{prefix}{pg_cluster}{suffix}/wal/{vp}', - )._backup_list(detail=True) - ] + paginator = client('s3').get_paginator('list_objects_v2') + pages = paginator.paginate(Bucket=bucket, Prefix=backup_prefix) + + for page in pages: + for obj in page.get("Contents", []): + key = obj["Key"] + if not key.endswith("backup_stop_sentinel.json"): + continue + + response = client('s3').get_object(Bucket=bucket, Key=key) + backup_info = loads(response["Body"].read().decode("utf-8")) + last_modified = response["LastModified"].astimezone(timezone.utc).isoformat() + + backup_name = key.split("/")[-1].replace("_backup_stop_sentinel.json", "") + start_seg, start_offset = backup_name.split("_")[1], backup_name.split("_")[-1] if "_" in backup_name else None + + if "LSN" in backup_info and "FinishLSN" in backup_info: + # WAL-G + lsn = backup_info["LSN"] + finish_lsn = backup_info["FinishLSN"] + backups.append({ + "expanded_size_bytes": backup_info.get("UncompressedSize"), + "last_modified": last_modified, + "name": backup_name, + "wal_segment_backup_start": start_seg, + "wal_segment_backup_stop": lsn_to_wal_segment_stop(finish_lsn, start_seg), + "wal_segment_offset_backup_start": lsn_to_offset_hex(lsn), + "wal_segment_offset_backup_stop": lsn_to_offset_hex(finish_lsn), + }) + elif "wal_segment_backup_stop" in backup_info: + # WAL-E + stop_seg = backup_info["wal_segment_backup_stop"] + stop_offset = backup_info["wal_segment_offset_backup_stop"] + + backups.append({ + "expanded_size_bytes": backup_info.get("expanded_size_bytes"), + "last_modified": last_modified, + "name": backup_name, + "wal_segment_backup_start": start_seg, + "wal_segment_backup_stop": stop_seg, + "wal_segment_offset_backup_start": start_offset, + "wal_segment_offset_backup_stop": stop_offset, + }) return backups diff --git a/ui/requirements.txt b/ui/requirements.txt index d3318ceec..783c0aac3 100644 --- a/ui/requirements.txt +++ b/ui/requirements.txt @@ -11,5 +11,4 @@ kubernetes==11.0.0 python-json-logger==2.0.7 requests==2.32.2 stups-tokens>=1.1.19 -wal_e==1.1.1 werkzeug==3.0.6 From 51135b07db0fb81f5fe5e6f2eab1d4d894f64cd4 Mon Sep 17 00:00:00 2001 From: Mario Trangoni Date: Tue, 3 Jun 2025 17:34:05 +0200 Subject: [PATCH 02/15] docs: Fix issues found by codespell (#2896) Signed-off-by: Mario Trangoni Co-authored-by: Felix Kunde --- docs/administrator.md | 6 +++--- docs/reference/cluster_manifest.md | 4 ++-- docs/reference/operator_parameters.md | 8 ++++---- docs/user.md | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/administrator.md b/docs/administrator.md index d0dd9956c..f394b70ab 100644 --- a/docs/administrator.md +++ b/docs/administrator.md @@ -384,7 +384,7 @@ exceptions: The interval of days can be set with `password_rotation_interval` (default `90` = 90 days, minimum 1). On each rotation the user name and password values are replaced in the K8s secret. They belong to a newly created user named after -the original role plus rotation date in YYMMDD format. All priviliges are +the original role plus rotation date in YYMMDD format. All privileges are inherited meaning that migration scripts should still grant and revoke rights against the original role. The timestamp of the next rotation (in RFC 3339 format, UTC timezone) is written to the secret as well. Note, if the rotation @@ -564,7 +564,7 @@ manifest affinity. ``` If `node_readiness_label_merge` is set to `"OR"` (default) the readiness label -affinty will be appended with its own expressions block: +affinity will be appended with its own expressions block: ```yaml affinity: @@ -1140,7 +1140,7 @@ metadata: iam.gke.io/gcp-service-account: @.iam.gserviceaccount.com ``` -2. Specify the new custom service account in your [operator paramaters](./reference/operator_parameters.md) +2. Specify the new custom service account in your [operator parameters](./reference/operator_parameters.md) If using manual deployment or kustomize, this is done by setting `pod_service_account_name` in your configuration file specified in the diff --git a/docs/reference/cluster_manifest.md b/docs/reference/cluster_manifest.md index 19ea8d77b..ab0353202 100644 --- a/docs/reference/cluster_manifest.md +++ b/docs/reference/cluster_manifest.md @@ -247,7 +247,7 @@ These parameters are grouped directly under the `spec` key in the manifest. [kubernetes volumeSource](https://godoc.org/k8s.io/api/core/v1#VolumeSource). It allows you to mount existing PersistentVolumeClaims, ConfigMaps and Secrets inside the StatefulSet. Also an `emptyDir` volume can be shared between initContainer and statefulSet. - Additionaly, you can provide a `SubPath` for volume mount (a file in a configMap source volume, for example). + Additionally, you can provide a `SubPath` for volume mount (a file in a configMap source volume, for example). Set `isSubPathExpr` to true if you want to include [API environment variables](https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath-expanded-environment). You can also specify in which container the additional Volumes will be mounted with the `targetContainers` array option. If `targetContainers` is empty, additional volumes will be mounted only in the `postgres` container. @@ -257,7 +257,7 @@ These parameters are grouped directly under the `spec` key in the manifest. ## Prepared Databases The operator can create databases with default owner, reader and writer roles -without the need to specifiy them under `users` or `databases` sections. Those +without the need to specify them under `users` or `databases` sections. Those parameters are grouped under the `preparedDatabases` top-level key. For more information, see [user docs](../user.md#prepared-databases-with-roles-and-default-privileges). diff --git a/docs/reference/operator_parameters.md b/docs/reference/operator_parameters.md index 7a9cdc709..95bfb4cf3 100644 --- a/docs/reference/operator_parameters.md +++ b/docs/reference/operator_parameters.md @@ -209,7 +209,7 @@ under the `users` key. For all `LOGIN` roles that are not database owners the operator can rotate credentials in the corresponding K8s secrets by replacing the username and password. This means, new users will be added on each rotation inheriting - all priviliges from the original roles. The rotation date (in YYMMDD format) + all privileges from the original roles. The rotation date (in YYMMDD format) is appended to the names of the new user. The timestamp of the next rotation is written to the secret. The default is `false`. @@ -552,7 +552,7 @@ configuration they are grouped under the `kubernetes` key. pods with `InitialDelaySeconds: 6`, `PeriodSeconds: 10`, `TimeoutSeconds: 5`, `SuccessThreshold: 1` and `FailureThreshold: 3`. When enabling readiness probes it is recommended to switch the `pod_management_policy` to `parallel` - to avoid unneccesary waiting times in case of multiple instances failing. + to avoid unnecessary waiting times in case of multiple instances failing. The default is `false`. * **storage_resize_mode** @@ -701,7 +701,7 @@ In the CRD-based configuration they are grouped under the `load_balancer` key. replaced by the cluster name, `{namespace}` is replaced with the namespace and `{hostedzone}` is replaced with the hosted zone (the value of the `db_hosted_zone` parameter). The `{team}` placeholder can still be used, - although it is not recommened because the team of a cluster can change. + although it is not recommended because the team of a cluster can change. If the cluster name starts with the `teamId` it will also be part of the DNS, aynway. No other placeholders are allowed! @@ -720,7 +720,7 @@ In the CRD-based configuration they are grouped under the `load_balancer` key. is replaced by the cluster name, `{namespace}` is replaced with the namespace and `{hostedzone}` is replaced with the hosted zone (the value of the `db_hosted_zone` parameter). The `{team}` placeholder can still be used, - although it is not recommened because the team of a cluster can change. + although it is not recommended because the team of a cluster can change. If the cluster name starts with the `teamId` it will also be part of the DNS, aynway. No other placeholders are allowed! diff --git a/docs/user.md b/docs/user.md index c63e43f57..c1a7c7d45 100644 --- a/docs/user.md +++ b/docs/user.md @@ -900,7 +900,7 @@ the PostgreSQL version between source and target cluster has to be the same. To start a cluster as standby, add the following `standby` section in the YAML file. You can stream changes from archived WAL files (AWS S3 or Google Cloud -Storage) or from a remote primary. Only one option can be specfied in the +Storage) or from a remote primary. Only one option can be specified in the manifest: ```yaml @@ -911,7 +911,7 @@ spec: For GCS, you have to define STANDBY_GOOGLE_APPLICATION_CREDENTIALS as a [custom pod environment variable](administrator.md#custom-pod-environment-variables). -It is not set from the config to allow for overridding. +It is not set from the config to allow for overriding. ```yaml spec: @@ -1282,7 +1282,7 @@ minutes if the certificates have changed and reloads postgres accordingly. ### TLS certificates for connection pooler By default, the pgBouncer image generates its own TLS certificate like Spilo. -When the `tls` section is specfied in the manifest it will be used for the +When the `tls` section is specified in the manifest it will be used for the connection pooler pod(s) as well. The security context options are hard coded to `runAsUser: 100` and `runAsGroup: 101`. The `fsGroup` will be the same like for Spilo. From fa4bc21538ca0a6f071d4f2c30dba32747f99070 Mon Sep 17 00:00:00 2001 From: Jociele Padilha <45459238+jopadi@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:40:39 +0200 Subject: [PATCH 03/15] upgrade Go from 1.23.4 to 1.25.0 (#2945) * upgrade go to 1.25 * add minor version to be Go 1.25.0 * revert the Go version on README to keep the history of the release --- .github/workflows/publish_ghcr_image.yaml | 2 +- .github/workflows/run_e2e.yaml | 2 +- .github/workflows/run_tests.yaml | 2 +- Makefile | 4 +-- docker/DebugDockerfile | 2 +- docker/Dockerfile | 2 +- docker/build_operator.sh | 2 +- go.mod | 20 +++++++------ go.sum | 36 +++++++++++++---------- kubectl-pg/go.mod | 2 +- pkg/cluster/k8sres.go | 4 +-- pkg/cluster/majorversionupgrade.go | 2 +- pkg/cluster/sync.go | 2 +- pkg/cluster/util.go | 4 +-- pkg/cluster/volumes.go | 2 +- pkg/controller/postgresql.go | 2 +- pkg/controller/util.go | 2 +- 17 files changed, 49 insertions(+), 43 deletions(-) diff --git a/.github/workflows/publish_ghcr_image.yaml b/.github/workflows/publish_ghcr_image.yaml index d56ff2f17..ff1e86a65 100644 --- a/.github/workflows/publish_ghcr_image.yaml +++ b/.github/workflows/publish_ghcr_image.yaml @@ -23,7 +23,7 @@ jobs: - uses: actions/setup-go@v2 with: - go-version: "^1.23.4" + go-version: "^1.25.0" - name: Run unit tests run: make deps mocks test diff --git a/.github/workflows/run_e2e.yaml b/.github/workflows/run_e2e.yaml index 16573046e..ae5433b5a 100644 --- a/.github/workflows/run_e2e.yaml +++ b/.github/workflows/run_e2e.yaml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-go@v2 with: - go-version: "^1.23.4" + go-version: "^1.25.0" - name: Make dependencies run: make deps mocks - name: Code generation diff --git a/.github/workflows/run_tests.yaml b/.github/workflows/run_tests.yaml index db47f6e40..51061bbf6 100644 --- a/.github/workflows/run_tests.yaml +++ b/.github/workflows/run_tests.yaml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: - go-version: "^1.23.4" + go-version: "^1.25.0" - name: Make dependencies run: make deps mocks - name: Compile diff --git a/Makefile b/Makefile index 8fc4b36f6..350675db6 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ ifndef GOPATH endif PATH := $(GOPATH)/bin:$(PATH) -SHELL := env PATH=$(PATH) $(SHELL) +SHELL := env PATH="$(PATH)" $(SHELL) default: local @@ -69,7 +69,7 @@ docker: ${DOCKERDIR}/${DOCKERFILE} docker build --rm -t "$(IMAGE):$(TAG)$(CDP_TAG)$(DEBUG_FRESH)$(DEBUG_POSTFIX)" -f "${DOCKERDIR}/${DOCKERFILE}" --build-arg VERSION="${VERSION}" . indocker-race: - docker run --rm -v "${GOPATH}":"${GOPATH}" -e GOPATH="${GOPATH}" -e RACE=1 -w ${PWD} golang:1.23.4 bash -c "make linux" + docker run --rm -v "${GOPATH}":"${GOPATH}" -e GOPATH="${GOPATH}" -e RACE=1 -w ${PWD} golang:1.25.0 bash -c "make linux" push: docker push "$(IMAGE):$(TAG)$(CDP_TAG)" diff --git a/docker/DebugDockerfile b/docker/DebugDockerfile index 18cb631fe..c44002984 100644 --- a/docker/DebugDockerfile +++ b/docker/DebugDockerfile @@ -1,4 +1,4 @@ -FROM golang:1.23-alpine +FROM golang:1.25-alpine LABEL maintainer="Team ACID @ Zalando " # We need root certificates to deal with teams api over https diff --git a/docker/Dockerfile b/docker/Dockerfile index 1fd2020d8..e50380003 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ ARG BASE_IMAGE=registry.opensource.zalan.do/library/alpine-3:latest -FROM golang:1.23-alpine AS builder +FROM golang:1.25-alpine AS builder ARG VERSION=latest COPY . /go/src/github.com/zalando/postgres-operator diff --git a/docker/build_operator.sh b/docker/build_operator.sh index 6c1817b1b..53afb581b 100644 --- a/docker/build_operator.sh +++ b/docker/build_operator.sh @@ -13,7 +13,7 @@ apt-get install -y wget ( cd /tmp - wget -q "https://storage.googleapis.com/golang/go1.23.4.linux-${arch}.tar.gz" -O go.tar.gz + wget -q "https://storage.googleapis.com/golang/go1.25.0.linux-${arch}.tar.gz" -O go.tar.gz tar -xf go.tar.gz mv go /usr/local ln -s /usr/local/go/bin/go /usr/bin/go diff --git a/go.mod b/go.mod index 9c0125229..d047b2453 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/zalando/postgres-operator -go 1.23.4 +go 1.25.0 require ( github.com/aws/aws-sdk-go v1.53.8 @@ -11,7 +11,7 @@ require ( github.com/r3labs/diff v1.1.0 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 - golang.org/x/crypto v0.31.0 + golang.org/x/crypto v0.41.0 golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.30.4 @@ -21,6 +21,8 @@ require ( k8s.io/code-generator v0.25.9 ) +require golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect + require ( github.com/Masterminds/semver v1.5.0 github.com/davecgh/go-spew v1.1.1 // indirect @@ -51,15 +53,15 @@ require ( github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/term v0.27.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + golang.org/x/tools v0.36.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 0e55f2dd7..2d66aef46 100644 --- a/go.sum +++ b/go.sum @@ -119,31 +119,31 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o= golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -151,16 +151,16 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -169,8 +169,12 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= +golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/kubectl-pg/go.mod b/kubectl-pg/go.mod index 9b2e1bbc5..96a183fa9 100644 --- a/kubectl-pg/go.mod +++ b/kubectl-pg/go.mod @@ -1,6 +1,6 @@ module github.com/zalando/postgres-operator/kubectl-pg -go 1.23.4 +go 1.25 require ( github.com/spf13/cobra v1.8.1 diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index fedd6a917..4db23976c 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -171,7 +171,7 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e if isSmaller { msg = fmt.Sprintf("defined CPU limit %s for %q container is below required minimum %s and will be increased", cpuLimit.String(), constants.PostgresContainerName, minCPULimit) - c.logger.Warningf(msg) + c.logger.Warningf("%s", msg) c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) resources.Limits[v1.ResourceCPU], _ = resource.ParseQuantity(minCPULimit) } @@ -188,7 +188,7 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e if isSmaller { msg = fmt.Sprintf("defined memory limit %s for %q container is below required minimum %s and will be increased", memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) - c.logger.Warningf(msg) + c.logger.Warningf("%s", msg) c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) resources.Limits[v1.ResourceMemory], _ = resource.ParseQuantity(minMemoryLimit) } diff --git a/pkg/cluster/majorversionupgrade.go b/pkg/cluster/majorversionupgrade.go index d8a1fb917..675004982 100644 --- a/pkg/cluster/majorversionupgrade.go +++ b/pkg/cluster/majorversionupgrade.go @@ -277,7 +277,7 @@ func (c *Cluster) majorVersionUpgrade() error { isUpgradeSuccess = false c.annotatePostgresResource(isUpgradeSuccess) c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "Major Version Upgrade", "upgrade from %d to %d FAILED: %v", c.currentMajorVersion, desiredVersion, scriptErrMsg) - return fmt.Errorf(scriptErrMsg) + return fmt.Errorf("%s", scriptErrMsg) } c.annotatePostgresResource(isUpgradeSuccess) diff --git a/pkg/cluster/sync.go b/pkg/cluster/sync.go index 797e7a5aa..9067c8c46 100644 --- a/pkg/cluster/sync.go +++ b/pkg/cluster/sync.go @@ -1208,7 +1208,7 @@ func (c *Cluster) updateSecret( } if updateSecret { - c.logger.Infof(updateSecretMsg) + c.logger.Infof("%s", updateSecretMsg) if secret, err = c.KubeClient.Secrets(secret.Namespace).Update(context.TODO(), secret, metav1.UpdateOptions{}); err != nil { return fmt.Errorf("could not update secret %s: %v", secretName, err) } diff --git a/pkg/cluster/util.go b/pkg/cluster/util.go index 0e31ecc32..06a35f1b7 100644 --- a/pkg/cluster/util.go +++ b/pkg/cluster/util.go @@ -257,9 +257,9 @@ func (c *Cluster) getTeamMembers(teamID string) ([]string, error) { if teamID == "" { msg := "no teamId specified" if c.OpConfig.EnableTeamIdClusternamePrefix { - return nil, fmt.Errorf(msg) + return nil, fmt.Errorf("%s", msg) } - c.logger.Warnf(msg) + c.logger.Warnf("%s", msg) return nil, nil } diff --git a/pkg/cluster/volumes.go b/pkg/cluster/volumes.go index fee18beaf..7aa70a5d1 100644 --- a/pkg/cluster/volumes.go +++ b/pkg/cluster/volumes.go @@ -129,7 +129,7 @@ func (c *Cluster) syncUnderlyingEBSVolume() error { if len(errors) > 0 { for _, s := range errors { - c.logger.Warningf(s) + c.logger.Warningf("%s", s) } } return nil diff --git a/pkg/controller/postgresql.go b/pkg/controller/postgresql.go index 42d96278c..824a030f4 100644 --- a/pkg/controller/postgresql.go +++ b/pkg/controller/postgresql.go @@ -597,7 +597,7 @@ func (c *Controller) createPodServiceAccount(namespace string) error { _, err := c.KubeClient.ServiceAccounts(namespace).Get(context.TODO(), podServiceAccountName, metav1.GetOptions{}) if k8sutil.ResourceNotFound(err) { - c.logger.Infof(fmt.Sprintf("creating pod service account %q in the %q namespace", podServiceAccountName, namespace)) + c.logger.Infof("creating pod service account %q in the %q namespace", podServiceAccountName, namespace) // get a separate copy of service account // to prevent a race condition when setting a namespace for many clusters diff --git a/pkg/controller/util.go b/pkg/controller/util.go index 59e608ad0..df043dfd9 100644 --- a/pkg/controller/util.go +++ b/pkg/controller/util.go @@ -248,7 +248,7 @@ func (c *Controller) getInfrastructureRoles( } if len(errors) > 0 { - return uniqRoles, fmt.Errorf(strings.Join(errors, `', '`)) + return uniqRoles, fmt.Errorf("%s", strings.Join(errors, `', '`)) } return uniqRoles, nil From ad7e5909166d396cd41e6f842e9a7e86cadeebeb Mon Sep 17 00:00:00 2001 From: Morten Lied Johansen Date: Wed, 17 Sep 2025 15:57:36 +0200 Subject: [PATCH 04/15] Skip creation of OwnerReference if user is in a different namespace (#2912) Instead of doing a string compare on the username, check the actual namespace of the user to determine if an owner reference can be created. --- pkg/cluster/k8sres.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 4db23976c..65ca76357 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -1928,7 +1928,7 @@ func (c *Cluster) generateSingleUserSecret(pgUser spec.PgUser) *v1.Secret { // if secret lives in another namespace we cannot set ownerReferences var ownerReferences []metav1.OwnerReference - if c.Config.OpConfig.EnableCrossNamespaceSecret && strings.Contains(username, ".") { + if c.Config.OpConfig.EnableCrossNamespaceSecret && c.Postgresql.ObjectMeta.Namespace != pgUser.Namespace { ownerReferences = nil } else { ownerReferences = c.ownerReferences() From cce263319262e25167b1cdc56b092b849803e0fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 16:01:02 +0200 Subject: [PATCH 05/15] Bump requests from 2.32.2 to 2.32.4 in /ui (#2922) Bumps [requests](https://github.com/psf/requests) from 2.32.2 to 2.32.4. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.2...v2.32.4) --- updated-dependencies: - dependency-name: requests dependency-version: 2.32.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/requirements.txt b/ui/requirements.txt index 783c0aac3..75bcc1952 100644 --- a/ui/requirements.txt +++ b/ui/requirements.txt @@ -9,6 +9,6 @@ jq==1.7.0 json_delta>=2.0.2 kubernetes==11.0.0 python-json-logger==2.0.7 -requests==2.32.2 +requests==2.32.4 stups-tokens>=1.1.19 werkzeug==3.0.6 From d98fc2753aacab063e3b6fae79fe9a1a55c0dfb9 Mon Sep 17 00:00:00 2001 From: Alexander Gramovich <34745780+ggramal@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:01:28 +0300 Subject: [PATCH 06/15] logical-backup:gcs_upload: try to use gcp metadata if LOGICAL_GOOGLE_APPLICATION_CREDENTIALS is not set (#2837) Co-authored-by: Felix Kunde --- logical-backup/dump.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/logical-backup/dump.sh b/logical-backup/dump.sh index 25641c3b5..a250670a6 100755 --- a/logical-backup/dump.sh +++ b/logical-backup/dump.sh @@ -122,7 +122,21 @@ function aws_upload { function gcs_upload { PATH_TO_BACKUP=gs://$LOGICAL_BACKUP_S3_BUCKET"/"$LOGICAL_BACKUP_S3_BUCKET_PREFIX"/"$SCOPE$LOGICAL_BACKUP_S3_BUCKET_SCOPE_SUFFIX"/logical_backups/"$(date +%s).sql.gz - gsutil -o Credentials:gs_service_key_file=$LOGICAL_BACKUP_GOOGLE_APPLICATION_CREDENTIALS cp - "$PATH_TO_BACKUP" + #Set local LOGICAL_GOOGLE_APPLICATION_CREDENTIALS to nothing or + #value of LOGICAL_GOOGLE_APPLICATION_CREDENTIALS env var. Needed + #because `set -o nounset` is globally set + local LOGICAL_BACKUP_GOOGLE_APPLICATION_CREDENTIALS=${LOGICAL_BACKUP_GOOGLE_APPLICATION_CREDENTIALS:-} + + GSUTIL_OPTIONS=("-o" "Credentials:gs_service_key_file=$LOGICAL_BACKUP_GOOGLE_APPLICATION_CREDENTIALS") + + #If GOOGLE_APPLICATION_CREDENTIALS is not set try to get + #creds from metadata + if [[ -z $LOGICAL_BACKUP_GOOGLE_APPLICATION_CREDENTIALS ]] + then + GSUTIL_OPTIONS[1]="GoogleCompute:service_account=default" + fi + + gsutil ${GSUTIL_OPTIONS[@]} cp - "$PATH_TO_BACKUP" } function upload { From bcd729b2ccbac7abdea923f77b29ae4c32df4fcd Mon Sep 17 00:00:00 2001 From: Polina Bungina <27892524+hughcapet@users.noreply.github.com> Date: Fri, 19 Sep 2025 14:44:17 +0200 Subject: [PATCH 07/15] Add selector to master service when switching to CM (#2955) Add service selector comparison to compareServices This is necessary for the proper switch of `kubernetes_use_configmaps` configuration value, as master service should have different label selector setup for those. --- pkg/cluster/cluster.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index e9a691faa..f1d9ce164 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -841,6 +841,10 @@ func (c *Cluster) compareServices(old, new *v1.Service) (bool, string) { return false, "new service's owner references do not match the current ones" } + if !reflect.DeepEqual(old.Spec.Selector, new.Spec.Selector) { + return false, "new service's selector does not match the current one" + } + return true, "" } From dc294259692319a229e7677c16f88d3248124e08 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Tue, 23 Sep 2025 14:30:06 +0200 Subject: [PATCH 08/15] include external traffic policy comparison into service diffing (#2956) --- pkg/cluster/cluster.go | 4 ++ pkg/cluster/cluster_test.go | 77 ++++++++++++++++++++++++++++++------- 2 files changed, 67 insertions(+), 14 deletions(-) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index f1d9ce164..b06386f39 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -845,6 +845,10 @@ func (c *Cluster) compareServices(old, new *v1.Service) (bool, string) { return false, "new service's selector does not match the current one" } + if old.Spec.ExternalTrafficPolicy != new.Spec.ExternalTrafficPolicy { + return false, "new service's ExternalTrafficPolicy does not match the current one" + } + return true, "" } diff --git a/pkg/cluster/cluster_test.go b/pkg/cluster/cluster_test.go index 09d9df972..25f61db98 100644 --- a/pkg/cluster/cluster_test.go +++ b/pkg/cluster/cluster_test.go @@ -1341,14 +1341,21 @@ func TestCompareEnv(t *testing.T) { } } -func newService(ann map[string]string, svcT v1.ServiceType, lbSr []string) *v1.Service { +func newService( + annotations map[string]string, + svcType v1.ServiceType, + sourceRanges []string, + selector map[string]string, + policy v1.ServiceExternalTrafficPolicyType) *v1.Service { svc := &v1.Service{ Spec: v1.ServiceSpec{ - Type: svcT, - LoadBalancerSourceRanges: lbSr, + Selector: selector, + Type: svcType, + LoadBalancerSourceRanges: sourceRanges, + ExternalTrafficPolicy: policy, }, } - svc.Annotations = ann + svc.Annotations = annotations return svc } @@ -1365,13 +1372,18 @@ func TestCompareServices(t *testing.T) { }, } + defaultPolicy := v1.ServiceExternalTrafficPolicyTypeCluster + serviceWithOwnerReference := newService( map[string]string{ constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeClusterIP, - []string{"128.141.0.0/16", "137.138.0.0/16"}) + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, + defaultPolicy, + ) ownerRef := metav1.OwnerReference{ APIVersion: "acid.zalan.do/v1", @@ -1397,14 +1409,16 @@ func TestCompareServices(t *testing.T) { constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeClusterIP, - []string{"128.141.0.0/16", "137.138.0.0/16"}), + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, defaultPolicy), new: newService( map[string]string{ constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeClusterIP, - []string{"128.141.0.0/16", "137.138.0.0/16"}), + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, defaultPolicy), match: true, }, { @@ -1415,14 +1429,16 @@ func TestCompareServices(t *testing.T) { constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeClusterIP, - []string{"128.141.0.0/16", "137.138.0.0/16"}), + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, defaultPolicy), new: newService( map[string]string{ constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeLoadBalancer, - []string{"128.141.0.0/16", "137.138.0.0/16"}), + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, defaultPolicy), match: false, reason: `new service's type "LoadBalancer" does not match the current one "ClusterIP"`, }, @@ -1434,14 +1450,16 @@ func TestCompareServices(t *testing.T) { constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeLoadBalancer, - []string{"128.141.0.0/16", "137.138.0.0/16"}), + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, defaultPolicy), new: newService( map[string]string{ constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeLoadBalancer, - []string{"185.249.56.0/22"}), + []string{"185.249.56.0/22"}, + nil, defaultPolicy), match: false, reason: `new service's LoadBalancerSourceRange does not match the current one`, }, @@ -1453,14 +1471,16 @@ func TestCompareServices(t *testing.T) { constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeLoadBalancer, - []string{"128.141.0.0/16", "137.138.0.0/16"}), + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, defaultPolicy), new: newService( map[string]string{ constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeLoadBalancer, - []string{}), + []string{}, + nil, defaultPolicy), match: false, reason: `new service's LoadBalancerSourceRange does not match the current one`, }, @@ -1472,10 +1492,39 @@ func TestCompareServices(t *testing.T) { constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, }, v1.ServiceTypeClusterIP, - []string{"128.141.0.0/16", "137.138.0.0/16"}), + []string{"128.141.0.0/16", "137.138.0.0/16"}, + nil, defaultPolicy), new: serviceWithOwnerReference, match: false, }, + { + about: "new service has a label selector", + current: newService( + map[string]string{}, + v1.ServiceTypeClusterIP, + []string{}, + nil, defaultPolicy), + new: newService( + map[string]string{}, + v1.ServiceTypeClusterIP, + []string{}, + map[string]string{"cluster-name": "clstr", "spilo-role": "master"}, defaultPolicy), + match: false, + }, + { + about: "services differ on external traffic policy", + current: newService( + map[string]string{}, + v1.ServiceTypeClusterIP, + []string{}, + nil, defaultPolicy), + new: newService( + map[string]string{}, + v1.ServiceTypeClusterIP, + []string{}, + nil, v1.ServiceExternalTrafficPolicyTypeLocal), + match: false, + }, } for _, tt := range tests { From 8ba57b28f5775895a6d710ada3931cf3defd7bc8 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Tue, 14 Oct 2025 10:59:43 +0200 Subject: [PATCH 09/15] extend RBAC in prepatation to switch to configmap-based cluster management (#2961) --- docs/reference/operator_parameters.md | 9 +++++-- manifests/operator-service-account-rbac.yaml | 27 +++++++++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/docs/reference/operator_parameters.md b/docs/reference/operator_parameters.md index 95bfb4cf3..7e7cbeaf0 100644 --- a/docs/reference/operator_parameters.md +++ b/docs/reference/operator_parameters.md @@ -107,8 +107,13 @@ Those are top-level keys, containing both leaf keys and groups. * **kubernetes_use_configmaps** Select if setup uses endpoints (default), or configmaps to manage leader when DCS is kubernetes (not etcd or similar). In OpenShift it is not possible to - use endpoints option, and configmaps is required. By default, - `kubernetes_use_configmaps: false`, meaning endpoints will be used. + use endpoints option, and configmaps is required. Starting with K8s 1.33, + endpoints are marked as deprecated. It's recommended to switch to config maps + instead. But, to do so make sure you scale the Postgres cluster down to just + one primary pod (e.g. using `max_instances` option). Otherwise, you risk + running into a split-brain scenario. + By default, `kubernetes_use_configmaps: false`, meaning endpoints will be used. + Starting from v1.16.0 the default will be changed to `true`. * **docker_image** Spilo Docker image for Postgres instances. For production, don't rely on the diff --git a/manifests/operator-service-account-rbac.yaml b/manifests/operator-service-account-rbac.yaml index bf27f99f1..2cc1edcd1 100644 --- a/manifests/operator-service-account-rbac.yaml +++ b/manifests/operator-service-account-rbac.yaml @@ -59,13 +59,20 @@ rules: - get - patch - update -# to read configuration from ConfigMaps +# to read configuration from ConfigMaps and help Patroni manage the cluster if endpoints are not used - apiGroups: - "" resources: - configmaps verbs: + - create + - delete + - deletecollection - get + - list + - patch + - update + - watch # to send events to the CRs - apiGroups: - "" @@ -78,7 +85,7 @@ rules: - patch - update - watch -# to manage endpoints which are also used by Patroni +# to manage endpoints which are also used by Patroni (if it is using config maps) - apiGroups: - "" resources: @@ -249,7 +256,21 @@ kind: ClusterRole metadata: name: postgres-pod rules: -# Patroni needs to watch and manage endpoints +# Patroni needs to watch and manage config maps (or endpoints) +- apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +# Patroni needs to watch and manage endpoints (or config maps) - apiGroups: - "" resources: From eddf521227ffbb7a0661a4bebfad4bf7fe25423f Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Tue, 14 Oct 2025 17:59:48 +0800 Subject: [PATCH 10/15] Replace `golang.org/x/exp` with stdlib (#2857) * Replace `golang.org/x/exp` with stdlib These experimental packages are now available in the Go standard library since Go 1.21. 1. golang.org/x/exp/slices -> slices [1] 2. golang.org/x/exp/maps -> maps [2] [1]: https://go.dev/doc/go1.21#slices [2]: https://go.dev/doc/go1.21#maps Signed-off-by: Eng Zer Jun * Run go mod tidy Signed-off-by: Eng Zer Jun --------- Signed-off-by: Eng Zer Jun Co-authored-by: Felix Kunde --- go.mod | 6 ++---- go.sum | 2 -- pkg/cluster/k8sres.go | 9 ++++----- pkg/cluster/pod.go | 3 +-- pkg/cluster/sync.go | 4 ++-- pkg/cluster/sync_test.go | 5 ++--- 6 files changed, 11 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index d047b2453..150074cf8 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/zalando/postgres-operator go 1.25.0 require ( + github.com/Masterminds/semver v1.5.0 github.com/aws/aws-sdk-go v1.53.8 github.com/golang/mock v1.6.0 github.com/lib/pq v1.10.9 @@ -12,7 +13,6 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 golang.org/x/crypto v0.41.0 - golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.30.4 k8s.io/apiextensions-apiserver v0.25.9 @@ -21,10 +21,7 @@ require ( k8s.io/code-generator v0.25.9 ) -require golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect - require ( - github.com/Masterminds/semver v1.5.0 github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect @@ -62,6 +59,7 @@ require ( golang.org/x/text v0.28.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.36.0 // indirect + golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 2d66aef46..cab88ce55 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o= -golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 65ca76357..93d992c4b 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -4,7 +4,9 @@ import ( "context" "encoding/json" "fmt" + "maps" "path" + "slices" "sort" "strings" @@ -12,19 +14,16 @@ import ( "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" + batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" policyv1 "k8s.io/api/policy/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" - "golang.org/x/exp/maps" - "golang.org/x/exp/slices" - batchv1 "k8s.io/api/batch/v1" - "k8s.io/apimachinery/pkg/labels" - acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" "github.com/zalando/postgres-operator/pkg/spec" "github.com/zalando/postgres-operator/pkg/util" diff --git a/pkg/cluster/pod.go b/pkg/cluster/pod.go index 7fc95090e..b28e03078 100644 --- a/pkg/cluster/pod.go +++ b/pkg/cluster/pod.go @@ -3,12 +3,11 @@ package cluster import ( "context" "fmt" + "slices" "sort" "strconv" "time" - "golang.org/x/exp/slices" - appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/pkg/cluster/sync.go b/pkg/cluster/sync.go index 9067c8c46..c632e598c 100644 --- a/pkg/cluster/sync.go +++ b/pkg/cluster/sync.go @@ -4,8 +4,10 @@ import ( "context" "encoding/json" "fmt" + "maps" "reflect" "regexp" + "slices" "strconv" "strings" "time" @@ -15,8 +17,6 @@ import ( "github.com/zalando/postgres-operator/pkg/util" "github.com/zalando/postgres-operator/pkg/util/constants" "github.com/zalando/postgres-operator/pkg/util/k8sutil" - "golang.org/x/exp/maps" - "golang.org/x/exp/slices" batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" policyv1 "k8s.io/api/policy/v1" diff --git a/pkg/cluster/sync_test.go b/pkg/cluster/sync_test.go index f9d1d7873..e670daa70 100644 --- a/pkg/cluster/sync_test.go +++ b/pkg/cluster/sync_test.go @@ -2,15 +2,14 @@ package cluster import ( "bytes" + "context" "fmt" "io" "net/http" + "slices" "testing" "time" - "context" - - "golang.org/x/exp/slices" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" From 3a85466cfdc02328e03dff81c49343f9d3bb5dbf Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Tue, 14 Oct 2025 07:49:06 -0400 Subject: [PATCH 11/15] DOC: Fix formatting of bullet points (#2948) Co-authored-by: Felix Kunde --- docs/administrator.md | 3 +++ docs/developer.md | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/administrator.md b/docs/administrator.md index f394b70ab..f28bd93f0 100644 --- a/docs/administrator.md +++ b/docs/administrator.md @@ -195,12 +195,14 @@ from numerous escape characters in the latter log entry, view it in CLI with used internally in K8s. The StatefulSet is replaced if the following properties change: + - annotations - volumeClaimTemplates - template volumes The StatefulSet is replaced and a rolling updates is triggered if the following properties differ between the old and new state: + - container name, ports, image, resources, env, envFrom, securityContext and volumeMounts - template labels, annotations, service account, securityContext, affinity, priority class and termination grace period @@ -898,6 +900,7 @@ services: There are multiple options to specify service annotations that will be merged with each other and override in the following order (where latter take precedence): + 1. Default annotations if LoadBalancer is enabled 2. Globally configured `custom_service_annotations` 3. `serviceAnnotations` specified in the cluster manifest diff --git a/docs/developer.md b/docs/developer.md index c006aded0..0429f951c 100644 --- a/docs/developer.md +++ b/docs/developer.md @@ -16,7 +16,7 @@ under the ~/go/src sub directories. Given the schema above, the Postgres Operator source code located at `github.com/zalando/postgres-operator` should be put at --`~/go/src/github.com/zalando/postgres-operator`. +`~/go/src/github.com/zalando/postgres-operator`. ```bash export GOPATH=~/go @@ -105,6 +105,7 @@ and K8s-like APIs for its custom resource definitions, namely the Postgres CRD and the operator CRD. The usage of the code generation follows conventions from the K8s community. Relevant scripts live in the `hack` directory: + * `update-codegen.sh` triggers code generation for the APIs defined in `pkg/apis/acid.zalan.do/`, * `verify-codegen.sh` checks if the generated code is up-to-date (to be used within CI). @@ -112,6 +113,7 @@ The `/pkg/generated/` contains the resultant code. To make these scripts work, you may need to `export GOPATH=$(go env GOPATH)` References for code generation are: + * [Relevant pull request](https://github.com/zalando/postgres-operator/pull/369) See comments there for minor issues that can sometimes broke the generation process. * [Code generator source code](https://github.com/kubernetes/code-generator) @@ -315,6 +317,7 @@ precedence. Update the following Go files that obtain the configuration parameter from the manifest files: + * [operator_configuration_type.go](https://github.com/zalando/postgres-operator/blob/master/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go) * [operator_config.go](https://github.com/zalando/postgres-operator/blob/master/pkg/controller/operator_config.go) * [config.go](https://github.com/zalando/postgres-operator/blob/master/pkg/util/config/config.go) @@ -323,6 +326,7 @@ Postgres manifest parameters are defined in the [api package](https://github.com The operator behavior has to be implemented at least in [k8sres.go](https://github.com/zalando/postgres-operator/blob/master/pkg/cluster/k8sres.go). Validation of CRD parameters is controlled in [crds.go](https://github.com/zalando/postgres-operator/blob/master/pkg/apis/acid.zalan.do/v1/crds.go). Please, reflect your changes in tests, for example in: + * [config_test.go](https://github.com/zalando/postgres-operator/blob/master/pkg/util/config/config_test.go) * [k8sres_test.go](https://github.com/zalando/postgres-operator/blob/master/pkg/cluster/k8sres_test.go) * [util_test.go](https://github.com/zalando/postgres-operator/blob/master/pkg/apis/acid.zalan.do/v1/util_test.go) @@ -330,6 +334,7 @@ Please, reflect your changes in tests, for example in: ### Updating manifest files For the CRD-based configuration, please update the following files: + * the default [OperatorConfiguration](https://github.com/zalando/postgres-operator/blob/master/manifests/postgresql-operator-default-configuration.yaml) * the CRD's [validation](https://github.com/zalando/postgres-operator/blob/master/manifests/operatorconfiguration.crd.yaml) * the CRD's validation in the [Helm chart](https://github.com/zalando/postgres-operator/blob/master/charts/postgres-operator/crds/operatorconfigurations.yaml) @@ -342,6 +347,7 @@ Last but no least, update the [ConfigMap](https://github.com/zalando/postgres-op Finally, add a section for each new configuration option and/or cluster manifest parameter in the reference documents: + * [config reference](reference/operator_parameters.md) * [manifest reference](reference/cluster_manifest.md) From 8c2a290a121d3a2e072ed04503ef1fa25e7c340d Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Tue, 14 Oct 2025 07:50:11 -0400 Subject: [PATCH 12/15] DOC: Minikube has many drivers now, incl. Docker (#2949) Co-authored-by: Felix Kunde --- docs/quickstart.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 2d6742354..fa16d1813 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -10,7 +10,7 @@ hence set it up first. For local tests we recommend to use one of the following solutions: * [minikube](https://github.com/kubernetes/minikube/releases), which creates a - single-node K8s cluster inside a VM (requires KVM or VirtualBox), + K8s cluster inside a container or VM (requires Docker, KVM, Hyper-V, HyperKit, VirtualBox, or similar), * [kind](https://kind.sigs.k8s.io/) and [k3d](https://k3d.io), which allows creating multi-nodes K8s clusters running on Docker (requires Docker) @@ -20,7 +20,7 @@ This quickstart assumes that you have started minikube or created a local kind cluster. Note that you can also use built-in K8s support in the Docker Desktop for Mac to follow the steps of this tutorial. You would have to replace `minikube start` and `minikube delete` with your launch actions for the Docker -built-in K8s support. +Desktop built-in K8s support. ## Configuration Options From 3bc244fe397ad084de8ddc3e02a1670f6b4c0949 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Thu, 16 Oct 2025 10:23:36 +0200 Subject: [PATCH 13/15] bump dependencies and reflect linter suggestions (#2963) --- .github/workflows/publish_ghcr_image.yaml | 2 +- .github/workflows/run_e2e.yaml | 2 +- .github/workflows/run_tests.yaml | 2 +- CODEOWNERS | 2 +- MAINTAINERS | 1 - Makefile | 4 +- README.md | 2 +- .../crds/operatorconfigurations.yaml | 2 +- charts/postgres-operator/values.yaml | 2 +- docker/build_operator.sh | 2 +- e2e/tests/test_e2e.py | 2 +- go.mod | 76 ++++---- go.sum | 171 +++++++++--------- kubectl-pg/go.mod | 2 +- kubectl-pg/go.sum | 4 +- manifests/complete-postgres-manifest.yaml | 2 +- manifests/configmap.yaml | 2 +- manifests/operatorconfiguration.crd.yaml | 2 +- ...gresql-operator-default-configuration.yaml | 2 +- pkg/cluster/cluster.go | 2 +- pkg/cluster/k8sres.go | 16 +- pkg/cluster/majorversionupgrade.go | 2 +- pkg/cluster/pod.go | 5 +- pkg/cluster/resources.go | 4 +- pkg/cluster/sync.go | 7 +- pkg/controller/operator_config.go | 2 +- pkg/util/config/config.go | 2 +- 27 files changed, 165 insertions(+), 159 deletions(-) diff --git a/.github/workflows/publish_ghcr_image.yaml b/.github/workflows/publish_ghcr_image.yaml index ff1e86a65..78815783a 100644 --- a/.github/workflows/publish_ghcr_image.yaml +++ b/.github/workflows/publish_ghcr_image.yaml @@ -23,7 +23,7 @@ jobs: - uses: actions/setup-go@v2 with: - go-version: "^1.25.0" + go-version: "^1.25.3" - name: Run unit tests run: make deps mocks test diff --git a/.github/workflows/run_e2e.yaml b/.github/workflows/run_e2e.yaml index ae5433b5a..86f861ec5 100644 --- a/.github/workflows/run_e2e.yaml +++ b/.github/workflows/run_e2e.yaml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-go@v2 with: - go-version: "^1.25.0" + go-version: "^1.25.3" - name: Make dependencies run: make deps mocks - name: Code generation diff --git a/.github/workflows/run_tests.yaml b/.github/workflows/run_tests.yaml index 51061bbf6..ec3e5eaf6 100644 --- a/.github/workflows/run_tests.yaml +++ b/.github/workflows/run_tests.yaml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: - go-version: "^1.25.0" + go-version: "^1.25.3" - name: Make dependencies run: make deps mocks - name: Compile diff --git a/CODEOWNERS b/CODEOWNERS index ca6f43a72..daca96b42 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,2 @@ # global owners -* @sdudoladov @Jan-M @FxKu @jopadi @idanovinda @hughcapet @macedigital +* @sdudoladov @Jan-M @FxKu @jopadi @idanovinda @hughcapet diff --git a/MAINTAINERS b/MAINTAINERS index cc07af957..7c4aa6675 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4,4 +4,3 @@ Jan Mussler Jociele Padilha Ida Novindasari Polina Bungina -Matthias Adler diff --git a/Makefile b/Makefile index 350675db6..50d070b9d 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ docker: ${DOCKERDIR}/${DOCKERFILE} docker build --rm -t "$(IMAGE):$(TAG)$(CDP_TAG)$(DEBUG_FRESH)$(DEBUG_POSTFIX)" -f "${DOCKERDIR}/${DOCKERFILE}" --build-arg VERSION="${VERSION}" . indocker-race: - docker run --rm -v "${GOPATH}":"${GOPATH}" -e GOPATH="${GOPATH}" -e RACE=1 -w ${PWD} golang:1.25.0 bash -c "make linux" + docker run --rm -v "${GOPATH}":"${GOPATH}" -e GOPATH="${GOPATH}" -e RACE=1 -w ${PWD} golang:1.25.3 bash -c "make linux" push: docker push "$(IMAGE):$(TAG)$(CDP_TAG)" @@ -78,7 +78,7 @@ mocks: GO111MODULE=on go generate ./... tools: - GO111MODULE=on go get k8s.io/client-go@kubernetes-1.30.4 + GO111MODULE=on go get k8s.io/client-go@kubernetes-1.32.9 GO111MODULE=on go install github.com/golang/mock/mockgen@v1.6.0 GO111MODULE=on go mod tidy diff --git a/README.md b/README.md index 9493115de..fdf2518ba 100644 --- a/README.md +++ b/README.md @@ -57,12 +57,12 @@ production for over five years. | Release | Postgres versions | K8s versions | Golang | | :-------- | :---------------: | :---------------: | :-----: | +| v1.15.0 | 13 → 17 | 1.27+ | 1.25.3 | | v1.14.0 | 13 → 17 | 1.27+ | 1.23.4 | | v1.13.0 | 12 → 16 | 1.27+ | 1.22.5 | | v1.12.0 | 11 → 16 | 1.27+ | 1.22.3 | | v1.11.0 | 11 → 16 | 1.27+ | 1.21.7 | | v1.10.1 | 10 → 15 | 1.21+ | 1.19.8 | -| v1.9.0 | 10 → 15 | 1.21+ | 1.18.9 | ## Getting started diff --git a/charts/postgres-operator/crds/operatorconfigurations.yaml b/charts/postgres-operator/crds/operatorconfigurations.yaml index 058769acf..c6da405a5 100644 --- a/charts/postgres-operator/crds/operatorconfigurations.yaml +++ b/charts/postgres-operator/crds/operatorconfigurations.yaml @@ -68,7 +68,7 @@ spec: type: string docker_image: type: string - default: "ghcr.io/zalando/spilo-17:4.0-p2" + default: "ghcr.io/zalando/spilo-17:4.0-p3" enable_crd_registration: type: boolean default: true diff --git a/charts/postgres-operator/values.yaml b/charts/postgres-operator/values.yaml index bf94b63d0..f45275a4c 100644 --- a/charts/postgres-operator/values.yaml +++ b/charts/postgres-operator/values.yaml @@ -38,7 +38,7 @@ configGeneral: # etcd connection string for Patroni. Empty uses K8s-native DCS. etcd_host: "" # Spilo docker image - docker_image: ghcr.io/zalando/spilo-17:4.0-p2 + docker_image: ghcr.io/zalando/spilo-17:4.0-p3 # key name for annotation to ignore globally configured instance limits # ignore_instance_limits_annotation_key: "" diff --git a/docker/build_operator.sh b/docker/build_operator.sh index 53afb581b..5abe56666 100644 --- a/docker/build_operator.sh +++ b/docker/build_operator.sh @@ -13,7 +13,7 @@ apt-get install -y wget ( cd /tmp - wget -q "https://storage.googleapis.com/golang/go1.25.0.linux-${arch}.tar.gz" -O go.tar.gz + wget -q "https://storage.googleapis.com/golang/go1.25.3.linux-${arch}.tar.gz" -O go.tar.gz tar -xf go.tar.gz mv go /usr/local ln -s /usr/local/go/bin/go /usr/bin/go diff --git a/e2e/tests/test_e2e.py b/e2e/tests/test_e2e.py index b9a2a27d4..4681508c5 100644 --- a/e2e/tests/test_e2e.py +++ b/e2e/tests/test_e2e.py @@ -14,7 +14,7 @@ from kubernetes.client.rest import ApiException SPILO_CURRENT = "registry.opensource.zalan.do/acid/spilo-17-e2e:0.3" SPILO_LAZY = "registry.opensource.zalan.do/acid/spilo-17-e2e:0.4" -SPILO_FULL_IMAGE = "ghcr.io/zalando/spilo-17:4.0-p2" +SPILO_FULL_IMAGE = "ghcr.io/zalando/spilo-17:4.0-p3" def to_selector(labels): return ",".join(["=".join(lbl) for lbl in labels.items()]) diff --git a/go.mod b/go.mod index 150074cf8..7eda62d18 100644 --- a/go.mod +++ b/go.mod @@ -1,75 +1,75 @@ module github.com/zalando/postgres-operator -go 1.25.0 +go 1.25.3 require ( github.com/Masterminds/semver v1.5.0 - github.com/aws/aws-sdk-go v1.53.8 + github.com/aws/aws-sdk-go v1.55.8 github.com/golang/mock v1.6.0 github.com/lib/pq v1.10.9 github.com/motomux/pretty v0.0.0-20161209205251-b2aad2c9a95d github.com/pkg/errors v0.9.1 github.com/r3labs/diff v1.1.0 github.com/sirupsen/logrus v1.9.3 - github.com/stretchr/testify v1.9.0 - golang.org/x/crypto v0.41.0 + github.com/stretchr/testify v1.11.1 + golang.org/x/crypto v0.43.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.30.4 + k8s.io/api v0.32.9 k8s.io/apiextensions-apiserver v0.25.9 - k8s.io/apimachinery v0.30.4 - k8s.io/client-go v0.30.4 + k8s.io/apimachinery v0.32.9 + k8s.io/client-go v0.32.9 k8s.io/code-generator v0.25.9 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/imdario/mergo v0.3.6 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kr/text v0.2.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/moby/spdystream v0.2.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/term v0.34.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.36.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + golang.org/x/mod v0.28.0 // indirect + golang.org/x/net v0.45.0 // indirect + golang.org/x/oauth2 v0.27.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.9.0 // indirect + golang.org/x/tools v0.37.0 // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.36.5 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect - k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index cab88ce55..ffdf21612 100644 --- a/go.sum +++ b/go.sum @@ -2,55 +2,52 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go v1.53.8 h1:eoqGb1WOHIrCFKo1d51cMcnt1ralfLFaEqRkC5Zzv8k= -github.com/aws/aws-sdk-go v1.53.8/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= +github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= +github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -73,8 +70,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -86,18 +83,19 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= -github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE= -github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/r3labs/diff v1.1.0 h1:V53xhrbTHrWFWq3gI4b94AjgEJOerO1+1l0xyHOBi8M= github.com/r3labs/diff v1.1.0/go.mod h1:7WjXasNzi0vJetRcB/RqNl5dlIsmXcTTLmF5IoH6Xig= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -111,37 +109,40 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM= +golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -149,26 +150,25 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -177,14 +177,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -194,31 +194,34 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.30.4 h1:XASIELmW8w8q0i1Y4124LqPoWMycLjyQti/fdYHYjCs= -k8s.io/api v0.30.4/go.mod h1:ZqniWRKu7WIeLijbbzetF4U9qZ03cg5IRwl8YVs8mX0= +k8s.io/api v0.32.9 h1:q/59kk8lnecgG0grJqzrmXC1Jcl2hPWp9ltz0FQuoLI= +k8s.io/api v0.32.9/go.mod h1:jIfT3rwW4EU1IXZm9qjzSk/2j91k4CJL5vUULrxqp3Y= k8s.io/apiextensions-apiserver v0.25.9 h1:Pycd6lm2auABp9wKQHCFSEPG+NPdFSTJXPST6NJFzB8= k8s.io/apiextensions-apiserver v0.25.9/go.mod h1:ijGxmSG1GLOEaWhTuaEr0M7KUeia3mWCZa6FFQqpt1M= -k8s.io/apimachinery v0.30.4 h1:5QHQI2tInzr8LsT4kU/2+fSeibH1eIHswNx480cqIoY= -k8s.io/apimachinery v0.30.4/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/client-go v0.30.4 h1:eculUe+HPQoPbixfwmaSZGsKcOf7D288tH6hDAdd+wY= -k8s.io/client-go v0.30.4/go.mod h1:IBS0R/Mt0LHkNHF4E6n+SUDPG7+m2po6RZU7YHeOpzc= +k8s.io/apimachinery v0.32.9 h1:fXk8ktfsxrdThaEOAQFgkhCK7iyoyvS8nbYJ83o/SSs= +k8s.io/apimachinery v0.32.9/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.9 h1:ZMyIQ1TEpTDAQni3L2gH1NZzyOA/gHfNcAazzCxMJ0c= +k8s.io/client-go v0.32.9/go.mod h1:2OT8aFSYvUjKGadaeT+AVbhkXQSpMAkiSb88Kz2WggI= k8s.io/code-generator v0.25.9 h1:lgyAV9AIRYNxZxgLRXqsCAtqJLHvakot41CjEqD5W0w= k8s.io/code-generator v0.25.9/go.mod h1:DHfpdhSUrwqF0f4oLqCtF8gYbqlndNetjBEz45nWzJI= k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo= -k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= +k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 h1:cErOOTkQ3JW19o4lo91fFurouhP8NcoBvb7CkvhZZpk= +k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/kubectl-pg/go.mod b/kubectl-pg/go.mod index 96a183fa9..2e3ed3cbe 100644 --- a/kubectl-pg/go.mod +++ b/kubectl-pg/go.mod @@ -5,7 +5,7 @@ go 1.25 require ( github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 - github.com/zalando/postgres-operator v1.13.0 + github.com/zalando/postgres-operator v1.14.0 k8s.io/api v0.30.4 k8s.io/apiextensions-apiserver v0.25.9 k8s.io/apimachinery v0.30.4 diff --git a/kubectl-pg/go.sum b/kubectl-pg/go.sum index 2237a9e03..65d7acbee 100644 --- a/kubectl-pg/go.sum +++ b/kubectl-pg/go.sum @@ -129,8 +129,8 @@ github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSW github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zalando/postgres-operator v1.13.0 h1:T9Mb+ZRQyTxXbagIK66GLVGCwM3661aX2lOkNpax4s8= -github.com/zalando/postgres-operator v1.13.0/go.mod h1:WiMEKzUny2lJHYle+7+D/5BhlvPn8prl76rEDYLsQAg= +github.com/zalando/postgres-operator v1.14.0 h1:C8+n26C8v6fPB1SNW+Y8X6oQoEHufzGJXJzYPlix+zw= +github.com/zalando/postgres-operator v1.14.0/go.mod h1:ZTHY3sVfHgLLRpTgyR/44JcumbACeJBjztr3o1yHBdc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/manifests/complete-postgres-manifest.yaml b/manifests/complete-postgres-manifest.yaml index 44d317123..7677dca62 100644 --- a/manifests/complete-postgres-manifest.yaml +++ b/manifests/complete-postgres-manifest.yaml @@ -10,7 +10,7 @@ metadata: # "delete-date": "2020-08-31" # can only be deleted on that day if "delete-date "key is configured # "delete-clustername": "acid-test-cluster" # can only be deleted when name matches if "delete-clustername" key is configured spec: - dockerImage: ghcr.io/zalando/spilo-17:4.0-p2 + dockerImage: ghcr.io/zalando/spilo-17:4.0-p3 teamId: "acid" numberOfInstances: 2 users: # Application/Robot users diff --git a/manifests/configmap.yaml b/manifests/configmap.yaml index 9473ef5ec..b757c5392 100644 --- a/manifests/configmap.yaml +++ b/manifests/configmap.yaml @@ -34,7 +34,7 @@ data: default_memory_request: 100Mi # delete_annotation_date_key: delete-date # delete_annotation_name_key: delete-clustername - docker_image: ghcr.io/zalando/spilo-17:4.0-p2 + docker_image: ghcr.io/zalando/spilo-17:4.0-p3 # downscaler_annotations: "deployment-time,downscaler/*" enable_admin_role_for_users: "true" enable_crd_registration: "true" diff --git a/manifests/operatorconfiguration.crd.yaml b/manifests/operatorconfiguration.crd.yaml index ded2477d7..ac8b01d22 100644 --- a/manifests/operatorconfiguration.crd.yaml +++ b/manifests/operatorconfiguration.crd.yaml @@ -66,7 +66,7 @@ spec: type: string docker_image: type: string - default: "ghcr.io/zalando/spilo-17:4.0-p2" + default: "ghcr.io/zalando/spilo-17:4.0-p3" enable_crd_registration: type: boolean default: true diff --git a/manifests/postgresql-operator-default-configuration.yaml b/manifests/postgresql-operator-default-configuration.yaml index 570ebd338..72e5b7c62 100644 --- a/manifests/postgresql-operator-default-configuration.yaml +++ b/manifests/postgresql-operator-default-configuration.yaml @@ -3,7 +3,7 @@ kind: OperatorConfiguration metadata: name: postgresql-operator-default-configuration configuration: - docker_image: ghcr.io/zalando/spilo-17:4.0-p2 + docker_image: ghcr.io/zalando/spilo-17:4.0-p3 # enable_crd_registration: true # crd_categories: # - all diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index b06386f39..9cd750e84 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -1788,7 +1788,7 @@ func (c *Cluster) GetSwitchoverSchedule() string { } } - if (schedule == time.Time{}) || possibleSwitchover.Before(schedule) { + if (schedule.Equal(time.Time{})) || possibleSwitchover.Before(schedule) { schedule = possibleSwitchover } } diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 93d992c4b..e05a54553 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -523,13 +523,14 @@ func (c *Cluster) nodeAffinity(nodeReadinessLabel map[string]string, nodeAffinit }, } } else { - if c.OpConfig.NodeReadinessLabelMerge == "OR" { + switch c.OpConfig.NodeReadinessLabelMerge { + case "OR": manifestTerms := nodeAffinityCopy.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms manifestTerms = append(manifestTerms, nodeReadinessSelectorTerm) nodeAffinityCopy.RequiredDuringSchedulingIgnoredDuringExecution = &v1.NodeSelector{ NodeSelectorTerms: manifestTerms, } - } else if c.OpConfig.NodeReadinessLabelMerge == "AND" { + case "AND": for i, nodeSelectorTerm := range nodeAffinityCopy.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms { manifestExpressions := nodeSelectorTerm.MatchExpressions manifestExpressions = append(manifestExpressions, matchExpressions...) @@ -1297,7 +1298,7 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef return nil, fmt.Errorf("could not generate resource requirements: %v", err) } - if spec.InitContainers != nil && len(spec.InitContainers) > 0 { + if len(spec.InitContainers) > 0 { if c.OpConfig.EnableInitContainers != nil && !(*c.OpConfig.EnableInitContainers) { c.logger.Warningf("initContainers specified but disabled in configuration - next statefulset creation would fail") } @@ -1400,7 +1401,7 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef // generate container specs for sidecars specified in the cluster manifest clusterSpecificSidecars := []v1.Container{} - if spec.Sidecars != nil && len(spec.Sidecars) > 0 { + if len(spec.Sidecars) > 0 { // warn if sidecars are defined, but globally disabled (does not apply to globally defined sidecars) if c.OpConfig.EnableSidecars != nil && !(*c.OpConfig.EnableSidecars) { c.logger.Warningf("sidecars specified but disabled in configuration - next statefulset creation would fail") @@ -1504,11 +1505,12 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef updateStrategy := appsv1.StatefulSetUpdateStrategy{Type: appsv1.OnDeleteStatefulSetStrategyType} var podManagementPolicy appsv1.PodManagementPolicyType - if c.OpConfig.PodManagementPolicy == "ordered_ready" { + switch c.OpConfig.PodManagementPolicy { + case "ordered_ready": podManagementPolicy = appsv1.OrderedReadyPodManagement - } else if c.OpConfig.PodManagementPolicy == "parallel" { + case "parallel": podManagementPolicy = appsv1.ParallelPodManagement - } else { + default: return nil, fmt.Errorf("could not set the pod management policy to the unknown value: %v", c.OpConfig.PodManagementPolicy) } diff --git a/pkg/cluster/majorversionupgrade.go b/pkg/cluster/majorversionupgrade.go index 675004982..8b671023f 100644 --- a/pkg/cluster/majorversionupgrade.go +++ b/pkg/cluster/majorversionupgrade.go @@ -237,7 +237,7 @@ func (c *Cluster) majorVersionUpgrade() error { isUpgradeSuccess := true numberOfPods := len(pods) - if allRunning && masterPod != nil { + if allRunning { c.logger.Infof("healthy cluster ready to upgrade, current: %d desired: %d", c.currentMajorVersion, desiredVersion) if c.currentMajorVersion < desiredVersion { defer func() error { diff --git a/pkg/cluster/pod.go b/pkg/cluster/pod.go index b28e03078..12a18b9b3 100644 --- a/pkg/cluster/pod.go +++ b/pkg/cluster/pod.go @@ -432,9 +432,10 @@ func (c *Cluster) recreatePods(pods []v1.Pod, switchoverCandidates []spec.Namesp } newRole := PostgresRole(newPod.Labels[c.OpConfig.PodRoleLabel]) - if newRole == Replica { + switch newRole { + case Replica: replicas = append(replicas, util.NameFromMeta(pod.ObjectMeta)) - } else if newRole == Master { + case Master: newMasterPod = newPod } } diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index 2c87efe47..ed3eb3d75 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -94,12 +94,12 @@ func (c *Cluster) listResources() error { func (c *Cluster) createStatefulSet() (*appsv1.StatefulSet, error) { c.setProcessName("creating statefulset") // check if it's allowed that spec contains initContainers - if c.Spec.InitContainers != nil && len(c.Spec.InitContainers) > 0 && + if len(c.Spec.InitContainers) > 0 && c.OpConfig.EnableInitContainers != nil && !(*c.OpConfig.EnableInitContainers) { return nil, fmt.Errorf("initContainers specified but disabled in configuration") } // check if it's allowed that spec contains sidecars - if c.Spec.Sidecars != nil && len(c.Spec.Sidecars) > 0 && + if len(c.Spec.Sidecars) > 0 && c.OpConfig.EnableSidecars != nil && !(*c.OpConfig.EnableSidecars) { return nil, fmt.Errorf("sidecar containers specified but disabled in configuration") } diff --git a/pkg/cluster/sync.go b/pkg/cluster/sync.go index c632e598c..6bf8c06b4 100644 --- a/pkg/cluster/sync.go +++ b/pkg/cluster/sync.go @@ -1122,13 +1122,14 @@ func (c *Cluster) updateSecret( // fetch user map to update later var userMap map[string]spec.PgUser var userKey string - if secretUsername == c.systemUsers[constants.SuperuserKeyName].Name { + switch secretUsername { + case c.systemUsers[constants.SuperuserKeyName].Name: userKey = constants.SuperuserKeyName userMap = c.systemUsers - } else if secretUsername == c.systemUsers[constants.ReplicationUserKeyName].Name { + case c.systemUsers[constants.ReplicationUserKeyName].Name: userKey = constants.ReplicationUserKeyName userMap = c.systemUsers - } else { + default: userKey = secretUsername userMap = c.pgUsers } diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index 5739f6314..3081a3d01 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -39,7 +39,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur result.EnableTeamIdClusternamePrefix = fromCRD.EnableTeamIdClusternamePrefix result.EtcdHost = fromCRD.EtcdHost result.KubernetesUseConfigMaps = fromCRD.KubernetesUseConfigMaps - result.DockerImage = util.Coalesce(fromCRD.DockerImage, "ghcr.io/zalando/spilo-17:4.0-p2") + result.DockerImage = util.Coalesce(fromCRD.DockerImage, "ghcr.io/zalando/spilo-17:4.0-p3") result.Workers = util.CoalesceUInt32(fromCRD.Workers, 8) result.MinInstances = fromCRD.MinInstances result.MaxInstances = fromCRD.MaxInstances diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index 30b967beb..886da7173 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -175,7 +175,7 @@ type Config struct { WatchedNamespace string `name:"watched_namespace"` // special values: "*" means 'watch all namespaces', the empty string "" means 'watch a namespace where operator is deployed to' KubernetesUseConfigMaps bool `name:"kubernetes_use_configmaps" default:"false"` EtcdHost string `name:"etcd_host" default:""` // special values: the empty string "" means Patroni will use K8s as a DCS - DockerImage string `name:"docker_image" default:"ghcr.io/zalando/spilo-17:4.0-p2"` + DockerImage string `name:"docker_image" default:"ghcr.io/zalando/spilo-17:4.0-p3"` SidecarImages map[string]string `name:"sidecar_docker_images"` // deprecated in favour of SidecarContainers SidecarContainers []v1.Container `name:"sidecars"` PodServiceAccountName string `name:"pod_service_account_name" default:"postgres-pod"` From 1af4c50ed098a26527e3229ddb8ce69d6c4a524d Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Tue, 21 Oct 2025 11:56:33 +0200 Subject: [PATCH 14/15] bump to v1.15.0 (#2965) * bump to v1.15.0 * more linter hints * update dependencies of kubectl-pg plugin --- LICENSE | 2 +- README.md | 8 +- charts/postgres-operator-ui/Chart.yaml | 4 +- charts/postgres-operator-ui/index.yaml | 58 ++--- .../postgres-operator-ui-1.15.0.tgz | Bin 0 -> 5089 bytes .../postgres-operator-ui-1.9.0.tgz | Bin 4926 -> 0 bytes charts/postgres-operator-ui/values.yaml | 2 +- charts/postgres-operator/Chart.yaml | 4 +- charts/postgres-operator/index.yaml | 56 ++--- .../postgres-operator-1.15.0.tgz | Bin 0 -> 18284 bytes .../postgres-operator-1.9.0.tgz | Bin 17544 -> 0 bytes charts/postgres-operator/values.yaml | 4 +- e2e/Dockerfile | 2 +- kubectl-pg/cmd/connect.go | 3 +- kubectl-pg/cmd/version.go | 2 +- kubectl-pg/go.mod | 75 ++++--- kubectl-pg/go.sum | 201 ++++++++---------- manifests/configmap.yaml | 2 +- manifests/operatorconfiguration.crd.yaml | 2 +- manifests/postgres-operator.yaml | 2 +- ...gresql-operator-default-configuration.yaml | 2 +- pkg/cluster/majorversionupgrade.go | 1 - pkg/controller/operator_config.go | 2 +- pkg/util/config/config.go | 2 +- pkg/util/volumes/ebs.go | 9 +- ui/app/package.json | 2 +- ui/manifests/deployment.yaml | 2 +- 27 files changed, 211 insertions(+), 236 deletions(-) create mode 100644 charts/postgres-operator-ui/postgres-operator-ui-1.15.0.tgz delete mode 100644 charts/postgres-operator-ui/postgres-operator-ui-1.9.0.tgz create mode 100644 charts/postgres-operator/postgres-operator-1.15.0.tgz delete mode 100644 charts/postgres-operator/postgres-operator-1.9.0.tgz diff --git a/LICENSE b/LICENSE index b21099078..2141e8bcb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Zalando SE +Copyright (c) 2025 Zalando SE Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index fdf2518ba..8820f04a5 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ pipelines with no access to Kubernetes API directly, promoting infrastructure as * Live volume resize without pod restarts (AWS EBS, PVC) * Database connection pooling with PGBouncer * Support fast in place major version upgrade. Supports global upgrade of all clusters. +* Pod protection during boostrap phase and configurable maintenance windows * Restore and cloning Postgres clusters on AWS, GCS and Azure * Additionally logical backups to S3 or GCS bucket can be configured * Standby cluster from S3 or GCS WAL archive @@ -32,7 +33,7 @@ pipelines with no access to Kubernetes API directly, promoting infrastructure as * Streaming replication cluster via Patroni * Point-In-Time-Recovery with [pg_basebackup](https://www.postgresql.org/docs/17/app-pgbasebackup.html) / -[WAL-E](https://github.com/wal-e/wal-e) via [Spilo](https://github.com/zalando/spilo) +[WAL-G](https://github.com/wal-g/wal-g) or [WAL-E](https://github.com/wal-e/wal-e) via [Spilo](https://github.com/zalando/spilo) * Preload libraries: [bg_mon](https://github.com/CyberDem0n/bg_mon), [pg_stat_statements](https://www.postgresql.org/docs/17/pgstatstatements.html), [pgextwlist](https://github.com/dimitri/pgextwlist), @@ -41,12 +42,17 @@ pipelines with no access to Kubernetes API directly, promoting infrastructure as [decoderbufs](https://github.com/debezium/postgres-decoderbufs), [hypopg](https://github.com/HypoPG/hypopg), [pg_cron](https://github.com/citusdata/pg_cron), +[pg_repack](https://github.com/reorg/pg_repack), [pg_partman](https://github.com/pgpartman/pg_partman), [pg_stat_kcache](https://github.com/powa-team/pg_stat_kcache), +[pg_audit](https://github.com/pgaudit/pgaudit), +[pgfaceting](https://github.com/cybertec-postgresql/pgfaceting), [pgq](https://github.com/pgq/pgq), [pgvector](https://github.com/pgvector/pgvector), [plpgsql_check](https://github.com/okbob/plpgsql_check), +[plproxy](https://github.com/plproxy/plproxy), [postgis](https://postgis.net/), +[roaringbitmap](https://github.com/ChenHuajun/pg_roaringbitmap), [set_user](https://github.com/pgaudit/set_user) and [timescaledb](https://github.com/timescale/timescaledb) diff --git a/charts/postgres-operator-ui/Chart.yaml b/charts/postgres-operator-ui/Chart.yaml index f4e2adf95..c9e28e56e 100644 --- a/charts/postgres-operator-ui/Chart.yaml +++ b/charts/postgres-operator-ui/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: postgres-operator-ui -version: 1.14.0 -appVersion: 1.14.0 +version: 1.15.0 +appVersion: 1.15.0 home: https://github.com/zalando/postgres-operator description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience keywords: diff --git a/charts/postgres-operator-ui/index.yaml b/charts/postgres-operator-ui/index.yaml index dab9594e9..3ad4ac84f 100644 --- a/charts/postgres-operator-ui/index.yaml +++ b/charts/postgres-operator-ui/index.yaml @@ -1,9 +1,32 @@ apiVersion: v1 entries: postgres-operator-ui: + - apiVersion: v2 + appVersion: 1.15.0 + created: "2025-10-16T11:34:57.912432565+02:00" + description: Postgres Operator UI provides a graphical interface for a convenient + database-as-a-service user experience + digest: d82b5fb7c3d4fd8b106343b2f9472cba5e6050315ab3c520a79366f2b2f20c7a + home: https://github.com/zalando/postgres-operator + keywords: + - postgres + - operator + - ui + - cloud-native + - patroni + - spilo + maintainers: + - email: opensource@zalando.de + name: Zalando + name: postgres-operator-ui + sources: + - https://github.com/zalando/postgres-operator + urls: + - postgres-operator-ui-1.15.0.tgz + version: 1.15.0 - apiVersion: v2 appVersion: 1.14.0 - created: "2024-12-23T11:26:07.721761867+01:00" + created: "2025-10-16T11:34:57.906677165+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: e87ed898079a852957a67a4caf3fbd27b9098e413f5d961b7a771a6ae8b3e17c @@ -26,7 +49,7 @@ entries: version: 1.14.0 - apiVersion: v2 appVersion: 1.13.0 - created: "2024-12-23T11:26:07.719409282+01:00" + created: "2025-10-16T11:34:57.904106882+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: e0444e516b50f82002d1a733527813c51759a627cefdd1005cea73659f824ea8 @@ -49,7 +72,7 @@ entries: version: 1.13.0 - apiVersion: v2 appVersion: 1.12.2 - created: "2024-12-23T11:26:07.717202918+01:00" + created: "2025-10-16T11:34:57.901526106+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: cbcef400c23ccece27d97369ad629278265c013e0a45c0b7f33e7568a082fedd @@ -72,7 +95,7 @@ entries: version: 1.12.2 - apiVersion: v2 appVersion: 1.11.0 - created: "2024-12-23T11:26:07.714792146+01:00" + created: "2025-10-16T11:34:57.898843691+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: a45f2284045c2a9a79750a36997386444f39b01ac722b17c84b431457577a3a2 @@ -95,7 +118,7 @@ entries: version: 1.11.0 - apiVersion: v2 appVersion: 1.10.1 - created: "2024-12-23T11:26:07.712194397+01:00" + created: "2025-10-16T11:34:57.896283083+02:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: 2e5e7a82aebee519ec57c6243eb8735124aa4585a3a19c66ffd69638fbeb11ce @@ -116,27 +139,4 @@ entries: urls: - postgres-operator-ui-1.10.1.tgz version: 1.10.1 - - apiVersion: v2 - appVersion: 1.9.0 - created: "2024-12-23T11:26:07.723891496+01:00" - description: Postgres Operator UI provides a graphical interface for a convenient - database-as-a-service user experience - digest: df434af6c8b697fe0631017ecc25e3c79e125361ae6622347cea41a545153bdc - home: https://github.com/zalando/postgres-operator - keywords: - - postgres - - operator - - ui - - cloud-native - - patroni - - spilo - maintainers: - - email: opensource@zalando.de - name: Zalando - name: postgres-operator-ui - sources: - - https://github.com/zalando/postgres-operator - urls: - - postgres-operator-ui-1.9.0.tgz - version: 1.9.0 -generated: "2024-12-23T11:26:07.709192608+01:00" +generated: "2025-10-16T11:34:57.893034861+02:00" diff --git a/charts/postgres-operator-ui/postgres-operator-ui-1.15.0.tgz b/charts/postgres-operator-ui/postgres-operator-ui-1.15.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..95fe866f6e03a19fcdd5161e845db9a1e3565643 GIT binary patch literal 5089 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 DDc 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 diff --git a/charts/postgres-operator-ui/values.yaml b/charts/postgres-operator-ui/values.yaml index 9923ff023..2e729ce76 100644 --- a/charts/postgres-operator-ui/values.yaml +++ b/charts/postgres-operator-ui/values.yaml @@ -8,7 +8,7 @@ replicaCount: 1 image: registry: ghcr.io repository: zalando/postgres-operator-ui - tag: v1.14.0 + tag: v1.15.0 pullPolicy: "IfNotPresent" # Optionally specify an array of imagePullSecrets. diff --git a/charts/postgres-operator/Chart.yaml b/charts/postgres-operator/Chart.yaml index 35852c488..40ffe22bc 100644 --- a/charts/postgres-operator/Chart.yaml +++ b/charts/postgres-operator/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: postgres-operator -version: 1.14.0 -appVersion: 1.14.0 +version: 1.15.0 +appVersion: 1.15.0 home: https://github.com/zalando/postgres-operator description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes keywords: diff --git a/charts/postgres-operator/index.yaml b/charts/postgres-operator/index.yaml index 4da98d70a..025ad2b9d 100644 --- a/charts/postgres-operator/index.yaml +++ b/charts/postgres-operator/index.yaml @@ -1,9 +1,31 @@ apiVersion: v1 entries: postgres-operator: + - apiVersion: v2 + appVersion: 1.15.0 + created: "2025-10-16T11:35:38.533627038+02:00" + description: Postgres Operator creates and manages PostgreSQL clusters running + in Kubernetes + digest: 002dd47647bf51fbba023bd1762d807be478cf37de7a44b80cd01ac1f20bd94a + home: https://github.com/zalando/postgres-operator + keywords: + - postgres + - operator + - cloud-native + - patroni + - spilo + maintainers: + - email: opensource@zalando.de + name: Zalando + name: postgres-operator + sources: + - https://github.com/zalando/postgres-operator + urls: + - postgres-operator-1.15.0.tgz + version: 1.15.0 - apiVersion: v2 appVersion: 1.14.0 - created: "2024-12-23T11:25:32.596716566+01:00" + created: "2025-10-16T11:35:38.52489216+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 36e1571f3f455b213f16cdda7b1158648e8e84deb804ba47ed6b9b6d19263ba8 @@ -25,7 +47,7 @@ entries: version: 1.14.0 - apiVersion: v2 appVersion: 1.13.0 - created: "2024-12-23T11:25:32.591136261+01:00" + created: "2025-10-16T11:35:38.517347652+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: a839601689aea0a7e6bc0712a5244d435683cf3314c95794097ff08540e1dfef @@ -47,7 +69,7 @@ entries: version: 1.13.0 - apiVersion: v2 appVersion: 1.12.2 - created: "2024-12-23T11:25:32.585419709+01:00" + created: "2025-10-16T11:35:38.510819005+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 65858d14a40d7fd90c32bd9fc60021acc9555c161079f43a365c70171eaf21d8 @@ -69,7 +91,7 @@ entries: version: 1.12.2 - apiVersion: v2 appVersion: 1.11.0 - created: "2024-12-23T11:25:32.580077286+01:00" + created: "2025-10-16T11:35:38.503781253+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 3914b5e117bda0834f05c9207f007e2ac372864cf6e86dcc2e1362bbe46c14d9 @@ -91,7 +113,7 @@ entries: version: 1.11.0 - apiVersion: v2 appVersion: 1.10.1 - created: "2024-12-23T11:25:32.574641578+01:00" + created: "2025-10-16T11:35:38.494366224+02:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: cc3baa41753da92466223d0b334df27e79c882296577b404a8e9071411fcf19c @@ -111,26 +133,4 @@ entries: urls: - postgres-operator-1.10.1.tgz version: 1.10.1 - - apiVersion: v2 - appVersion: 1.9.0 - created: "2024-12-23T11:25:32.604748814+01:00" - description: Postgres Operator creates and manages PostgreSQL clusters running - in Kubernetes - digest: 64df90c898ca591eb3a330328173ffaadfbf9ddd474d8c42ed143edc9e3f4276 - home: https://github.com/zalando/postgres-operator - keywords: - - postgres - - operator - - cloud-native - - patroni - - spilo - maintainers: - - email: opensource@zalando.de - name: Zalando - name: postgres-operator - sources: - - https://github.com/zalando/postgres-operator - urls: - - postgres-operator-1.9.0.tgz - version: 1.9.0 -generated: "2024-12-23T11:25:32.568598763+01:00" +generated: "2025-10-16T11:35:38.487472753+02:00" diff --git a/charts/postgres-operator/postgres-operator-1.15.0.tgz b/charts/postgres-operator/postgres-operator-1.15.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e029732ae3484e9588268943211611527ae8f253 GIT binary patch literal 18284 zcmV)!K#;#5iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMZ}d)qeBDEj`azXDg;^K8mTe6M*D-&=s)^{-Ti~%f1v)h z2xxjzkzoEG{f%*z8}~2r;F$hGxS%W=qnlv|$8q-Opf}j-^*cTh9;a~v?=CgFpbO0| z$m0YjL?9gbD8vz-5n)PQ|Iatb3sR8~E)Y+nh(k`U3EvyhC@JV|0P z-r1SaWS&lX9t(Fq;s8fJ+gak!&Ihu%W!x9zj)TnCj)SuA4)Ow)`c8xsdP8I(oNyM= zj)O!@1J(&KjS@^F!T|;eF%8DDek54RJ@Vf*?w(IN2t`;@_`lSvj{0kvC{+{S-K#M- zrS5*@@n4?*H#kU%*rotzp8tEp{{BH}{_hQTM^E$rF&-M?85wsF;$%ie!WUySn|r)R z8N7>`pb3+2>p2*q1kc9kMl&!%aT)}dETG$wGZU$06x-V&)%55lgV_1~EpTzQ|W^@Pq{Fua3u}DV@E;d`6Nn z>Kajd0y+^jCmj;uNkINnu;`8YFh)}x2qMeRNJKae zkY@u!G3GcVQci2+uT?S07|)<i$}s!0szgpdpIF8#wigfjeNqf#{i z0#Ho|i-HAEBNCjDX&MO0Ikz;Kvot|842e&1LV^YInd~!Jl(Qg^zZHnQ2?74NaAC=C z(|E?QPfSljD@X#hFJJ$1dUbtvagIoIgKjWKG!hBHzGUZ^vm5FgL|WLR8;Y|fiFH+#d%IoJktPN65Y5rnA?4tV4ffxEl@;mk&hER z!GfTe`B~!w8dA-6h($=uLllyb@kNe7%tQBv1*zoV47B27 zorZC;K&c=C{d_32hJjw4T=yil#Pi)b6LQijo>X1nGw%c8suwy)|LH2pYou+aAwb_a zgM;yIukXa84#4?97OJt57@SEDlrThR5#t2S0ya@1QBQ1;iXy?0N7TRzfTW7M=98;F zxj9Vt16ct5ssSV*UV`XUa(f!9mXpYj8I2Nwp8I5q(;#{A5=m7MP=`1ck}#zVqJUsI zv!A~@x&Gn9p?IO%lZj(D6~xUeW|B&l3TcF*G@K9)3xg(E$Z3-4p?XMr$Qhs?P{dSQ zJ4jZ}S}DfJ87PqWZUd0`t^#CCIAwk|1w0lB;-$bBoWz)N#L1s25ikJijjQU6(O$R; z1n_=8g}MrigFMb67yBWNI+j>P zF&09aGl-j64U;^M6+tMO;{;(T?O0NQ)hrDfiff?Qk}ZQwqlEAq8~_Sf?PL#locJV4 zC=OsE{Cp^oR(9kVWRytFu8hSs5Xb1KuW*q>!m^Pi41FLZ&dI0;C%?EEh%p)*DyXqN zNFWJQL40TiCviYM1=!4>Y?i7iXTH0p_E@eOkv~}!fr~UIT$WM7R*kvQF((T|BbxY= z4pIdzXqgqN+2<|(gK=$0zt@@rpz5;ev^$nUMJp69QCDfR-LaIIbV@{m5>96`IrbP< zqL-*UO#>)FBO2ns(j!=)R{~QdVGKmoAB?+3ThO@NkVy^3Ak)!LqM2Zp`eGvTTW&)PwVCrX#!8|G0L~&rVLY z9My|6dUbw{d=|n3S6Dif?UbJIv|Ta|HD&2hFY2F$}ji6j(&`GT+zbQUQA zDMhxy!zO|9^4Rn?)QUIBEr-5kCPJ4~8FoCuQu(CEd@?E(J zxe5f*9{Yfj+z`GfsMBh_O+~^&7zwMMUgxB`hQ|mTDL8*M(XS>ebUMl9pb{(2)G`68 zDlJ#9a7Y^~a-ai}5L=0ppR^{YK05MEcVo3s9XZ zZ5+zDnP<5ziB7Jx%}xcvH;hVCI>7<4z-ZmDs8oeiNOciw1W4(UN+?Kin+t|#$WOsC zf|8U)d5iP56bvhEKg#9vBy+Y%+Ibr3HBO)jnMy-OnM_nDyAGte1}>|+xwFPHP!l$r z0fH&=<}|RoOuG^0_=X@HDYXf4G9{cy%c!RRG)Aq&nbL(uSvYgWR3Xznc=^i-*x81Y zm%A&LYle`@jyAeoFTgZ(P05NTN_!qh2}O81l^wD`ti*;f^KHElBve98@v0_VzWNbn z7lBFkmPW@nm`aI>`jP<#MQA=1JOv+~J4t$BmI|CNYjci722jU zQpi`LpG{Repl?jO)&9(sW0COGOQaxD){ipyq{uZYyY?m&3M+F*_qSWrjQgRqan)%?zp=3^+^hnL$u(3F81KN=i%6&`TN+ zsB>yxVT`)j=FcZR6TUdHKj{{n`as|>Czc~1hP@yq^Q5i?x&yn7B+u2Q&L`9Xx$8ktJEb|WKasO?i<3nTwf9vvw+POpq?v3utZ-K7E?>B z+{JyaITMLeyBnDQM0+e^HNz|!g>EpXYJrsO&*C&tJ1p8NGRBZ3%Bq&TbHN4x8+0dJ zILc;n)YqIOLxm$Li@x8nl~(&bJUG9cV%$UzrT| z!tIxduf+`Q*H|jaDE6kbq!PkI8YzpDaZe6tut0b!TM6cqUO{yaXT{wam)2a#hhLDQ znXX$fBh}t(g}34*KmcD%=HJwdktl9#8~syBWNX9Q)KeOXno)q9g1zU{DHt(U6=lJi zVU^qk_NrAt)2&olPPC@$!|vrj8*SWwqG^CRID4hqbSpJc2ZJgpk*ZZxtVzjq3ESmTanOdgknx_Xh5Xu7AhT8!OY*=o!SyEw9#_f#d1;#p|-R&01WXABuaXELqa!v zvVbiZ9b^y@;tSZ-q<%)5a!zLyxh*&N7;t&Bd* z$rzD|c!}a0?DFRo^9r!ggAXfp>-ud{(GeQm}EFjttuos7X+mcQ7a#!JmdS+F( z9Ft?@PaGBn3;oK-pfNhVqe9PigvfMCykv~dnO1(ZNt^G?W2HqET-L@bt0(@9-jFC4 zC>^A0`MJOtqwaTIV~i<18wY{qXzO&I<$KzhV<+G7GgGhV|4=o|yG!O@kt{$@VmrBf zuXn{W0Ly-N*%w-WalJS-`=Z@JH-n+c&_2@kpmaSsvGfkE-lV-3QF`lE)3w*{zoj;; zb%-nO1_ON>DARFUD2-#n(S)UukGWD+t*$WJ?8RovK3fT;NOlIOOw#Uas$k7A_W?C* z_oN}RWn9c9s|E|@#i^PgA&u-|9q#Fo0I-^t^&uC>X1FK2v6ET+0&x;xy_GCjXgOlF zKh#8l>GEUkYS3G%RiOenk!z_^NHb_2R-sKWMN|}vHd}R2tczpndUN7^u=a8XqTrqY z%k37^#Kgl`z6wr6EQwI&`zjQfQ(|ughGhj<>4w_c(>j@P>AA9M4t$_TvKG1&uArBK z+M`t<0UZfw2~w`QJss%M^H^Br9>#GTER-W&**s;8;GPvm z4Y&6pGi#`FFY-=rJbtX&o-BCU4Q6nJ6x#~srnb@K=;dxnW56%%e;Fqf!@g_aRQdPU z!75doHpo@UtOk~$I~hGjH|=U)B;@+i!Sf# z^0{;4L{ZXRax!Mq$XNQexonMWu?wsvRSl;fiIPh)w-i5RO5>N_CpGuv)cazHi8=9L z$(6Je@K@qag`yLOX1m+)Gnrv;(M*c0R!zk{y2K24U7wgyZlJ`GWj5%UY7&;aCgb;& zeWNL=>Y&cE%y5$8kow3clT?MaYfjHYRT4phsTSq0WU+B!UfmErVS*?KC}1;@@8VcN zBJkM_Oql%Ac58-jnns?|T)|O1$BEGiQEqG()NA7d%4el{a}=8A~qIHsxxmdffMnnEhoDK52Zsg=o}V|3WpVRm`sC5aM< z%Qr3@y&BG`G+Gx37V7=F6&L)q7popT&ixCFQBk}L}lxw`QD>#|ys7z}BPJg^M&Lhbyx58D$#)zbjCr20u z&Y%#(%g9`5XG(CIWufrvlgmPAY#x4S`KSv*X(#uN&%D^RD(8M^ z*&AoaZQT#7?*gIm%2BQ#0D z7n(2?YXp0WG>+xGvm_M_7G|bBlRsQBa#hW?!2W*x1_?3?No3Aq{QdZibET`ux~l0~fh*NAOr4#|^i-?uS{*FG{ew-i^H$wr6P#|rr>>66 z5sn;0DERZcV$^+!x-(C7D z%a(LC6LA?hNvMuthB5N>ASo$i=3sY-ZVCCIc;^85cp)nI2l~uJm`Jc0!Fu3z>_)c#3UXf` zw_S#&3y)EE)JOe3`cD3*8C`Xtwb6}*6^{y}t5c-Z1kD1nKiFg$k^WE}-~g+YR>?@_ zAe5XlPeZH^;pE3AA)3jE3*&s2?=!$fAz-J_i&ob<*e4n!=7i+6|$osUhjooIzzV*rI2S1 zpwX1sp4%M=_8aa%ZTazUTFk+VA5cmmHZll**dbvYumv$uuEj&m*!N+l)9Tv%s3Dl? zYGWVbGG$q*Nz5l03~1O}QQE%N^|Z>Mbi_A0u+^N=l2(x!y@*IFZ%(WMhS^LbM6frn z+Rn;2H>;vXLj~bE72k_w=w|8ATDkB{2*kbJa+)M0l7o&TJ6`ss>K4YU!jUCKoF&9d zh@W>sMvXdQseW5WE@AaZr+V>~JxZtfyn(Idklh%zR+8`X3@u9=sYw9VZ1YI~*fHvw zSj27~_+$z2HN zni%`s?lKrv++|by6#lS4ioH3x44^UsV^2k3)R(RciD-sj2o_lhT$fg$P4tS|Js;aH zHnYF}>f{X)VEEkn^8Nmu#OA!Rh4%{ZCqlt0?x z{_~;8haZYBq3ogO4T*pR(743`CX*e>MW~UexgBsg}oR~ z8K=ntc>xy6+{hHSnE4&^{X~8~H-5J2ip3*uG4n5%Dx0R|g8;l@_AvAYAxU1!KdK%@zoxW5V)4I}?Lwl^vAJ z>cB5Syc8PGqJ-SR#NcUkEZ*xVU)UytH|H$6Vk|#Y$qDu^qF^Ck{*-P1WS=2o_0j~a zo?7v$nV>(01I_AyXBy|+{3=(cO6N5@+25CNCbNU!>@JnV9pJ?^@mS=GG1^lncBq{9 z`qiMcFGubYj;jxDbe^Hp`mZ4GA(|PYiF3JaV&Ao4M10i6lC8V>4y^xIQS_p8o;78H zOR)GLc4+hm@e)VQS;sO(cGTvRV-e{XxK8Fh-)Y8>FERN?sSEGiGX5c8*mp7(+=-d* z+zfV}RUs4|=+D#W2AJ;G-(jwt-VyM1G04)C$Q3EuD#L0+G0y_DBN?@D&e4e8S)Nbl zIpl9jym`Km_td;l_OeNG_x2y|FUMCptOx>%#wc7k@T*Yp^~Kxc|L^kZ;^f*c{1a!P ziBrl$yMCf1@UO@;|B`*?9^;z%$(=~?E*&$b+Th$`PuDHUnD{2Qs2|3IM<>{8Y0dtr9Rn_ z$Q^Y+P?FV=e_vcRdr$d)ALDt)&<)}0#4Apg^ID@h&Qh_w zlp5-|(?Ot(c}ajACyOln;nOG7yCMO>g7nU_GlXBhpczTjmbnw4E{@|~afOf&WaUhM z?=BJ1gFq?NLtnmhpG41ApQicm&PfmxE_zA4Q7Z5i^M7}LuveP@2g8Hir}_UF&!AMDM^7=5?%YU!iux(b>J>b5GjxOhznDW|L?BwOZ zbI?;4PJlW42L?}{bz~; zaFakzONpb``8!e2p?o57$o2>{As$Wz(Z^nL<5T5LlLmycP{CR-XZEQ;&-IRk4(^8J zJ~8oL^g3r##FcnN#RJ~Zfm#nM1sGz1Fc7b)ZPCd_XUqGBPP2YBAG5wSWoiqw>ij_D zkp2P<8UN6Jd@VY&K2cB#>q$;);qAQ%j5&>xDeC?=;rutzEkRRw@56C*ze}80j>Bp_ zo<*PWxizv`4?m}o7o`3QcIdsxy1xh$MgujIUy+JoWfNlNx1!!2kehD%)^ua$ck@Oq zd7s<1tK_(C)2t<5=0mn>$>rOoVFin@6{Fc^_U0^RLt9O+B?9FVV-m4qQHZlvrNHsg zu0^tZw|3&&a!LKx8GF%ZIL{*0*Y5XS)OEXStU*5o7-AbD0_k$~M!h-T0wH*L<{c_B zd4FPE{;=H0se-CH`6qKH#9JJ9P5*Kn%?SF-2eNpH{-REPkADEw8T`^((0-tiexIOsQWT2@frP@vV_>sK)6~ULrF{yQ2W=Q=wBe?+V}^R zd9CzO6E4!p&p^9KC%+i-m%$Z5{(vCJ-`9UylW#1CS_92tz9=J?b(>lbVCx#cT(P0I z45F%^UqSzC(*N}q9Bg$K#NR#d23n#24|fkr_x}us`=h~={{I-yr%$$i$S2tAX&>R2 zFCF`GF!+SiWX?GKs51F{I0OU!X3&vye{ApBcS4e2A18R6ZN5oNON&UIj-cgLDNA&P z=K$cga~%MbISIm^nD4;au(GmVL9*J*H0X05&SU|=GHp_;BJ~wb2urcrxn3!G3Ks`F z%K|=Bx*9mPpLlcYwl%Y|z_l9?J*+c>8J#*|*Xn$!wKV59{Pb$C;y|Af`4e>$o)TDG z9E4-~nzJ-ESMPMK^Z5E*UcH0h45oPxJOw{hjGXn;lWKyegTNg$gP?W?)(H3!%NE10 z?0z0cbwkG%!L8`ad*{)}Q=+|gBq21Q7413_!Xo=Vv^K-F^35g&PRCUkk4R|=IP7BE^&Q0{FV__*a zD;1=;WPimKd%I7|^?#%50GrqUfn4}Y>wkZ6u>Z9FKgRQw*Z)R0$CDDEl>i(BN*bwf zACqeaa=+y9JbCQvl5i|+KUc{|lb%SF|K8C_#N}&)sj!RxI4h}jdIIjK;RO4l5ShPz zt06Ld#lmW+s2&M*SAvS16=k1mA%eD2Q8Bm8GCo_Ta*8LMdVs+ocy!ezKmNqHgkmmz zJh^(MT^X=LsIE|~7>AhVtFx9G6{;h!vw4}PaIF}ccA9O?J(Oh?qtuB@eNyfTA^%Y0 zVIs~>u3D;as#@&;-dms3CP1du?pW%(PKE%Ni3pZC(zN>b?`9n+MUr5@bn_{kyve+1 zEr+qL9g?_j-3&<>I=OoPDoaXSh*MSp@NEqMlO1?v3kLfjlBr z<@j$!62NFF$qhT0{PP5nJ1RhiUH)<+dg#QQn7yGGUF(eB*KJ2QPh_u>l|UN%5^WVd zR2oh_Nf}4aTi8;|>16dRjc>f}i_Jhl&f4w^BQTd`Bg(tf>PWjEt(ZI(5$INb5#f+} z>e#Q@+@lhKm(wWocjMh`pWmvbF4bz?QMPto-2WEYnQlAhKUqqtaIa~iH~(wI ztvzEkP4@KCQT`h@$40w9E9L)ac(7ZJ|K9IE#eY1?qxB&2XGsH60cfaO3^217 zgk0>KBGuBqNv2w%gYD(OzwuI_Iyd(UHAac*b-Yz1sk-#SgtfX53G1$i+o=eG?Ue%B zP~}~1>&62?yG@mbNXSZ8Hu{Wc>-?*_AfF^DCmZ-CG^lk+rq@~{$ZC0N5?ToC>?YI?S<%C;X0crx3mSH`q zfm?f;^uOGxxS0aDLjT+E@0a6$`~BgQ{`V-4tvTnSYpYInl=BC`D_%ooojYl1XPBcIur(~w zP@AF!rBNO7K!54I)3o${#Dc&*8r_oV+I@j~=ra;?JlxwCX_%w1Lj*QPS{WbJh5(~1 zXWeA!?8nw6Vaf@Tuz%n%s4J7LmWLI`P880dz(m_)qjeamy3vZwYul?oFE@3mv1Vey z?w!aiPR^^nQuDNE=E!KB*{S##GeP0zoiAU;OP>=w zgVYEGB$sIrTFl-p_W060KYn| zUb`2Ur&q`CF0Ncf!uzY^cV`#p?!}M)d3y40i*!`TBRr^1?<@`Ux;c)Ni{LiC2s}!ya%>ySk z51d@RTG|dOr8vA9bhRI$62j9~(L=i{O1C;lGUEU}FRdtrEfQs<+Rj#_ZV6gZ9d<KfT1k<$<5UIBSN9q>0)b7Y%I?iBOj^;udLyW&Int<*L!Yz&RkT5> z04`mGu>xXwW2ur!%{>{-T&YSe1NisWYMb;wTT(ejSUMmq@1+HJ#B{8mk)!{`y{!{EUn_WG3?5Wa>boISpYr@UL2NED-Xv z2UXgGx?fCAJ9RncgoLq@w#spQsouO{w}hMV=oD`LFloti|6wC9Wy$vb?IrKG@ifVQ zt(cXA1D67bbr+Qo{Y1M6(dZa&6eo3)>w7EcTLuU#4IF9R#&e}8`||6_lD z@8C)PKgLr$|5Zv1U9I?+mkDzSXp3jPo_xEF@_CCVp_=ADToX0L9*t&>br$q~#($gr zpWXfP{?Fc%{`WXf?fK8jn@r21V1uM^_T;SxlU?}gB+P;PuL}`G|5mepEk$&!HgMF{ z;X0w*gQSOh_%ucx$8o+Q_YoiNbADpJdo!Qxx$W>?HIrGKlCzKIysykOH*!zHIMD#k((7QPmNTe~ir;wPFAb^X&)#(%(&0Zo-0-Vqr0wJu{dmQMn2`D)0@#`2mV#$cY2eLdxtXA^IdO( zKXkt9C1Kq8?*H#RL%(27St`)kt5ebG#hm>?yrk2kKEXSx9A|(0D~gHb`R{SRCiL&# zhM#_#=l}k2FzT1{|2*CQ`AARk{NHk(UP~*2{JbWj=T(-Ux5DpJ!#(9yyN&;5i9a)+ z`Aj9kDFcm6t}K%Wr#k*newWMr&-G>AC~W|tI7m4T>YAm_8PRB#2AJ0rQf20hC+9hN z4q~w?1%G-tAv4Bl{uu{B2O;6Hn2b^8`_hTOggISj4tCrO6c)m7h(Ct=oz)AK)Y5*F zP6`T>Dkaq-xbYi?!}nouad63Lln{Qxf;5aW(iFzwKJ8o9JUgdy*^#Btj6D?u|d zNjbA9i{8X$az##dRb&%)Jlyc(R=XF$Ctip?2 zuohk~iv_)>7ZaXPB5bH2zY1r6D!4^GBuc|#QKv!hsmBui>mw;geOsSP5y;CZN*!C@ z5de+*ZdpVwgT$QU#nQJZ4FWs~Y#C@jG$COH#D<i>dxjKmrI?# z0AL4lO*(^v@oum0#G`JhYE44>I`k990)nG@{1u&Hp}4^T_18pTNd}+9oXCOm*C8ap z9~Z7l!I_1Rui07^rc{X~o|zbR65Y5rm_I<5ih1a&#K;c;9D3*$2d*@_T#tn@P9CDC z5`sgQ`mPq^u+%9-ZoAkL&v)lc)V5*e)GE&%W%^}niVOEP3pdYH;C>*Bdts}+8eywF z5#qaiA*_R3T$pXh)4g6sJ}t_I1!7;bJh9N zwYh2356c8`5@X6Y1-!QeSCGUFNyzxZm6`?-iJLIRu3Kd+L4D$3?%E4k?EqG+)Tm@7 z)UDeqIzyB3s0(^cYY@6~@=5K)oPaImq|t|n-A0bO^}Q11E#n_ZeIx4lKV#_zjy^1X z(g(8c)v|i63Kd4tWw#OGE^P8wm24gqw0dAr)8L?0( zpjDa^YB7H|nVcZaaNrim+qfGBOJ)$tLSDCx>Y$9Oe9Ckg@TL+sX40&U@q`AnuK2?a zn{iwDEW~v4PSoIf0rRT4*WfE>p<2dQyH2;)Jnlt&O?@0^!f}ki(rRc`?)=+UPdczQ zUWF1I^1wkA3D>I7K2C?K$P3%F@^M0{?W?uGK_9OTj@?GW!vW!Kd+lMSUFK$uDYq{f!mlRl5*p6;;e^gqQ2Geu|}}o{M`;3 z<@Rd5Ks=17qtTROk?_<@Qcje4Sx9KHjvQ|Q`c-Y$hBdZ&@2L2gdo{Cdx#~jFboxN5 z+o4JrOR~OHvyQ5soS6DDZ7enIxTsyU?*YeZ*v7CV*K7lho`$lC>Kycz0809{1u((1 zPTjr-oMPhNCP4LKi$-(8Y4Y{Ok|ATYDe^!TGX|SME~_ECA+FAdv$5qcTy|F@ou1HI zPghzgk7F)WQRRk&SM95|>WAfR>ils~_xSu(Rp;oh7gtpu>oPHII#79Fau(lIg+BHt zuI3fhJ;md_)dXy!Hb{hEWlb3mt9BCCY^U={8?|4Y*q>B3wML`PJfN<+L~~8PUA^Yr z&Pk-Szouonm8@)HM5NeFA*$m?U5HEB9n}>Ag2AHw_USDfEUxYSVnRMO_=S!Ev1 zr(Y%_VKEEXY_Yaa!DjVh5aXPQq|SdM=^)V!2zjgabYG_;X_o?U~39ydva_pX;1>tUt zye-PDE_+VQDmMD75kp7oYiJ*%;R)d(jc`KT8OI)}-RQq3y5$Xjl$lv-$!*rK?}6%* z*f_WcE;@;9^zCFi9os?D~ zO=>?YyY$#4a-rMKmT!&fqww-H!b0}ndK<155EZ7r0hH$TPEleS=C}>+a{93ilp}y0owNYE`qU zt$Wn<;V z^$Cr>-W-z1zai$$6G~T;u$G|G*@aykQx|RqYZU?3F5aYaC0jtpzbZE z$<~k!s(p~Kg{b$|9t9y-f(p~t25z^qBP~qZYSXA+gGnvP+h)j78*C3aUZr&I)xg)9 z#X43dGb+ESc$o@6OWri9>dH93aA9*hu2Vz^fiW%KNTyGT>Ex}WTOJ*p9J z8pEr-cOgro^%__M3l8(G2k=(F5z#I9M@i~e&zJgt!!k;LctPLcnIO7`c^Kr&MgjH z{LwWYJMCa!8`Ml}O3eDrDPOl!U3IPbT?Fmok0~eRK3jh`q!D@+F1vluhVXTFI!nMG z-t$o9cBmlYpH=ZvvgKwRro!^Tpr zgy9c1sXY{a&wePj(rMAWujP+w!69GIdDw!un6n$|uPJj@nhE%0gM~2jnznRAHqa`UfoWwoAD3;x z6UDtAx=Tc9`hWiIyBE)Q)U^Lid|!I?;?wSz%DG?kF`|ASeJB5G zF^xRVA}Qau5Nf1vH>|F)=BDB#ow@qb!UuL`nd{6n_dWzR>juYaz-x7qrXMnbtEieO zQ)jUs`gB&dtqez%J-&G~!aec1aPE9NO2w>GjfpX@j3$Cq4w-=77#D!5M-)>vaII(BH*zo^Tww`LAWV6z)1_85 z5oDB`^38Whjrahl1^Izvy0g5WS-w8G8ufY(=$N{2HC#iRTDd#3o8^j+$!IXAB9Ue* ziIVEfi}yrV<6VX5e>tK7jkbfOR6uw*Snx4I&zf=)ZZIGU0kGP-ri=#hb=+!&&H2hW z;GDXz;cqJj4^&5cXcE_V!f62Ck{78E!qe}+r40@Lwp>g_${PuXRBL>zGCGX|hW#E% zdkRNYI7G#L^wpTxi#jPocSR|~@S06j&?=L{ETLRw2y7kUc0AxZ!|kHSViKtUq&&|s z_Nc!T&n7H|ND8$p?~I1+2n_L^>rdSL!{*D)e&q_fjQPRB;sp_cvf4v}4(cWxM*;&m zs~oB;iY~WHrTuoi(ZW ze=sQD|3BCpKHdNG7|(;;|6_B{*SYj3rvP5&H~r)vmag|H-Wq7%=~IHXe34JA7Mg#- zD}3G&9Cj+?w^=-_1nsgY;zYzO5_A#}eRt2Qi(TZ<^%8=^Grxejcst4}1dRBRb%`cGHq-Dde=|{K#D47!^ z?HwQ8*wxFJ)yJNoA4}IHUA}j&l-AS|u`W$~S+_LSSw6=aDl*>eX-!S^yf`fo^cFO^ zwP{j{;O1m0I0eeKa>Gz|>yx=|v`zC)QqD<~AhC!%J)Pyy=PaF_#i?i@6z`eN&;j)p z`mcBAk?i~I#RFV*RJ`KV`m}``j#k`pWY(oJ>0MmoJZocn zHRVlQX{BaOTpNN=ZCJa$O0s^kB6;uXUENlxHCJr@wjkFY^JY>Tb9AnK2?*pWA-*Eu z3P%n1sXW>>WoXIW@%h(*bM*Uf{^!AO{%`*0;jevXSN=KN`?c@v{r=*&-s2Y9(S?Tc z?daFOGyHwo+2RG2CnFn2vq`!*CH>9ntY(M4s4rCv(r9{v7e{2W*t-WC4%yx)KE{I{OQ^0(*DfBoL6s&7@V+gE#r-pvW( zWJc~{b;mXlU?NCm)scOI)PXzn{OYF@G#ZVL(6w@@qP^b!3zW=p0@@3mQX&wBe*DNH zg0Mh1LTow}B*`!HP8fRs?xcp6Qxyj>MuVfHeP=Lq21oA(`{U8kc<;dJAC4R!QBT1=w?(k?SMLSCFUeQq(R8NM~+G1Q|>=!YR? zlh^~L0!Sg319bG=Of-a<&o8;1QKSLBmf4MjC$Q&_rpwghH7G+ocbU)H#jm_#>^Y1wZ7zRs1m z5;ZlZ?e*5*Vxya!IsZxn7})aRs{VG&2Dw)Nab0^VuTju%ei|>tQkjk94E{Tfe0IBC z-)kGE&~NCw=g;4==<~ajeEvJ}Kfjx&pMT=?^EFOBU#HQF@pEOFewL={-+uFrQ7eCb zZus`XdA@GV-_UmzT?IQDDuvf^QwFbxUg0C=ljGVuw>B^nvvl~cARGR5mJI()-Q%QQ zpWYEKU3ErdqeC_uU1H?uW{{}T_pXZE5;~jLVQ8ap=Qx^F-B$X2TMZv6Ps{0@lvJYL z3@@W^@{F5jh4Z@zaAkYcv--9v^EjyKGO4^&7LT#2Xxk1|&x$LU@~5@kq8>x;g8+wn znOZgPK762_mfTnd|=IEymDNh7TPCy^(3$K^R&=DG48(z zM3np?T}PIkK+;F-%JI4Z<$ z*1fJMp1Jc$plOTQovFD`HOuH3=fs$K9rndrcqrn?4>?Cx7BNB*}{OVh_K* z#GJ%fnyinq30~WtRVto7n)<#zA6uIs>-@;tw<5buw8LW)w3RTHHiKd#Z5o;a#48r8 zQifMURKcs~%{SXM4iMjT8@{as*NDD_{i=t#!mlaRZ3~ffjqy~iEU{3l!2IpaNlt0d9b+tp>S3cvQ;F9)dt(>?J7nZu@zIYU|XY!Wn> z2VxV&1Lb%%2u_m&G9lpeZsP%_6Vh|ObM9US&)G&5nDb)CE_fU)J= z{|8Hvha5+xEeeTgpVOZ1MuM6c;f z^p?IvKhtlMVXf1(RnJy~eb;B>Ii1bd;bT|;>$q5oyI6`QXZW@zKQ3y^%vCX2N}czA=V*Xwsd!UDpZ?TGE_4Xb2BLrB)jX|XEos>Qr&+7y;-dirOItL_8I zzTZ)iRJ)16ceMVRJe`ud5R0v}?3}3}zeNoTLt0# zVigR?e@OgE&F7P=)8luiuYRnhU`74&ixm)5ea>q5*HCbE@#b^|4Gl016%9~mG$))^ z>ue4>JO3Z2S7+~PDQK>Je$iY%V6)n*t=?R`K0B|)+f?)XqN%Rl-%hHcfmDgB)5|w! zC&%y3F6!~GhH`$f8cucvTFv+C_m`(v@2^jy=VLh$cB;>W9W)-VN63Ugq&MaOtk&@77haPN0 zru_+@$2_0Z?m)!q!w{_wLbN>s(cyrs>4?NuCs6(^9Y90r@Vnm#?1QhQU#Tyj# zV!^W}W8M@xXUU3k?M`bv(0QH4j)tl7#>$&t4`&5~ue}9>U^A)C!@9B!TXe_Wdy~Iv zgI*`phsf&nwlbPh>#nGq%sESE^Z33;9-c02d3v_~thoP0-E+F(4KU63zw~$eqow;_ zcK1h5_rE;G^Pu;?DDL?>H^7*S5V8wS@;hMcPqnwe0PXN)`5u_Wz^u9nCj0nJ-3Iet z`}T*W!Pbl5w{-tQo9h>@jThowQ+z;;l2`DOcHiO{Zbwl&Mi6+7g zmA!nf>5+V-Me^mmguq%!6G|AG5RZi z0^QOeP%+9ABB>+3I`cr5E=78X0eP#ac$^`rVXLn?Bq|T=?VLT*Kzwb*&G_xAU{?+?cPz7kbcSN;ifp$X6s z1xRjn5=Gb-18S)!5Kp5hUrcCZot;x?=!}SDj7Ixpuy-(+j;6bNdz0Z{G#%`FzK;(k zgTdb6{_Y_;B!{~`nH=_aCwTXO`1_Ni$-X~08t#uK_z-~2nN-%zQJNV|=INy8v2X`8 zMxX60+cHQwb#EE>bHhQG(tj4pI>-xH>N^qK#bGL_{3`k{2vvsPkWtpo@#`QGVj7H5 zev|rt*R=JrlYPqM_+RRECx25-e8JXm?%(*72TKjlN;rewV7J%rC9{uE9l{ix7#NJe@doLT=-C2II7{oQEM(7_J(b^@NjQ;aCFc=`ifk*zjwHI z=nr=BZr?wc`bT|lG@STHQ*XcD9}ckR9qsMyd4v5y|KMo4JHn&=J@24DI2aH-9S-~_ zS@>XFIP488xlr*|8!jBQlZA)<{=vcU@T;!KM}ytT9vKV{CO+;Tj&`U0J@07PKbZFW z2V{u7ktA@}o9>gtec$tjM2hdpgzWBngI)jVi3=Z!3kNl_aL`&7_IraiTzIg%zdP7F zIQ)uS=y{_F#=C=qy^)WPhP(Uw!{Ny9Pe!9%e>yxM2S?uF;c$4gzjtsj+3oM*LvqwV z80-!PQ*Syr@}9Wxp}4T$8&qDc zVQyr3R8em|NM&qo0PMZ{ciT1=FgQQ!ufQtvok`kI*29u)?RMvL>@@3XV*9h5_RQCI zIUos1s7ZnaNZHC`|Moq2ksw771%JKEnD|L=CY#s7Clz42dq`-4$$IOvXg`+w>7_DAFKUqE+P1k^nV ziy{3>cWYe5#{HW-Fv340$}kBhV9{^EC`$kAbq+h-mWP;2aTJSJ7izYEb2VFlOA(9_ z12FVJ07E!KOqaU)U+;nICoD#k0h)v%4rc&|EdYK>97IDDBi5Re08PL=jw3eN+neEd zo;V$s1bd&L4?~aatxV9?4O-q3>aj`70{Uyq0_k@PxIRfdD}*s#AYKT@l!Ult0TyAO zv;v637~&970RsgP`x9P2WF(<3`kxAS$3rauLdYrn-||&U{=$xSw~b-e}EuiF>ny)K8XM!S&|2E2;w;s>z75) zMY0-2(~RHTq>QM8$(~1Cw&#-2MNuq%C?>Hd2w;0J6mdA5S>hFM7n5XIB($Iv5l?M&0Vq+C7HC7? zZwsJ`5EA-JK@E#xjHZdt`24xW@thsl?Enb@n+G630inwb1Dgl-g7^ua!6|6@jR6O`H@A=vj!S|F#@O)@ z-*@N0LGdj@A-Ljw1$uoUDX2dN-^-O^Obywkx6rqFZCgS!yH+z9aEpB(ux04VaZM$S z+c~0g)ysy<5e6}W!Knu#il+E3!^dCS*t1o2Ud@(eOr$7wJ-#kNLC>OC7xFn!}P?EIKc_12)E*cyt-*;2?jj1gTxU!V}X9q$2` zA`gWzhQ3$`KOHcj1Rg#HDJ5LSD`K%V#0fa;D$y(EuuNnz0XGOm85z~!_!m0`F#){; z2{keYNpQl1Ax|`eqR7Xt1guw3x=Q7e)8B1fd%|~(&~uh~;4Fy{&&xtbKh|c0gav-zr)DX?3X>Je(CL!txSZNz9 z{;t@BO#Tt99(n>LS|Ga2${h1Eb3$ zN+LKDV>zWHNKs`Rk(m0NP%ko#R1!mOL*_ys(bYk*jKWro75SD?XYV^noM2F5lS#Kg zzHs8XYPYa4h&@@_9g0Guss0ki?6i(8!R7P~rB?A>LcQrvV@q}G1kRRqBYEmlQ&{e zkQkc}I6PWF%oiHya#f(0hvs2M6Jh_cox~Gn4TDM|AX3CRE|=yaN*p;q&824$m=?7~ z(Xvj}qN=;vu|5fB{Il*;*%yqj3Aw_xmMTH$9+mSW&nFzD6e>^d8*=^deZ#aqyao)> z1?Ce6#cs#Y!%7&41#S*lXVL4pA?~=LJLSq@h+;0vS{!P^l$5NemM7OUnaXyEd8XSf zt?^R|Sxgf*PAF3HtQ6t-I?_Uz(hqZmr2wnuuAP^4{`9SUVM`RQTI8JZC}EZ>E4=5z zIifgS^X8VJ*S#W1l`HEkE(d#-v&^HFyT=YNW;>M-R$V+^o5QM}-N{|wJ7+*jESs+`%o`8NgXr(47 z-CV6Hq+S?4xSWeDBuH&hiwI+Ul_}|#gnXX!8O&Fe6o`3oW0A@IQ|)DP3QkmMEoulQ zZBA}Q)g#SjMB`E(o>}w)L}y6arAl#C5@Cy)6VN`tY~OPg@VDnjNj&d^nA{*?JKR8f;WN*zLL~)MaXmH z-YG4(6VOiW?Vr^Q{c1&?BL!G?i(_|Q%Gl#&B=nYlMHEdDrN}!;I6u0Q^9zTwQ^|Pb z>$i8p&OpL{aUu$A-%erJo+xdz6iUumw?LF~ej1aA_++*eGKQ393-py?(Y2J^khj*) z35%udP&3%aO6Q8?j55|FSU`&9hQNoLM2RnL#7eZ&5*;VXsFoR|gdigX>AhfSNx{#O zUo(<49n#7VUg9t(D+!8U?Tj`pNVGG81kTb>snnP#Swi-#0&OeMb_O~#f^s^5gF~SZ z-V?W1B)$@}XurZzN=CjnA?19A1~`;rGodaYP=5*Fl(#aTW2Sc_)x&9Vdq%lPTChUq zxK=88b~kNWQVV~E z7bwgaN(-o3UdAvcp#5E2D<4v>guZWB3tFugnOBbYxrnyNd=`4?<+X8HL%+Kq-X%)I zk2tpDi;v2$mjYNd9`e3W@{8?8iT3QYl_iwJP-G}WPjgVJ9$#3>2c_Ih_aaI;pA=og zZubK=VQoTO-k&AtQ$UG|KmkbH-mBZlg{_GeWNHU>!8+)RB__$5PQHwP9lSI)lAR)?J-0CRI&0CUTl(ER|`ZP!jOaj zd@^I1*TV30i_f;N1ASMVe<{9c61q}y6^7zDjI~S%GG#j_UTYgrwkq`-Th`E?v0P{s z6nYnLu?|b-BFg34t7|S(DJ==nbPp3{E)k25A}o7grL6j)D8yWxqFlP>QW^g_0S8?b zD3ryHp)eMa#oC0UcEdU5O6wAc3F{=&DKg^))K^8*h%H%+f|T`ZCGMp%+*Du|vBDG3-sAZ9JWLf{-W3$hR9u-c0B_%1Y2y)}E4R#+ z#U=nHmdi&N`c^L&ik}$@;vg~j&3<~BjicrW5LRXR5T+ig-)RYy4-yL7%g8Q-(1a**k9_E_JaSg*}#@Hn*#gg=sjR)7NAf^lmBw` z-g+x-dwedg0(^ITwGG4>TY-4=iL-($WuH4z{*LCr-=)CeCtF+Rl!rlLF0aSTU8i+ zZH<(FG%KzV6Yw3bhWmrBnAGzl4qX113E5%hh|p9{G1hZ)*+$IAA^K{8d}lJzHx zUgx0GmCX=GNyrq;L`0B0;JM=a`-72C>>_0?mo;r8PNSTK$-^J1m})d#NrMHre-I}< zFw)Mqz-s4A>hin~qQC+O3v+&(4cf0kd*-q>-+0wW64y(E`_0Y*o+YE=LHG%r9B`d zv68=!ez_`zqU)G&lo*k9Noh?bFl60gg5XmLQQHcqqkT6;mGI# z9oima6+kIE*HgVKxrbgm?LN3g=td6u7NgeqS{?LT zg{BHmKzq;y-7ff!|0lS<5^YdwXyYR}PXegI@v{R|A__*YJ8i_}?^6L?#&UZB4#jpY z8Q&Z(kP?Y!b7^}M$0bz2nM(p;Iukb5cWG3RAwXpSxzZ(~>&$hD-4N{N3qU;V7IeWNWp#Agg9*<@gz`BY7k` z{yNo5uZltL&8>NX%U8%8+i(pHC3r7!>>_;~r=l$&4@&-p4- z2Sr|{Q3|}HM4Zw=UTdDcq)HV$72Zk|lJ0H8ws@ibdE!bKa9 zg`U=u^Ie>RRc^z#WPvqx;xGYr0@}9n^0c!6B7LMtE~Ff6y6|9 ze6nDKJIZC-VGFmDKVgznQ;ajY%5rR+Mz1;pBC8*#RWC$Mxqo?%*j59W#v=GW@Co7j ztu~VZ9LA&t4CLAtEvt$cP5yUVgA^-BO4ou&$$d&eNLH8!kUu26TBo^)9nBn)2t&EF z_gejtKACmL3C&0Pk$iv5ndjFzRaahB$1*OY&V_h0Bz{kSEY$ z3PUDsUG0K(O%Y?B;9CVFi`!&sp2zLyNHLv!s{l$P8HO^Fp}KTcXhA*vT+qc@;HtC) zt)oDs7kXlvs^IZ0bN)5^^O1O)+9==+ot!qhmvt&H}zON3r~6h;^$_ln3TA+bcLzhO-$( zGnMm0S*m|JVA*(!;wvaS;AKr75E0;vLKp4Ht=r-|dMN(=w8vYz_d>y!hZ`&ydg7O* z0yTxnQldK21e)}x-KKb>vXWGFAOu&ra?QH%TE$mpamYCsk`KvHveT(hzw{X@CCXwZ zfV~D#!og;wr*f6d5tt^vFLyEJV9|+_L{gKhk`}I~tWlt@N%j3G6s>Gq5%JnUZq8}4 zr!2&te-%y)iV4N>61YBOQol$gwTO5v{r#AKKGO!O@{0MBOA+xd$}3Yds!N7W$&J^I zl9VF>70i=GNa^4)qinBORz>VEER-gAS#w;@T3YTgUtB^ls-r^X^J>rn1o7d#4L}e&84VJrpjn-Pr(0` z{bik=SY&F&bCezh`o9hKoav@TE|_opBe3Vy{BODl+dDhIetXr4@8T_UjIGQ6*dO%^ z`QJu^@$fnS+haV}1S}Ahhk{_dn%EG`VS2FmHQx&+trie2IXCu!Wu?IvKYacSI+w^t zkfF|5dd%YMS1?1d^eR|BXu~M#Twa(jh{j_@Ue4*2@D{rD*o|D&I}^>5FS zA0f&*akNz`$TjPKzdzb9tp9O;y#KuZALIG_dG9;0z`;c9EK}^Gcp0G|_?`*fIhug) z_P%~?@lvg~cagA&7Pl;sFSw=3Svu^laur)yIia0(WWr(2GC=2NnS7L&JlAJOzwj+C zbirsKe&Rq`=-O5W427QfEh#-#X806`JpJ}(0(~xRcp`BT$I)s1f+TcNKIS-hdl+z# z3loM^WN;R0BlBZm^<`m1QjwmCz0h+{npBY#6yD$@rzUs!~nYRv{86%ta@Jk%Je&Vf}4xLwN z_vc}X(E#=2mz-8z+k}XCji@&VWYKQknl@L?vqr7h8Je^!CvP_z4^xTRek4q2>*+N( z1?R*%FBN3Dh%H%4sFlrH#LKrU*N3@$fj0B8i`u%N9CKb5eEm8BpFe{?2o6E}bz0&J_%k6fGNB0`WPl7f zF&RLh9>GFIu9C?QGG|HQqavIo&QF4NmN-9a@>jv-LH+zDt0YMJRj>8X?dm9bSAwR2qkp1I-I$p8KQapC@let-0w z|NU{E&!0{CkUG%qDAUr{uPyU(2=NIf@tjcnNhUkEIS>l`qSxX~ZDM+7S^ z|5`K0vk;(!0O71t;c9mRCkFS9InB}3CpvaPsm zs3>9-I&q~>iao*jA96hOvFPK=h9aD-Rylz8mgkfTkV>_ChWM_|i&6xj&q!(^RN~)% zn|2@tNd&#Z^;RONIyDbA9LB14aN@poH6$kB`10dPnzu0*ktRbOn<@Z0f#TX0Xkry* zFS6u2A@S649g&APi};esej5=YU^L|4dJ^zP3;F=M!%T3li=U5K2OR4oPzwyfl}d$r z)pT4VE-kSbg|R%v?fMWG8Fop(2r`@NOskpo)M|_tZpzZ?_!!7K!f3wPdL!(Lgh+IT zw+vx`U3rX=vvM5HHtUtT!P-GDAcv*Bpf)P-LW&JC>j%T1)Dgqk!_$k$$RJyxupx=jB=zrE3+qWe~QEu&Gy9cN>v?--OmIaYd$LmkC1ib{+RX1aexqmFRB zS33&RAZvv_reAhKy@X0f^+$0}qa@@&wjin4$1@b0H)E_SDkAy5%&6Ls)n}PAS6GNZ zsT_b8CvR8>e3Xk{<;ajsOf+IoHERW@O!ZVc>9cz(sHc|yYct1I-k-Jnf6yHl&wq@E&*wiL=TTx7`m-Ql z$;dj;&PUFf8$!nRb&+yzU&m98n8@aQ;J^pmTB`@B8Hq?_g^b}J)}s>A|x{Bs7&*0B5p}$I(>u8 z-2r2F{@&>QUG@JaU6EdFr_zdK^FzSP-_&6osA;HY=%XaUNz9T!siHYiQ=VP{f9+f= zS~_naLn769yP&$ZUx5zz0@xh(ha;8*845E*U~8nM@lj0($RC!;3-(9GJu1=&5|e+z zz^^Kk?$-w;=V>HPKR1bXH;p!#Nac-|)4a01>ho$-R~oAqmiWD*jcj4C5)&o6SzW!c zG9F=`n=^Vyr)o3wFY&6QbGL!7U-wErMucH;IljO2#xUK{ObDM<=ZR!{NnB9(e?SIElK!z zd31exerBJ)`N!Mi>mAZj(pRNNNi!RMNgrKbp1*(p_RMG8B z!09UPb5b=QkaB6UN-CS*O97Z!txD<}pDVUvbEhjeyNO|2%?W3k?5Zl>TR*SU|ElGg z`{@|#?Ek%@{lDMu4@b}X-(x)MHr#VH2ae4-aC~{P;tnWeMqBjSN{=js@a!shXmz!a zu$hw?`QT-NUF8hxQb{q*eL!9Su%^1OrROT|%gO=#gHT(gsjw4i953UV4J_#jWYz_f z3Wce{m$9ucWMvcDr9Xtj6Di|mf_U4wL;k)Cqjsb+pF-Jir77BZ(`u!+nwxHlK;!g| z-zqSxo(WYof3ss{{c>l7f&p)tO{hI{qiO)F&WDr$^9qeR3Q8Rg3W_H$@T;m^@GawfA9@Hb@HFdyDZH)Ex|eO zB?YdF|LgTe1^I8#A3WRtALVJdf0~k>x=9F!Ga~}fL(HW(l1ZNb_K~6Nz=b|t#IkH# z@+6uLt=CiUZ%Sg!QSj`1C^#S1iz-bd@M3PTS8{vg~^Pb!yssXoVK5?LbBGa4c z#Kp=~)RQy)nWz6dKXv?HiK|;i|25$MgTYGv*U_{7|0qvsM4w_-&#d>c{J!xrLTSYI z=|xMLkkg|l#x>URS}Wobe*&(LFT|Tz*lI4!VtLo`CT_Xy$M~tI_Vd%=X~6%Labxps zU=9E8j#l#jbw|Tz`TtR#{P~|kV&L+VK*eoB9|GCoS)XUyZY_V_;Ypaf^)GIhnL-zb zGs`#&ct7R8f&XWJzo`HBhtKlg<2;q;|4Q#HE3$$ul7g9ww;D`(wVM?aOI&T4iy-;0 zTJ;+Vq7&)Bk+*`Xgklep9_-=M*t9ImdcxUM$ zo_NwMFuHx7G@DEs-gA$|uqx6;{WlyqUX}kkd~)GgNGRG7j&=Iquvf_c&>Qx;&-vdU z(QV?;xd`b7@AOcLcJ*!OTa0}*s@;0&=&>jk);V+L3f3G)^5qB*Ky!Y>$^@IM6K`szt#)zGo+X#44j_4Wvxy`$sfp#TOI5nxF^d| z^2fg;n^;}{F7+xx|L(2$si%JZkGg~Lelh>ce)swO|D!zl^IxlZS`Dd4e&l7_S{R=8CfK`5fV&C9)~gn|p11(830FcMyfxcW{$>ewUh4Wc$qF{bAkq_A#@ zGeHe$5oHDHpAMLrj!s^r4xFWV>u)Vx#++3qG7+_B`zbk^P$f%SSdp>>)jIW(!{6JdsE8JQn&h=U{mVG=lqa)Q%5iDDNorcqo+bbvz} z=ZMhc9TjGrQvC|hG*6PoEKI^{93U3MAd)MQ@F z6r;Y4&xHu&RTPDet?mc`je2&GMXrK`l)~l8w=nU2==dfNG#?zJpafz~PXJ)@qbg!b zD*}C4-~_a1bC>e1P9=cf6R8ZX-f+_I^sMNxU8q`-(7X!0Lx_)HSdG7=GYk|9=woj~ z1O{jDP(%?QIByd|eE4Z;%M6cc`1ppc)t9c9V2NfrMjeF7HVXdwZFk zom97P(DGi`DpTX{v?l_1mu-Yqkn><8gzpqK@>$0(`^9{SKu-f+W`s)UD{mIKrFUnBB$$4Cl6#gRQ23+{WZkP})lwD6jiOC%Lqu)i2!4ytimYdGI1r9?c*}B2{c%|+pJ8%%AjxO$lJOPdcCqPknyg&Ml~#=Djqdm1-vc0 zjR@CiBj{isR~3KQVbeA%j|32J--!xb$0siI%Z5(lE2bb?#aFpWHy1nZMSMkl7^R$X z0)(1X)2ht!x2vACgkQW2rLe|}8B~&Os|@Yqbf^rwF!d@A#;9Dm+6bKJ%3>DW;*bI?OHv07)^O{=7>q%mW8m?eV4DTOSii5n*rNu4B@7h#k2Ujy_> z6`mU2T<&nlKl(Dh)R$9Uh|AkIsJtDrgjPSQOV!IZ^2vy)F4IK3SK4kRv%d!%qhVXa z;cZCh1LP8W?ML%BZ}jvXG@xl^&;#8X`zRm2hK>O(Iq^xt) z*YnG=k5vhMwjHP}nl%lIDMKH5jue)sga&2apbgPlpOtR%)rvf)6mvo36CNT&xk%w9 z9Fv`;ka#%DU6F{GM8qev<;Kc`*%|pzr8!}7m7>P!K;Z&Y5(X%YGe6NrG!&t&*BEL+ z$+&L;NnU;UFsp}95Ao3#sWNNUQ3NUUeN<{W$eG60!K+I3wP`=`Ep(6>h36y;9&logQ@cV0PS(b4L%!N+KLjA(#E7$bW|xdvY4&bueNRkt2UqVk_p!%$>=wCZ2WA3;Vd5AMVpLIUR5xv2o_f`B7QIlUwshdNJ>}bY_dxK*87RU45 zX_{4BS_Upi!*zOdrj3{j{oOcrDzq|*mnI=(y#F?Hs~A9JFzOairrU$aZXSKO;aa_P z`(btrB~>8|4Vnt{fshIK+yDFWH}Cu4%WvNIFMsR&=6&wH9(;ZE_g8=Y+nNzAbtIYO zsbGtzBd}Ype`y+3Ovny<@g@4r`~KD6Q&PWw^>_8^*S8nf?>_wWJ8nStu-pBB8xX$J z{@o4fy(-cJc=u#;g5&TJc<`^&CiB}Qs$__Ow$48XK&Ax>=-Wjr9`J@s~B;+IELV65@LX(x4b~bSP zr5$Nt+Etqd-3m-nq}cU@95li9fa6t2OI;3pqgAY&`l(Xqw=@h#U zYJgOS1Z$MS_f-)~=A^9wqvnhkvYi^;Gn3BeRMGp|`7Bo=Ux=lq9KB}H47$sQq$x%) zSWk|gUk^rz#WCEghthTSz+I#$Ti;LSJq6{6w+%K_*2jP(;bsl2fF+I`ZQWyg0gBd>e-vbK{kegu-|V4!6!4D4QwZIZ#ML2-9q1npKNWSR33$mLCx5< z#BAQ2;=Lo~RX1V?dC)felu%Ucv(4Q+$Dxb8J%!y;Q-9Ix9Co^847xz(jF6d+Y$IHIYo=Df@CR`! zkGkHo8}f~`8Z_@)vT&7?_Kg@T3&cf~EU>pB%UP>dz)v+A#mud9VX?tFWuv@Ap?z$? zc^_hovpySd=DA*lxy8=63Jir_MDT`N@hZ421i)2bN|4R^a942IPBu`{Ty^wMn6!2R zR0dyd%FPQ)^~-PHy?VJPm*{Wo`@*YNpZCA6HIomzpxXuC@&AfbUfrEmPUMCzNhg`v z>T0wHHYDkrkJS8n2yDhZapizF>Lf+K$QmqTa;8L{*L?WnBFZT(PBgl7`&fp1;=s{+2S;Oc>JjKh>{q&G4isOKLHhMj(b`_=1DLA=28;cRRu(=QkNl1rn}G+B*5}eCwbyK zWzbvW5}>LPMOY48+xsUq`w&ob`~yaKZ`GSv zyri`p^=9VZ2;1WNsG2r4vK^+kPvswd@Oh3|%#}bC#^u@B?uo9#R4L95@DcTKxEm~m z0?dW}l1>14QJ1%Divf`c#8lf<*-#*!J|d^oZf;Qbtwz)-5;wPKDFEM+O{P&qUY_o6 z#9))Byq0j0j*0G+M<W`Wc7{EK*bL{NH_S?;%H!|3QXBpb$|(&ItJ28hbqiyiCXcJ2BAuHZB^$Ah8znh{ zJ_y-qW16JswLMu9PL8sj+%S^f`l7EJY|^~rgi;j7fGtB;EoVOT*_2LCxs)_e6z}NH zP@(Du`lq||g!g^=;sLHY$zSnkeA>YcCu{CF(fd*nc8PdemB!5i<=nz7VX)7&jh3Hs zOhP`@f_%1BNY-@EZ0wt+Tdz-SCs$C#ClPthXMV+Z+59VWt(eccEOvFd>((lCDQz1= zkO_{D*QDrN?<#GSo^XvvwE?+iXV;Tjo9A%j?ECUziL+s+i}WMNlMT3pVa-Jdk9NNh zSg{Oz`L$;q{{EZyrT3fnoA;&vYuDQ6fA)vJcCF#>uYT)1ZlOI@sL$UHe(hTQ-&gGt zu3vgsuy!`ou?4Fjcp05lZ)KOYHgorE8N#@e7|orthG1%{FY1 zUO2Q7A+eU1c3?OAwQC*z{{1WKWmnAFFTG#8z5egn-@o?yzl$<_qV|4&_3L%~`%C^y zzT}g8@cXODOEI;@yWAgNM%`C0f9ohLe}DP%*YB;e`bPCC6Wt4NJx73|8M=$)<+z9m z+1?X3hT}k}RRN5_%gY~+!C){r1Xt4f2!@@}D-h3NEW{2x#fSkY`tcJ95r7Q95RmDV zp*XvRHzwfY^>GC)Z)I@81oRFMM^>+I^$xFlqsicKG8|jogGs3uo>x30G3R!3%z$9b zdeNE$l~hftX1_Xj2a*J@`rFq`hs-{Ev3vKNJpORHvAZgOcPDR-xAh`@!#<%E;q^hB zIyLEuKojX=ecEDqA=o-8s8)b!mK_-YH%jV0HyG3u--iAh`AFUOVMy7=jUhzFrOT1&~XkAzyyK;LsztyR~>WvFQ8;zI*xd0|~!eC+N#B z$oq0VPrm#}@s}$Yf4NG+SCf}gt^C6E%)kHUX^oWs{8IDnmGwYye*@o@bfoYy$b?l# zb@{3udh-s6hmI=m7}`PuOq182h}`v8Y3lk@c}W&yoH3NmE z_HbF`7U9{v3PTfFI>S*X#WoV%n+oqh8d2WfaVEs7HS8k#I-|LM*4V}K0N1uhKI<>@ z(T@e{?&`@(r7;rgiZ<;~`K-C&CVLvIB=XVZJ_vAe?MOg9HE)L^CSrm32UA0+I&${jR-kNE?)(=fQbcKB6#)MuY z8WjEW@>xGiSKzEOZ`F_S+Hrl}XrKAjGrv;L^G5qTasN#wZUdKE{l1yH(u(feZ}bER zSK2*i!`*v_*#vw-B9R(>LoY47vwsW6d4r7blD_* zdd+o2KB>P>cc-IS%U16LZhh#?GIZyZgd|~GO!guao8xmgyrS9!Cho*soAk7L*y6bM zTy=THhPQUh#sEdm=&XQ3@A15ujiNn%z%Sjm@p*beSS(kw#O6_#SW&m?tv?VCaE4p;R3BgkgDbu7n$smpDDgV$U_anQ6KSy z3_uY15Qka?;f)b*r}z$emN=PF16S8d7;g)oadHAN1Z18@#3tbFYjE)zT)zhIUV{&> z!A(b#Qv(?Ki~zloBHp!p%;Q@ExVXN6J_=(F8ove?_%*o3ufaR~8hpU7!B6jr$E!_h#xV4p-9~k7dwOlgwyUq&B<@t)3c$Mb zt`z`Ch|Z_0^{h3fCZpT#UDxQc`{OmbYh`xO@|4zF1aNMAWZk%bX63xTE~5_+RD6y( zw;tey&M-(q$jDAAPjX}6@i>gdlR$NV7#o8sYE_R~9 znyT~c@M-$?&jgkw(NDkMVHTI0bA*n!F==QzMOA*%owV$X$VkF!X35LwLn}3fE<_ys znxfgfyFxArtHYA&Hr#}vhc}E@T!ynleXA;zVQu=Fnn;H&T$mPcmJwu(`sMT30&o6# zaddTc`TnZndq~znI6GelLnIbMo>TGp`10-1_1lv-l@zS0e|EkGf~-$T#r)M2T%Nyw zyM~4u7@CS2C^(!WipwP-3!I+)KW{HjuPZ62uYGo2U*9LQ%KKp6pT9djtHfJZ^X$B? zuJS|0WiEYL;_~gq`_tp2>(ldU{Oh5dov(+J-Wyc${p#bz+sltvZ!at9SO?+kyb6Y3 zJHOy~ei~l*&_!~Ozf=aG$F#zfGLe+LZ;Y-*?YZF1BvYMD(tPU07)+uKGl4J_A^%{u z*yeHUj~RvEEbMoE$Zw-?-==}S4MKby$KN&$>%B)nZ@oaL9}Aoi#Lh@8B+~}PYb4lw z!PB}Z3SH=o#B0hmi%EWe_TFYmD1@&#^ zjORh~|I69)G&ca~MA&J9`|J(?^Hb$50D^Y$W%V9_Si>y42_XIWP2C3YpPl`CWw6y& z^eyH8ZjyfcN-N9PbuP^cQ7dQ6Ykz=|$c`@^8zPPmGDchsW8@hqGZkN6gSr|f|4631 zJo$WGia0F+Bm~?0P7{a;aF9y^lqLJmuIVld?BC2Tn6>l~`~TbR_1igN2*?Y{8Mwv1 zFGJoO#HmA`4539Umts7`fP9ctJkF3*Osgjy5}8i$c1|8?Af8$v6G`G0@BKYW(|ALB9Q|3$B5T;RPjGo);qtI*d%eEO=_Iq1l@%KbC} z?S8l4x4I*%-@WejCd2V$IOuc-z5f1iv_Jm7+n;pRX~D7^pBOk-_!UGZ7`KdTX6C(6 zis>;xlQ7Ko5*!*QF(ev1LoA+v>3BSyLa&bw51eryj`}?`9QMcE-q4+ny5qya&>J9c zbZ{{3bsf0xjQXSf!4SI6;b_ovhSIS%CtOz7f!Q-0&l5*n_AUfQkL<0gGC*2ZZwd7> zy+M^yf9A?s!1YPuS)s`2t}Do+{OT_eTq%Bw)P`oJNDH6kh|o_&fz4 zYzp?ur(kb&3ie8;V7Ji}Jm?)99E^rfI0Xj~^#^@-+U*{q?jeMI==FMTZ`|8I*mu4D zwC9ZbXf$w#hvUHz4G*Rc>N_Lk9PIa}`|iQ$c?v$*6zrBy!EUoDIBv)VN2C4m_({3o zxIgL-M*|1BU8g%dK%>ziL?g$YPP_g72n_~Pc!*qd=;>{4xApG_6`u5I^%=U zL2o*6hF*6#_J+{wb%&!N+J{qT?2d-hDSDoP4>ki!nc%o76C8C0jb>nfbl4w{_McJ| zgx!Pb;bG62_6P1E--P!a7akrU$92#E^{22mbP#lUBd#S64i5*1`-j~jf(RWPI)i6X z@S&#Qs52;=f^udxnu3iK;(o8YKkSeDPdEj=gM-oZ0Co??hc4`ny&f9&_eThg9d|e! z_qwR(9*q0b!Qpt^Kj==;{^8JbMpL)n9gg96y8k={A8ZPiD#W8Qg}8hQHWCGUhx`45 z(V+K)Q*hsb!^3gk_4W@&o(o~0DgWFt00960CIm%I0I~r9lhpAl diff --git a/charts/postgres-operator/values.yaml b/charts/postgres-operator/values.yaml index f45275a4c..d66aa5608 100644 --- a/charts/postgres-operator/values.yaml +++ b/charts/postgres-operator/values.yaml @@ -1,7 +1,7 @@ image: registry: ghcr.io repository: zalando/postgres-operator - tag: v1.14.0 + tag: v1.15.0 pullPolicy: "IfNotPresent" # Optionally specify an array of imagePullSecrets. @@ -364,7 +364,7 @@ configLogicalBackup: # logical_backup_memory_request: "" # image for pods of the logical backup job (example runs pg_dumpall) - logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.14.0" + logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.0" # path of google cloud service account json file # logical_backup_google_application_credentials: "" diff --git a/e2e/Dockerfile b/e2e/Dockerfile index cfbc9eff7..4ad55c136 100644 --- a/e2e/Dockerfile +++ b/e2e/Dockerfile @@ -15,7 +15,7 @@ RUN apt-get update \ curl \ vim \ && pip3 install --no-cache-dir -r requirements.txt \ - && curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.24.3/bin/linux/amd64/kubectl \ + && curl -LO https://dl.k8s.io/release/v1.32.9/bin/linux/amd64/kubectl \ && chmod +x ./kubectl \ && mv ./kubectl /usr/local/bin/kubectl \ && apt-get clean \ diff --git a/kubectl-pg/cmd/connect.go b/kubectl-pg/cmd/connect.go index 2c6d87835..a7643ca05 100644 --- a/kubectl-pg/cmd/connect.go +++ b/kubectl-pg/cmd/connect.go @@ -23,6 +23,7 @@ THE SOFTWARE. package cmd import ( + "context" "log" "os" user "os/user" @@ -121,7 +122,7 @@ func connect(clusterName string, master bool, replica string, psql bool, user st log.Fatal(err) } - err = exec.Stream(remotecommand.StreamOptions{ + err = exec.StreamWithContext(context.TODO(), remotecommand.StreamOptions{ Stdin: os.Stdin, Stdout: os.Stdout, Stderr: os.Stderr, diff --git a/kubectl-pg/cmd/version.go b/kubectl-pg/cmd/version.go index e9a1e8056..23cc55422 100644 --- a/kubectl-pg/cmd/version.go +++ b/kubectl-pg/cmd/version.go @@ -65,7 +65,7 @@ func version(namespace string) { operatorDeployment := getPostgresOperator(client) if operatorDeployment.Name == "" { - log.Fatal("make sure zalando's postgres operator is running") + log.Fatalf("make sure zalando's postgres operator is running in namespace %s", namespace) } operatorImage := operatorDeployment.Spec.Template.Spec.Containers[0].Image imageDetails := strings.Split(operatorImage, ":") diff --git a/kubectl-pg/go.mod b/kubectl-pg/go.mod index 2e3ed3cbe..9a2faed99 100644 --- a/kubectl-pg/go.mod +++ b/kubectl-pg/go.mod @@ -3,72 +3,69 @@ module github.com/zalando/postgres-operator/kubectl-pg go 1.25 require ( - github.com/spf13/cobra v1.8.1 - github.com/spf13/viper v1.19.0 + github.com/spf13/cobra v1.10.1 + github.com/spf13/viper v1.21.0 github.com/zalando/postgres-operator v1.14.0 - k8s.io/api v0.30.4 + k8s.io/api v0.32.9 k8s.io/apiextensions-apiserver v0.25.9 - k8s.io/apimachinery v0.30.4 - k8s.io/client-go v0.30.4 + k8s.io/apimachinery v0.32.9 + k8s.io/client-go v0.32.9 ) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/imdario/mergo v0.3.6 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kr/text v0.2.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moby/spdystream v0.2.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/motomux/pretty v0.0.0-20161209205251-b2aad2c9a95d // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/subosito/gotenv v1.6.0 // indirect - go.uber.org/multierr v1.11.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/crypto v0.31.0 // indirect - golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.27.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.5.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/text v0.28.0 // indirect + golang.org/x/time v0.7.0 // indirect + google.golang.org/protobuf v1.35.1 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/kubectl-pg/go.sum b/kubectl-pg/go.sum index 65d7acbee..2bb48c85a 100644 --- a/kubectl-pg/go.sum +++ b/kubectl-pg/go.sum @@ -1,6 +1,6 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -10,44 +10,42 @@ github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxER github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -63,14 +61,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -82,151 +76,128 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= -github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE= -github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= -github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zalando/postgres-operator v1.14.0 h1:C8+n26C8v6fPB1SNW+Y8X6oQoEHufzGJXJzYPlix+zw= github.com/zalando/postgres-operator v1.14.0/go.mod h1:ZTHY3sVfHgLLRpTgyR/44JcumbACeJBjztr3o1yHBdc= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o= -golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.30.4 h1:XASIELmW8w8q0i1Y4124LqPoWMycLjyQti/fdYHYjCs= -k8s.io/api v0.30.4/go.mod h1:ZqniWRKu7WIeLijbbzetF4U9qZ03cg5IRwl8YVs8mX0= +k8s.io/api v0.32.9 h1:q/59kk8lnecgG0grJqzrmXC1Jcl2hPWp9ltz0FQuoLI= +k8s.io/api v0.32.9/go.mod h1:jIfT3rwW4EU1IXZm9qjzSk/2j91k4CJL5vUULrxqp3Y= k8s.io/apiextensions-apiserver v0.25.9 h1:Pycd6lm2auABp9wKQHCFSEPG+NPdFSTJXPST6NJFzB8= k8s.io/apiextensions-apiserver v0.25.9/go.mod h1:ijGxmSG1GLOEaWhTuaEr0M7KUeia3mWCZa6FFQqpt1M= -k8s.io/apimachinery v0.30.4 h1:5QHQI2tInzr8LsT4kU/2+fSeibH1eIHswNx480cqIoY= -k8s.io/apimachinery v0.30.4/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/client-go v0.30.4 h1:eculUe+HPQoPbixfwmaSZGsKcOf7D288tH6hDAdd+wY= -k8s.io/client-go v0.30.4/go.mod h1:IBS0R/Mt0LHkNHF4E6n+SUDPG7+m2po6RZU7YHeOpzc= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +k8s.io/apimachinery v0.32.9 h1:fXk8ktfsxrdThaEOAQFgkhCK7iyoyvS8nbYJ83o/SSs= +k8s.io/apimachinery v0.32.9/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.9 h1:ZMyIQ1TEpTDAQni3L2gH1NZzyOA/gHfNcAazzCxMJ0c= +k8s.io/client-go v0.32.9/go.mod h1:2OT8aFSYvUjKGadaeT+AVbhkXQSpMAkiSb88Kz2WggI= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/manifests/configmap.yaml b/manifests/configmap.yaml index b757c5392..2c0ba9151 100644 --- a/manifests/configmap.yaml +++ b/manifests/configmap.yaml @@ -86,7 +86,7 @@ data: # logical_backup_cpu_limit: "" # logical_backup_cpu_request: "" logical_backup_cronjob_environment_secret: "" - logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.14.0" + logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.0" # logical_backup_google_application_credentials: "" logical_backup_job_prefix: "logical-backup-" # logical_backup_memory_limit: "" diff --git a/manifests/operatorconfiguration.crd.yaml b/manifests/operatorconfiguration.crd.yaml index ac8b01d22..6556b333c 100644 --- a/manifests/operatorconfiguration.crd.yaml +++ b/manifests/operatorconfiguration.crd.yaml @@ -508,7 +508,7 @@ spec: pattern: '^(\d+m|\d+(\.\d{1,3})?)$' logical_backup_docker_image: type: string - default: "ghcr.io/zalando/postgres-operator/logical-backup:v1.14.0" + default: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.0" logical_backup_google_application_credentials: type: string logical_backup_job_prefix: diff --git a/manifests/postgres-operator.yaml b/manifests/postgres-operator.yaml index e3f77657e..364cbb6dc 100644 --- a/manifests/postgres-operator.yaml +++ b/manifests/postgres-operator.yaml @@ -19,7 +19,7 @@ spec: serviceAccountName: postgres-operator containers: - name: postgres-operator - image: ghcr.io/zalando/postgres-operator:v1.14.0 + image: ghcr.io/zalando/postgres-operator:v1.15.0 imagePullPolicy: IfNotPresent resources: requests: diff --git a/manifests/postgresql-operator-default-configuration.yaml b/manifests/postgresql-operator-default-configuration.yaml index 72e5b7c62..389d9325a 100644 --- a/manifests/postgresql-operator-default-configuration.yaml +++ b/manifests/postgresql-operator-default-configuration.yaml @@ -168,7 +168,7 @@ configuration: # logical_backup_cpu_request: "" # logical_backup_memory_limit: "" # logical_backup_memory_request: "" - logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.14.0" + logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.0" # logical_backup_google_application_credentials: "" logical_backup_job_prefix: "logical-backup-" logical_backup_provider: "s3" diff --git a/pkg/cluster/majorversionupgrade.go b/pkg/cluster/majorversionupgrade.go index 8b671023f..b80cbaa09 100644 --- a/pkg/cluster/majorversionupgrade.go +++ b/pkg/cluster/majorversionupgrade.go @@ -16,7 +16,6 @@ import ( // VersionMap Map of version numbers var VersionMap = map[string]int{ - "12": 120000, "13": 130000, "14": 140000, "15": 150000, diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index 3081a3d01..5cf1d7e40 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -180,7 +180,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur // logical backup config result.LogicalBackupSchedule = util.Coalesce(fromCRD.LogicalBackup.Schedule, "30 00 * * *") - result.LogicalBackupDockerImage = util.Coalesce(fromCRD.LogicalBackup.DockerImage, "ghcr.io/zalando/postgres-operator/logical-backup:v1.14.0") + result.LogicalBackupDockerImage = util.Coalesce(fromCRD.LogicalBackup.DockerImage, "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.0") result.LogicalBackupProvider = util.Coalesce(fromCRD.LogicalBackup.BackupProvider, "s3") result.LogicalBackupAzureStorageAccountName = fromCRD.LogicalBackup.AzureStorageAccountName result.LogicalBackupAzureStorageAccountKey = fromCRD.LogicalBackup.AzureStorageAccountKey diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index 886da7173..9fadd6a5b 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -127,7 +127,7 @@ type Scalyr struct { // LogicalBackup defines configuration for logical backup type LogicalBackup struct { LogicalBackupSchedule string `name:"logical_backup_schedule" default:"30 00 * * *"` - LogicalBackupDockerImage string `name:"logical_backup_docker_image" default:"ghcr.io/zalando/postgres-operator/logical-backup:v1.14.0"` + LogicalBackupDockerImage string `name:"logical_backup_docker_image" default:"ghcr.io/zalando/postgres-operator/logical-backup:v1.15.0"` LogicalBackupProvider string `name:"logical_backup_provider" default:"s3"` LogicalBackupAzureStorageAccountName string `name:"logical_backup_azure_storage_account_name" default:""` LogicalBackupAzureStorageContainer string `name:"logical_backup_azure_storage_container" default:""` diff --git a/pkg/util/volumes/ebs.go b/pkg/util/volumes/ebs.go index cb8f8e97f..45850d55f 100644 --- a/pkg/util/volumes/ebs.go +++ b/pkg/util/volumes/ebs.go @@ -88,12 +88,13 @@ func (r *EBSVolumeResizer) DescribeVolumes(volumeIds []string) ([]VolumeProperti } for _, v := range volumeOutput.Volumes { - if *v.VolumeType == "gp3" { + switch *v.VolumeType { + case "gp3": p = append(p, VolumeProperties{VolumeID: *v.VolumeId, Size: *v.Size, VolumeType: *v.VolumeType, Iops: *v.Iops, Throughput: *v.Throughput}) - } else if *v.VolumeType == "gp2" { + case "gp2": p = append(p, VolumeProperties{VolumeID: *v.VolumeId, Size: *v.Size, VolumeType: *v.VolumeType}) - } else { - return nil, fmt.Errorf("Discovered unexpected volume type %s %s", *v.VolumeId, *v.VolumeType) + default: + return nil, fmt.Errorf("discovered unexpected volume type %s %s", *v.VolumeId, *v.VolumeType) } } diff --git a/ui/app/package.json b/ui/app/package.json index ef24834ca..ab4c65c7f 100644 --- a/ui/app/package.json +++ b/ui/app/package.json @@ -1,6 +1,6 @@ { "name": "postgres-operator-ui", - "version": "1.14.0", + "version": "1.15.0", "description": "PostgreSQL Operator UI", "main": "src/app.js", "config": { diff --git a/ui/manifests/deployment.yaml b/ui/manifests/deployment.yaml index 3b3097416..41b940891 100644 --- a/ui/manifests/deployment.yaml +++ b/ui/manifests/deployment.yaml @@ -18,7 +18,7 @@ spec: serviceAccountName: postgres-operator-ui containers: - name: "service" - image: ghcr.io/zalando/postgres-operator-ui:v1.14.0 + image: ghcr.io/zalando/postgres-operator-ui:v1.15.0 ports: - containerPort: 8081 protocol: "TCP" From 2c57498e43f2742c6da936b1d02af1839f70c5e3 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Wed, 5 Nov 2025 16:28:37 +0100 Subject: [PATCH 15/15] skip db user actions when its secret failed to sync on update (#2969) * skip db user actions when its secret failed to sync on update * need to add new pgUser field to e2e test * lets collect errors of syncSecret so we still get status updateFailed --- e2e/tests/test_e2e.py | 3 +- pkg/cluster/sync.go | 61 +++++++++++++++++++++++++++++----------- pkg/cluster/sync_test.go | 20 +++++++++++-- pkg/spec/types.go | 1 + pkg/util/users/users.go | 4 +++ 5 files changed, 69 insertions(+), 20 deletions(-) diff --git a/e2e/tests/test_e2e.py b/e2e/tests/test_e2e.py index 4681508c5..f473b5cc4 100644 --- a/e2e/tests/test_e2e.py +++ b/e2e/tests/test_e2e.py @@ -1003,7 +1003,8 @@ class EndToEndTestCase(unittest.TestCase): "Origin": 2, "IsDbOwner": False, "Deleted": False, - "Rotated": False + "Rotated": False, + "Degraded": False, }) return True except: diff --git a/pkg/cluster/sync.go b/pkg/cluster/sync.go index 6bf8c06b4..a210790b3 100644 --- a/pkg/cluster/sync.go +++ b/pkg/cluster/sync.go @@ -1059,40 +1059,52 @@ func (c *Cluster) syncStandbyClusterConfiguration() error { func (c *Cluster) syncSecrets() error { c.logger.Debug("syncing secrets") c.setProcessName("syncing secrets") + errors := make([]string, 0) generatedSecrets := c.generateUserSecrets() retentionUsers := make([]string, 0) currentTime := time.Now() for secretUsername, generatedSecret := range generatedSecrets { - secret, err := c.KubeClient.Secrets(generatedSecret.Namespace).Create(context.TODO(), generatedSecret, metav1.CreateOptions{}) + pgUserDegraded := false + createdSecret, err := c.KubeClient.Secrets(generatedSecret.Namespace).Create(context.TODO(), generatedSecret, metav1.CreateOptions{}) if err == nil { - c.Secrets[secret.UID] = secret - c.logger.Infof("created new secret %s, namespace: %s, uid: %s", util.NameFromMeta(secret.ObjectMeta), generatedSecret.Namespace, secret.UID) + c.Secrets[createdSecret.UID] = createdSecret + c.logger.Infof("created new secret %s, namespace: %s, uid: %s", util.NameFromMeta(createdSecret.ObjectMeta), generatedSecret.Namespace, createdSecret.UID) continue } if k8sutil.ResourceAlreadyExists(err) { - if err = c.updateSecret(secretUsername, generatedSecret, &retentionUsers, currentTime); err != nil { - c.logger.Warningf("syncing secret %s failed: %v", util.NameFromMeta(secret.ObjectMeta), err) + updatedSecret, err := c.updateSecret(secretUsername, generatedSecret, &retentionUsers, currentTime) + if err == nil { + c.Secrets[updatedSecret.UID] = updatedSecret + continue } + errors = append(errors, fmt.Sprintf("syncing secret %s failed: %v", util.NameFromMeta(updatedSecret.ObjectMeta), err)) + pgUserDegraded = true } else { - return fmt.Errorf("could not create secret for user %s: in namespace %s: %v", secretUsername, generatedSecret.Namespace, err) + errors = append(errors, fmt.Sprintf("could not create secret for user %s: in namespace %s: %v", secretUsername, generatedSecret.Namespace, err)) + pgUserDegraded = true } + c.updatePgUser(secretUsername, pgUserDegraded) } // remove rotation users that exceed the retention interval if len(retentionUsers) > 0 { err := c.initDbConn() if err != nil { - return fmt.Errorf("could not init db connection: %v", err) + errors = append(errors, fmt.Sprintf("could not init db connection: %v", err)) } if err = c.cleanupRotatedUsers(retentionUsers, c.pgDb); err != nil { - return fmt.Errorf("error removing users exceeding configured retention interval: %v", err) + errors = append(errors, fmt.Sprintf("error removing users exceeding configured retention interval: %v", err)) } if err := c.closeDbConn(); err != nil { - c.logger.Errorf("could not close database connection after removing users exceeding configured retention interval: %v", err) + errors = append(errors, fmt.Sprintf("could not close database connection after removing users exceeding configured retention interval: %v", err)) } } + if len(errors) > 0 { + return fmt.Errorf("%v", strings.Join(errors, `', '`)) + } + return nil } @@ -1105,7 +1117,7 @@ func (c *Cluster) updateSecret( secretUsername string, generatedSecret *v1.Secret, retentionUsers *[]string, - currentTime time.Time) error { + currentTime time.Time) (*v1.Secret, error) { var ( secret *v1.Secret err error @@ -1115,7 +1127,7 @@ func (c *Cluster) updateSecret( // get the secret first if secret, err = c.KubeClient.Secrets(generatedSecret.Namespace).Get(context.TODO(), generatedSecret.Name, metav1.GetOptions{}); err != nil { - return fmt.Errorf("could not get current secret: %v", err) + return generatedSecret, fmt.Errorf("could not get current secret: %v", err) } c.Secrets[secret.UID] = secret @@ -1211,24 +1223,22 @@ func (c *Cluster) updateSecret( if updateSecret { c.logger.Infof("%s", updateSecretMsg) if secret, err = c.KubeClient.Secrets(secret.Namespace).Update(context.TODO(), secret, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("could not update secret %s: %v", secretName, err) + return secret, fmt.Errorf("could not update secret %s: %v", secretName, err) } - c.Secrets[secret.UID] = secret } if changed, _ := c.compareAnnotations(secret.Annotations, generatedSecret.Annotations, nil); changed { patchData, err := metaAnnotationsPatch(generatedSecret.Annotations) if err != nil { - return fmt.Errorf("could not form patch for secret %q annotations: %v", secret.Name, err) + return secret, fmt.Errorf("could not form patch for secret %q annotations: %v", secret.Name, err) } secret, err = c.KubeClient.Secrets(secret.Namespace).Patch(context.TODO(), secret.Name, types.MergePatchType, []byte(patchData), metav1.PatchOptions{}) if err != nil { - return fmt.Errorf("could not patch annotations for secret %q: %v", secret.Name, err) + return secret, fmt.Errorf("could not patch annotations for secret %q: %v", secret.Name, err) } - c.Secrets[secret.UID] = secret } - return nil + return secret, nil } func (c *Cluster) rotatePasswordInSecret( @@ -1334,6 +1344,23 @@ func (c *Cluster) rotatePasswordInSecret( return updateSecretMsg, nil } +func (c *Cluster) updatePgUser(secretUsername string, degraded bool) { + for key, pgUser := range c.pgUsers { + if pgUser.Name == secretUsername { + pgUser.Degraded = degraded + c.pgUsers[key] = pgUser + return + } + } + for key, pgUser := range c.systemUsers { + if pgUser.Name == secretUsername { + pgUser.Degraded = degraded + c.systemUsers[key] = pgUser + return + } + } +} + func (c *Cluster) syncRoles() (err error) { c.setProcessName("syncing roles") diff --git a/pkg/cluster/sync_test.go b/pkg/cluster/sync_test.go index e670daa70..d5bad341c 100644 --- a/pkg/cluster/sync_test.go +++ b/pkg/cluster/sync_test.go @@ -12,9 +12,12 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + k8stesting "k8s.io/client-go/testing" "github.com/golang/mock/gomock" + "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/zalando/postgres-operator/mocks" @@ -50,6 +53,16 @@ func newFakeK8sSyncClient() (k8sutil.KubernetesClient, *fake.Clientset) { } func newFakeK8sSyncSecretsClient() (k8sutil.KubernetesClient, *fake.Clientset) { + // add a reactor that checks namespace existence before creating secrets + clientSet.PrependReactor("create", "secrets", func(action k8stesting.Action) (bool, runtime.Object, error) { + createAction := action.(k8stesting.CreateAction) + secret := createAction.GetObject().(*v1.Secret) + if secret.Namespace != "default" { + return true, nil, errors.New("namespace does not exist") + } + return false, nil, nil + }) + return k8sutil.KubernetesClient{ SecretsGetter: clientSet.CoreV1(), }, clientSet @@ -810,7 +823,7 @@ func TestUpdateSecret(t *testing.T) { }, Spec: acidv1.PostgresSpec{ Databases: map[string]string{dbname: dbowner}, - Users: map[string]acidv1.UserFlags{appUser: {}, "bar": {}, dbowner: {}}, + Users: map[string]acidv1.UserFlags{appUser: {}, "bar": {}, dbowner: {}, "not-exist.test_user": {}}, UsersIgnoringSecretRotation: []string{"bar"}, UsersWithInPlaceSecretRotation: []string{dbowner}, Streams: []acidv1.Stream{ @@ -842,6 +855,7 @@ func TestUpdateSecret(t *testing.T) { PasswordRotationInterval: 1, PasswordRotationUserRetention: 3, }, + EnableCrossNamespaceSecret: true, Resources: config.Resources{ ClusterLabels: map[string]string{"application": "spilo"}, ClusterNameLabel: "cluster-name", @@ -864,7 +878,9 @@ func TestUpdateSecret(t *testing.T) { allUsers := make(map[string]spec.PgUser) for _, pgUser := range cluster.pgUsers { - allUsers[pgUser.Name] = pgUser + if !pgUser.Degraded { + allUsers[pgUser.Name] = pgUser + } } for _, systemUser := range cluster.systemUsers { allUsers[systemUser.Name] = systemUser diff --git a/pkg/spec/types.go b/pkg/spec/types.go index d727aee42..c08cc5c61 100644 --- a/pkg/spec/types.go +++ b/pkg/spec/types.go @@ -58,6 +58,7 @@ type PgUser struct { IsDbOwner bool `yaml:"is_db_owner"` Deleted bool `yaml:"deleted"` Rotated bool `yaml:"rotated"` + Degraded bool `yaml:"degraded"` } func (user *PgUser) Valid() bool { diff --git a/pkg/util/users/users.go b/pkg/util/users/users.go index 924d8390e..b3b60df04 100644 --- a/pkg/util/users/users.go +++ b/pkg/util/users/users.go @@ -48,6 +48,10 @@ func (strategy DefaultUserSyncStrategy) ProduceSyncRequests(dbUsers spec.PgUserM if newUser.Deleted { continue } + // when the secret of the user could not be created or updated skip any database actions + if newUser.Degraded { + continue + } dbUser, exists := dbUsers[name] if !exists { reqs = append(reqs, spec.PgSyncUserRequest{Kind: spec.PGSyncUserAdd, User: newUser})