Merge branch 'master' into fix/missing-s3-client-endpoint-override
This commit is contained in:
		
						commit
						b7f3a15afa
					
				|  | @ -23,7 +23,7 @@ jobs: | ||||||
| 
 | 
 | ||||||
|       - uses: actions/setup-go@v2 |       - uses: actions/setup-go@v2 | ||||||
|         with: |         with: | ||||||
|           go-version: "^1.23.4" |           go-version: "^1.25.0" | ||||||
| 
 | 
 | ||||||
|       - name: Run unit tests |       - name: Run unit tests | ||||||
|         run: make deps mocks test |         run: make deps mocks test | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ jobs: | ||||||
|     - uses: actions/checkout@v1 |     - uses: actions/checkout@v1 | ||||||
|     - uses: actions/setup-go@v2 |     - uses: actions/setup-go@v2 | ||||||
|       with: |       with: | ||||||
|           go-version: "^1.23.4" |           go-version: "^1.25.0" | ||||||
|     - name: Make dependencies |     - name: Make dependencies | ||||||
|       run: make deps mocks |       run: make deps mocks | ||||||
|     - name: Code generation |     - name: Code generation | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ jobs: | ||||||
|     - uses: actions/checkout@v2 |     - uses: actions/checkout@v2 | ||||||
|     - uses: actions/setup-go@v2 |     - uses: actions/setup-go@v2 | ||||||
|       with: |       with: | ||||||
|           go-version: "^1.23.4" |           go-version: "^1.25.0" | ||||||
|     - name: Make dependencies |     - name: Make dependencies | ||||||
|       run: make deps mocks |       run: make deps mocks | ||||||
|     - name: Compile |     - name: Compile | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										4
									
								
								Makefile
								
								
								
								
							|  | @ -43,7 +43,7 @@ ifndef GOPATH | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| PATH := $(GOPATH)/bin:$(PATH) | PATH := $(GOPATH)/bin:$(PATH) | ||||||
| SHELL := env PATH=$(PATH) $(SHELL) | SHELL := env PATH="$(PATH)" $(SHELL) | ||||||
| 
 | 
 | ||||||
| default: local | 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}" . | 	docker build --rm -t "$(IMAGE):$(TAG)$(CDP_TAG)$(DEBUG_FRESH)$(DEBUG_POSTFIX)" -f "${DOCKERDIR}/${DOCKERFILE}" --build-arg VERSION="${VERSION}" . | ||||||
| 
 | 
 | ||||||
| indocker-race: | 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: | push: | ||||||
| 	docker push "$(IMAGE):$(TAG)$(CDP_TAG)" | 	docker push "$(IMAGE):$(TAG)$(CDP_TAG)" | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| FROM golang:1.23-alpine | FROM golang:1.25-alpine | ||||||
| LABEL maintainer="Team ACID @ Zalando <team-acid@zalando.de>" | LABEL maintainer="Team ACID @ Zalando <team-acid@zalando.de>" | ||||||
| 
 | 
 | ||||||
| # We need root certificates to deal with teams api over https | # We need root certificates to deal with teams api over https | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| ARG BASE_IMAGE=registry.opensource.zalan.do/library/alpine-3:latest | 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 | ARG VERSION=latest | ||||||
| 
 | 
 | ||||||
| COPY  . /go/src/github.com/zalando/postgres-operator | COPY  . /go/src/github.com/zalando/postgres-operator | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ apt-get install -y wget | ||||||
| 
 | 
 | ||||||
| ( | ( | ||||||
|     cd /tmp |     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 |     tar -xf go.tar.gz | ||||||
|     mv go /usr/local |     mv go /usr/local | ||||||
|     ln -s /usr/local/go/bin/go /usr/bin/go |     ln -s /usr/local/go/bin/go /usr/bin/go | ||||||
|  |  | ||||||
|  | @ -107,8 +107,13 @@ Those are top-level keys, containing both leaf keys and groups. | ||||||
| * **kubernetes_use_configmaps** | * **kubernetes_use_configmaps** | ||||||
|   Select if setup uses endpoints (default), or configmaps to manage leader when |   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 |   DCS is kubernetes (not etcd or similar). In OpenShift it is not possible to | ||||||
|   use endpoints option, and configmaps is required. By default, |   use endpoints option, and configmaps is required. Starting with K8s 1.33, | ||||||
|   `kubernetes_use_configmaps: false`, meaning endpoints will be used. |   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** | * **docker_image** | ||||||
|   Spilo Docker image for Postgres instances. For production, don't rely on the |   Spilo Docker image for Postgres instances. For production, don't rely on the | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										22
									
								
								go.mod
								
								
								
								
							|  | @ -1,8 +1,9 @@ | ||||||
| module github.com/zalando/postgres-operator | module github.com/zalando/postgres-operator | ||||||
| 
 | 
 | ||||||
| go 1.23.4 | go 1.25.0 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
|  | 	github.com/Masterminds/semver v1.5.0 | ||||||
| 	github.com/aws/aws-sdk-go v1.53.8 | 	github.com/aws/aws-sdk-go v1.53.8 | ||||||
| 	github.com/golang/mock v1.6.0 | 	github.com/golang/mock v1.6.0 | ||||||
| 	github.com/lib/pq v1.10.9 | 	github.com/lib/pq v1.10.9 | ||||||
|  | @ -11,8 +12,7 @@ require ( | ||||||
| 	github.com/r3labs/diff v1.1.0 | 	github.com/r3labs/diff v1.1.0 | ||||||
| 	github.com/sirupsen/logrus v1.9.3 | 	github.com/sirupsen/logrus v1.9.3 | ||||||
| 	github.com/stretchr/testify v1.9.0 | 	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 | 	gopkg.in/yaml.v2 v2.4.0 | ||||||
| 	k8s.io/api v0.30.4 | 	k8s.io/api v0.30.4 | ||||||
| 	k8s.io/apiextensions-apiserver v0.25.9 | 	k8s.io/apiextensions-apiserver v0.25.9 | ||||||
|  | @ -22,7 +22,6 @@ require ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/Masterminds/semver v1.5.0 |  | ||||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||||
| 	github.com/emicklei/go-restful/v3 v3.11.0 // indirect | 	github.com/emicklei/go-restful/v3 v3.11.0 // indirect | ||||||
| 	github.com/evanphx/json-patch v4.12.0+incompatible // indirect | 	github.com/evanphx/json-patch v4.12.0+incompatible // indirect | ||||||
|  | @ -51,15 +50,16 @@ require ( | ||||||
| 	github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // 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.0 // indirect | ||||||
| 	github.com/spf13/pflag v1.0.5 // indirect | 	github.com/spf13/pflag v1.0.5 // indirect | ||||||
| 	golang.org/x/mod v0.17.0 // indirect | 	golang.org/x/mod v0.27.0 // indirect | ||||||
| 	golang.org/x/net v0.25.0 // indirect | 	golang.org/x/net v0.43.0 // indirect | ||||||
| 	golang.org/x/oauth2 v0.10.0 // indirect | 	golang.org/x/oauth2 v0.10.0 // indirect | ||||||
| 	golang.org/x/sync v0.10.0 // indirect | 	golang.org/x/sync v0.16.0 // indirect | ||||||
| 	golang.org/x/sys v0.28.0 // indirect | 	golang.org/x/sys v0.35.0 // indirect | ||||||
| 	golang.org/x/term v0.27.0 // indirect | 	golang.org/x/term v0.34.0 // indirect | ||||||
| 	golang.org/x/text v0.21.0 // indirect | 	golang.org/x/text v0.28.0 // indirect | ||||||
| 	golang.org/x/time v0.3.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 | ||||||
|  | 	golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect | ||||||
| 	google.golang.org/appengine v1.6.7 // indirect | 	google.golang.org/appengine v1.6.7 // indirect | ||||||
| 	google.golang.org/protobuf v1.33.0 // indirect | 	google.golang.org/protobuf v1.33.0 // indirect | ||||||
| 	gopkg.in/inf.v0 v0.9.1 // indirect | 	gopkg.in/inf.v0 v0.9.1 // indirect | ||||||
|  |  | ||||||
							
								
								
									
										38
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										38
									
								
								go.sum
								
								
								
								
							|  | @ -119,31 +119,29 @@ 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-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-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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= | golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= | ||||||
| golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= | 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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
| golang.org/x/mod v0.3.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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
| golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= | golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= | ||||||
| golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | 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-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-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-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-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-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.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= | ||||||
| golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= | golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= | ||||||
| golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= | 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 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= | ||||||
| golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= | 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-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-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-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.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.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= | ||||||
| golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | 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-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-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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | @ -151,16 +149,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-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-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.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= | golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= | ||||||
| golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | 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.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||||
| golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= | golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= | ||||||
| golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= | 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.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.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.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= | golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= | ||||||
| golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= | 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 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= | ||||||
| golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | 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= | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
|  | @ -169,8 +167,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-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.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||||
| golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | 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.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= | ||||||
| golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= | 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-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-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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| module github.com/zalando/postgres-operator/kubectl-pg | module github.com/zalando/postgres-operator/kubectl-pg | ||||||
| 
 | 
 | ||||||
| go 1.23.4 | go 1.25 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/spf13/cobra v1.8.1 | 	github.com/spf13/cobra v1.8.1 | ||||||
|  |  | ||||||
|  | @ -122,7 +122,21 @@ function aws_upload { | ||||||
| function gcs_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 |     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 { | function upload { | ||||||
|  |  | ||||||
|  | @ -59,13 +59,20 @@ rules: | ||||||
|   - get |   - get | ||||||
|   - patch |   - patch | ||||||
|   - update |   - update | ||||||
| # to read configuration from ConfigMaps | # to read configuration from ConfigMaps and help Patroni manage the cluster if endpoints are not used | ||||||
| - apiGroups: | - apiGroups: | ||||||
|   - "" |   - "" | ||||||
|   resources: |   resources: | ||||||
|   - configmaps |   - configmaps | ||||||
|   verbs: |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - deletecollection | ||||||
|   - get |   - get | ||||||
|  |   - list | ||||||
|  |   - patch | ||||||
|  |   - update | ||||||
|  |   - watch | ||||||
| # to send events to the CRs | # to send events to the CRs | ||||||
| - apiGroups: | - apiGroups: | ||||||
|   - "" |   - "" | ||||||
|  | @ -78,7 +85,7 @@ rules: | ||||||
|   - patch |   - patch | ||||||
|   - update |   - update | ||||||
|   - watch |   - 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: | - apiGroups: | ||||||
|   - "" |   - "" | ||||||
|   resources: |   resources: | ||||||
|  | @ -249,7 +256,21 @@ kind: ClusterRole | ||||||
| metadata: | metadata: | ||||||
|   name: postgres-pod |   name: postgres-pod | ||||||
| rules: | 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: | - apiGroups: | ||||||
|   - "" |   - "" | ||||||
|   resources: |   resources: | ||||||
|  |  | ||||||
|  | @ -841,6 +841,14 @@ func (c *Cluster) compareServices(old, new *v1.Service) (bool, string) { | ||||||
| 		return false, "new service's owner references do not match the current ones" | 		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" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if old.Spec.ExternalTrafficPolicy != new.Spec.ExternalTrafficPolicy { | ||||||
|  | 		return false, "new service's ExternalTrafficPolicy does not match the current one" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return true, "" | 	return true, "" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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{ | 	svc := &v1.Service{ | ||||||
| 		Spec: v1.ServiceSpec{ | 		Spec: v1.ServiceSpec{ | ||||||
| 			Type:                     svcT, | 			Selector:                 selector, | ||||||
| 			LoadBalancerSourceRanges: lbSr, | 			Type:                     svcType, | ||||||
|  | 			LoadBalancerSourceRanges: sourceRanges, | ||||||
|  | 			ExternalTrafficPolicy:    policy, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	svc.Annotations = ann | 	svc.Annotations = annotations | ||||||
| 	return svc | 	return svc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1365,13 +1372,18 @@ func TestCompareServices(t *testing.T) { | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	defaultPolicy := v1.ServiceExternalTrafficPolicyTypeCluster | ||||||
|  | 
 | ||||||
| 	serviceWithOwnerReference := newService( | 	serviceWithOwnerReference := newService( | ||||||
| 		map[string]string{ | 		map[string]string{ | ||||||
| 			constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | 			constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | ||||||
| 			constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 			constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 		}, | 		}, | ||||||
| 		v1.ServiceTypeClusterIP, | 		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{ | 	ownerRef := metav1.OwnerReference{ | ||||||
| 		APIVersion: "acid.zalan.do/v1", | 		APIVersion: "acid.zalan.do/v1", | ||||||
|  | @ -1397,14 +1409,16 @@ func TestCompareServices(t *testing.T) { | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeClusterIP, | 				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( | 			new: newService( | ||||||
| 				map[string]string{ | 				map[string]string{ | ||||||
| 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeClusterIP, | 				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, | 			match: true, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -1415,14 +1429,16 @@ func TestCompareServices(t *testing.T) { | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeClusterIP, | 				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( | 			new: newService( | ||||||
| 				map[string]string{ | 				map[string]string{ | ||||||
| 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeLoadBalancer, | 				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, | 			match:  false, | ||||||
| 			reason: `new service's type "LoadBalancer" does not match the current one "ClusterIP"`, | 			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, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeLoadBalancer, | 				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( | 			new: newService( | ||||||
| 				map[string]string{ | 				map[string]string{ | ||||||
| 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeLoadBalancer, | 				v1.ServiceTypeLoadBalancer, | ||||||
| 				[]string{"185.249.56.0/22"}), | 				[]string{"185.249.56.0/22"}, | ||||||
|  | 				nil, defaultPolicy), | ||||||
| 			match:  false, | 			match:  false, | ||||||
| 			reason: `new service's LoadBalancerSourceRange does not match the current one`, | 			reason: `new service's LoadBalancerSourceRange does not match the current one`, | ||||||
| 		}, | 		}, | ||||||
|  | @ -1453,14 +1471,16 @@ func TestCompareServices(t *testing.T) { | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeLoadBalancer, | 				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( | 			new: newService( | ||||||
| 				map[string]string{ | 				map[string]string{ | ||||||
| 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | 					constants.ZalandoDNSNameAnnotation: "clstr.acid.zalan.do", | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeLoadBalancer, | 				v1.ServiceTypeLoadBalancer, | ||||||
| 				[]string{}), | 				[]string{}, | ||||||
|  | 				nil, defaultPolicy), | ||||||
| 			match:  false, | 			match:  false, | ||||||
| 			reason: `new service's LoadBalancerSourceRange does not match the current one`, | 			reason: `new service's LoadBalancerSourceRange does not match the current one`, | ||||||
| 		}, | 		}, | ||||||
|  | @ -1472,10 +1492,39 @@ func TestCompareServices(t *testing.T) { | ||||||
| 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | 					constants.ElbTimeoutAnnotationName: constants.ElbTimeoutAnnotationValue, | ||||||
| 				}, | 				}, | ||||||
| 				v1.ServiceTypeClusterIP, | 				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, | 			new:   serviceWithOwnerReference, | ||||||
| 			match: false, | 			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 { | 	for _, tt := range tests { | ||||||
|  |  | ||||||
|  | @ -4,7 +4,9 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"maps" | ||||||
| 	"path" | 	"path" | ||||||
|  | 	"slices" | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
|  | @ -12,19 +14,16 @@ import ( | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| 
 | 
 | ||||||
| 	appsv1 "k8s.io/api/apps/v1" | 	appsv1 "k8s.io/api/apps/v1" | ||||||
|  | 	batchv1 "k8s.io/api/batch/v1" | ||||||
| 	v1 "k8s.io/api/core/v1" | 	v1 "k8s.io/api/core/v1" | ||||||
| 	policyv1 "k8s.io/api/policy/v1" | 	policyv1 "k8s.io/api/policy/v1" | ||||||
| 	apierrors "k8s.io/apimachinery/pkg/api/errors" | 	apierrors "k8s.io/apimachinery/pkg/api/errors" | ||||||
| 	"k8s.io/apimachinery/pkg/api/resource" | 	"k8s.io/apimachinery/pkg/api/resource" | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	"k8s.io/apimachinery/pkg/labels" | ||||||
| 	"k8s.io/apimachinery/pkg/types" | 	"k8s.io/apimachinery/pkg/types" | ||||||
| 	"k8s.io/apimachinery/pkg/util/intstr" | 	"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" | 	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/spec" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util" | 	"github.com/zalando/postgres-operator/pkg/util" | ||||||
|  | @ -171,7 +170,7 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e | ||||||
| 		if isSmaller { | 		if isSmaller { | ||||||
| 			msg = fmt.Sprintf("defined CPU limit %s for %q container is below required minimum %s and will be increased", | 			msg = fmt.Sprintf("defined CPU limit %s for %q container is below required minimum %s and will be increased", | ||||||
| 				cpuLimit.String(), constants.PostgresContainerName, minCPULimit) | 				cpuLimit.String(), constants.PostgresContainerName, minCPULimit) | ||||||
| 			c.logger.Warningf(msg) | 			c.logger.Warningf("%s", msg) | ||||||
| 			c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) | 			c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) | ||||||
| 			resources.Limits[v1.ResourceCPU], _ = resource.ParseQuantity(minCPULimit) | 			resources.Limits[v1.ResourceCPU], _ = resource.ParseQuantity(minCPULimit) | ||||||
| 		} | 		} | ||||||
|  | @ -188,7 +187,7 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e | ||||||
| 		if isSmaller { | 		if isSmaller { | ||||||
| 			msg = fmt.Sprintf("defined memory limit %s for %q container is below required minimum %s and will be increased", | 			msg = fmt.Sprintf("defined memory limit %s for %q container is below required minimum %s and will be increased", | ||||||
| 				memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) | 				memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) | ||||||
| 			c.logger.Warningf(msg) | 			c.logger.Warningf("%s", msg) | ||||||
| 			c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) | 			c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) | ||||||
| 			resources.Limits[v1.ResourceMemory], _ = resource.ParseQuantity(minMemoryLimit) | 			resources.Limits[v1.ResourceMemory], _ = resource.ParseQuantity(minMemoryLimit) | ||||||
| 		} | 		} | ||||||
|  | @ -1928,7 +1927,7 @@ func (c *Cluster) generateSingleUserSecret(pgUser spec.PgUser) *v1.Secret { | ||||||
| 
 | 
 | ||||||
| 	// if secret lives in another namespace we cannot set ownerReferences
 | 	// if secret lives in another namespace we cannot set ownerReferences
 | ||||||
| 	var ownerReferences []metav1.OwnerReference | 	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 | 		ownerReferences = nil | ||||||
| 	} else { | 	} else { | ||||||
| 		ownerReferences = c.ownerReferences() | 		ownerReferences = c.ownerReferences() | ||||||
|  |  | ||||||
|  | @ -277,7 +277,7 @@ func (c *Cluster) majorVersionUpgrade() error { | ||||||
| 				isUpgradeSuccess = false | 				isUpgradeSuccess = false | ||||||
| 				c.annotatePostgresResource(isUpgradeSuccess) | 				c.annotatePostgresResource(isUpgradeSuccess) | ||||||
| 				c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "Major Version Upgrade", "upgrade from %d to %d FAILED: %v", c.currentMajorVersion, desiredVersion, scriptErrMsg) | 				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) | 			c.annotatePostgresResource(isUpgradeSuccess) | ||||||
|  |  | ||||||
|  | @ -3,12 +3,11 @@ package cluster | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"slices" | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"golang.org/x/exp/slices" |  | ||||||
| 
 |  | ||||||
| 	appsv1 "k8s.io/api/apps/v1" | 	appsv1 "k8s.io/api/apps/v1" | ||||||
| 	v1 "k8s.io/api/core/v1" | 	v1 "k8s.io/api/core/v1" | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  |  | ||||||
|  | @ -4,8 +4,10 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"maps" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"regexp" | 	"regexp" | ||||||
|  | 	"slices" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
|  | @ -15,8 +17,6 @@ import ( | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util" | 	"github.com/zalando/postgres-operator/pkg/util" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/constants" | 	"github.com/zalando/postgres-operator/pkg/util/constants" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/k8sutil" | 	"github.com/zalando/postgres-operator/pkg/util/k8sutil" | ||||||
| 	"golang.org/x/exp/maps" |  | ||||||
| 	"golang.org/x/exp/slices" |  | ||||||
| 	batchv1 "k8s.io/api/batch/v1" | 	batchv1 "k8s.io/api/batch/v1" | ||||||
| 	v1 "k8s.io/api/core/v1" | 	v1 "k8s.io/api/core/v1" | ||||||
| 	policyv1 "k8s.io/api/policy/v1" | 	policyv1 "k8s.io/api/policy/v1" | ||||||
|  | @ -1208,7 +1208,7 @@ func (c *Cluster) updateSecret( | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if 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 { | 		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 fmt.Errorf("could not update secret %s: %v", secretName, err) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -2,15 +2,14 @@ package cluster | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
|  | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"slices" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"context" |  | ||||||
| 
 |  | ||||||
| 	"golang.org/x/exp/slices" |  | ||||||
| 	v1 "k8s.io/api/core/v1" | 	v1 "k8s.io/api/core/v1" | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| 	"k8s.io/apimachinery/pkg/types" | 	"k8s.io/apimachinery/pkg/types" | ||||||
|  |  | ||||||
|  | @ -257,9 +257,9 @@ func (c *Cluster) getTeamMembers(teamID string) ([]string, error) { | ||||||
| 	if teamID == "" { | 	if teamID == "" { | ||||||
| 		msg := "no teamId specified" | 		msg := "no teamId specified" | ||||||
| 		if c.OpConfig.EnableTeamIdClusternamePrefix { | 		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 | 		return nil, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -129,7 +129,7 @@ func (c *Cluster) syncUnderlyingEBSVolume() error { | ||||||
| 
 | 
 | ||||||
| 	if len(errors) > 0 { | 	if len(errors) > 0 { | ||||||
| 		for _, s := range errors { | 		for _, s := range errors { | ||||||
| 			c.logger.Warningf(s) | 			c.logger.Warningf("%s", s) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
|  |  | ||||||
|  | @ -597,7 +597,7 @@ func (c *Controller) createPodServiceAccount(namespace string) error { | ||||||
| 	_, err := c.KubeClient.ServiceAccounts(namespace).Get(context.TODO(), podServiceAccountName, metav1.GetOptions{}) | 	_, err := c.KubeClient.ServiceAccounts(namespace).Get(context.TODO(), podServiceAccountName, metav1.GetOptions{}) | ||||||
| 	if k8sutil.ResourceNotFound(err) { | 	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
 | 		// get a separate copy of service account
 | ||||||
| 		// to prevent a race condition when setting a namespace for many clusters
 | 		// to prevent a race condition when setting a namespace for many clusters
 | ||||||
|  |  | ||||||
|  | @ -248,7 +248,7 @@ func (c *Controller) getInfrastructureRoles( | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if len(errors) > 0 { | 	if len(errors) > 0 { | ||||||
| 		return uniqRoles, fmt.Errorf(strings.Join(errors, `', '`)) | 		return uniqRoles, fmt.Errorf("%s", strings.Join(errors, `', '`)) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return uniqRoles, nil | 	return uniqRoles, nil | ||||||
|  |  | ||||||
|  | @ -9,6 +9,6 @@ jq==1.7.0 | ||||||
| json_delta>=2.0.2 | json_delta>=2.0.2 | ||||||
| kubernetes==11.0.0 | kubernetes==11.0.0 | ||||||
| python-json-logger==2.0.7 | python-json-logger==2.0.7 | ||||||
| requests==2.32.2 | requests==2.32.4 | ||||||
| stups-tokens>=1.1.19 | stups-tokens>=1.1.19 | ||||||
| werkzeug==3.0.6 | werkzeug==3.0.6 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue