From 1f4ee605ae35b25f45108cab29ae58d080697908 Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Thu, 18 Dec 2025 12:12:53 +0100 Subject: [PATCH] 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/*