From ccb52c094d5b3a0f7acda0c1bac332aa78e28e4a Mon Sep 17 00:00:00 2001 From: Ida Novindasari Date: Tue, 20 May 2025 16:31:26 +0200 Subject: [PATCH 01/30] [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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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/30] 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 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 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/30] 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}) From 8e629c5d6d84450f4d73eb4e2f6a45d954d9f504 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Wed, 3 Dec 2025 11:00:59 +0100 Subject: [PATCH 16/30] add Mikkel (#3002) --- CODEOWNERS | 2 +- MAINTAINERS | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index daca96b42..96213da15 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,2 @@ # global owners -* @sdudoladov @Jan-M @FxKu @jopadi @idanovinda @hughcapet +* @sdudoladov @Jan-M @FxKu @jopadi @idanovinda @hughcapet @mikkeloscar diff --git a/MAINTAINERS b/MAINTAINERS index 7c4aa6675..6ff2aa62e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4,3 +4,4 @@ Jan Mussler Jociele Padilha Ida Novindasari Polina Bungina +Mikkel Larsen From 744372b09bad91ca11b8f2bb9b4799f7be8f7e49 Mon Sep 17 00:00:00 2001 From: Aleksandr Vinokurov Date: Tue, 9 Dec 2025 09:36:32 +0100 Subject: [PATCH 17/30] Fix typo in README.md regarding bootstrap phase (#2978) Co-authored-by: Felix Kunde --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8820f04a5..cc2bdb17e 100644 --- a/README.md +++ b/README.md @@ -17,7 +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 +* Pod protection during bootstrap 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 From 42bbead4c95df2054e9fe12dd71ec867e27074a7 Mon Sep 17 00:00:00 2001 From: ovnozdrach <135333325+ovnozdrach@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:37:11 +0300 Subject: [PATCH 18/30] Fix Sidecar without image specification issue (#2977) Co-authored-by: Oleg Nozdrachev Co-authored-by: Felix Kunde --- pkg/cluster/k8sres.go | 19 ++++ pkg/cluster/k8sres_test.go | 201 +++++++++++++++++++++++++++++++++++-- 2 files changed, 212 insertions(+), 8 deletions(-) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index e05a54553..9bc39a9db 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -1303,6 +1303,9 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef c.logger.Warningf("initContainers specified but disabled in configuration - next statefulset creation would fail") } initContainers = spec.InitContainers + if err := c.validateContainers(initContainers); err != nil { + return nil, fmt.Errorf("invalid init containers: %v", err) + } } // backward compatible check for InitContainers @@ -1455,6 +1458,10 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef sidecarContainers = patchSidecarContainers(sidecarContainers, volumeMounts, c.OpConfig.SuperUsername, c.credentialSecretName(c.OpConfig.SuperUsername)) + if err := c.validateContainers(sidecarContainers); err != nil { + return nil, fmt.Errorf("invalid sidecar containers: %v", err) + } + tolerationSpec := tolerations(&spec.Tolerations, c.OpConfig.PodToleration) effectivePodPriorityClassName := util.Coalesce(spec.PodPriorityClassName, c.OpConfig.PodPriorityClassName) @@ -2592,3 +2599,15 @@ func ensurePath(file string, defaultDir string, defaultFile string) string { } return file } + +func (c *Cluster) validateContainers(containers []v1.Container) error { + for i, container := range containers { + if container.Name == "" { + return fmt.Errorf("container[%d]: name is required", i) + } + if container.Image == "" { + return fmt.Errorf("container '%v': image is required", container.Name) + } + } + return nil +} diff --git a/pkg/cluster/k8sres_test.go b/pkg/cluster/k8sres_test.go index 137c24081..6bd87366d 100644 --- a/pkg/cluster/k8sres_test.go +++ b/pkg/cluster/k8sres_test.go @@ -1935,7 +1935,8 @@ func TestAdditionalVolume(t *testing.T) { AdditionalVolumes: additionalVolumes, Sidecars: []acidv1.Sidecar{ { - Name: sidecarName, + Name: sidecarName, + DockerImage: "test-image", }, }, }, @@ -2163,10 +2164,12 @@ func TestSidecars(t *testing.T) { }, Sidecars: []acidv1.Sidecar{ { - Name: "cluster-specific-sidecar", + Name: "cluster-specific-sidecar", + DockerImage: "test-image", }, { - Name: "cluster-specific-sidecar-with-resources", + Name: "cluster-specific-sidecar-with-resources", + DockerImage: "test-image", Resources: &acidv1.Resources{ ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("210m"), Memory: k8sutil.StringToPointer("0.8Gi")}, ResourceLimits: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("510m"), Memory: k8sutil.StringToPointer("1.4Gi")}, @@ -2201,7 +2204,8 @@ func TestSidecars(t *testing.T) { }, SidecarContainers: []v1.Container{ { - Name: "global-sidecar", + Name: "global-sidecar", + Image: "test-image", }, // will be replaced by a cluster specific sidecar with the same name { @@ -2271,6 +2275,7 @@ func TestSidecars(t *testing.T) { // cluster specific sidecar assert.Contains(t, s.Spec.Template.Spec.Containers, v1.Container{ Name: "cluster-specific-sidecar", + Image: "test-image", Env: env, Resources: generateKubernetesResources("200m", "500m", "0.7Gi", "1.3Gi"), ImagePullPolicy: v1.PullIfNotPresent, @@ -2297,6 +2302,7 @@ func TestSidecars(t *testing.T) { // global sidecar assert.Contains(t, s.Spec.Template.Spec.Containers, v1.Container{ Name: "global-sidecar", + Image: "test-image", Env: env, VolumeMounts: mounts, }) @@ -2325,6 +2331,180 @@ func TestSidecars(t *testing.T) { } +func TestContainerValidation(t *testing.T) { + testCases := []struct { + name string + spec acidv1.PostgresSpec + clusterConfig Config + expectedError string + }{ + { + name: "init container without image", + spec: acidv1.PostgresSpec{ + PostgresqlParam: acidv1.PostgresqlParam{ + PgVersion: "17", + }, + TeamID: "myapp", + NumberOfInstances: 1, + Volume: acidv1.Volume{ + Size: "1G", + }, + InitContainers: []v1.Container{ + { + Name: "invalid-initcontainer", + }, + }, + }, + clusterConfig: Config{ + OpConfig: config.Config{ + PodManagementPolicy: "ordered_ready", + ProtectedRoles: []string{"admin"}, + Auth: config.Auth{ + SuperUsername: superUserName, + ReplicationUsername: replicationUserName, + }, + }, + }, + expectedError: "image is required", + }, + { + name: "sidecar without name", + spec: acidv1.PostgresSpec{ + PostgresqlParam: acidv1.PostgresqlParam{ + PgVersion: "17", + }, + TeamID: "myapp", + NumberOfInstances: 1, + Volume: acidv1.Volume{ + Size: "1G", + }, + }, + clusterConfig: Config{ + OpConfig: config.Config{ + PodManagementPolicy: "ordered_ready", + ProtectedRoles: []string{"admin"}, + Auth: config.Auth{ + SuperUsername: superUserName, + ReplicationUsername: replicationUserName, + }, + SidecarContainers: []v1.Container{ + { + Image: "test-image", + }, + }, + }, + }, + expectedError: "name is required", + }, + { + name: "sidecar without image", + spec: acidv1.PostgresSpec{ + PostgresqlParam: acidv1.PostgresqlParam{ + PgVersion: "17", + }, + TeamID: "myapp", + NumberOfInstances: 1, + Volume: acidv1.Volume{ + Size: "1G", + }, + Sidecars: []acidv1.Sidecar{ + { + Name: "invalid-sidecar", + }, + }, + }, + clusterConfig: Config{ + OpConfig: config.Config{ + PodManagementPolicy: "ordered_ready", + ProtectedRoles: []string{"admin"}, + Auth: config.Auth{ + SuperUsername: superUserName, + ReplicationUsername: replicationUserName, + }, + }, + }, + expectedError: "image is required", + }, + { + name: "valid containers pass validation", + spec: acidv1.PostgresSpec{ + PostgresqlParam: acidv1.PostgresqlParam{ + PgVersion: "17", + }, + TeamID: "myapp", + NumberOfInstances: 1, + Volume: acidv1.Volume{ + Size: "1G", + }, + Sidecars: []acidv1.Sidecar{ + { + Name: "valid-sidecar", + DockerImage: "busybox:latest", + }, + }, + InitContainers: []v1.Container{ + { + Name: "valid-initcontainer", + Image: "alpine:latest", + }, + }, + }, + clusterConfig: Config{ + OpConfig: config.Config{ + PodManagementPolicy: "ordered_ready", + ProtectedRoles: []string{"admin"}, + Auth: config.Auth{ + SuperUsername: superUserName, + ReplicationUsername: replicationUserName, + }, + }, + }, + expectedError: "", + }, + { + name: "multiple invalid sidecars", + spec: acidv1.PostgresSpec{ + Sidecars: []acidv1.Sidecar{ + { + Name: "sidecar1", + }, + { + Name: "sidecar2", + }, + }, + }, + expectedError: "image is required", + }, + { + name: "empty container name and image", + spec: acidv1.PostgresSpec{ + InitContainers: []v1.Container{ + { + Name: "", + Image: "", + }, + }, + }, + expectedError: "name is required", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + cluster := New(tc.clusterConfig, k8sutil.KubernetesClient{}, acidv1.Postgresql{}, logger, eventRecorder) + + _, err := cluster.generateStatefulSet(&tc.spec) + + if tc.expectedError != "" { + assert.Error(t, err) + assert.Contains(t, err.Error(), tc.expectedError) + } else { + assert.NoError(t, err) + } + }) + } +} + func TestGeneratePodDisruptionBudget(t *testing.T) { testName := "Test PodDisruptionBudget spec generation" @@ -2618,7 +2798,8 @@ func TestGenerateService(t *testing.T) { Name: "cluster-specific-sidecar", }, { - Name: "cluster-specific-sidecar-with-resources", + Name: "cluster-specific-sidecar-with-resources", + DockerImage: "test-image", Resources: &acidv1.Resources{ ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("210m"), Memory: k8sutil.StringToPointer("0.8Gi")}, ResourceLimits: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("510m"), Memory: k8sutil.StringToPointer("1.4Gi")}, @@ -2928,6 +3109,7 @@ func TestGenerateResourceRequirements(t *testing.T) { namespace := "default" clusterNameLabel := "cluster-name" sidecarName := "postgres-exporter" + dockerImage := "test-image" // enforceMinResourceLimits will be called 2 times emitting 4 events (2x cpu, 2x memory raise) // enforceMaxResourceRequests will be called 4 times emitting 6 events (2x cpu, 4x memory cap) @@ -2993,7 +3175,8 @@ func TestGenerateResourceRequirements(t *testing.T) { Spec: acidv1.PostgresSpec{ Sidecars: []acidv1.Sidecar{ { - Name: sidecarName, + Name: sidecarName, + DockerImage: dockerImage, }, }, TeamID: "acid", @@ -3232,7 +3415,8 @@ func TestGenerateResourceRequirements(t *testing.T) { Spec: acidv1.PostgresSpec{ Sidecars: []acidv1.Sidecar{ { - Name: sidecarName, + Name: sidecarName, + DockerImage: dockerImage, Resources: &acidv1.Resources{ ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("10Mi")}, ResourceLimits: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, @@ -3321,7 +3505,8 @@ func TestGenerateResourceRequirements(t *testing.T) { Spec: acidv1.PostgresSpec{ Sidecars: []acidv1.Sidecar{ { - Name: sidecarName, + Name: sidecarName, + DockerImage: dockerImage, Resources: &acidv1.Resources{ ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("10Mi")}, ResourceLimits: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, From 04ad66f7013b1a032c93edbf8375a9201ef27762 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Wed, 10 Dec 2025 10:01:07 +0100 Subject: [PATCH 19/30] stop retention user cleanup early again when DB connection attempt fails (#2999) * stop retention user cleanup early again when DB connection attempt fails * add unit test and new returned error from updateSecret --- pkg/cluster/database.go | 20 ++++++++++++--- pkg/cluster/sync.go | 26 +++++++++---------- pkg/cluster/sync_test.go | 54 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 17 deletions(-) diff --git a/pkg/cluster/database.go b/pkg/cluster/database.go index aac877bcf..56b5f3638 100644 --- a/pkg/cluster/database.go +++ b/pkg/cluster/database.go @@ -281,9 +281,23 @@ func findUsersFromRotation(rotatedUsers []string, db *sql.DB) (map[string]string return extraUsers, nil } -func (c *Cluster) cleanupRotatedUsers(rotatedUsers []string, db *sql.DB) error { +func (c *Cluster) cleanupRotatedUsers(rotatedUsers []string) error { c.setProcessName("checking for rotated users to remove from the database due to configured retention") - extraUsers, err := findUsersFromRotation(rotatedUsers, db) + + err := c.initDbConn() + if err != nil { + return fmt.Errorf("could not init db connection: %v", err) + } + defer func() { + if c.connectionIsClosed() { + return + } + if err := c.closeDbConn(); err != nil { + c.logger.Errorf("could not close database connection after removing users exceeding configured retention interval: %v", err) + } + }() + + extraUsers, err := findUsersFromRotation(rotatedUsers, c.pgDb) if err != nil { return fmt.Errorf("error when querying for deprecated users from password rotation: %v", err) } @@ -304,7 +318,7 @@ func (c *Cluster) cleanupRotatedUsers(rotatedUsers []string, db *sql.DB) error { } if retentionDate.After(userCreationDate) { c.logger.Infof("dropping user %q due to configured days in password_rotation_user_retention", rotatedUser) - if err = users.DropPgUser(rotatedUser, db); err != nil { + if err = users.DropPgUser(rotatedUser, c.pgDb); err != nil { c.logger.Errorf("could not drop role %q: %v", rotatedUser, err) continue } diff --git a/pkg/cluster/sync.go b/pkg/cluster/sync.go index a210790b3..ecf692702 100644 --- a/pkg/cluster/sync.go +++ b/pkg/cluster/sync.go @@ -1078,7 +1078,7 @@ func (c *Cluster) syncSecrets() error { c.Secrets[updatedSecret.UID] = updatedSecret continue } - errors = append(errors, fmt.Sprintf("syncing secret %s failed: %v", util.NameFromMeta(updatedSecret.ObjectMeta), err)) + errors = append(errors, fmt.Sprintf("syncing secret %s failed: %v", util.NameFromMeta(generatedSecret.ObjectMeta), err)) pgUserDegraded = true } else { errors = append(errors, fmt.Sprintf("could not create secret for user %s: in namespace %s: %v", secretUsername, generatedSecret.Namespace, err)) @@ -1089,16 +1089,9 @@ func (c *Cluster) syncSecrets() error { // remove rotation users that exceed the retention interval if len(retentionUsers) > 0 { - err := c.initDbConn() - if err != nil { - errors = append(errors, fmt.Sprintf("could not init db connection: %v", err)) - } - if err = c.cleanupRotatedUsers(retentionUsers, c.pgDb); err != nil { + if err := c.cleanupRotatedUsers(retentionUsers); err != nil { errors = append(errors, fmt.Sprintf("error removing users exceeding configured retention interval: %v", err)) } - if err := c.closeDbConn(); err != nil { - errors = append(errors, fmt.Sprintf("could not close database connection after removing users exceeding configured retention interval: %v", err)) - } } if len(errors) > 0 { @@ -1187,13 +1180,18 @@ func (c *Cluster) updateSecret( } } else { // username might not match if password rotation has been disabled again - if secretUsername != string(secret.Data["username"]) { + usernameFromSecret := string(secret.Data["username"]) + if secretUsername != usernameFromSecret { + // handle edge case when manifest user conflicts with a user from prepared databases + if strings.Replace(usernameFromSecret, "-", "_", -1) == strings.Replace(secretUsername, "-", "_", -1) { + return nil, fmt.Errorf("could not update secret because of user name mismatch: expected: %s, got: %s", secretUsername, usernameFromSecret) + } *retentionUsers = append(*retentionUsers, secretUsername) secret.Data["username"] = []byte(secretUsername) secret.Data["password"] = []byte(util.RandomPassword(constants.PasswordLength)) secret.Data["nextRotation"] = []byte{} updateSecret = true - updateSecretMsg = fmt.Sprintf("secret %s does not contain the role %s - updating username and resetting password", secretName, secretUsername) + updateSecretMsg = fmt.Sprintf("secret does not contain the role %s - updating username and resetting password", secretUsername) } } @@ -1223,18 +1221,18 @@ 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 secret, fmt.Errorf("could not update secret %s: %v", secretName, err) + return nil, fmt.Errorf("could not update secret: %v", err) } } if changed, _ := c.compareAnnotations(secret.Annotations, generatedSecret.Annotations, nil); changed { patchData, err := metaAnnotationsPatch(generatedSecret.Annotations) if err != nil { - return secret, fmt.Errorf("could not form patch for secret %q annotations: %v", secret.Name, err) + return nil, fmt.Errorf("could not form patch for secret annotations: %v", err) } secret, err = c.KubeClient.Secrets(secret.Namespace).Patch(context.TODO(), secret.Name, types.MergePatchType, []byte(patchData), metav1.PatchOptions{}) if err != nil { - return secret, fmt.Errorf("could not patch annotations for secret %q: %v", secret.Name, err) + return nil, fmt.Errorf("could not patch annotations for secret: %v", err) } } diff --git a/pkg/cluster/sync_test.go b/pkg/cluster/sync_test.go index d5bad341c..87e9dc8a5 100644 --- a/pkg/cluster/sync_test.go +++ b/pkg/cluster/sync_test.go @@ -964,3 +964,57 @@ func TestUpdateSecret(t *testing.T) { t.Errorf("%s: updated secret does not contain expected username: expected %s, got %s", testName, appUser, currentUsername) } } + +func TestUpdateSecretNameConflict(t *testing.T) { + client, _ := newFakeK8sSyncSecretsClient() + + clusterName := "acid-test-cluster" + namespace := "default" + secretTemplate := config.StringTemplate("{username}.{cluster}.credentials") + + // define manifest user that has the same name as a prepared database owner user except for dashes vs underscores + // because of this the operator cannot create both secrets because underscores are not allowed in k8s secret names + pg := acidv1.Postgresql{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterName, + Namespace: namespace, + }, + Spec: acidv1.PostgresSpec{ + PreparedDatabases: map[string]acidv1.PreparedDatabase{"prepared": {DefaultUsers: true}}, + Users: map[string]acidv1.UserFlags{"prepared-owner-user": {}}, + Volume: acidv1.Volume{ + Size: "1Gi", + }, + }, + } + + var cluster = New( + Config{ + OpConfig: config.Config{ + Auth: config.Auth{ + SuperUsername: "postgres", + ReplicationUsername: "standby", + SecretNameTemplate: secretTemplate, + }, + Resources: config.Resources{ + ClusterLabels: map[string]string{"application": "spilo"}, + ClusterNameLabel: "cluster-name", + }, + }, + }, client, pg, logger, eventRecorder) + + cluster.Name = clusterName + cluster.Namespace = namespace + cluster.pgUsers = map[string]spec.PgUser{} + + // init all users + cluster.initUsers() + // create secrets and fail because of user name mismatch + // prepared-owner-user from manifest vs prepared_owner_user from prepared database + err := cluster.syncSecrets() + assert.Error(t, err) + + // the order of secrets to sync is not deterministic, check only first part of the error message + expectedError := fmt.Sprintf("syncing secret %s failed: could not update secret because of user name mismatch", "default/prepared-owner-user.acid-test-cluster.credentials") + assert.Contains(t, err.Error(), expectedError) +} From 88d6192064edcb6804eea848e80f7f283faa320f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:31:10 +0100 Subject: [PATCH 20/30] Bump js-yaml from 4.1.0 to 4.1.1 in /ui/app (#2989) Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Felix Kunde --- ui/app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/app/package.json b/ui/app/package.json index ab4c65c7f..03a9643c1 100644 --- a/ui/app/package.json +++ b/ui/app/package.json @@ -38,7 +38,7 @@ "brfs": "^2.0.2", "dedent-js": "1.0.1", "eslint": "^8.32.0", - "js-yaml": "4.1.0", + "js-yaml": "4.1.1", "pug": "^3.0.2", "rimraf": "^4.1.2", "riot": "^3.13.2", From 842c6eded3f72b7a4b9335a368afd6fb56b5cdf7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:34:42 +0100 Subject: [PATCH 21/30] Bump golang.org/x/crypto from 0.31.0 to 0.45.0 in /kubectl-pg (#2996) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.31.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.31.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Felix Kunde --- kubectl-pg/go.mod | 10 +++++----- kubectl-pg/go.sum | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/kubectl-pg/go.mod b/kubectl-pg/go.mod index 9a2faed99..fcd4aec43 100644 --- a/kubectl-pg/go.mod +++ b/kubectl-pg/go.mod @@ -51,12 +51,12 @@ require ( github.com/subosito/gotenv v1.6.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/net v0.30.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/net v0.47.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.28.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.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 diff --git a/kubectl-pg/go.sum b/kubectl-pg/go.sum index 2bb48c85a..e905ac7e7 100644 --- a/kubectl-pg/go.sum +++ b/kubectl-pg/go.sum @@ -130,16 +130,16 @@ 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.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= 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/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.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= 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= @@ -149,22 +149,22 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h 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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= 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.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= 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.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= 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= From 1b4ffb08752426cd66e778cec442174b332b11dc Mon Sep 17 00:00:00 2001 From: Ida Novindasari Date: Wed, 10 Dec 2025 16:45:42 +0100 Subject: [PATCH 22/30] Separate pipeline for internal/external build and support multi arch (#2991) * separate pipeline for internal/external build and support multi arch * remove distutils and use node:lts-alpine in both * change base image arguments * fix local naming and base image * address feedback --------- Co-authored-by: Felix Kunde --- .github/workflows/publish_ghcr_image.yaml | 2 + Makefile | 13 +++-- delivery.yaml | 62 ++++++++++++++++------- docker/Dockerfile | 2 +- ui/Dockerfile | 2 +- ui/Makefile | 21 ++++++-- 6 files changed, 70 insertions(+), 32 deletions(-) diff --git a/.github/workflows/publish_ghcr_image.yaml b/.github/workflows/publish_ghcr_image.yaml index 78815783a..7bfb17a51 100644 --- a/.github/workflows/publish_ghcr_image.yaml +++ b/.github/workflows/publish_ghcr_image.yaml @@ -7,6 +7,8 @@ env: on: push: + branches: + - master tags: - '*' diff --git a/Makefile b/Makefile index 50d070b9d..385a03d09 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ LOCAL_BUILD_FLAGS ?= $(BUILD_FLAGS) LDFLAGS ?= -X=main.version=$(VERSION) DOCKERDIR = docker -IMAGE ?= registry.opensource.zalan.do/acid/$(BINARY) +BASE_IMAGE ?= alpine:latest +IMAGE ?= $(BINARY) TAG ?= $(VERSION) GITHEAD = $(shell git rev-parse --short HEAD) GITURL = $(shell git config --get remote.origin.url) @@ -42,8 +43,9 @@ ifndef GOPATH GOPATH := $(HOME)/go endif -PATH := $(GOPATH)/bin:$(PATH) -SHELL := env PATH="$(PATH)" $(SHELL) +PATH := $(GOPATH)/bin:$(PATH) +SHELL := env PATH="$(PATH)" $(SHELL) +IMAGE_TAG := $(IMAGE):$(TAG)$(CDP_TAG)$(DEBUG_FRESH)$(DEBUG_POSTFIX) default: local @@ -66,14 +68,11 @@ docker: ${DOCKERDIR}/${DOCKERFILE} echo "Version ${VERSION}" echo "CDP tag ${CDP_TAG}" echo "git describe $(shell git describe --tags --always --dirty)" - docker build --rm -t "$(IMAGE):$(TAG)$(CDP_TAG)$(DEBUG_FRESH)$(DEBUG_POSTFIX)" -f "${DOCKERDIR}/${DOCKERFILE}" --build-arg VERSION="${VERSION}" . + docker build --rm -t "$(IMAGE_TAG)" -f "${DOCKERDIR}/${DOCKERFILE}" --build-arg VERSION="${VERSION}" --build-arg BASE_IMAGE="${BASE_IMAGE}" . indocker-race: 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)" - mocks: GO111MODULE=on go generate ./... diff --git a/delivery.yaml b/delivery.yaml index 7eacd769b..9ab8b5a4c 100644 --- a/delivery.yaml +++ b/delivery.yaml @@ -1,6 +1,15 @@ version: "2017-09-20" +allow_concurrent_steps: true + +build_env: &BUILD_ENV + PYTHON_BASE_IMAGE: container-registry.zalando.net/library/python-3.11-slim + ALPINE_BASE_IMAGE: container-registry.zalando.net/library/alpine-3 + MULTI_ARCH_REGISTRY: container-registry-test.zalando.net/acid + pipeline: - id: build-postgres-operator + env: + <<: *BUILD_ENV type: script vm_config: type: linux @@ -17,17 +26,26 @@ pipeline: - desc: Build Docker image cmd: | - IS_PR_BUILD=${CDP_PULL_REQUEST_NUMBER+"true"} - if [[ ${CDP_TARGET_BRANCH} == "master" && ${IS_PR_BUILD} != "true" ]] - then - IMAGE=registry-write.opensource.zalan.do/acid/postgres-operator + if [ -z ${CDP_SOURCE_BRANCH} ]; then + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator else - IMAGE=registry-write.opensource.zalan.do/acid/postgres-operator-test + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-test + fi + + docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use + docker buildx build --platform "linux/amd64,linux/arm64" \ + --build-arg BASE_IMAGE="${ALPINE_BASE_IMAGE}" \ + -t "${IMAGE}:${CDP_BUILD_VERSION}" \ + -f docker/Dockerfile \ + --push . + + if [ -z ${CDP_SOURCE_BRANCH} ]; then + cdp-promote-image ${IMAGE}:${CDP_BUILD_VERSION} fi - export IMAGE - make docker push - id: build-operator-ui + env: + <<: *BUILD_ENV type: script vm_config: type: linux @@ -46,18 +64,21 @@ pipeline: - desc: 'Build and push Docker image' cmd: | cd ui - IS_PR_BUILD=${CDP_PULL_REQUEST_NUMBER+"true"} - if [[ ${CDP_TARGET_BRANCH} == "master" && ${IS_PR_BUILD} != "true" ]] - then - IMAGE=registry-write.opensource.zalan.do/acid/postgres-operator-ui + if [ -z ${CDP_SOURCE_BRANCH} ]; then + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-ui else - IMAGE=registry-write.opensource.zalan.do/acid/postgres-operator-ui-test + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-ui-test + fi + + IMAGE_TAG=$(make docker-push IMAGE=${IMAGE} BASE_IMAGE=${PYTHON_BASE_IMAGE}) + + if [ -z ${CDP_SOURCE_BRANCH} ]; then + cdp-promote-image ${IMAGE_TAG} fi - export IMAGE - make docker - make push - id: build-logical-backup + env: + <<: *BUILD_ENV type: script vm_config: type: linux @@ -67,6 +88,11 @@ pipeline: cmd: | cd logical-backup export TAG=$(git describe --tags --always --dirty) - IMAGE="registry-write.opensource.zalan.do/acid/logical-backup" - docker build --rm -t "$IMAGE:$TAG$CDP_TAG" . - docker push "$IMAGE:$TAG$CDP_TAG" + docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use + docker buildx build --platform linux/amd64,linux/arm64 \ + -t ${MULTI_ARCH_REGISTRY}/postgres-operator-logical-backup:${TAG} \ + --push . + + if [ -z ${CDP_SOURCE_BRANCH} ]; then + cdp-promote-image ${MULTI_ARCH_REGISTRY}/postgres-operator-logical-backup:${TAG} + fi diff --git a/docker/Dockerfile b/docker/Dockerfile index e50380003..9eef4e68c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE_IMAGE=registry.opensource.zalan.do/library/alpine-3:latest +ARG BASE_IMAGE=alpine:latest FROM golang:1.25-alpine AS builder ARG VERSION=latest diff --git a/ui/Dockerfile b/ui/Dockerfile index 51f1d7744..8ed70c2c0 100644 --- a/ui/Dockerfile +++ b/ui/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE_IMAGE=registry.opensource.zalan.do/library/python-3.11-slim:latest +ARG BASE_IMAGE=python:3.11-slim ARG NODE_IMAGE=node:lts-alpine FROM $NODE_IMAGE AS build diff --git a/ui/Makefile b/ui/Makefile index 8f88982ab..70c2018db 100644 --- a/ui/Makefile +++ b/ui/Makefile @@ -1,6 +1,7 @@ .PHONY: clean test appjs docker push mock -IMAGE ?= registry.opensource.zalan.do/acid/postgres-operator-ui +IMAGE ?= postgres-operator-ui +BASE_IMAGE ?= python:3.11-slim VERSION ?= $(shell git describe --tags --always --dirty) TAG ?= $(VERSION) GITHEAD = $(shell git rev-parse --short HEAD) @@ -30,10 +31,20 @@ docker: appjs echo "Version ${VERSION}" echo "CDP tag ${CDP_TAG}" echo "git describe $(shell git describe --tags --always --dirty)" - docker build --rm -t "$(IMAGE):$(TAG)$(CDP_TAG)" -f Dockerfile . - -push: - docker push "$(IMAGE):$(TAG)$(CDP_TAG)" + docker build --rm -t "$(IMAGE):$(TAG)$(CDP_TAG)" -f Dockerfile --build-arg BASE_IMAGE="${BASE_IMAGE}" . +docker-push: appjs + echo "Tag ${TAG}" + echo "Version ${VERSION}" + echo "CDP tag ${CDP_TAG}" + echo "git describe $(shell git describe --tags --always --dirty)" + docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use + docker buildx build --platform linux/amd64,linux/arm64 \ + --build-arg BASE_IMAGE="${BASE_IMAGE}" \ + -f Dockerfile \ + -t "$(IMAGE):$(TAG)$(CDP_TAG)" \ + --push . + echo "$(IMAGE):$(TAG)$(CDP_TAG)" + mock: docker run -it -p 8081:8081 "$(IMAGE):$(TAG)" --mock From f826f75769c6f99a6e7662f2abed5567c9f60531 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:07:20 +0100 Subject: [PATCH 23/30] Bump golang.org/x/crypto from 0.43.0 to 0.45.0 (#2997) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.43.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.43.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 7eda62d18..df7c94b5b 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/r3labs/diff v1.1.0 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.11.1 - golang.org/x/crypto v0.43.0 + golang.org/x/crypto v0.45.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.32.9 k8s.io/apiextensions-apiserver v0.25.9 @@ -49,15 +49,15 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/spf13/pflag v1.0.5 // 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/mod v0.29.0 // indirect + golang.org/x/net v0.47.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/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.9.0 // indirect - golang.org/x/tools v0.37.0 // indirect + golang.org/x/tools v0.38.0 // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect diff --git a/go.sum b/go.sum index ffdf21612..581054d7c 100644 --- a/go.sum +++ b/go.sum @@ -121,28 +121,28 @@ 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.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= 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.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= 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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM= -golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= 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.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.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= @@ -150,15 +150,15 @@ 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.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -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/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= 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.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= 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= @@ -167,8 +167,8 @@ 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.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= 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= From 543acd5731a7fda227a66f500ef9a03a2233d0d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:08:01 +0100 Subject: [PATCH 24/30] Bump werkzeug from 3.0.6 to 3.1.4 in /ui (#3001) Bumps [werkzeug](https://github.com/pallets/werkzeug) from 3.0.6 to 3.1.4. - [Release notes](https://github.com/pallets/werkzeug/releases) - [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/werkzeug/compare/3.0.6...3.1.4) --- updated-dependencies: - dependency-name: werkzeug dependency-version: 3.1.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 75bcc1952..eaeafe3c1 100644 --- a/ui/requirements.txt +++ b/ui/requirements.txt @@ -11,4 +11,4 @@ kubernetes==11.0.0 python-json-logger==2.0.7 requests==2.32.4 stups-tokens>=1.1.19 -werkzeug==3.0.6 +werkzeug==3.1.4 From fe340cb4295ced5f19b53d6205fcdb4a73d240f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:11:22 +0100 Subject: [PATCH 25/30] Bump golang.org/x/oauth2 from 0.23.0 to 0.27.0 in /kubectl-pg (#3008) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.23.0 to 0.27.0. - [Commits](https://github.com/golang/oauth2/compare/v0.23.0...v0.27.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-version: 0.27.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- kubectl-pg/go.mod | 2 +- kubectl-pg/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kubectl-pg/go.mod b/kubectl-pg/go.mod index fcd4aec43..57fca863e 100644 --- a/kubectl-pg/go.mod +++ b/kubectl-pg/go.mod @@ -53,7 +53,7 @@ require ( go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/crypto v0.45.0 // indirect golang.org/x/net v0.47.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/oauth2 v0.27.0 // indirect golang.org/x/sys v0.38.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect diff --git a/kubectl-pg/go.sum b/kubectl-pg/go.sum index e905ac7e7..37ed34ec8 100644 --- a/kubectl-pg/go.sum +++ b/kubectl-pg/go.sum @@ -140,8 +140,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +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= From 5aa8f961ece9200b8304a3087ec886b21cbe04ff Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Wed, 10 Dec 2025 17:11:53 +0100 Subject: [PATCH 26/30] only trigger ghcr build on tag event (#3010) --- .github/workflows/publish_ghcr_image.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/publish_ghcr_image.yaml b/.github/workflows/publish_ghcr_image.yaml index 7bfb17a51..78815783a 100644 --- a/.github/workflows/publish_ghcr_image.yaml +++ b/.github/workflows/publish_ghcr_image.yaml @@ -7,8 +7,6 @@ env: on: push: - branches: - - master tags: - '*' From cd05682482304000654ff1d6c6feaae882fbfe39 Mon Sep 17 00:00:00 2001 From: Steven Berler <1030627+berler@users.noreply.github.com> Date: Thu, 11 Dec 2025 01:22:40 -0800 Subject: [PATCH 27/30] fix switchover schedule tests (#2995) * fix switchover schedule tests Previously the tests would fail depending on the local time zone and the time of day the test was being run. --------- Co-authored-by: Felix Kunde Co-authored-by: Mikkel Oscar Lyderik Larsen --- pkg/cluster/cluster.go | 6 +++++- pkg/cluster/cluster_test.go | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 9cd750e84..b6a4e24a8 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -1767,9 +1767,13 @@ func (c *Cluster) GetStatus() *ClusterStatus { } func (c *Cluster) GetSwitchoverSchedule() string { + now := time.Now().UTC() + return c.getSwitchoverScheduleAtTime(now) +} + +func (c *Cluster) getSwitchoverScheduleAtTime(now time.Time) string { var possibleSwitchover, schedule time.Time - now := time.Now().UTC() for _, window := range c.Spec.MaintenanceWindows { // in the best case it is possible today possibleSwitchover = time.Date(now.Year(), now.Month(), now.Day(), window.StartTime.Hour(), window.StartTime.Minute(), 0, 0, time.UTC) diff --git a/pkg/cluster/cluster_test.go b/pkg/cluster/cluster_test.go index 25f61db98..d78d4c92e 100644 --- a/pkg/cluster/cluster_test.go +++ b/pkg/cluster/cluster_test.go @@ -2116,7 +2116,7 @@ func TestCompareVolumeMounts(t *testing.T) { } func TestGetSwitchoverSchedule(t *testing.T) { - now := time.Now() + now, _ := time.Parse(time.RFC3339, "2025-11-11T12:35:00Z") futureTimeStart := now.Add(1 * time.Hour) futureWindowTimeStart := futureTimeStart.Format("15:04") @@ -2195,7 +2195,7 @@ func TestGetSwitchoverSchedule(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cluster.Spec.MaintenanceWindows = tt.windows - schedule := cluster.GetSwitchoverSchedule() + schedule := cluster.getSwitchoverScheduleAtTime(now) if schedule != tt.expected { t.Errorf("Expected GetSwitchoverSchedule to return %s, returned: %s", tt.expected, schedule) } From a27727f8d04cde3f45b48dd0364639d4e0ac54e2 Mon Sep 17 00:00:00 2001 From: Ida Novindasari Date: Fri, 12 Dec 2025 16:49:58 +0100 Subject: [PATCH 28/30] [ui] internal pipeline fix to build ui image (#3013) * fix ui pipeline * adjust logical backup image tagging --- delivery.yaml | 167 +++++++++++++++++++++++++++----------------------- ui/Makefile | 13 ---- 2 files changed, 89 insertions(+), 91 deletions(-) diff --git a/delivery.yaml b/delivery.yaml index 9ab8b5a4c..e582b982b 100644 --- a/delivery.yaml +++ b/delivery.yaml @@ -7,92 +7,103 @@ build_env: &BUILD_ENV MULTI_ARCH_REGISTRY: container-registry-test.zalando.net/acid pipeline: - - id: build-postgres-operator - env: - <<: *BUILD_ENV - type: script - vm_config: - type: linux - size: large - image: cdp-runtime/go - cache: - paths: - - /go/pkg/mod # pkg cache for Go modules - - ~/.cache/go-build # Go build cache - commands: - - desc: Run unit tests - cmd: | - make deps mocks test + - id: build-postgres-operator + env: + <<: *BUILD_ENV + type: script + vm_config: + type: linux + size: large + image: cdp-runtime/go + cache: + paths: + - /go/pkg/mod # pkg cache for Go modules + - ~/.cache/go-build # Go build cache + commands: + - desc: Run unit tests + cmd: | + make deps mocks test - - desc: Build Docker image - cmd: | - if [ -z ${CDP_SOURCE_BRANCH} ]; then - IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator - else - IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-test - fi + - desc: Build Docker image + cmd: | + if [ -z ${CDP_SOURCE_BRANCH} ]; then + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator + else + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-test + fi - docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use - docker buildx build --platform "linux/amd64,linux/arm64" \ - --build-arg BASE_IMAGE="${ALPINE_BASE_IMAGE}" \ - -t "${IMAGE}:${CDP_BUILD_VERSION}" \ - -f docker/Dockerfile \ - --push . + docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use + docker buildx build --platform "linux/amd64,linux/arm64" \ + --build-arg BASE_IMAGE="${ALPINE_BASE_IMAGE}" \ + -t "${IMAGE}:${CDP_BUILD_VERSION}" \ + -f docker/Dockerfile \ + --push . - if [ -z ${CDP_SOURCE_BRANCH} ]; then - cdp-promote-image ${IMAGE}:${CDP_BUILD_VERSION} - fi + if [ -z ${CDP_SOURCE_BRANCH} ]; then + cdp-promote-image ${IMAGE}:${CDP_BUILD_VERSION} + fi - - id: build-operator-ui - env: - <<: *BUILD_ENV - type: script - vm_config: - type: linux + - id: build-operator-ui + env: + <<: *BUILD_ENV + type: script + vm_config: + type: linux - commands: - - desc: 'Prepare environment' - cmd: | - apt-get update - apt-get install -y build-essential + commands: + - desc: 'Prepare environment' + cmd: | + apt-get update + apt-get install -y build-essential - - desc: 'Compile JavaScript app' - cmd: | - cd ui - make appjs + - desc: 'Compile JavaScript app' + cmd: | + cd ui + make appjs - - desc: 'Build and push Docker image' - cmd: | - cd ui - if [ -z ${CDP_SOURCE_BRANCH} ]; then - IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-ui - else - IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-ui-test - fi - - IMAGE_TAG=$(make docker-push IMAGE=${IMAGE} BASE_IMAGE=${PYTHON_BASE_IMAGE}) + - desc: 'Build and push Docker image' + cmd: | + cd ui + if [ -z ${CDP_SOURCE_BRANCH} ]; then + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-ui + else + IMAGE=${MULTI_ARCH_REGISTRY}/postgres-operator-ui-test + fi + + make appjs + docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use + docker buildx build --platform linux/amd64,linux/arm64 \ + --build-arg BASE_IMAGE="${PYTHON_BASE_IMAGE}" \ + -t ${IMAGE}:${CDP_BUILD_VERSION} \ + --push . - if [ -z ${CDP_SOURCE_BRANCH} ]; then - cdp-promote-image ${IMAGE_TAG} - fi + if [ -z ${CDP_SOURCE_BRANCH} ]; then + cdp-promote-image ${IMAGE}:${CDP_BUILD_VERSION} + fi - - id: build-logical-backup - env: - <<: *BUILD_ENV - type: script - vm_config: - type: linux + - id: build-logical-backup + env: + <<: *BUILD_ENV + type: script + vm_config: + type: linux - commands: - - desc: Build image - cmd: | - cd logical-backup - export TAG=$(git describe --tags --always --dirty) - docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use - docker buildx build --platform linux/amd64,linux/arm64 \ - -t ${MULTI_ARCH_REGISTRY}/postgres-operator-logical-backup:${TAG} \ - --push . + commands: + - desc: Build image + cmd: | + cd logical-backup - if [ -z ${CDP_SOURCE_BRANCH} ]; then - cdp-promote-image ${MULTI_ARCH_REGISTRY}/postgres-operator-logical-backup:${TAG} - fi + if [ -z ${CDP_SOURCE_BRANCH} ]; then + IMAGE=${MULTI_ARCH_REGISTRY}/logical-backup + else + IMAGE=${MULTI_ARCH_REGISTRY}/logical-backup-test + fi + + docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use + docker buildx build --platform linux/amd64,linux/arm64 \ + -t ${IMAGE}:${CDP_BUILD_VERSION} \ + --push . + + if [ -z ${CDP_SOURCE_BRANCH} ]; then + cdp-promote-image ${IMAGE}:${CDP_BUILD_VERSION} + fi diff --git a/ui/Makefile b/ui/Makefile index 70c2018db..ff4cf94f6 100644 --- a/ui/Makefile +++ b/ui/Makefile @@ -33,18 +33,5 @@ docker: appjs echo "git describe $(shell git describe --tags --always --dirty)" docker build --rm -t "$(IMAGE):$(TAG)$(CDP_TAG)" -f Dockerfile --build-arg BASE_IMAGE="${BASE_IMAGE}" . -docker-push: appjs - echo "Tag ${TAG}" - echo "Version ${VERSION}" - echo "CDP tag ${CDP_TAG}" - echo "git describe $(shell git describe --tags --always --dirty)" - docker buildx create --config /etc/cdp-buildkitd.toml --driver-opt network=host --bootstrap --use - docker buildx build --platform linux/amd64,linux/arm64 \ - --build-arg BASE_IMAGE="${BASE_IMAGE}" \ - -f Dockerfile \ - -t "$(IMAGE):$(TAG)$(CDP_TAG)" \ - --push . - echo "$(IMAGE):$(TAG)$(CDP_TAG)" - mock: docker run -it -p 8081:8081 "$(IMAGE):$(TAG)" --mock From c4f10ceadc9dfd541f61318441920eca1c01b5d2 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Tue, 16 Dec 2025 19:25:12 +0100 Subject: [PATCH 29/30] bump to v1.15.1 (#3011) * bump to v1.15.1 --- .../postgres-operator-issue-template.md | 2 +- README.md | 2 +- charts/postgres-operator-ui/Chart.yaml | 4 +- charts/postgres-operator-ui/index.yaml | 22 +++++------ .../postgres-operator-ui-1.15.0.tgz | Bin 5089 -> 0 bytes .../postgres-operator-ui-1.15.1.tgz | Bin 0 -> 5088 bytes charts/postgres-operator-ui/values.yaml | 2 +- charts/postgres-operator/Chart.yaml | 4 +- charts/postgres-operator/index.yaml | 36 ++++++++++++++---- .../postgres-operator-1.15.1.tgz | Bin 0 -> 18278 bytes charts/postgres-operator/values.yaml | 4 +- delivery.yaml | 1 - kubectl-pg/go.mod | 19 ++++----- kubectl-pg/go.sum | 35 +++++++++-------- manifests/configmap.yaml | 2 +- manifests/operatorconfiguration.crd.yaml | 2 +- manifests/postgres-operator.yaml | 2 +- ...gresql-operator-default-configuration.yaml | 2 +- pkg/controller/operator_config.go | 2 +- pkg/util/config/config.go | 2 +- ui/app/package.json | 2 +- ui/manifests/deployment.yaml | 2 +- 22 files changed, 86 insertions(+), 61 deletions(-) delete mode 100644 charts/postgres-operator-ui/postgres-operator-ui-1.15.0.tgz create mode 100644 charts/postgres-operator-ui/postgres-operator-ui-1.15.1.tgz create mode 100644 charts/postgres-operator/postgres-operator-1.15.1.tgz diff --git a/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md b/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md index ee3a704ea..3b731eb72 100644 --- a/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md +++ b/.github/ISSUE_TEMPLATE/postgres-operator-issue-template.md @@ -9,7 +9,7 @@ assignees: '' Please, answer some short questions which should help us to understand your problem / question better? -- **Which image of the operator are you using?** e.g. ghcr.io/zalando/postgres-operator:v1.13.0 +- **Which image of the operator are you using?** e.g. ghcr.io/zalando/postgres-operator:v1.15.1 - **Where do you run it - cloud or metal? Kubernetes or OpenShift?** [AWS K8s | GCP ... | Bare Metal K8s] - **Are you running Postgres Operator in production?** [yes | no] - **Type of issue?** [Bug report, question, feature request, etc.] diff --git a/README.md b/README.md index cc2bdb17e..7d54e9fd9 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ production for over five years. | Release | Postgres versions | K8s versions | Golang | | :-------- | :---------------: | :---------------: | :-----: | -| v1.15.0 | 13 → 17 | 1.27+ | 1.25.3 | +| v1.15.1 | 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 | diff --git a/charts/postgres-operator-ui/Chart.yaml b/charts/postgres-operator-ui/Chart.yaml index c9e28e56e..871640467 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.15.0 -appVersion: 1.15.0 +version: 1.15.1 +appVersion: 1.15.1 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 3ad4ac84f..20408aeaf 100644 --- a/charts/postgres-operator-ui/index.yaml +++ b/charts/postgres-operator-ui/index.yaml @@ -2,11 +2,11 @@ apiVersion: v1 entries: postgres-operator-ui: - apiVersion: v2 - appVersion: 1.15.0 - created: "2025-10-16T11:34:57.912432565+02:00" + appVersion: 1.15.1 + created: "2025-12-11T12:44:25.470723322+01:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience - digest: d82b5fb7c3d4fd8b106343b2f9472cba5e6050315ab3c520a79366f2b2f20c7a + digest: 4bbb750934366038d692711f924151182b7be131b6822d011f5a4e51cf609482 home: https://github.com/zalando/postgres-operator keywords: - postgres @@ -22,11 +22,11 @@ entries: sources: - https://github.com/zalando/postgres-operator urls: - - postgres-operator-ui-1.15.0.tgz - version: 1.15.0 + - postgres-operator-ui-1.15.1.tgz + version: 1.15.1 - apiVersion: v2 appVersion: 1.14.0 - created: "2025-10-16T11:34:57.906677165+02:00" + created: "2025-12-11T12:44:25.468680645+01:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: e87ed898079a852957a67a4caf3fbd27b9098e413f5d961b7a771a6ae8b3e17c @@ -49,7 +49,7 @@ entries: version: 1.14.0 - apiVersion: v2 appVersion: 1.13.0 - created: "2025-10-16T11:34:57.904106882+02:00" + created: "2025-12-11T12:44:25.466716836+01:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: e0444e516b50f82002d1a733527813c51759a627cefdd1005cea73659f824ea8 @@ -72,7 +72,7 @@ entries: version: 1.13.0 - apiVersion: v2 appVersion: 1.12.2 - created: "2025-10-16T11:34:57.901526106+02:00" + created: "2025-12-11T12:44:25.464739895+01:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: cbcef400c23ccece27d97369ad629278265c013e0a45c0b7f33e7568a082fedd @@ -95,7 +95,7 @@ entries: version: 1.12.2 - apiVersion: v2 appVersion: 1.11.0 - created: "2025-10-16T11:34:57.898843691+02:00" + created: "2025-12-11T12:44:25.462698399+01:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: a45f2284045c2a9a79750a36997386444f39b01ac722b17c84b431457577a3a2 @@ -118,7 +118,7 @@ entries: version: 1.11.0 - apiVersion: v2 appVersion: 1.10.1 - created: "2025-10-16T11:34:57.896283083+02:00" + created: "2025-12-11T12:44:25.460357063+01:00" description: Postgres Operator UI provides a graphical interface for a convenient database-as-a-service user experience digest: 2e5e7a82aebee519ec57c6243eb8735124aa4585a3a19c66ffd69638fbeb11ce @@ -139,4 +139,4 @@ entries: urls: - postgres-operator-ui-1.10.1.tgz version: 1.10.1 -generated: "2025-10-16T11:34:57.893034861+02:00" +generated: "2025-12-11T12:44:25.45732896+01: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 deleted file mode 100644 index 95fe866f6e03a19fcdd5161e845db9a1e3565643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5089 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 DDc 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 CAR(s! literal 0 HcmV?d00001 diff --git a/charts/postgres-operator-ui/values.yaml b/charts/postgres-operator-ui/values.yaml index 2e729ce76..c308335b2 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.15.0 + tag: v1.15.1 pullPolicy: "IfNotPresent" # Optionally specify an array of imagePullSecrets. diff --git a/charts/postgres-operator/Chart.yaml b/charts/postgres-operator/Chart.yaml index 40ffe22bc..6f0d2e762 100644 --- a/charts/postgres-operator/Chart.yaml +++ b/charts/postgres-operator/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: postgres-operator -version: 1.15.0 -appVersion: 1.15.0 +version: 1.15.1 +appVersion: 1.15.1 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 025ad2b9d..ad0a890b6 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.1 + created: "2025-12-11T12:43:37.232803735+01:00" + description: Postgres Operator creates and manages PostgreSQL clusters running + in Kubernetes + digest: 64d9c1d7be7e5bc4661099806b77dc509cb547938c2de6c7105f9665e9ee0aab + 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.1.tgz + version: 1.15.1 - apiVersion: v2 appVersion: 1.15.0 - created: "2025-10-16T11:35:38.533627038+02:00" + created: "2025-12-11T12:43:37.226030229+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 002dd47647bf51fbba023bd1762d807be478cf37de7a44b80cd01ac1f20bd94a @@ -25,7 +47,7 @@ entries: version: 1.15.0 - apiVersion: v2 appVersion: 1.14.0 - created: "2025-10-16T11:35:38.52489216+02:00" + created: "2025-12-11T12:43:37.217094172+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 36e1571f3f455b213f16cdda7b1158648e8e84deb804ba47ed6b9b6d19263ba8 @@ -47,7 +69,7 @@ entries: version: 1.14.0 - apiVersion: v2 appVersion: 1.13.0 - created: "2025-10-16T11:35:38.517347652+02:00" + created: "2025-12-11T12:43:37.211148314+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: a839601689aea0a7e6bc0712a5244d435683cf3314c95794097ff08540e1dfef @@ -69,7 +91,7 @@ entries: version: 1.13.0 - apiVersion: v2 appVersion: 1.12.2 - created: "2025-10-16T11:35:38.510819005+02:00" + created: "2025-12-11T12:43:37.202520969+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 65858d14a40d7fd90c32bd9fc60021acc9555c161079f43a365c70171eaf21d8 @@ -91,7 +113,7 @@ entries: version: 1.12.2 - apiVersion: v2 appVersion: 1.11.0 - created: "2025-10-16T11:35:38.503781253+02:00" + created: "2025-12-11T12:43:37.197036041+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 3914b5e117bda0834f05c9207f007e2ac372864cf6e86dcc2e1362bbe46c14d9 @@ -113,7 +135,7 @@ entries: version: 1.11.0 - apiVersion: v2 appVersion: 1.10.1 - created: "2025-10-16T11:35:38.494366224+02:00" + created: "2025-12-11T12:43:37.191421669+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: cc3baa41753da92466223d0b334df27e79c882296577b404a8e9071411fcf19c @@ -133,4 +155,4 @@ entries: urls: - postgres-operator-1.10.1.tgz version: 1.10.1 -generated: "2025-10-16T11:35:38.487472753+02:00" +generated: "2025-12-11T12:43:37.184779748+01:00" diff --git a/charts/postgres-operator/postgres-operator-1.15.1.tgz b/charts/postgres-operator/postgres-operator-1.15.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1e9373dbd081595911e65364fa86df6613a417c4 GIT binary patch literal 18278 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 pg7utrc(8jgJjmtSV> Date: Thu, 18 Dec 2025 12:12:53 +0100 Subject: [PATCH 30/30] fix docker build for UI and bumped some outdated versions in docs and config (#3017) * fix docker build for UI and bumped some outdated versions in docs and config * update helm chart image again because of wrong format field * switch to new registry ghcr.io for e2e test * update e2e test runner Dockerfile --- .../crds/operatorconfigurations.yaml | 2 +- .../postgres-operator/crds/postgresqls.yaml | 1 - charts/postgres-operator/index.yaml | 18 ++++++------- .../postgres-operator-1.15.1.tgz | Bin 18278 -> 18344 bytes docs/administrator.md | 2 +- docs/developer.md | 10 +++---- docs/reference/operator_parameters.md | 2 +- e2e/Dockerfile | 25 +++++++----------- e2e/Makefile | 4 +-- e2e/exec_into_env.sh | 4 +-- e2e/requirements.txt | 4 +-- e2e/run.sh | 8 +++--- manifests/postgresql.crd.yaml | 1 - pkg/apis/acid.zalan.do/v1/crds.go | 9 +++---- pkg/apis/acid.zalan.do/v1/util_test.go | 2 -- ui/Dockerfile | 2 +- 16 files changed, 41 insertions(+), 53 deletions(-) diff --git a/charts/postgres-operator/crds/operatorconfigurations.yaml b/charts/postgres-operator/crds/operatorconfigurations.yaml index c6da405a5..58e84bd2f 100644 --- a/charts/postgres-operator/crds/operatorconfigurations.yaml +++ b/charts/postgres-operator/crds/operatorconfigurations.yaml @@ -510,7 +510,7 @@ spec: pattern: '^(\d+m|\d+(\.\d{1,3})?)$' logical_backup_docker_image: type: string - default: "ghcr.io/zalando/postgres-operator/logical-backup:v1.13.0" + default: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" logical_backup_google_application_credentials: type: string logical_backup_job_prefix: diff --git a/charts/postgres-operator/crds/postgresqls.yaml b/charts/postgres-operator/crds/postgresqls.yaml index 8083e5e1d..667c58efa 100644 --- a/charts/postgres-operator/crds/postgresqls.yaml +++ b/charts/postgres-operator/crds/postgresqls.yaml @@ -278,7 +278,6 @@ spec: items: type: string weight: - format: int32 type: integer requiredDuringSchedulingIgnoredDuringExecution: type: object diff --git a/charts/postgres-operator/index.yaml b/charts/postgres-operator/index.yaml index ad0a890b6..7128b8eb9 100644 --- a/charts/postgres-operator/index.yaml +++ b/charts/postgres-operator/index.yaml @@ -3,10 +3,10 @@ entries: postgres-operator: - apiVersion: v2 appVersion: 1.15.1 - created: "2025-12-11T12:43:37.232803735+01:00" + created: "2025-12-17T14:48:33.832345061+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes - digest: 64d9c1d7be7e5bc4661099806b77dc509cb547938c2de6c7105f9665e9ee0aab + digest: 9f3edc3d796105c02c04eaae28a78e58fb08c1847a9de012245fd6ac2c0d2c00 home: https://github.com/zalando/postgres-operator keywords: - postgres @@ -25,7 +25,7 @@ entries: version: 1.15.1 - apiVersion: v2 appVersion: 1.15.0 - created: "2025-12-11T12:43:37.226030229+01:00" + created: "2025-12-17T14:48:33.826117296+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 002dd47647bf51fbba023bd1762d807be478cf37de7a44b80cd01ac1f20bd94a @@ -47,7 +47,7 @@ entries: version: 1.15.0 - apiVersion: v2 appVersion: 1.14.0 - created: "2025-12-11T12:43:37.217094172+01:00" + created: "2025-12-17T14:48:33.819729144+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 36e1571f3f455b213f16cdda7b1158648e8e84deb804ba47ed6b9b6d19263ba8 @@ -69,7 +69,7 @@ entries: version: 1.14.0 - apiVersion: v2 appVersion: 1.13.0 - created: "2025-12-11T12:43:37.211148314+01:00" + created: "2025-12-17T14:48:33.81038602+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: a839601689aea0a7e6bc0712a5244d435683cf3314c95794097ff08540e1dfef @@ -91,7 +91,7 @@ entries: version: 1.13.0 - apiVersion: v2 appVersion: 1.12.2 - created: "2025-12-11T12:43:37.202520969+01:00" + created: "2025-12-17T14:48:33.803256825+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 65858d14a40d7fd90c32bd9fc60021acc9555c161079f43a365c70171eaf21d8 @@ -113,7 +113,7 @@ entries: version: 1.12.2 - apiVersion: v2 appVersion: 1.11.0 - created: "2025-12-11T12:43:37.197036041+01:00" + created: "2025-12-17T14:48:33.797369053+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: 3914b5e117bda0834f05c9207f007e2ac372864cf6e86dcc2e1362bbe46c14d9 @@ -135,7 +135,7 @@ entries: version: 1.11.0 - apiVersion: v2 appVersion: 1.10.1 - created: "2025-12-11T12:43:37.191421669+01:00" + created: "2025-12-17T14:48:33.791368349+01:00" description: Postgres Operator creates and manages PostgreSQL clusters running in Kubernetes digest: cc3baa41753da92466223d0b334df27e79c882296577b404a8e9071411fcf19c @@ -155,4 +155,4 @@ entries: urls: - postgres-operator-1.10.1.tgz version: 1.10.1 -generated: "2025-12-11T12:43:37.184779748+01:00" +generated: "2025-12-17T14:48:33.785159183+01:00" diff --git a/charts/postgres-operator/postgres-operator-1.15.1.tgz b/charts/postgres-operator/postgres-operator-1.15.1.tgz index 1e9373dbd081595911e65364fa86df6613a417c4..7dce6f87d253c4a707ecc14d855e8c164a039f47 100644 GIT binary patch literal 18344 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
<-Um&qb!-ikePjCTH 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 DAPda- literal 18278 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 pg7utrc(8jgJjmtSV> +kind load docker-image ghcr.io/zalando/postgres-operator:${TAG} --name ``` Then create a new Postgres Operator deployment. @@ -276,10 +276,10 @@ Examples for fake K8s objects can be found in: The operator provides reference end-to-end (e2e) tests to ensure various infrastructure parts work smoothly together. The test code is available at `e2e/tests`. -The special `registry.opensource.zalan.do/acid/postgres-operator-e2e-tests-runner` image is used to run the tests. The container mounts the local `e2e/tests` directory at runtime, so whatever you modify in your local copy of the tests will be executed by a test runner. By maintaining a separate test runner image we avoid the need to re-build the e2e test image on every build. +The special `ghcr.io/zalando/postgres-operator-e2e-tests-runner` image is used to run the tests. The container mounts the local `e2e/tests` directory at runtime, so whatever you modify in your local copy of the tests will be executed by a test runner. By maintaining a separate test runner image we avoid the need to re-build the e2e test image on every build. -Each e2e execution tests a Postgres Operator image built from the current git branch. The test -runner creates a new local K8s cluster using [kind](https://kind.sigs.k8s.io/), +Each e2e execution tests a Postgres Operator image built from the current git branch. +The test runner creates a new local K8s cluster using [kind](https://kind.sigs.k8s.io/), utilizes provided manifest examples, and runs e2e tests contained in the `tests` folder. The K8s API client in the container connects to the `kind` cluster via the standard Docker `bridge` network. The kind cluster is deleted if tests diff --git a/docs/reference/operator_parameters.md b/docs/reference/operator_parameters.md index 7e7cbeaf0..5662d6b8e 100644 --- a/docs/reference/operator_parameters.md +++ b/docs/reference/operator_parameters.md @@ -824,7 +824,7 @@ grouped under the `logical_backup` key. runs `pg_dumpall` on a replica if possible and uploads compressed results to an S3 bucket under the key `////logical_backups`. The default image is the same image built with the Zalando-internal CI - pipeline. Default: "ghcr.io/zalando/postgres-operator/logical-backup:v1.13.0" + pipeline. Default: "ghcr.io/zalando/postgres-operator/logical-backup:v1.15.1" * **logical_backup_google_application_credentials** Specifies the path of the google cloud service account json file. Default is empty. diff --git a/e2e/Dockerfile b/e2e/Dockerfile index 4ad55c136..98bbf755a 100644 --- a/e2e/Dockerfile +++ b/e2e/Dockerfile @@ -1,27 +1,20 @@ # An image to run e2e tests. # The image does not include the tests; all necessary files are bind-mounted when a container starts. -FROM ubuntu:20.04 +FROM python:3.11-slim LABEL maintainer="Team ACID @ Zalando " ENV TERM xterm-256color -COPY requirements.txt ./ - -RUN apt-get update \ - && apt-get install --no-install-recommends -y \ - python3 \ - python3-setuptools \ - python3-pip \ - curl \ - vim \ - && pip3 install --no-cache-dir -r requirements.txt \ +RUN apt-get -qq -y update \ + # https://www.psycopg.org/docs/install.html#psycopg-vs-psycopg-binary + && apt-get -qq -y install --no-install-recommends curl vim python3-dev \ && 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 \ + && apt-get -qq -y clean \ && rm -rf /var/lib/apt/lists/* -# working line -# python3 -m unittest discover -v --failfast -k test_e2e.EndToEndTestCase.test_lazy_spilo_upgrade --start-directory tests -ENTRYPOINT ["python3", "-m", "unittest"] -CMD ["discover","-v","--failfast","--start-directory","/tests"] \ No newline at end of file +COPY requirements.txt ./ +RUN pip install -r ./requirements.txt + +CMD ["python", "-m", "unittest", "discover", "-v", "--failfast", "--start-directory", "/tests"] \ No newline at end of file diff --git a/e2e/Makefile b/e2e/Makefile index 52d24e9e5..5fa0de471 100644 --- a/e2e/Makefile +++ b/e2e/Makefile @@ -11,7 +11,7 @@ endif LOCAL_BUILD_FLAGS ?= $(BUILD_FLAGS) LDFLAGS ?= -X=main.version=$(VERSION) -IMAGE ?= registry.opensource.zalan.do/acid/$(BINARY) +IMAGE ?= ghcr.io/zalando/$(BINARY) VERSION ?= $(shell git describe --tags --always --dirty) TAG ?= $(VERSION) GITHEAD = $(shell git rev-parse --short HEAD) @@ -46,7 +46,7 @@ tools: # install pinned version of 'kind' # go install must run outside of a dir with a (module-based) Go project ! # otherwise go install updates project's dependencies and/or behaves differently - cd "/tmp" && GO111MODULE=on go install sigs.k8s.io/kind@v0.24.0 + cd "/tmp" && GO111MODULE=on go install sigs.k8s.io/kind@v0.27.0 e2etest: tools copy clean ./run.sh main diff --git a/e2e/exec_into_env.sh b/e2e/exec_into_env.sh index 59acbeeb4..a46efecbd 100755 --- a/e2e/exec_into_env.sh +++ b/e2e/exec_into_env.sh @@ -2,8 +2,8 @@ export cluster_name="postgres-operator-e2e-tests" export kubeconfig_path="/tmp/kind-config-${cluster_name}" -export operator_image="registry.opensource.zalan.do/acid/postgres-operator:latest" -export e2e_test_runner_image="registry.opensource.zalan.do/acid/postgres-operator-e2e-tests-runner:0.4" +export operator_image="ghcr.io/zalando/postgres-operator:latest" +export e2e_test_runner_image="ghcr.io/zalando/postgres-operator-e2e-tests-runner:latest" docker run -it --entrypoint /bin/bash --network=host -e "TERM=xterm-256color" \ --mount type=bind,source="$(readlink -f ${kubeconfig_path})",target=/root/.kube/config \ diff --git a/e2e/requirements.txt b/e2e/requirements.txt index d904585be..30b656552 100644 --- a/e2e/requirements.txt +++ b/e2e/requirements.txt @@ -1,3 +1,3 @@ -kubernetes==29.2.0 +kubernetes==31.0.0 timeout_decorator==0.5.0 -pyyaml==6.0.1 +pyyaml==6.0.3 diff --git a/e2e/run.sh b/e2e/run.sh index d289cb3f4..b0f13f92e 100755 --- a/e2e/run.sh +++ b/e2e/run.sh @@ -9,7 +9,7 @@ IFS=$'\n\t' readonly cluster_name="postgres-operator-e2e-tests" readonly kubeconfig_path="/tmp/kind-config-${cluster_name}" readonly spilo_image="registry.opensource.zalan.do/acid/spilo-17-e2e:0.3" -readonly e2e_test_runner_image="registry.opensource.zalan.do/acid/postgres-operator-e2e-tests-runner:0.4" +readonly e2e_test_runner_image="ghcr.io/zalando/postgres-operator-e2e-tests-runner:latest" export GOPATH=${GOPATH-~/go} export PATH=${GOPATH}/bin:$PATH @@ -19,11 +19,11 @@ echo "Kubeconfig path: ${kubeconfig_path}" function pull_images(){ operator_tag=$(git describe --tags --always --dirty) - if [[ -z $(docker images -q registry.opensource.zalan.do/acid/postgres-operator:${operator_tag}) ]] + if [[ -z $(docker images -q ghcr.io/zalando/postgres-operator:${operator_tag}) ]] then - docker pull registry.opensource.zalan.do/acid/postgres-operator:latest + docker pull ghcr.io/zalando/postgres-operator:latest fi - operator_image=$(docker images --filter=reference="registry.opensource.zalan.do/acid/postgres-operator" --format "{{.Repository}}:{{.Tag}}" | head -1) + operator_image=$(docker images --filter=reference="ghcr.io/zalando/postgres-operator" --format "{{.Repository}}:{{.Tag}}" | head -1) } function start_kind(){ diff --git a/manifests/postgresql.crd.yaml b/manifests/postgresql.crd.yaml index 39d751cef..7a1b21a4d 100644 --- a/manifests/postgresql.crd.yaml +++ b/manifests/postgresql.crd.yaml @@ -276,7 +276,6 @@ spec: items: type: string weight: - format: int32 type: integer requiredDuringSchedulingIgnoredDuringExecution: type: object diff --git a/pkg/apis/acid.zalan.do/v1/crds.go b/pkg/apis/acid.zalan.do/v1/crds.go index 3f6bf25d9..b89cb1448 100644 --- a/pkg/apis/acid.zalan.do/v1/crds.go +++ b/pkg/apis/acid.zalan.do/v1/crds.go @@ -436,8 +436,7 @@ var PostgresCRDResourceValidation = apiextv1.CustomResourceValidation{ }, }, "weight": { - Type: "integer", - Format: "int32", + Type: "integer", }, }, }, @@ -768,9 +767,9 @@ var PostgresCRDResourceValidation = apiextv1.CustomResourceValidation{ }, }, OneOf: []apiextv1.JSONSchemaProps{ - apiextv1.JSONSchemaProps{Required: []string{"s3_wal_path"}}, - apiextv1.JSONSchemaProps{Required: []string{"gs_wal_path"}}, - apiextv1.JSONSchemaProps{Required: []string{"standby_host"}}, + {Required: []string{"s3_wal_path"}}, + {Required: []string{"gs_wal_path"}}, + {Required: []string{"standby_host"}}, }, }, "streams": { diff --git a/pkg/apis/acid.zalan.do/v1/util_test.go b/pkg/apis/acid.zalan.do/v1/util_test.go index 5e4913ffe..9f3fe9bde 100644 --- a/pkg/apis/acid.zalan.do/v1/util_test.go +++ b/pkg/apis/acid.zalan.do/v1/util_test.go @@ -787,8 +787,6 @@ func TestPostgresListMeta(t *testing.T) { if a := tt.out.GetListMeta(); reflect.DeepEqual(a, tt.out.ListMeta) { t.Errorf("GetObjectMeta expected: %v, got: %v", tt.out.ListMeta, a) } - - return }) } } diff --git a/ui/Dockerfile b/ui/Dockerfile index 8ed70c2c0..63170a24b 100644 --- a/ui/Dockerfile +++ b/ui/Dockerfile @@ -17,7 +17,7 @@ WORKDIR /app RUN apt-get -qq -y update \ # https://www.psycopg.org/docs/install.html#psycopg-vs-psycopg-binary - && apt-get -qq -y install --no-install-recommends g++ libpq-dev python3-dev python3-distutils \ + && apt-get -qq -y install --no-install-recommends g++ libpq-dev python3-dev \ && apt-get -qq -y clean \ && rm -rf /var/lib/apt/lists/*