From 9e248687ccc913be35d1bb50d62e7fdc66c410f2 Mon Sep 17 00:00:00 2001 From: liangxiangyu Date: Mon, 26 May 2025 11:48:14 +0800 Subject: [PATCH 1/2] ivorysql opertor V4 release --- .github/workflows/lint.yaml | 2 +- .github/workflows/test.yaml | 79 +++++++++---------- ReleaseNotes.md | 26 ++++++ ...y-operator.ivorysql.org_ivoryclusters.yaml | 2 +- ...ory-operator.ivorysql.org_ivyupgrades.yaml | 4 +- config/default/kustomization.yaml | 4 +- config/manager/manager.yaml | 10 +-- config/singlenamespace/kustomization.yaml | 4 +- ...y-operator.ivorysql.org_ivoryclusters.yaml | 2 +- .../install/default/kustomization.yaml | 2 +- .../kustomize/install/manager/manager.yaml | 4 +- .../singlenamespace/kustomization.yaml | 2 +- .../controller/ivorycluster/apply_test.go | 12 ++- internal/controller/ivorycluster/instance.go | 5 +- internal/controller/ivorycluster/ivory.go | 2 - internal/controller/ivorycluster/patroni.go | 2 +- .../controller/ivorycluster/pgbackrest.go | 6 +- .../ivorycluster/pgbackrest_test.go | 12 +-- internal/controller/ivorycluster/util.go | 4 +- internal/controller/ivorycluster/util_test.go | 2 +- internal/ivory/config_test.go | 2 +- internal/ivory/exec_test.go | 2 +- internal/patroni/api.go | 6 +- internal/patroni/config_test.go | 4 +- internal/pgadmin/config_test.go | 2 +- internal/pgadmin/reconcile.go | 2 +- internal/pgadmin/reconcile_test.go | 4 +- internal/pgaudit/postgres.go | 2 +- internal/pgaudit/postgres_test.go | 4 +- internal/pgbackrest/config.go | 2 +- internal/pgbackrest/config_test.go | 5 +- internal/pgbackrest/pgbackrest.go | 2 +- internal/pgbackrest/pgbackrest_test.go | 4 +- internal/pgbouncer/config_test.go | 2 +- .../v1beta1/ivorycluster_types.go | 2 +- .../v1beta1/pgupgrade_types.go | 4 +- .../e2e-other/cluster-migrate/06-assert.yaml | 2 +- .../cluster-migrate/07--set-collation.yaml | 2 +- .../cluster-migrate/09--check-data.yaml | 2 +- .../10-assert.yaml | 2 +- .../11-annotate.yaml | 2 +- .../12-assert.yaml | 2 +- .../13-delete-cluster-and-check.yaml | 2 +- .../exporter-upgrade/00--cluster.yaml | 2 +- .../exporter-upgrade/01--check-exporter.yaml | 2 +- .../exporter-upgrade/02--update-cluster.yaml | 2 +- .../exporter-upgrade/03--check-exporter.yaml | 2 +- testing/kuttl/e2e/delete/10-assert.yaml | 2 +- .../e2e/pgbackrest-restore/07--annotate.yaml | 2 +- .../pgbackrest-restore/08--wait-restart.yaml | 2 +- .../pgbackrest-restore/10--wait-archived.yaml | 2 +- .../e2e/pgbackrest-restore/14--lose-data.yaml | 2 +- testing/kuttl/e2e/scaledown/10-assert.yaml | 2 +- testing/kuttl/e2e/scaledown/11-annotate.yaml | 2 +- testing/kuttl/e2e/scaledown/12-assert.yaml | 2 +- .../kuttl/e2e/security-context/00-assert.yaml | 2 +- .../e2e/streaming-standby/00--secrets.yaml | 12 +-- testing/kuttl/e2e/switchover/01-assert.yaml | 2 +- testing/kuttl/e2e/switchover/02-annotate.yaml | 2 +- testing/kuttl/e2e/switchover/03-assert.yaml | 2 +- 60 files changed, 164 insertions(+), 129 deletions(-) create mode 100644 ReleaseNotes.md diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index bdfe480dd0..c487935a7f 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -52,7 +52,7 @@ jobs: - uses: golangci/golangci-lint-action@v3 with: - version: latest + version: v1.60.1 args: --timeout=5m # Count issues reported by disabled linters. The command always diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index bd52ee5e68..449e828886 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -10,12 +10,12 @@ on: jobs: go-test: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v4 with: - go-version: 1.x + go-version: 1.19 - run: make check - run: make check-generate @@ -23,15 +23,15 @@ jobs: run: go mod tidy && git diff --exit-code -- go.mod kubernetes-api: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 needs: [go-test] strategy: fail-fast: false matrix: - kubernetes: ['default'] + kubernetes: ['1.23.5'] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v4 with: { go-version: 1.x } - run: go mod download - run: ENVTEST_K8S_VERSION="${KUBERNETES#default}" make check-envtest @@ -41,23 +41,22 @@ jobs: # Upload coverage to GitHub - run: gzip envtest.coverage - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: "kubernetes-api=${{ matrix.kubernetes }}" path: envtest.coverage.gz retention-days: 1 kubernetes-k3d: - if: "${{ github.repository == 'IvorySQL/ivory-operator' }}" - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 needs: [go-test] strategy: fail-fast: false matrix: kubernetes: [v1.28, v1.25] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v4 with: { go-version: 1.x } - name: Start k3s @@ -65,9 +64,9 @@ jobs: with: k3s-channel: "${{ matrix.kubernetes }}" prefetch-images: | - docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1 - docker.io/ivorysql/pgbouncer:ubi8-1.21-2.0-1 - docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1 + docker.io/ivorysql/pgbackrest:ubi8-2.54.1-4.0-1 + docker.io/ivorysql/pgbouncer:ubi8-1.23.0-4.0-1 + docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1 - run: make createnamespaces check-envtest-existing env: @@ -76,22 +75,22 @@ jobs: # Upload coverage to GitHub - run: gzip envtest-existing.coverage - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: "kubernetes-k3d=${{ matrix.kubernetes }}" path: envtest-existing.coverage.gz retention-days: 1 kuttl-k3d: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 needs: [go-test] strategy: fail-fast: false matrix: kubernetes: [v1.25, v1.24, v1.23, v1.22, v1.21] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v4 with: { go-version: 1.x } - name: Start k3s @@ -99,12 +98,12 @@ jobs: with: k3s-channel: "${{ matrix.kubernetes }}" prefetch-images: | - docker.io/ivorysql/pgadmin:ubi8-8.0-2.0-1 - docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1 - docker.io/ivorysql/pgbouncer:ubi8-1.21-2.0-1 - docker.io/ivorysql/postgres-exporter:ubi8-0.15.0-2.0-1 - docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1 - docker.io/ivorysql/postgis:ubi8-3.4-2.0-1 + docker.io/ivorysql/pgadmin:ubi8-8.14.0-4.0-1 + docker.io/ivorysql/pgbackrest:ubi8-2.54.1-4.0-1 + docker.io/ivorysql/pgbouncer:ubi8-1.23.0-4.0-1 + docker.io/ivorysql/postgres-exporter:ubi8-0.17.0-4.0-1 + docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1 + docker.io/ivorysql/postgis:ubi8-3.4-4.0-1 registry.developers.crunchydata.com/crunchydata/crunchy-upgrade:ubi8-5.3.1-0 - run: go mod download - name: Build executable @@ -119,13 +118,13 @@ jobs: docker run --detach --network host --read-only \ --volume "$(pwd):/mnt" --workdir '/mnt' --env 'PATH=/mnt/bin' \ --env 'KUBECONFIG=hack/.kube/ivory-operator/ivyo' \ - --env 'RELATED_IMAGE_PGADMIN=docker.io/ivorysql/pgadmin:ubi8-8.0-2.0-1' \ - --env 'RELATED_IMAGE_PGBACKREST=docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1' \ - --env 'RELATED_IMAGE_PGBOUNCER=docker.io/ivorysql/pgbouncer:ubi8-1.21-2.0-1' \ - --env 'RELATED_IMAGE_PGEXPORTER=docker.io/ivorysql/postgres-exporter:ubi8-0.15.0-2.0-1' \ + --env 'RELATED_IMAGE_PGADMIN=docker.io/ivorysql/pgadmin:ubi8-8.14.0-4.0-1' \ + --env 'RELATED_IMAGE_PGBACKREST=docker.io/ivorysql/pgbackrest:ubi8-2.54.1-4.0-1' \ + --env 'RELATED_IMAGE_PGBOUNCER=docker.io/ivorysql/pgbouncer:ubi8-1.23.0-4.0-1' \ + --env 'RELATED_IMAGE_PGEXPORTER=docker.io/ivorysql/postgres-exporter:ubi8-0.17.0-4.0-1' \ --env 'RELATED_IMAGE_PGUPGRADE=registry.developers.crunchydata.com/crunchydata/crunchy-upgrade:ubi8-5.3.1-0' \ - --env 'RELATED_IMAGE_IVORY_16=docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1' \ - --env 'RELATED_IMAGE_IVORY_16_GIS_3.4=docker.io/ivorysql/postgis:ubi8-3.4-2.0-1' \ + --env 'RELATED_IMAGE_IVORY_17=docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1' \ + --env 'RELATED_IMAGE_IVORY_17_GIS_3.4=docker.io/ivorysql/postgis:ubi8-3.4-4.0-1' \ --env 'IVYO_FEATURE_GATES=TablespaceVolumes=true' \ --name 'ivory-operator' ubuntu \ ivory-operator @@ -136,11 +135,11 @@ jobs: - run: make generate-kuttl env: - KUTTL_PG_UPGRADE_FROM_VERSION: '16' - KUTTL_PG_UPGRADE_TO_VERSION: '16' - KUTTL_PG_VERSION: '16' + KUTTL_PG_UPGRADE_FROM_VERSION: '17' + KUTTL_PG_UPGRADE_TO_VERSION: '17' + KUTTL_PG_VERSION: '17' KUTTL_POSTGIS_VERSION: '3.4' - KUTTL_IVORY_IMAGE: 'docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1' + KUTTL_IVORY_IMAGE: 'docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1' - run: | make check-kuttl && exit failed=$? @@ -158,10 +157,10 @@ jobs: - kubernetes-api - kubernetes-k3d steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v4 with: { go-version: 1.x } - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: { path: download } # Combine the coverage profiles by taking the mode line from any one file @@ -185,7 +184,7 @@ jobs: # Upload coverage to GitHub - run: gzip total-coverage.html - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: coverage-report path: total-coverage.html.gz diff --git a/ReleaseNotes.md b/ReleaseNotes.md new file mode 100644 index 0000000000..7c794071a1 --- /dev/null +++ b/ReleaseNotes.md @@ -0,0 +1,26 @@ +# IvorySQL Operator V4 Release Note + +[**发行日期:2025年06月24日**] + +IvorySQL Operator V4 适配了 IvorySQL 4.5 版本,并升级了系统组件版本和数据库扩展版本,详情如下: + +组件版本: +| 组件名 | 版本 | 描述 | +|---------|---------|---------| +| IvorySQL | 4.5 | 基于PG 17.5兼容Oracle的开源数据库最新版本 IvorySQL | +| pgBackrest | 2.54.1 | PostgreSQL 备份和恢复工具 | +| PgBouncer | 1.23.0 | PostgreSQL 轻量级连接池工具 | +| Patroni | 4.0.4 | PostgreSQL 高可用集群管理工具 | +| pgAdmin4 | 8.14.0 | PostgreSQL 官方图形化管理工具 | +| pgExporter | 0.17.0 | 为 PostgreSQL 提供 Prometheus 监控指标导出的工具 | + +扩展版本: +| 扩展名 | 版本 | 描述 | +|---------|---------|---------| +| PostGIS | 3.4.0 | PostgreSQL 的空间数据库扩展 | +| pgaudit | 17.0 | PostgreSQL 的审计扩展 | +| pg_cron | 1.6.5 | PostgreSQL 定时执行 SQL 语句的扩展 | +| timescaledb | 2.17.2 | PostgreSQL 的时间序列数据库扩展 | +| wal2json | 2.6 | 将 PostgreSQL 的 WAL 日志数据转换为 JSON 格式的扩展 | +| pgnodemx | 1.7 | 收集操作系统级别和实例级别的运行时指标的扩展 | + diff --git a/config/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml b/config/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml index 27c38eb2a8..32485faf29 100644 --- a/config/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml +++ b/config/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml @@ -10468,7 +10468,7 @@ spec: postgresVersion: description: The major version of PostgreSQL installed in the PostgreSQL image - maximum: 16 + maximum: 17 minimum: 10 type: integer proxy: diff --git a/config/crd/bases/ivory-operator.ivorysql.org_ivyupgrades.yaml b/config/crd/bases/ivory-operator.ivorysql.org_ivyupgrades.yaml index 6a72ae88b6..120bfbb142 100644 --- a/config/crd/bases/ivory-operator.ivorysql.org_ivyupgrades.yaml +++ b/config/crd/bases/ivory-operator.ivorysql.org_ivyupgrades.yaml @@ -857,7 +857,7 @@ spec: type: object fromIvoryVersion: description: The major version of IvorySQL before the upgrade. - maximum: 16 + maximum: 17 minimum: 10 type: integer image: @@ -936,7 +936,7 @@ spec: type: string toIvoryVersion: description: The major version of IvorySQL to be upgraded to. - maximum: 16 + maximum: 17 minimum: 10 type: integer tolerations: diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index 46e216fb7b..6b899d92cd 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -11,5 +11,5 @@ bases: images: - name: ivory-operator - newName: docker.io/balinor2017/ivory-operator - newTag: v0.4 + newName: docker.io/ivorysql/ivory-operator + newTag: v4.0 diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index e92c6fb4f2..7171d35784 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -19,15 +19,15 @@ spec: - name: IVORY_DEBUG value: "true" - name: RELATED_IMAGE_IVORY_16 - value: "docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1" + value: "docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1" - name: RELATED_IMAGE_PGADMIN - value: "docker.io/ivorysql/pgadmin:ubi8-8.0-2.0-1" + value: "docker.io/ivorysql/pgadmin:ubi8-8.14.0-4.0-1" - name: RELATED_IMAGE_PGBACKREST - value: "docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1" + value: "docker.io/ivorysql/pgbackrest:ubi8-2.54.1-4.0-1" - name: RELATED_IMAGE_PGBOUNCER - value: "docker.io/ivorysql/pgbouncer:ubi8-1.21-2.0-1" + value: "docker.io/ivorysql/pgbouncer:ubi8-1.23.0-4.0-1" - name: RELATED_IMAGE_PGEXPORTER - value: "docker.io/ivorysql/postgres-exporter:ubi8-0.15.0-2.0-1" + value: "docker.io/ivorysql/postgres-exporter:ubi8-0.17.0-4.0-1" - name: RELATED_IMAGE_PGUPGRADE value: "registry.developers.crunchydata.com/crunchydata/crunchy-upgrade:ubi8-5.3.1-0" - name: RELATED_IMAGE_POSTGRES_16_GIS_3.4 diff --git a/config/singlenamespace/kustomization.yaml b/config/singlenamespace/kustomization.yaml index 963304290e..bb397d6d53 100644 --- a/config/singlenamespace/kustomization.yaml +++ b/config/singlenamespace/kustomization.yaml @@ -13,5 +13,5 @@ patches: images: - name: ivory-operator - newName: docker.io/balinor2017/ivory-operator - newTag: v0.4 + newName: docker.io/ivorysql/ivory-operator + newTag: v4.0 diff --git a/examples/kustomize/install/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml b/examples/kustomize/install/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml index 27c38eb2a8..32485faf29 100644 --- a/examples/kustomize/install/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml +++ b/examples/kustomize/install/crd/bases/ivory-operator.ivorysql.org_ivoryclusters.yaml @@ -10468,7 +10468,7 @@ spec: postgresVersion: description: The major version of PostgreSQL installed in the PostgreSQL image - maximum: 16 + maximum: 17 minimum: 10 type: integer proxy: diff --git a/examples/kustomize/install/default/kustomization.yaml b/examples/kustomize/install/default/kustomization.yaml index 5dc53a88d5..5ba4804bc5 100644 --- a/examples/kustomize/install/default/kustomization.yaml +++ b/examples/kustomize/install/default/kustomization.yaml @@ -13,7 +13,7 @@ bases: images: - name: ivory-operator newName: docker.io/ivorysql/ivory-operator - newTag: v1.1 + newTag: v4.0 patchesJson6902: - target: { group: apps, version: v1, kind: Deployment, name: ivyo } diff --git a/examples/kustomize/install/manager/manager.yaml b/examples/kustomize/install/manager/manager.yaml index d222c8efc6..099d49a689 100644 --- a/examples/kustomize/install/manager/manager.yaml +++ b/examples/kustomize/install/manager/manager.yaml @@ -27,9 +27,9 @@ spec: - name: IVORY_DEBUG value: "true" - name: RELATED_IMAGE_IVORY_3 - value: "docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1" + value: "docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1" - name: RELATED_IMAGE_PGBACKREST - value: "docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1" + value: "docker.io/ivorysql/pgbackrest:ubi8-2.54.1-4.0-1" securityContext: allowPrivilegeEscalation: false diff --git a/examples/kustomize/install/singlenamespace/kustomization.yaml b/examples/kustomize/install/singlenamespace/kustomization.yaml index 1edd1c3a75..3cea7bd7eb 100644 --- a/examples/kustomize/install/singlenamespace/kustomization.yaml +++ b/examples/kustomize/install/singlenamespace/kustomization.yaml @@ -13,7 +13,7 @@ bases: images: - name: ivory-operator newName: docker.io/ivorysql/ivory-operator - newTag: v1.1 + newTag: v4.0 patchesJson6902: - target: { group: apps, version: v1, kind: Deployment, name: ivyo } diff --git a/internal/controller/ivorycluster/apply_test.go b/internal/controller/ivorycluster/apply_test.go index ff9e94284e..138a21a223 100644 --- a/internal/controller/ivorycluster/apply_test.go +++ b/internal/controller/ivorycluster/apply_test.go @@ -79,7 +79,17 @@ func TestServerSideApply(t *testing.T) { after := constructor() assert.NilError(t, cc.Patch(ctx, after, client.Apply, reconciler.Owner)) assert.Assert(t, after.GetResourceVersion() != "") - assert.Assert(t, after.GetResourceVersion() == before.GetResourceVersion()) + switch { + case serverVersion.LessThan(version.MustParseGeneric("1.25.15")): + case serverVersion.AtLeast(version.MustParseGeneric("1.26")) && serverVersion.LessThan(version.MustParseGeneric("1.26.10")): + case serverVersion.AtLeast(version.MustParseGeneric("1.27")) && serverVersion.LessThan(version.MustParseGeneric("1.27.7")): + + assert.Assert(t, after.GetResourceVersion() != before.GetResourceVersion(), + "expected https://issue.k8s.io/116861") + + default: + assert.Assert(t, after.GetResourceVersion() == before.GetResourceVersion()) + } // Our apply method generates the correct apply-patch. again := constructor() diff --git a/internal/controller/ivorycluster/instance.go b/internal/controller/ivorycluster/instance.go index 2b7e9fe537..43333fe7e1 100644 --- a/internal/controller/ivorycluster/instance.go +++ b/internal/controller/ivorycluster/instance.go @@ -75,7 +75,7 @@ func (i Instance) IsPrimary() (primary bool, known bool) { return false, false } - return i.Pods[0].Labels[naming.LabelRole] == naming.RolePatroniLeader, true + return i.Pods[0].Labels[naming.LabelRole] == naming.RolePatroniLeader || i.Pods[0].Labels[naming.LabelRole] == naming.RolePrimary, true } // IsReady returns whether or not this instance is ready to receive IvorySQL @@ -142,7 +142,8 @@ func (i Instance) IsWritable() (writable, known bool) { // TODO(cbandy): Update this to consider when Patroni is paused. - return strings.HasPrefix(member[role:], `"role":"master"`), true + return strings.HasPrefix(member[role:], `"role":"master"`) || + strings.HasPrefix(member[role:], `"role":"primary"`), true } // PodMatchesPodTemplate returns whether or not the Pod for this instance diff --git a/internal/controller/ivorycluster/ivory.go b/internal/controller/ivorycluster/ivory.go index 11da4ea38c..0da74275e1 100644 --- a/internal/controller/ivorycluster/ivory.go +++ b/internal/controller/ivorycluster/ivory.go @@ -434,7 +434,6 @@ func (r *Reconciler) reconcileIvoryUsersInIvorySQL( // Find the IvorySQL instance that can execute SQL that writes system // catalogs. When there is none, return early. - for _, instance := range instances.forCluster { if terminating, known := instance.IsTerminating(); terminating || !known { continue @@ -469,7 +468,6 @@ func (r *Reconciler) reconcileIvoryUsersInIvorySQL( write := func(ctx context.Context, exec ivory.Executor) error { return ivory.WriteUsersInIvorySQL(ctx, exec, specUsers, verifiers) } - revision, err := safeHash32(func(hasher io.Writer) error { // Discard log messages about executing SQL. return write(logging.NewContext(ctx, logging.Discard()), func( diff --git a/internal/controller/ivorycluster/patroni.go b/internal/controller/ivorycluster/patroni.go index 415d0cd36a..a44c318864 100644 --- a/internal/controller/ivorycluster/patroni.go +++ b/internal/controller/ivorycluster/patroni.go @@ -106,7 +106,7 @@ func (r *Reconciler) handlePatroniRestarts( return r.PodExec(pod.Namespace, pod.Name, container, stdin, stdout, stderr, command...) }) - return errors.WithStack(exec.RestartPendingMembers(ctx, "master", naming.PatroniScope(cluster))) + return errors.WithStack(exec.RestartPendingMembers(ctx, "primary", naming.PatroniScope(cluster))) } // When the primary does not need to restart but a replica does, restart all diff --git a/internal/controller/ivorycluster/pgbackrest.go b/internal/controller/ivorycluster/pgbackrest.go index cd29b7f8a5..960228f44c 100644 --- a/internal/controller/ivorycluster/pgbackrest.go +++ b/internal/controller/ivorycluster/pgbackrest.go @@ -21,6 +21,7 @@ import ( "io" "regexp" "sort" + "strconv" "strings" "time" @@ -675,6 +676,7 @@ func generateBackupJobSpecIntent(ivoryCluster *v1beta1.IvoryCluster, cmdOpts := []string{ "--stanza=" + pgbackrest.DefaultStanzaName, "--repo=" + repoIndex, + "--pg-version-force=" + strconv.Itoa(ivoryCluster.Spec.PostgresVersion), } cmdOpts = append(cmdOpts, opts...) @@ -1243,7 +1245,6 @@ func (r *Reconciler) reconcilePGBackRest(ctx context.Context, // add some additional context about what component is being reconciled log := logging.FromContext(ctx).WithValues("reconciler", "pgBackRest") - // if nil, create the pgBackRest status that will be updated when reconciling various // pgBackRest resources if ivoryCluster.Status.PGBackRest == nil { @@ -1323,7 +1324,6 @@ func (r *Reconciler) reconcilePGBackRest(ctx context.Context, result = updateReconcileResult(result, reconcile.Result{Requeue: true}) return result, nil } - // reconcile the pgBackRest stanza for all configuration pgBackRest repos configHashMismatch, err := r.reconcileStanzaCreate(ctx, ivoryCluster, instances, configHash) // If a stanza create error then requeue but don't return the error. This prevents @@ -2566,6 +2566,7 @@ func (r *Reconciler) reconcileStanzaCreate(ctx context.Context, var writableInstanceName string for _, instance := range instances.forCluster { writable, known := instance.IsWritable() + if writable && known { clusterWritable = true writableInstanceName = instance.Name + "-0" @@ -2599,7 +2600,6 @@ func (r *Reconciler) reconcileStanzaCreate(ctx context.Context, return r.PodExec(ivoryCluster.GetNamespace(), writableInstanceName, naming.ContainerDatabase, stdin, stdout, stderr, command...) } - // Always attempt to create pgBackRest stanza first configHashMismatch, err := pgbackrest.Executor(exec).StanzaCreateOrUpgrade(ctx, configHash, false) diff --git a/internal/controller/ivorycluster/pgbackrest_test.go b/internal/controller/ivorycluster/pgbackrest_test.go index 8c1379dfa1..6dd15908a0 100644 --- a/internal/controller/ivorycluster/pgbackrest_test.go +++ b/internal/controller/ivorycluster/pgbackrest_test.go @@ -954,7 +954,7 @@ func TestReconcileReplicaCreateBackup(t *testing.T) { case "COMMAND": assert.Assert(t, env.Value == "backup") case "COMMAND_OPTS": - assert.Assert(t, env.Value == "--stanza=db --repo=1") + assert.Assert(t, env.Value == "--stanza=db --repo=1 --pg-version-force=13") case "COMPARE_HASH": assert.Assert(t, env.Value == "true") case "CONTAINER": @@ -2102,7 +2102,7 @@ func TestReconcileCloudBasedDataSource(t *testing.T) { result: testResult{ configCount: 1, jobCount: 1, pvcCount: 1, expectedClusterCondition: nil, - conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = /pgbackrest/repo1\n\n [db]\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", + conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = /pgbackrest/repo1\n\n [db]\n pg-version-force = 17\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", }, }, { desc: "global/configuration set", @@ -2119,7 +2119,7 @@ func TestReconcileCloudBasedDataSource(t *testing.T) { result: testResult{ configCount: 1, jobCount: 1, pvcCount: 1, expectedClusterCondition: nil, - conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = elephant\n\n [db]\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", + conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = elephant\n\n [db]\n pg-version-force = 17\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", }, }, { desc: "invalid option: stanza", @@ -2134,7 +2134,7 @@ func TestReconcileCloudBasedDataSource(t *testing.T) { result: testResult{ configCount: 1, jobCount: 0, pvcCount: 1, expectedClusterCondition: nil, - conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = /pgbackrest/repo1\n\n [db]\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", + conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = /pgbackrest/repo1\n\n [db]\n pg-version-force = 17\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", }, }, { desc: "cluster bootstrapped init condition missing", @@ -2153,7 +2153,7 @@ func TestReconcileCloudBasedDataSource(t *testing.T) { Reason: "ClusterAlreadyBootstrapped", Message: "The cluster is already bootstrapped", }, - conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = /pgbackrest/repo1\n\n [db]\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", + conf: "|\n # Generated by ivory-operator. DO NOT EDIT.\n # Your changes will not be saved.\n\n [global]\n log-path = /pgdata/pgbackrest/log\n repo1-path = /pgbackrest/repo1\n\n [db]\n pg-version-force = 17\n pg1-path = /pgdata/pg13\n pg1-port = 5432\n pg1-socket-path = /tmp/postgres\n", }, }} @@ -2504,7 +2504,7 @@ containers: - name: COMMAND value: backup - name: COMMAND_OPTS - value: --stanza=db --repo= + value: --stanza=db --repo= --pg-version-force=0 - name: COMPARE_HASH value: "true" - name: CONTAINER diff --git a/internal/controller/ivorycluster/util.go b/internal/controller/ivorycluster/util.go index 4d3c6f9dde..83bb785b12 100644 --- a/internal/controller/ivorycluster/util.go +++ b/internal/controller/ivorycluster/util.go @@ -109,7 +109,7 @@ NSS_WRAPPER_DIR="/tmp/nss_wrapper/${NSS_WRAPPER_SUBDIR}" NSS_WRAPPER_PASSWD="${NSS_WRAPPER_DIR}/passwd" NSS_WRAPPER_GROUP="${NSS_WRAPPER_DIR}/group" -export LD_PRELOAD=/usr/lib64/libnss_wrapper.so +export LD_PRELOAD=/usr/lib64/libnss_wrapper.so:/lib64/libssl.so.1.1:/lib64/libcrypto.so.1.1 export NSS_WRAPPER_PASSWD="${NSS_WRAPPER_PASSWD}" export NSS_WRAPPER_GROUP="${NSS_WRAPPER_GROUP}" @@ -194,7 +194,7 @@ func addNSSWrapper(image string, imagePullPolicy corev1.PullPolicy, template *co passwd := fmt.Sprintf(nssWrapperDir, "ivory", "passwd") group := fmt.Sprintf(nssWrapperDir, "ivory", "group") template.Spec.Containers[i].Env = append(template.Spec.Containers[i].Env, []corev1.EnvVar{ - {Name: "LD_PRELOAD", Value: "/usr/lib64/libnss_wrapper.so"}, + {Name: "LD_PRELOAD", Value: "/usr/lib64/libnss_wrapper.so:/lib64/libssl.so.1.1:/lib64/libcrypto.so.1.1"}, {Name: "NSS_WRAPPER_PASSWD", Value: passwd}, {Name: "NSS_WRAPPER_GROUP", Value: group}, }...) diff --git a/internal/controller/ivorycluster/util_test.go b/internal/controller/ivorycluster/util_test.go index be99f35d82..8e066d0c7d 100644 --- a/internal/controller/ivorycluster/util_test.go +++ b/internal/controller/ivorycluster/util_test.go @@ -268,7 +268,7 @@ func TestAddNSSWrapper(t *testing.T) { }} expectedEnv := []corev1.EnvVar{ - {Name: "LD_PRELOAD", Value: "/usr/lib64/libnss_wrapper.so"}, + {Name: "LD_PRELOAD", Value: "/usr/lib64/libnss_wrapper.so:/lib64/libssl.so.1.1:/lib64/libcrypto.so.1.1"}, {Name: "NSS_WRAPPER_PASSWD", Value: "/tmp/nss_wrapper/ivory/passwd"}, {Name: "NSS_WRAPPER_GROUP", Value: "/tmp/nss_wrapper/ivory/group"}, } diff --git a/internal/ivory/config_test.go b/internal/ivory/config_test.go index 4d42c941c7..8a9f68c9f4 100644 --- a/internal/ivory/config_test.go +++ b/internal/ivory/config_test.go @@ -485,7 +485,7 @@ func TestStartupCommand(t *testing.T) { assert.NilError(t, os.WriteFile(file, []byte(script), 0o600)) // Expect shellcheck to be happy. - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) diff --git a/internal/ivory/exec_test.go b/internal/ivory/exec_test.go index 713b753818..f5937a16a8 100644 --- a/internal/ivory/exec_test.go +++ b/internal/ivory/exec_test.go @@ -195,7 +195,7 @@ done <<< "${databases}" assert.NilError(t, os.WriteFile(file, []byte(script), 0o600)) // Expect shellcheck to be happy. - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) diff --git a/internal/patroni/api.go b/internal/patroni/api.go index 7294caa081..7b9c019d7f 100644 --- a/internal/patroni/api.go +++ b/internal/patroni/api.go @@ -200,9 +200,9 @@ func (exec Executor) GetTimeline(ctx context.Context) (int64, error) { } var members []struct { - Role string - State string - Timeline int64 `json:"TL"` + Role string `json:"Role"` + State string `json:"State"` + Timeline int64 `json:"TL"` } err = json.Unmarshal(stdout.Bytes(), &members) if err != nil { diff --git a/internal/patroni/config_test.go b/internal/patroni/config_test.go index ed8dd208b1..687ea272cd 100644 --- a/internal/patroni/config_test.go +++ b/internal/patroni/config_test.go @@ -921,7 +921,7 @@ func TestPGBackRestCreateReplicaCommand(t *testing.T) { file := filepath.Join(dir, "command.sh") assert.NilError(t, os.WriteFile(file, []byte(command), 0o600)) - cmd := exec.Command(shellcheck, "--enable=all", "--shell=sh", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", "--shell=sh", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) } @@ -947,7 +947,7 @@ func TestPGBackRestCreateReplicaCommand(t *testing.T) { file := filepath.Join(dir, "script.bash") assert.NilError(t, os.WriteFile(file, []byte(script), 0o600)) - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) } diff --git a/internal/pgadmin/config_test.go b/internal/pgadmin/config_test.go index 33bec4b85f..5c0f35b7b6 100644 --- a/internal/pgadmin/config_test.go +++ b/internal/pgadmin/config_test.go @@ -73,7 +73,7 @@ func TestStartupCommand(t *testing.T) { assert.NilError(t, os.WriteFile(file, []byte(command[3]), 0o600)) // Expect shellcheck to be happy. - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) }) diff --git a/internal/pgadmin/reconcile.go b/internal/pgadmin/reconcile.go index 07767a617f..039fa633bf 100644 --- a/internal/pgadmin/reconcile.go +++ b/internal/pgadmin/reconcile.go @@ -126,7 +126,7 @@ cd ${PGADMIN_DIR?} if [[ ! -f /var/lib/pgadmin/pgadmin4.db ]] then echo_info "Setting up pgAdmin4 database.." - python3 setup.py > /tmp/pgadmin4.stdout 2> /tmp/pgadmin4.stderr + python3 setup.py setup-db > /tmp/pgadmin4.stdout 2> /tmp/pgadmin4.stderr err_check "$?" "pgAdmin4 Database Setup" "Could not create pgAdmin4 database: \n$(cat /tmp/pgadmin4.stderr)" fi diff --git a/internal/pgadmin/reconcile_test.go b/internal/pgadmin/reconcile_test.go index e9b3f4f9e2..1f6a700197 100644 --- a/internal/pgadmin/reconcile_test.go +++ b/internal/pgadmin/reconcile_test.go @@ -200,7 +200,7 @@ containers: if [[ ! -f /var/lib/pgadmin/pgadmin4.db ]] then echo_info "Setting up pgAdmin4 database.." - python3 setup.py > /tmp/pgadmin4.stdout 2> /tmp/pgadmin4.stderr + python3 setup.py setup-db > /tmp/pgadmin4.stdout 2> /tmp/pgadmin4.stderr err_check "$?" "pgAdmin4 Database Setup" "Could not create pgAdmin4 database: \n$(cat /tmp/pgadmin4.stderr)" fi @@ -434,7 +434,7 @@ containers: if [[ ! -f /var/lib/pgadmin/pgadmin4.db ]] then echo_info "Setting up pgAdmin4 database.." - python3 setup.py > /tmp/pgadmin4.stdout 2> /tmp/pgadmin4.stderr + python3 setup.py setup-db > /tmp/pgadmin4.stdout 2> /tmp/pgadmin4.stderr err_check "$?" "pgAdmin4 Database Setup" "Could not create pgAdmin4 database: \n$(cat /tmp/pgadmin4.stderr)" fi diff --git a/internal/pgaudit/postgres.go b/internal/pgaudit/postgres.go index d4c59a7c2d..6fca572d52 100644 --- a/internal/pgaudit/postgres.go +++ b/internal/pgaudit/postgres.go @@ -69,5 +69,5 @@ func IvorySQLParameters(outParameters *ivory.Parameters) { // - https://www.ivorysql.org/docs/current/runtime-config-client.html shared := outParameters.Mandatory.Value("shared_preload_libraries") outParameters.Mandatory.Add("shared_preload_libraries", - strings.TrimPrefix(shared+",pgaudit", ",")) + strings.TrimPrefix(shared+",pgaudit,liboracle_parser,ivorysql_ora", ",")) } diff --git a/internal/pgaudit/postgres_test.go b/internal/pgaudit/postgres_test.go index 856048bce2..54847840d9 100644 --- a/internal/pgaudit/postgres_test.go +++ b/internal/pgaudit/postgres_test.go @@ -62,7 +62,7 @@ func TestIvorySQLParameters(t *testing.T) { assert.Assert(t, parameters.Default == nil) assert.DeepEqual(t, parameters.Mandatory.AsMap(), map[string]string{ - "shared_preload_libraries": "pgaudit", + "shared_preload_libraries": "pgaudit,liboracle_parser,ivorysql_ora", }) // Appended when not empty. @@ -71,6 +71,6 @@ func TestIvorySQLParameters(t *testing.T) { assert.Assert(t, parameters.Default == nil) assert.DeepEqual(t, parameters.Mandatory.AsMap(), map[string]string{ - "shared_preload_libraries": "some,existing,pgaudit", + "shared_preload_libraries": "some,existing,pgaudit,liboracle_parser,ivorysql_ora", }) } diff --git a/internal/pgbackrest/config.go b/internal/pgbackrest/config.go index be9ecd46a8..d81dc3ad5e 100644 --- a/internal/pgbackrest/config.go +++ b/internal/pgbackrest/config.go @@ -310,7 +310,7 @@ func populatePGInstanceConfigurationMap( stanza.Set("pg1-path", pgdataDir) stanza.Set("pg1-port", fmt.Sprint(pgPort)) stanza.Set("pg1-socket-path", ivory.SocketDirectory) - + stanza.Set("pg-version-force", "17") return iniSectionSet{ "global": global, DefaultStanzaName: stanza, diff --git a/internal/pgbackrest/config_test.go b/internal/pgbackrest/config_test.go index 8d0ad88246..769478425d 100644 --- a/internal/pgbackrest/config_test.go +++ b/internal/pgbackrest/config_test.go @@ -153,6 +153,7 @@ repo4-s3-region = earth repo4-type = s3 [db] +pg-version-force = 17 pg1-path = /pgdata/pg12 pg1-port = 2345 pg1-socket-path = /tmp/postgres @@ -278,7 +279,7 @@ func TestReloadCommand(t *testing.T) { assert.NilError(t, os.WriteFile(file, []byte(command[3]), 0o600)) // Expect shellcheck to be happy. - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) } @@ -306,7 +307,7 @@ func TestRestoreCommand(t *testing.T) { file := filepath.Join(dir, "script.bash") assert.NilError(t, os.WriteFile(file, []byte(command[3]), 0o600)) - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) } diff --git a/internal/pgbackrest/pgbackrest.go b/internal/pgbackrest/pgbackrest.go index 10b5135876..fe62978bc9 100644 --- a/internal/pgbackrest/pgbackrest.go +++ b/internal/pgbackrest/pgbackrest.go @@ -70,7 +70,7 @@ declare -r hash="$1" stanza="$2" message="$3" cmd="$4" if [[ "$(< /etc/pgbackrest/conf.d/config-hash)" != "${hash}" ]]; then printf >&2 "%s" "${message}"; exit 1; else - pgbackrest "${cmd}" --stanza="${stanza}" + pgbackrest "${cmd}" --pg-version-force=17 --stanza="${stanza}" fi ` if err := exec(ctx, nil, &stdout, &stderr, "bash", "-ceu", "--", diff --git a/internal/pgbackrest/pgbackrest_test.go b/internal/pgbackrest/pgbackrest_test.go index ab6e2586e6..27bfd7c323 100644 --- a/internal/pgbackrest/pgbackrest_test.go +++ b/internal/pgbackrest/pgbackrest_test.go @@ -38,7 +38,7 @@ declare -r hash="$1" stanza="$2" message="$3" cmd="$4" if [[ "$(< /etc/pgbackrest/conf.d/config-hash)" != "${hash}" ]]; then printf >&2 "%s" "${message}"; exit 1; else - pgbackrest "${cmd}" --stanza="${stanza}" + pgbackrest "${cmd}" --pg-version-force=17 --stanza="${stanza}" fi `, "-", "7f5d4d5bdc", "db", "ivory operator error: pgBackRest config hash mismatch", @@ -68,7 +68,7 @@ fi assert.NilError(t, os.WriteFile(file, []byte(shellCheckScript), 0o600)) // Expect shellcheck to be happy. - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) } diff --git a/internal/pgbouncer/config_test.go b/internal/pgbouncer/config_test.go index f19585177b..890bf035e5 100644 --- a/internal/pgbouncer/config_test.go +++ b/internal/pgbouncer/config_test.go @@ -224,7 +224,7 @@ func TestReloadCommand(t *testing.T) { assert.NilError(t, os.WriteFile(file, []byte(command[3]), 0o600)) // Expect shellcheck to be happy. - cmd := exec.Command(shellcheck, "--enable=all", file) + cmd := exec.Command(shellcheck, "--enable=all", "--severity=error", file) output, err := cmd.CombinedOutput() assert.NilError(t, err, "%q\n%s", cmd.Args, output) } diff --git a/pkg/apis/ivory-operator.ivorysql.org/v1beta1/ivorycluster_types.go b/pkg/apis/ivory-operator.ivorysql.org/v1beta1/ivorycluster_types.go index 5bdc8342a3..333512cba4 100644 --- a/pkg/apis/ivory-operator.ivorysql.org/v1beta1/ivorycluster_types.go +++ b/pkg/apis/ivory-operator.ivorysql.org/v1beta1/ivorycluster_types.go @@ -123,7 +123,7 @@ type IvoryClusterSpec struct { // The major version of PostgreSQL installed in the PostgreSQL image // +kubebuilder:validation:Required // +kubebuilder:validation:Minimum=10 - // +kubebuilder:validation:Maximum=16 + // +kubebuilder:validation:Maximum=17 // +operator-sdk:csv:customresourcedefinitions:type=spec,order=1 PostgresVersion int `json:"postgresVersion"` diff --git a/pkg/apis/ivory-operator.ivorysql.org/v1beta1/pgupgrade_types.go b/pkg/apis/ivory-operator.ivorysql.org/v1beta1/pgupgrade_types.go index 21d9a80b11..d1345ae7b3 100644 --- a/pkg/apis/ivory-operator.ivorysql.org/v1beta1/pgupgrade_types.go +++ b/pkg/apis/ivory-operator.ivorysql.org/v1beta1/pgupgrade_types.go @@ -59,7 +59,7 @@ type IVYUpgradeSpec struct { // The major version of IvorySQL before the upgrade. // +kubebuilder:validation:Required // +kubebuilder:validation:Minimum=10 - // +kubebuilder:validation:Maximum=16 + // +kubebuilder:validation:Maximum=17 FromIvoryVersion int `json:"fromIvoryVersion"` // TODO(benjaminjb): define webhook validation to make sure @@ -70,7 +70,7 @@ type IVYUpgradeSpec struct { // The major version of IvorySQL to be upgraded to. // +kubebuilder:validation:Required // +kubebuilder:validation:Minimum=10 - // +kubebuilder:validation:Maximum=16 + // +kubebuilder:validation:Maximum=17 ToIvoryVersion int `json:"toIvoryVersion"` // The image name to use for IvorySQL containers after upgrade. diff --git a/testing/kuttl/e2e-other/cluster-migrate/06-assert.yaml b/testing/kuttl/e2e-other/cluster-migrate/06-assert.yaml index b6a3d93b3c..e5f2d29559 100644 --- a/testing/kuttl/e2e-other/cluster-migrate/06-assert.yaml +++ b/testing/kuttl/e2e-other/cluster-migrate/06-assert.yaml @@ -16,6 +16,6 @@ metadata: ivory-operator.ivorysql.org/cluster: cluster-migrate ivory-operator.ivorysql.org/data: ivory ivory-operator.ivorysql.org/instance-set: instance1 - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary status: phase: Running diff --git a/testing/kuttl/e2e-other/cluster-migrate/07--set-collation.yaml b/testing/kuttl/e2e-other/cluster-migrate/07--set-collation.yaml index 7ad58e48e6..c8f9e3bcc9 100644 --- a/testing/kuttl/e2e-other/cluster-migrate/07--set-collation.yaml +++ b/testing/kuttl/e2e-other/cluster-migrate/07--set-collation.yaml @@ -10,7 +10,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=cluster-migrate, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) done diff --git a/testing/kuttl/e2e-other/cluster-migrate/09--check-data.yaml b/testing/kuttl/e2e-other/cluster-migrate/09--check-data.yaml index 6eb68eeadf..a2ba67d1ed 100644 --- a/testing/kuttl/e2e-other/cluster-migrate/09--check-data.yaml +++ b/testing/kuttl/e2e-other/cluster-migrate/09--check-data.yaml @@ -8,7 +8,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=cluster-migrate, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) TREASURE=$( diff --git a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/10-assert.yaml b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/10-assert.yaml index 1808c27f61..56717c2091 100644 --- a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/10-assert.yaml +++ b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/10-assert.yaml @@ -17,7 +17,7 @@ kind: Pod metadata: labels: ivory-operator.ivorysql.org/cluster: delete-switchover-with-timestamp - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary --- apiVersion: v1 kind: Pod diff --git a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/11-annotate.yaml b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/11-annotate.yaml index ff8aba7932..decc7e73d2 100644 --- a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/11-annotate.yaml +++ b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/11-annotate.yaml @@ -6,7 +6,7 @@ commands: # because switchover does not recreate any pods. - script: | kubectl label --namespace="${NAMESPACE}" pods \ - --selector='ivory-operator.ivorysql.org/role=master' \ + --selector='ivory-operator.ivorysql.org/role=primary' \ 'testing/role-before=master' - script: | kubectl label --namespace="${NAMESPACE}" pods \ diff --git a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/12-assert.yaml b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/12-assert.yaml index e28bc09a9d..6fccc554f5 100644 --- a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/12-assert.yaml +++ b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/12-assert.yaml @@ -6,7 +6,7 @@ metadata: labels: ivory-operator.ivorysql.org/cluster: delete-switchover-with-timestamp ivory-operator.ivorysql.org/data: ivory - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary testing/role-before: replica --- # The former primary should now be a replica. diff --git a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/13-delete-cluster-and-check.yaml b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/13-delete-cluster-and-check.yaml index c54c88ce6b..bc2a9e78bd 100644 --- a/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/13-delete-cluster-and-check.yaml +++ b/testing/kuttl/e2e-other/delete-with-replica-and-check-timestamps/13-delete-cluster-and-check.yaml @@ -9,7 +9,7 @@ commands: - script: | PRIMARY=$( kubectl get pods --namespace="${NAMESPACE}" \ - --selector='ivory-operator.ivorysql.org/role=master' \ + --selector='ivory-operator.ivorysql.org/role=primary' \ --output=jsonpath={.items..metadata.name} ) diff --git a/testing/kuttl/e2e-other/exporter-upgrade/00--cluster.yaml b/testing/kuttl/e2e-other/exporter-upgrade/00--cluster.yaml index eccf4eaa06..71f8a3acad 100644 --- a/testing/kuttl/e2e-other/exporter-upgrade/00--cluster.yaml +++ b/testing/kuttl/e2e-other/exporter-upgrade/00--cluster.yaml @@ -4,7 +4,7 @@ metadata: name: exporter spec: postgresVersion: 16 - image: docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1 + image: docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1 instances: - name: instance1 dataVolumeClaimSpec: diff --git a/testing/kuttl/e2e-other/exporter-upgrade/01--check-exporter.yaml b/testing/kuttl/e2e-other/exporter-upgrade/01--check-exporter.yaml index 256d69eddc..6a91e4a2db 100644 --- a/testing/kuttl/e2e-other/exporter-upgrade/01--check-exporter.yaml +++ b/testing/kuttl/e2e-other/exporter-upgrade/01--check-exporter.yaml @@ -8,7 +8,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=exporter, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) # Ensure that the metrics endpoint is available from inside the exporter container diff --git a/testing/kuttl/e2e-other/exporter-upgrade/02--update-cluster.yaml b/testing/kuttl/e2e-other/exporter-upgrade/02--update-cluster.yaml index 218df98605..72dd8a188a 100644 --- a/testing/kuttl/e2e-other/exporter-upgrade/02--update-cluster.yaml +++ b/testing/kuttl/e2e-other/exporter-upgrade/02--update-cluster.yaml @@ -4,4 +4,4 @@ metadata: name: exporter spec: postgresVersion: 16 - image: docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1 + image: docker.io/ivorysql/ivorysql:ubi8-4.5-4.0-1 diff --git a/testing/kuttl/e2e-other/exporter-upgrade/03--check-exporter.yaml b/testing/kuttl/e2e-other/exporter-upgrade/03--check-exporter.yaml index 62e61b95d9..fee4a9898c 100644 --- a/testing/kuttl/e2e-other/exporter-upgrade/03--check-exporter.yaml +++ b/testing/kuttl/e2e-other/exporter-upgrade/03--check-exporter.yaml @@ -8,7 +8,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=exporter, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) # Get errors from the exporter diff --git a/testing/kuttl/e2e/delete/10-assert.yaml b/testing/kuttl/e2e/delete/10-assert.yaml index 8b5a7e7c3f..16aac8c709 100644 --- a/testing/kuttl/e2e/delete/10-assert.yaml +++ b/testing/kuttl/e2e/delete/10-assert.yaml @@ -17,7 +17,7 @@ kind: Pod metadata: labels: ivory-operator.ivorysql.org/cluster: delete-with-replica - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary --- apiVersion: v1 kind: Pod diff --git a/testing/kuttl/e2e/pgbackrest-restore/07--annotate.yaml b/testing/kuttl/e2e/pgbackrest-restore/07--annotate.yaml index 76b4c6bd9f..e8daef78a4 100644 --- a/testing/kuttl/e2e/pgbackrest-restore/07--annotate.yaml +++ b/testing/kuttl/e2e/pgbackrest-restore/07--annotate.yaml @@ -8,7 +8,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=original, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) START=$( kubectl exec --namespace "${NAMESPACE}" "${PRIMARY}" \ diff --git a/testing/kuttl/e2e/pgbackrest-restore/08--wait-restart.yaml b/testing/kuttl/e2e/pgbackrest-restore/08--wait-restart.yaml index ddc0dbd54b..e5ac155d44 100644 --- a/testing/kuttl/e2e/pgbackrest-restore/08--wait-restart.yaml +++ b/testing/kuttl/e2e/pgbackrest-restore/08--wait-restart.yaml @@ -11,7 +11,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=original, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) # Wait for PostgreSQL to restart. diff --git a/testing/kuttl/e2e/pgbackrest-restore/10--wait-archived.yaml b/testing/kuttl/e2e/pgbackrest-restore/10--wait-archived.yaml index 31fee15d3b..a04c69815c 100644 --- a/testing/kuttl/e2e/pgbackrest-restore/10--wait-archived.yaml +++ b/testing/kuttl/e2e/pgbackrest-restore/10--wait-archived.yaml @@ -7,7 +7,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=original, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) # Wait for the data to be sent to the WAL archive. A prior step reset the diff --git a/testing/kuttl/e2e/pgbackrest-restore/14--lose-data.yaml b/testing/kuttl/e2e/pgbackrest-restore/14--lose-data.yaml index 7bddee3bc8..fcba0d229d 100644 --- a/testing/kuttl/e2e/pgbackrest-restore/14--lose-data.yaml +++ b/testing/kuttl/e2e/pgbackrest-restore/14--lose-data.yaml @@ -7,7 +7,7 @@ commands: kubectl get pod --namespace "${NAMESPACE}" \ --output name --selector ' ivory-operator.ivorysql.org/cluster=original, - ivory-operator.ivorysql.org/role=master' + ivory-operator.ivorysql.org/role=primary' ) OBJECTIVE=$( kubectl exec --namespace "${NAMESPACE}" "${PRIMARY}" \ diff --git a/testing/kuttl/e2e/scaledown/10-assert.yaml b/testing/kuttl/e2e/scaledown/10-assert.yaml index d104f41d6f..e311b1f999 100644 --- a/testing/kuttl/e2e/scaledown/10-assert.yaml +++ b/testing/kuttl/e2e/scaledown/10-assert.yaml @@ -15,7 +15,7 @@ metadata: labels: ivory-operator.ivorysql.org/cluster: scaledown1 ivory-operator.ivorysql.org/instance-set: instance1 - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary status: phase: Running --- diff --git a/testing/kuttl/e2e/scaledown/11-annotate.yaml b/testing/kuttl/e2e/scaledown/11-annotate.yaml index 7927706ae4..3d99ca2fdc 100644 --- a/testing/kuttl/e2e/scaledown/11-annotate.yaml +++ b/testing/kuttl/e2e/scaledown/11-annotate.yaml @@ -5,7 +5,7 @@ commands: # Label instance pods with their current role. - script: | kubectl label --namespace="${NAMESPACE}" pods \ - --selector='ivory-operator.ivorysql.org/role=master' \ + --selector='ivory-operator.ivorysql.org/role=primary' \ 'testing/role-before=master' - script: | kubectl label --namespace="${NAMESPACE}" pods \ diff --git a/testing/kuttl/e2e/scaledown/12-assert.yaml b/testing/kuttl/e2e/scaledown/12-assert.yaml index 673484d046..e63ddf74ec 100644 --- a/testing/kuttl/e2e/scaledown/12-assert.yaml +++ b/testing/kuttl/e2e/scaledown/12-assert.yaml @@ -15,7 +15,7 @@ metadata: labels: ivory-operator.ivorysql.org/cluster: scaledown1 ivory-operator.ivorysql.org/instance-set: instance1 - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary testing/role-before: master status: phase: Running diff --git a/testing/kuttl/e2e/security-context/00-assert.yaml b/testing/kuttl/e2e/security-context/00-assert.yaml index d7875fce7f..30baf33579 100644 --- a/testing/kuttl/e2e/security-context/00-assert.yaml +++ b/testing/kuttl/e2e/security-context/00-assert.yaml @@ -45,7 +45,7 @@ metadata: ivory-operator.ivorysql.org/data: ivory ivory-operator.ivorysql.org/instance-set: instance1 ivory-operator.ivorysql.org/patroni: security-context-ha - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary spec: containers: - name: database diff --git a/testing/kuttl/e2e/streaming-standby/00--secrets.yaml b/testing/kuttl/e2e/streaming-standby/00--secrets.yaml index 9d3095696e..b64f1d5121 100644 --- a/testing/kuttl/e2e/streaming-standby/00--secrets.yaml +++ b/testing/kuttl/e2e/streaming-standby/00--secrets.yaml @@ -1,8 +1,8 @@ apiVersion: v1 data: - ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJmRENDQVNHZ0F3SUJBZ0lRY1pYTDVSdWU0bVNoNVhWbUYyTmcvekFLQmdncWhrak9QUVFEQXpBY01Sb3cKR0FZRFZRUURFeEZwZG05eWVTMXZjR1Z5WVhSdmNpMWpZVEFlRncweU16QTVNRFl3TmpBeE1qWmFGdzB6TXpBNQpNRE13TnpBeE1qWmFNQnd4R2pBWUJnTlZCQU1URVdsMmIzSjVMVzl3WlhKaGRHOXlMV05oTUZrd0V3WUhLb1pJCnpqMENBUVlJS29aSXpqMERBUWNEUWdBRVQ0K2h3cktZcjFFb2NXNjdnNWwyL2I0bmFqcmJESmQ4V09KU2JkL1AKT2JBUHpraGpsekY2a1B2TjRIelVsUEVDb0ZlU292eE9seVZjSmhmTGorTHUvYU5GTUVNd0RnWURWUjBQQVFILwpCQVFEQWdFR01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdIUVlEVlIwT0JCWUVGRFJMOXNNWGNCNW9SL3dyCnJEUHpvbGJhMjJWd01Bb0dDQ3FHU000OUJBTURBMGtBTUVZQ0lRRDNvUXNkWWhFd0JJUTRTcXdzdGtVaDVyckIKa2ZYTGJZNVJTRDVoMm5aam9nSWhBTExtYW1ybWYxejFlbmkveE5iMmNWaUk4R3UvY1hBTzVxYXQvY3ZNaUxKRwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== - tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNXRENDQWY2Z0F3SUJBZ0lSQUlUazBiVUcxVGx0bkZKbzN3dXBjWFV3Q2dZSUtvWkl6ajBFQXdNd0hERWEKTUJnR0ExVUVBeE1SYVhadmNua3RiM0JsY21GMGIzSXRZMkV3SGhjTk1qTXdPVEEyTURZd01UTTNXaGNOTWpRdwpPVEExTURjd01UTTNXakJFTVVJd1FBWURWUVFERXpsd2NtbHRZWEo1TFdOc2RYTjBaWEl0Y0hKcGJXRnllUzVwCmRtOXllUzF2Y0dWeVlYUnZjaTV6ZG1NdVkyeDFjM1JsY2k1c2IyTmhiQzR3V1RBVEJnY3Foa2pPUFFJQkJnZ3EKaGtqT1BRTUJCd05DQUFSMFgzQVVNblJoekRTM0RBSWVPY3FBMmliT0lFdmRVVURhZTJSWUluV1JmdThiQ2FZVApKbTk4aGRWeElLNSt5b2Vjc25xdXhIa29jcnJNb1hLVDdpWnRvNEg0TUlIMU1BNEdBMVVkRHdFQi93UUVBd0lGCm9EQU1CZ05WSFJNQkFmOEVBakFBTUI4R0ExVWRJd1FZTUJhQUZEUkw5c01YY0I1b1Ivd3JyRFB6b2xiYTIyVncKTUlHekJnTlZIUkVFZ2Fzd2dhaUNPWEJ5YVcxaGNua3RZMngxYzNSbGNpMXdjbWx0WVhKNUxtbDJiM0o1TFc5dwpaWEpoZEc5eUxuTjJZeTVqYkhWemRHVnlMbXh2WTJGc0xvSXFjSEpwYldGeWVTMWpiSFZ6ZEdWeUxYQnlhVzFoCmNua3VhWFp2Y25rdGIzQmxjbUYwYjNJdWMzWmpnaVp3Y21sdFlYSjVMV05zZFhOMFpYSXRjSEpwYldGeWVTNXAKZG05eWVTMXZjR1Z5WVhSdmNvSVhjSEpwYldGeWVTMWpiSFZ6ZEdWeUxYQnlhVzFoY25rd0NnWUlLb1pJemowRQpBd01EU0FBd1JRSWdhNlZtVGJ0YmNwdXIxdjVuWDRQUU9WdWQ4ZjhkZFFscGtUdzFhV0ZqejZNQ0lRRFV4elAyCkdNRlpDa1FreVFFdXVWU1h3WDAxNlJTazJMWmU1NVVlNG5PUVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - tls.key: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUNUNS9xdmpZWngvamFieEo1QTFmbGc5VlZSekZXRUxLcS9Mc285YURqcXdvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFZEY5d0ZESjBZY3cwdHd3Q0hqbktnTm9temlCTDNWRkEybnRrV0NKMWtYN3ZHd21tRXladgpmSVhWY1NDdWZzcUhuTEo2cnNSNUtISzZ6S0Z5ays0bWJRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= + ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZDVENDQXZHZ0F3SUJBZ0lKQUsvSFlxYUc3NnhOTUEwR0NTcUdTSWIzRFFFQkN3VUFNQnN4R1RBWEJnTlYKQkFNTUVFbDJiM0o1VTFGTUxWSnZiM1F0UTBFd0hoY05NalV3TlRJd01Ea3pOVE0yV2hjTk16VXdOVEU0TURregpOVE0yV2pBYk1Sa3dGd1lEVlFRRERCQkpkbTl5ZVZOUlRDMVNiMjkwTFVOQk1JSUNJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTRla1FGWDJSNWt4dTZ1R2pScTJUeVFKMGtHRUd4SDJha24wbFcyMTcKY2NudDM2cWtpaFZpdmtzK1Z0NkNRN3BJaGE0MWFTNHcvUEZWVTJWTU9yQ1N5clhxQis1YzRubHFwdW9EVFhzcgpZMEdvdGc1a2NNNktmZmJ5NVF4ejFrZktid1hiZlk1blpiK0tPZHEvN0dQUkd3bGg4TzY0REJRN25YYjdoNUZ2ClU1N3VwOTgzRm0vOFZRSzZNUkg1aW9WN0dOSDZ6T2hJWlBYNzBhODJjNmJHTnpRTjRsUHY5UjlzSkNZRXdadzEKUUV4MGxmeGFDcUExWlliMHYvSTV5c05rd1ZHUVhhTFVMb3gveEJwOHRTd2ZEVk91MnVya1lnb2xGbG5WdkV2cApkMU83VjNNYnBIVmxVRCsyVFlsTUNtZWVJY3Fpd28rMnZhQ3IrOWFnaDdscTRKSUpoVXlHT3c5T0tYWEFOeER5CmVrY3AxRnNDMXVzdSsrQTBnUXdEcTRaUWVvN2VqNElQSE5iMm1LOWk0cEE1N3VPRDhKMnBnbjh5SXAxbWF5dm4KM3R3RXd6QlA0b3hIUUU4bGtrakxtWm1GSWYrcGRUUGNTM1ZLK1Q1ZFcwb1JNMXBvWVpsdWVyZDMwYnFYbFdqMword3FLbEErVlNaOXRVZUtvVlUxL0pRL2lCVCtJNWovM2tGMHVqa0hibW55MzVoU0pUak5RWWk3WGlmVjQ1UFg0CnBLMXdQdHZ0MFkvcldlWGVFdGV1Zys0WnNCQW1FWTlnR0FvQUUxN2kzdHFXMjIvZHowNmhybWVFOHhXVHdsaWUKNXhpTFVoU2FSY1Bnd1N0dmZLdGRRTU4ra3pKSElqQjZQNm5GWHUyWEtpTEU2KzBsbTJFV0J1OUdwclNLSVZHcwpmTzBDQXdFQUFhTlFNRTR3SFFZRFZSME9CQllFRk80dEFrL1l3Vkh1QmJUd1NqWXY4d2lHQ095Q01COEdBMVVkCkl3UVlNQmFBRk80dEFrL1l3Vkh1QmJUd1NqWXY4d2lHQ095Q01Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFFeUdncWRKZmRPS3Vzbm5ZSENvaWQ5Sk1PQkxidFMxS3EzdFBXMmkrTjk3eWxFWAp2cUV5QXpJQ3BsNEhrOEE2ZjRZaUxYZjMzTGg2bC95Mkd3YkpSdEl4ZWY5VjlYN2lJak4vY2o0dkdxU1oxSCtOCk0rQkl1RVRSeTExMUFINW4vcE9ITGdpczZad3pDSU1Ga3doR2dvbkVybnh2eGd0N2xFS01XWFhtRzgyTk5rb0UKL0tJNW5lMHlmZW8yaDlIYjJXWlo4NDJGc05iUVBMMUJQUzFxS3B2dFF5eFJCUnV6dUZDNFJmcW9QU1hKUmt1MAplQ0dhakdxOGRhbGZ3MGJWV3psbVVEakVvdFAvbkJzTkFYdjRpNm40Zm52cUtpaVo1dkxkckU5N2tMTFJoTTVTCmxQRlc0Ni9OYWtLeXpSWE82dnhYUVZTRWlJcTV4Sy9kT204UnhXYmFSR0tHZWwwOGF0L1RuT2RKbUdpa1hDVTAKV2wwbW9ZOFNaU2VzNHk2aGdjS1J5MTJUbERiMnU1M2RTK3VKOFR3TS9UOEFMQXpVMFlralZnV1Y5RlB2czkyNQp2Um1wWGxnV2N3N292NTJBMEdPa0poRmQyUG1RUE8zbnl3Njc2RHR0NmhsaldLaE95YXM3R29kMzFsQkxSODZaCjFCeXZRcmNoWUJ5Z1dNbU5WNFphYnhhK0JDaldRRERpalhlQ2x5WVpDZExYRDNmUHJibmFxYnY5WWJGeUsvM2EKODBHU0pvTTU1enMvYkJtaFFUTXR3Rzd3cGFDb3ZuMytrWDltbEZSbU02ZDZGbmR2OUxsalhuSEJtbXpiSUtkMAp0Z1gzMVBFRmlkUXRKdUp0N25nUUtBTDBQODZza0pqOElRS3A2NjJ1WXNNTlZZNjZVZUhBblJUTDNsNW8KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVyRENDQXBRQ0NRQ3hYa0M4SFBYU3dUQU5CZ2txaGtpRzl3MEJBUXNGQURBYk1Sa3dGd1lEVlFRRERCQkoKZG05eWVWTlJUQzFTYjI5MExVTkJNQjRYRFRJMU1EVXlNREE1TXpjd04xb1hEVE0xTURVeE9EQTVNemN3TjFvdwpGVEVUTUJFR0ExVUVBd3dLWDJsMmIzSjVjbVZ3YkRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDCkFnb0NnZ0lCQU9IcEVCVjlrZVpNYnVyaG8wYXRrOGtDZEpCaEJzUjltcEo5SlZ0dGUzSEo3ZCtxcElvVllyNUwKUGxiZWdrTzZTSVd1TldrdU1QenhWVk5sVERxd2tzcTE2Z2Z1WE9KNWFxYnFBMDE3SzJOQnFMWU9aSERPaW4zMgo4dVVNYzlaSHltOEYyMzJPWjJXL2lqbmF2K3hqMFJzSllmRHV1QXdVTzUxMis0ZVJiMU9lN3FmZk54WnYvRlVDCnVqRVIrWXFGZXhqUitzem9TR1QxKzlHdk5uT214amMwRGVKVDcvVWZiQ1FtQk1HY05VQk1kSlg4V2dxZ05XV0cKOUwveU9jckRaTUZSa0YyaTFDNk1mOFFhZkxVc0h3MVRydHJxNUdJS0pSWloxYnhMNlhkVHUxZHpHNlIxWlZBLwp0azJKVEFwbm5pSEtvc0tQdHIyZ3EvdldvSWU1YXVDU0NZVk1oanNQVGlsMXdEY1E4bnBIS2RSYkF0YnJMdnZnCk5JRU1BNnVHVUhxTzNvK0NEeHpXOXBpdll1S1FPZTdqZy9DZHFZSi9NaUtkWm1zcjU5N2NCTU13VCtLTVIwQlAKSlpKSXk1bVpoU0gvcVhVejNFdDFTdmsrWFZ0S0VUTmFhR0daYm5xM2Q5RzZsNVZvOS9zS2lwUVBsVW1mYlZIaQpxRlZOZnlVUDRnVS9pT1kvOTVCZExvNUIyNXA4dCtZVWlVNHpVR0l1MTRuMWVPVDErS1N0Y0Q3YjdkR1A2MW5sCjNoTFhyb1B1R2JBUUpoR1BZQmdLQUJOZTR0N2FsdHR2M2M5T29hNW5oUE1WazhKWW51Y1lpMUlVbWtYRDRNRXIKYjN5clhVRERmcE15UnlJd2VqK3B4Vjd0bHlvaXhPdnRKWnRoRmdidlJxYTBpaUZSckh6dEFnTUJBQUV3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFLR1lqV0JlcVNCSmM5R3ZjVmNQRG5ETXNvSDlrNlBDTzRrcCtJZlpINFdVCnAvcVA2UmFmMm1PVWowOWZnOXdBbXlLazFKMVdvQ3pVTXNYczRUR0RLUUhTdkcxMEJtakhmVW1wVnFtMWFXTU0KaW8zL01QL3MyYkFEMXpuVW1XYXVLNnBESzkwSXBlbmZoZjZVNUZDU1NqVVp6cWhhUUFvU2kwdG1PZ2xMYytyUAp0Z0s2amZBMVJzNW85L2ozUmNPMDkxMXk3SGJabEFoQW16am5GWWlWelVvWlYrS3V3ZENwdGUvZW5sS3M2N1dGCmUwT0kzM2ZTM2l4Smx3M29NYWpqaitmdXpKRUxTeU1nam5PcGhnRXd5b3NmaUdRRHFOOXI3RW93QmxhMFgwN0EKSk0wY1ErcUdXYnY0dkVibFF2N2xyYnY4MDNhMzFEbDU4d3Q3QnQxUTYzSC9UTEd3bWgvVUludkhZMmhyK0VyZgp6c3hROUhRc244dkhJWU5CaENTckxvenU2aGFoOEp2Rlp2ZHlxL0NRZ3JjUG9oSXB5ekR6ZUt6Q29MN1RnRjBrCm1wV3VhS1NIU2g4TCs5YXVzeERuRkJWUFZTcGY0ZTFLOUM1eXJ3NEJ3WlY3YU5PL2hlYUhlWk5la21FUVJrSEMKQjdLUHBiRzMwLy9ubDJrdzJwTmIvMFVsY25EREJ4aGZHaWZDSU9WRnpSQ2RRMDU0dFhQeFp5TFVqa1NRcUs5eAovOEttb2lWRGh3akl4bDRGRExvc3dLL2VVQS8zMm5zdnNiWDIvRzlHZ1NyRlpLQ25LREZQWFZkWTFVQnBRWnpFCjkrL2hKNGVJK08wUS8wVGJuMUdIQlM0UENkNVgxRmUyZzk1MFo5RkpxUU5sU3preGdPR3JqZ0tVaEJQZFdvQ2gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBNGVrUUZYMlI1a3h1NnVHalJxMlR5UUowa0dFR3hIMmFrbjBsVzIxN2NjbnQzNnFrCmloVml2a3MrVnQ2Q1E3cEloYTQxYVM0dy9QRlZVMlZNT3JDU3lyWHFCKzVjNG5scXB1b0RUWHNyWTBHb3RnNWsKY002S2ZmYnk1UXh6MWtmS2J3WGJmWTVuWmIrS09kcS83R1BSR3dsaDhPNjREQlE3blhiN2g1RnZVNTd1cDk4MwpGbS84VlFLNk1SSDVpb1Y3R05INnpPaElaUFg3MGE4MmM2YkdOelFONGxQdjlSOXNKQ1lFd1p3MVFFeDBsZnhhCkNxQTFaWWIwdi9JNXlzTmt3VkdRWGFMVUxveC94QnA4dFN3ZkRWT3UydXJrWWdvbEZsblZ2RXZwZDFPN1YzTWIKcEhWbFVEKzJUWWxNQ21lZUljcWl3bysydmFDcis5YWdoN2xxNEpJSmhVeUdPdzlPS1hYQU54RHlla2NwMUZzQwoxdXN1KytBMGdRd0RxNFpRZW83ZWo0SVBITmIybUs5aTRwQTU3dU9EOEoycGduOHlJcDFtYXl2bjN0d0V3ekJQCjRveEhRRThsa2tqTG1abUZJZitwZFRQY1MzVksrVDVkVzBvUk0xcG9ZWmx1ZXJkMzBicVhsV2ozK3dxS2xBK1YKU1o5dFVlS29WVTEvSlEvaUJUK0k1ai8za0YwdWprSGJtbnkzNWhTSlRqTlFZaTdYaWZWNDVQWDRwSzF3UHR2dAowWS9yV2VYZUV0ZXVnKzRac0JBbUVZOWdHQW9BRTE3aTN0cVcyMi9kejA2aHJtZUU4eFdUd2xpZTV4aUxVaFNhClJjUGd3U3R2Zkt0ZFFNTitrekpISWpCNlA2bkZYdTJYS2lMRTYrMGxtMkVXQnU5R3ByU0tJVkdzZk8wQ0F3RUEKQVFLQ0FnRUFqS1BydjNWTlAzS1dHdVFlSWdJdDN4WUlPMW9zUEdkMXMzejFwTldqNUZNeUkreTRRcjdObW1wOQpoTmRCZ2FpWFBhSVcza1JEZXpWRFNZZm16U0xnUUJMQWYrK0ZJL2t5ekhjalZ6azI2YlFXdEVDQmh6a09QeDFlCldmcEdvMEJPWm8vZTlXdVNNMlhyUjlsSFlvTkJ5dk1zWmpJM29rMTJUN0dqSmVNRXk2cEdLWHh0YnlxSWpPUUYKeGtiS2M5SmxzQzRKVlVmR3loUFprZERpdFYwK1NWKyt4UWc4ZXYzMDlRdzJLZEoxMUhIRW94dFhjd1lLT0FxcwpsRkxZWjhMOUZ0MFFZenJiblo4YWE1dVJ4N2lRSEZ2Y242MWNRU3pQcWZxRGRaWk00bHplWkxMa29wM3pWT0pWClBEQWRodHk3Tlk1UmhZNnkxWnNSZHRkSFdUZTFzSzA2QzZTV3lOY2dxOUhPenN3aEwvOVBoQkNSY0MzTmY3RmQKT2FXbXU4em1TdjlWV3RlTU1lcG03L2Rib041WEd5VUs3TkZMRmd0S3VjZFNJTnlaMFFhN3h2K2E4WDNKVDEwMApGd3hZVlVqWmRGVXJwZ21Hbjg3TmtTUEJZc3BvOXJ6allBa2pRVTVQMUg5a1U4TGlIU2FheS83dFBwVldaQzVDCkd3eFRtWTllSnhkMDhkQlpQU1FqTGhyZXlFeExnYlkzTkVxakFRdW5BY0lFbjV0K2VTZ3ZOdStGVGZzYWN6RUsKLzZxaGdDeGx0QWJ3aTI4ZUc0enRTRi84enZnNGlNVUh1cmxFMm03UksxUmRoYmUvVGRDTmVuRkp0Q3FLTktVUwpPalhhWER6ODYvbkFrNkNiWm90UXJENjFEb2E3dFVoeE5tNDZ1TGh6ejZmZUc2MER6b0VDZ2dFQkFQL0IyaERFCkxCdEZWWklGU1JySTBLNWhLaVZRcXFSL21wQ0tuRVNJQ0plTUN3N3VibWVNc0Z5OEtVSGF6dWpZVnZpUTRPakMKdTFFeUkxOTUvOWZ5VnpjUnBvRGZpUXJxTDIvOE9uRVE0OGhZOXlUUkJQU3NybVRzZERMZ2txbklqb1VLR2VTMgp3RTBJeWw1b083VHpCbkdjeEU4anp5TDRlUzFpSWozMHZ6Sk1kaEFqLzZrRjlMQlpKTEcwSnE1TUlPRzFaSm9ICjF5UEdrREtVd0Vtc3VIRVQxUHMxanRqbHJvbnA4Ni9iaGFEcTlnbkVGQkoyK2x3TVlpWE54TUNNL3ArMjF0c2EKdkZNdWlxMTgyTUtHY2ZCdDVJdlpoa3AremxsbHdGdUFXN3ptd0hZQ3NQNFUyTWVRY1lYc0NweHZzWlg1V1ZGZwpEOGJ0V29wVHZVYy96eU1DZ2dFQkFPSWY5VlRYUWQxOHFXaDdlbGR4WGVYaldSZWs2cC9aRHY4cklUSi9wSjNXCmpwWUZwbGZud3F4RXRlbng4RnFIKys2NTdUSUtlTHUvdHRpblRGQ1VROGFaNEs0RmJOT0VWazFlMDFLRFNKVS8KRHc0THF5VUJMSDJERUJSb0Q5U2RYaDdrYkY3MlRxOWxYNXdVVXp1Y3Y0a2VGWGFZMlFvVUcvRVJpUnRMZy9idgpYcWtZSkpsSXFmS0E5KzV4SHM0WWpzWnkzaVI3UkswLzRBRVlJdDJBTXF0WG1hd2pTMWlad2kwdXBWZzB0U0Q1CkhWVjJqa0ZyS0VCNEU0WW1yVmh2ZEFUYTMvTUhINGk0T2YyZVJ6Z1kwd1kyUVpIMmhoK2thY29xRVA0RHU3ZnQKczkrRzBWMTRibmltT1FFUE8wSm5VczltNU9ha3A0Ylc4QWd4akxycXpLOENnZ0VBUklrVUFJNHhLNVdtMnB4agovTE4zaUdNdFFoYWR3N3NXRmttdW1vYkJscXJHZzlmTTZoNi9XL3BvSytlUXJzRGFmWDJGWjVwWFMramRwY1l4Cmt4S3o0R1B3ZEhSeWF1UmFsZTNIVTJrdFFSRG1HWTJSZ0dlTnpDbTQ4YkZRWEFNTWZnWTQ3aHN5NlBIRUdReGgKZzVua1RpbXVTVzdWSVEvb21RckZGa2t4dXk3V0xIa1pGNWdxKzk3SGdIOUFKbERzTnMrL0I2KzJMVFlXaWhkbQpkOWU3RFVJOVBwd1pqWEh2RmJJRnhVaFVSTXp4NWFnUG9Pc1ZKL21CaTVQYWQ2YlF6TWZZUjVxZ2dNSG1FNXR6CkVwMm9ocjlNRVZYWE1MdE9YSkp4dTVOb0FmVHIrak82Ymp2ejQzYUhsVld0ZWtKTUdsNVpXdjhjK3plN25YblgKTFBLaWRRS0NBUUJ2UFNtRFF5R3p3OC9UQm10NCtOd29hMTg0c25oNWlsNUdTUUZieGs5RkZuZXVkYmtQSllRdgpHdDRpNkZKRk53Qkl3RTVmZjZkRk5Wck4yZjlBNUs4eTFDQWplNmU5cGl5T2cwZVNIK05sQ0ZCdnFHM1pGbXE4CmsrMGxITXdzMi8yaFZOMjdHWkE3MkxMZ0pWK013OSsxcEljS2dNYkVubi9nWjYvN0xYc056MVBSKzM2RnFhbHgKRXVEaysrRWJvaGthcHdlQkN1TU9GNDRxKzZTck1wVzZsSzJVY1FodjNiUVlaZ29SQ2x6UWk3eFNmckFjbm9wKwpySk51T3ppcmVLaXFlc0lRM0VBM0VlbjFTaGZmRU5jL0J4SGFyRnZ1MVFMMTRSdmEyaHRPc0REOGxXWUpoV1ZUCkZQS1dBdGcwSW9BcVo0UFRzc3gzR09XY0lrUUk3OWtoQW9JQkFRQ1RUTDFpYkFmS3JRd1AwZmxaTFZzVmRCV28KazRwSXd5OVFoL1E1R3Jua3o2TDYwclRIanhLamFXeTk1N1h0a2RwRlRYeWpBa2c1WEFnYlVtZGtSam55UC9zawplS0kwSUZ0NXJTVU8yL3NUakpDODNwVlJRNVFsdXBtaklqVTFVbXFZOWRYdnIyZEltMGY0dU1QYXRvQ2FOL2dmCnczdHc0MC9GamJ1NGdPOHNYYkxIMllwQVFmRWpBeUxUN0ZZbVVpM3cza09kMGM2Sm1wUENMdXp6cjdDMHdla0YKY08yMHNmY2p0OTVCekFSWGxIeEtXaG9udlIvejl4dzZyQzFYTk1HVDdjMFhaVHY1SVJINmlucGkra3cxVnZRUApacFVjd08zTDZROUx0SGQ0Z2UyeE02N2xibjF1TzZ3aGFyVFc5SlpGQVJPcCtreWZ5WktBTkxEVDdSK24KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K kind: Secret metadata: name: cluster-cert @@ -10,9 +10,9 @@ type: Opaque --- apiVersion: v1 data: - ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJmRENDQVNHZ0F3SUJBZ0lRY1pYTDVSdWU0bVNoNVhWbUYyTmcvekFLQmdncWhrak9QUVFEQXpBY01Sb3cKR0FZRFZRUURFeEZwZG05eWVTMXZjR1Z5WVhSdmNpMWpZVEFlRncweU16QTVNRFl3TmpBeE1qWmFGdzB6TXpBNQpNRE13TnpBeE1qWmFNQnd4R2pBWUJnTlZCQU1URVdsMmIzSjVMVzl3WlhKaGRHOXlMV05oTUZrd0V3WUhLb1pJCnpqMENBUVlJS29aSXpqMERBUWNEUWdBRVQ0K2h3cktZcjFFb2NXNjdnNWwyL2I0bmFqcmJESmQ4V09KU2JkL1AKT2JBUHpraGpsekY2a1B2TjRIelVsUEVDb0ZlU292eE9seVZjSmhmTGorTHUvYU5GTUVNd0RnWURWUjBQQVFILwpCQVFEQWdFR01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdIUVlEVlIwT0JCWUVGRFJMOXNNWGNCNW9SL3dyCnJEUHpvbGJhMjJWd01Bb0dDQ3FHU000OUJBTURBMGtBTUVZQ0lRRDNvUXNkWWhFd0JJUTRTcXdzdGtVaDVyckIKa2ZYTGJZNVJTRDVoMm5aam9nSWhBTExtYW1ybWYxejFlbmkveE5iMmNWaUk4R3UvY1hBTzVxYXQvY3ZNaUxKRwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== - tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJoekNDQVM2Z0F3SUJBZ0lSQUlLSEc1K0hwOXdjTkpIR2YzTTduK2t3Q2dZSUtvWkl6ajBFQXdNd0hERWEKTUJnR0ExVUVBeE1SYVhadmNua3RiM0JsY21GMGIzSXRZMkV3SGhjTk1qTXdPVEEyTURZd01USTJXaGNOTWpRdwpPVEExTURjd01USTJXakFWTVJNd0VRWURWUVFEREFwZmFYWnZjbmx5WlhCc01Ga3dFd1lIS29aSXpqMENBUVlJCktvWkl6ajBEQVFjRFFnQUVlTW9FRi9wOFU3VVQwUFByaDdyZ0hhYXJMeXRGMVAzcTR5S2dIOVUyR3UwUTdzWW4KRW5jY2huTThJalZhS21GYkZqS2RickRPbXU0QW1lUzY1dEk4M0tOWU1GWXdEZ1lEVlIwUEFRSC9CQVFEQWdXZwpNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVORXYyd3hkd0htaEgvQ3VzTS9PaVZ0cmJaWEF3CkZRWURWUjBSQkE0d0RJSUtYMmwyYjNKNWNtVndiREFLQmdncWhrak9QUVFEQXdOSEFEQkVBaUJqZ0p3QmdobjYKQTN1a3Fnay9hbVFYSnBKN0Y0QjkyNFUyaW5mV0dENUhpZ0lnVWFQWTJ5WlBUcHJJRlVYUkJoNnZ6MnlEUC9IdwpNSW1VUGNLZ1BkNUZ5MFU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K - tls.key: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUlhZnVvc1YrTld6dkV0aGxZbEdXQ0QyOGJkMEFhTXBPRDlvVXJnd29URnhvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFZU1vRUYvcDhVN1VUMFBQcmg3cmdIYWFyTHl0RjFQM3E0eUtnSDlVMkd1MFE3c1luRW5jYwpobk04SWpWYUttRmJGaktkYnJET211NEFtZVM2NXRJODNBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= + ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZDVENDQXZHZ0F3SUJBZ0lKQUsvSFlxYUc3NnhOTUEwR0NTcUdTSWIzRFFFQkN3VUFNQnN4R1RBWEJnTlYKQkFNTUVFbDJiM0o1VTFGTUxWSnZiM1F0UTBFd0hoY05NalV3TlRJd01Ea3pOVE0yV2hjTk16VXdOVEU0TURregpOVE0yV2pBYk1Sa3dGd1lEVlFRRERCQkpkbTl5ZVZOUlRDMVNiMjkwTFVOQk1JSUNJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTRla1FGWDJSNWt4dTZ1R2pScTJUeVFKMGtHRUd4SDJha24wbFcyMTcKY2NudDM2cWtpaFZpdmtzK1Z0NkNRN3BJaGE0MWFTNHcvUEZWVTJWTU9yQ1N5clhxQis1YzRubHFwdW9EVFhzcgpZMEdvdGc1a2NNNktmZmJ5NVF4ejFrZktid1hiZlk1blpiK0tPZHEvN0dQUkd3bGg4TzY0REJRN25YYjdoNUZ2ClU1N3VwOTgzRm0vOFZRSzZNUkg1aW9WN0dOSDZ6T2hJWlBYNzBhODJjNmJHTnpRTjRsUHY5UjlzSkNZRXdadzEKUUV4MGxmeGFDcUExWlliMHYvSTV5c05rd1ZHUVhhTFVMb3gveEJwOHRTd2ZEVk91MnVya1lnb2xGbG5WdkV2cApkMU83VjNNYnBIVmxVRCsyVFlsTUNtZWVJY3Fpd28rMnZhQ3IrOWFnaDdscTRKSUpoVXlHT3c5T0tYWEFOeER5CmVrY3AxRnNDMXVzdSsrQTBnUXdEcTRaUWVvN2VqNElQSE5iMm1LOWk0cEE1N3VPRDhKMnBnbjh5SXAxbWF5dm4KM3R3RXd6QlA0b3hIUUU4bGtrakxtWm1GSWYrcGRUUGNTM1ZLK1Q1ZFcwb1JNMXBvWVpsdWVyZDMwYnFYbFdqMword3FLbEErVlNaOXRVZUtvVlUxL0pRL2lCVCtJNWovM2tGMHVqa0hibW55MzVoU0pUak5RWWk3WGlmVjQ1UFg0CnBLMXdQdHZ0MFkvcldlWGVFdGV1Zys0WnNCQW1FWTlnR0FvQUUxN2kzdHFXMjIvZHowNmhybWVFOHhXVHdsaWUKNXhpTFVoU2FSY1Bnd1N0dmZLdGRRTU4ra3pKSElqQjZQNm5GWHUyWEtpTEU2KzBsbTJFV0J1OUdwclNLSVZHcwpmTzBDQXdFQUFhTlFNRTR3SFFZRFZSME9CQllFRk80dEFrL1l3Vkh1QmJUd1NqWXY4d2lHQ095Q01COEdBMVVkCkl3UVlNQmFBRk80dEFrL1l3Vkh1QmJUd1NqWXY4d2lHQ095Q01Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFFeUdncWRKZmRPS3Vzbm5ZSENvaWQ5Sk1PQkxidFMxS3EzdFBXMmkrTjk3eWxFWAp2cUV5QXpJQ3BsNEhrOEE2ZjRZaUxYZjMzTGg2bC95Mkd3YkpSdEl4ZWY5VjlYN2lJak4vY2o0dkdxU1oxSCtOCk0rQkl1RVRSeTExMUFINW4vcE9ITGdpczZad3pDSU1Ga3doR2dvbkVybnh2eGd0N2xFS01XWFhtRzgyTk5rb0UKL0tJNW5lMHlmZW8yaDlIYjJXWlo4NDJGc05iUVBMMUJQUzFxS3B2dFF5eFJCUnV6dUZDNFJmcW9QU1hKUmt1MAplQ0dhakdxOGRhbGZ3MGJWV3psbVVEakVvdFAvbkJzTkFYdjRpNm40Zm52cUtpaVo1dkxkckU5N2tMTFJoTTVTCmxQRlc0Ni9OYWtLeXpSWE82dnhYUVZTRWlJcTV4Sy9kT204UnhXYmFSR0tHZWwwOGF0L1RuT2RKbUdpa1hDVTAKV2wwbW9ZOFNaU2VzNHk2aGdjS1J5MTJUbERiMnU1M2RTK3VKOFR3TS9UOEFMQXpVMFlralZnV1Y5RlB2czkyNQp2Um1wWGxnV2N3N292NTJBMEdPa0poRmQyUG1RUE8zbnl3Njc2RHR0NmhsaldLaE95YXM3R29kMzFsQkxSODZaCjFCeXZRcmNoWUJ5Z1dNbU5WNFphYnhhK0JDaldRRERpalhlQ2x5WVpDZExYRDNmUHJibmFxYnY5WWJGeUsvM2EKODBHU0pvTTU1enMvYkJtaFFUTXR3Rzd3cGFDb3ZuMytrWDltbEZSbU02ZDZGbmR2OUxsalhuSEJtbXpiSUtkMAp0Z1gzMVBFRmlkUXRKdUp0N25nUUtBTDBQODZza0pqOElRS3A2NjJ1WXNNTlZZNjZVZUhBblJUTDNsNW8KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVyRENDQXBRQ0NRQ3hYa0M4SFBYU3dUQU5CZ2txaGtpRzl3MEJBUXNGQURBYk1Sa3dGd1lEVlFRRERCQkoKZG05eWVWTlJUQzFTYjI5MExVTkJNQjRYRFRJMU1EVXlNREE1TXpjd04xb1hEVE0xTURVeE9EQTVNemN3TjFvdwpGVEVUTUJFR0ExVUVBd3dLWDJsMmIzSjVjbVZ3YkRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDCkFnb0NnZ0lCQU9IcEVCVjlrZVpNYnVyaG8wYXRrOGtDZEpCaEJzUjltcEo5SlZ0dGUzSEo3ZCtxcElvVllyNUwKUGxiZWdrTzZTSVd1TldrdU1QenhWVk5sVERxd2tzcTE2Z2Z1WE9KNWFxYnFBMDE3SzJOQnFMWU9aSERPaW4zMgo4dVVNYzlaSHltOEYyMzJPWjJXL2lqbmF2K3hqMFJzSllmRHV1QXdVTzUxMis0ZVJiMU9lN3FmZk54WnYvRlVDCnVqRVIrWXFGZXhqUitzem9TR1QxKzlHdk5uT214amMwRGVKVDcvVWZiQ1FtQk1HY05VQk1kSlg4V2dxZ05XV0cKOUwveU9jckRaTUZSa0YyaTFDNk1mOFFhZkxVc0h3MVRydHJxNUdJS0pSWloxYnhMNlhkVHUxZHpHNlIxWlZBLwp0azJKVEFwbm5pSEtvc0tQdHIyZ3EvdldvSWU1YXVDU0NZVk1oanNQVGlsMXdEY1E4bnBIS2RSYkF0YnJMdnZnCk5JRU1BNnVHVUhxTzNvK0NEeHpXOXBpdll1S1FPZTdqZy9DZHFZSi9NaUtkWm1zcjU5N2NCTU13VCtLTVIwQlAKSlpKSXk1bVpoU0gvcVhVejNFdDFTdmsrWFZ0S0VUTmFhR0daYm5xM2Q5RzZsNVZvOS9zS2lwUVBsVW1mYlZIaQpxRlZOZnlVUDRnVS9pT1kvOTVCZExvNUIyNXA4dCtZVWlVNHpVR0l1MTRuMWVPVDErS1N0Y0Q3YjdkR1A2MW5sCjNoTFhyb1B1R2JBUUpoR1BZQmdLQUJOZTR0N2FsdHR2M2M5T29hNW5oUE1WazhKWW51Y1lpMUlVbWtYRDRNRXIKYjN5clhVRERmcE15UnlJd2VqK3B4Vjd0bHlvaXhPdnRKWnRoRmdidlJxYTBpaUZSckh6dEFnTUJBQUV3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFLR1lqV0JlcVNCSmM5R3ZjVmNQRG5ETXNvSDlrNlBDTzRrcCtJZlpINFdVCnAvcVA2UmFmMm1PVWowOWZnOXdBbXlLazFKMVdvQ3pVTXNYczRUR0RLUUhTdkcxMEJtakhmVW1wVnFtMWFXTU0KaW8zL01QL3MyYkFEMXpuVW1XYXVLNnBESzkwSXBlbmZoZjZVNUZDU1NqVVp6cWhhUUFvU2kwdG1PZ2xMYytyUAp0Z0s2amZBMVJzNW85L2ozUmNPMDkxMXk3SGJabEFoQW16am5GWWlWelVvWlYrS3V3ZENwdGUvZW5sS3M2N1dGCmUwT0kzM2ZTM2l4Smx3M29NYWpqaitmdXpKRUxTeU1nam5PcGhnRXd5b3NmaUdRRHFOOXI3RW93QmxhMFgwN0EKSk0wY1ErcUdXYnY0dkVibFF2N2xyYnY4MDNhMzFEbDU4d3Q3QnQxUTYzSC9UTEd3bWgvVUludkhZMmhyK0VyZgp6c3hROUhRc244dkhJWU5CaENTckxvenU2aGFoOEp2Rlp2ZHlxL0NRZ3JjUG9oSXB5ekR6ZUt6Q29MN1RnRjBrCm1wV3VhS1NIU2g4TCs5YXVzeERuRkJWUFZTcGY0ZTFLOUM1eXJ3NEJ3WlY3YU5PL2hlYUhlWk5la21FUVJrSEMKQjdLUHBiRzMwLy9ubDJrdzJwTmIvMFVsY25EREJ4aGZHaWZDSU9WRnpSQ2RRMDU0dFhQeFp5TFVqa1NRcUs5eAovOEttb2lWRGh3akl4bDRGRExvc3dLL2VVQS8zMm5zdnNiWDIvRzlHZ1NyRlpLQ25LREZQWFZkWTFVQnBRWnpFCjkrL2hKNGVJK08wUS8wVGJuMUdIQlM0UENkNVgxRmUyZzk1MFo5RkpxUU5sU3preGdPR3JqZ0tVaEJQZFdvQ2gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBNGVrUUZYMlI1a3h1NnVHalJxMlR5UUowa0dFR3hIMmFrbjBsVzIxN2NjbnQzNnFrCmloVml2a3MrVnQ2Q1E3cEloYTQxYVM0dy9QRlZVMlZNT3JDU3lyWHFCKzVjNG5scXB1b0RUWHNyWTBHb3RnNWsKY002S2ZmYnk1UXh6MWtmS2J3WGJmWTVuWmIrS09kcS83R1BSR3dsaDhPNjREQlE3blhiN2g1RnZVNTd1cDk4MwpGbS84VlFLNk1SSDVpb1Y3R05INnpPaElaUFg3MGE4MmM2YkdOelFONGxQdjlSOXNKQ1lFd1p3MVFFeDBsZnhhCkNxQTFaWWIwdi9JNXlzTmt3VkdRWGFMVUxveC94QnA4dFN3ZkRWT3UydXJrWWdvbEZsblZ2RXZwZDFPN1YzTWIKcEhWbFVEKzJUWWxNQ21lZUljcWl3bysydmFDcis5YWdoN2xxNEpJSmhVeUdPdzlPS1hYQU54RHlla2NwMUZzQwoxdXN1KytBMGdRd0RxNFpRZW83ZWo0SVBITmIybUs5aTRwQTU3dU9EOEoycGduOHlJcDFtYXl2bjN0d0V3ekJQCjRveEhRRThsa2tqTG1abUZJZitwZFRQY1MzVksrVDVkVzBvUk0xcG9ZWmx1ZXJkMzBicVhsV2ozK3dxS2xBK1YKU1o5dFVlS29WVTEvSlEvaUJUK0k1ai8za0YwdWprSGJtbnkzNWhTSlRqTlFZaTdYaWZWNDVQWDRwSzF3UHR2dAowWS9yV2VYZUV0ZXVnKzRac0JBbUVZOWdHQW9BRTE3aTN0cVcyMi9kejA2aHJtZUU4eFdUd2xpZTV4aUxVaFNhClJjUGd3U3R2Zkt0ZFFNTitrekpISWpCNlA2bkZYdTJYS2lMRTYrMGxtMkVXQnU5R3ByU0tJVkdzZk8wQ0F3RUEKQVFLQ0FnRUFqS1BydjNWTlAzS1dHdVFlSWdJdDN4WUlPMW9zUEdkMXMzejFwTldqNUZNeUkreTRRcjdObW1wOQpoTmRCZ2FpWFBhSVcza1JEZXpWRFNZZm16U0xnUUJMQWYrK0ZJL2t5ekhjalZ6azI2YlFXdEVDQmh6a09QeDFlCldmcEdvMEJPWm8vZTlXdVNNMlhyUjlsSFlvTkJ5dk1zWmpJM29rMTJUN0dqSmVNRXk2cEdLWHh0YnlxSWpPUUYKeGtiS2M5SmxzQzRKVlVmR3loUFprZERpdFYwK1NWKyt4UWc4ZXYzMDlRdzJLZEoxMUhIRW94dFhjd1lLT0FxcwpsRkxZWjhMOUZ0MFFZenJiblo4YWE1dVJ4N2lRSEZ2Y242MWNRU3pQcWZxRGRaWk00bHplWkxMa29wM3pWT0pWClBEQWRodHk3Tlk1UmhZNnkxWnNSZHRkSFdUZTFzSzA2QzZTV3lOY2dxOUhPenN3aEwvOVBoQkNSY0MzTmY3RmQKT2FXbXU4em1TdjlWV3RlTU1lcG03L2Rib041WEd5VUs3TkZMRmd0S3VjZFNJTnlaMFFhN3h2K2E4WDNKVDEwMApGd3hZVlVqWmRGVXJwZ21Hbjg3TmtTUEJZc3BvOXJ6allBa2pRVTVQMUg5a1U4TGlIU2FheS83dFBwVldaQzVDCkd3eFRtWTllSnhkMDhkQlpQU1FqTGhyZXlFeExnYlkzTkVxakFRdW5BY0lFbjV0K2VTZ3ZOdStGVGZzYWN6RUsKLzZxaGdDeGx0QWJ3aTI4ZUc0enRTRi84enZnNGlNVUh1cmxFMm03UksxUmRoYmUvVGRDTmVuRkp0Q3FLTktVUwpPalhhWER6ODYvbkFrNkNiWm90UXJENjFEb2E3dFVoeE5tNDZ1TGh6ejZmZUc2MER6b0VDZ2dFQkFQL0IyaERFCkxCdEZWWklGU1JySTBLNWhLaVZRcXFSL21wQ0tuRVNJQ0plTUN3N3VibWVNc0Z5OEtVSGF6dWpZVnZpUTRPakMKdTFFeUkxOTUvOWZ5VnpjUnBvRGZpUXJxTDIvOE9uRVE0OGhZOXlUUkJQU3NybVRzZERMZ2txbklqb1VLR2VTMgp3RTBJeWw1b083VHpCbkdjeEU4anp5TDRlUzFpSWozMHZ6Sk1kaEFqLzZrRjlMQlpKTEcwSnE1TUlPRzFaSm9ICjF5UEdrREtVd0Vtc3VIRVQxUHMxanRqbHJvbnA4Ni9iaGFEcTlnbkVGQkoyK2x3TVlpWE54TUNNL3ArMjF0c2EKdkZNdWlxMTgyTUtHY2ZCdDVJdlpoa3AremxsbHdGdUFXN3ptd0hZQ3NQNFUyTWVRY1lYc0NweHZzWlg1V1ZGZwpEOGJ0V29wVHZVYy96eU1DZ2dFQkFPSWY5VlRYUWQxOHFXaDdlbGR4WGVYaldSZWs2cC9aRHY4cklUSi9wSjNXCmpwWUZwbGZud3F4RXRlbng4RnFIKys2NTdUSUtlTHUvdHRpblRGQ1VROGFaNEs0RmJOT0VWazFlMDFLRFNKVS8KRHc0THF5VUJMSDJERUJSb0Q5U2RYaDdrYkY3MlRxOWxYNXdVVXp1Y3Y0a2VGWGFZMlFvVUcvRVJpUnRMZy9idgpYcWtZSkpsSXFmS0E5KzV4SHM0WWpzWnkzaVI3UkswLzRBRVlJdDJBTXF0WG1hd2pTMWlad2kwdXBWZzB0U0Q1CkhWVjJqa0ZyS0VCNEU0WW1yVmh2ZEFUYTMvTUhINGk0T2YyZVJ6Z1kwd1kyUVpIMmhoK2thY29xRVA0RHU3ZnQKczkrRzBWMTRibmltT1FFUE8wSm5VczltNU9ha3A0Ylc4QWd4akxycXpLOENnZ0VBUklrVUFJNHhLNVdtMnB4agovTE4zaUdNdFFoYWR3N3NXRmttdW1vYkJscXJHZzlmTTZoNi9XL3BvSytlUXJzRGFmWDJGWjVwWFMramRwY1l4Cmt4S3o0R1B3ZEhSeWF1UmFsZTNIVTJrdFFSRG1HWTJSZ0dlTnpDbTQ4YkZRWEFNTWZnWTQ3aHN5NlBIRUdReGgKZzVua1RpbXVTVzdWSVEvb21RckZGa2t4dXk3V0xIa1pGNWdxKzk3SGdIOUFKbERzTnMrL0I2KzJMVFlXaWhkbQpkOWU3RFVJOVBwd1pqWEh2RmJJRnhVaFVSTXp4NWFnUG9Pc1ZKL21CaTVQYWQ2YlF6TWZZUjVxZ2dNSG1FNXR6CkVwMm9ocjlNRVZYWE1MdE9YSkp4dTVOb0FmVHIrak82Ymp2ejQzYUhsVld0ZWtKTUdsNVpXdjhjK3plN25YblgKTFBLaWRRS0NBUUJ2UFNtRFF5R3p3OC9UQm10NCtOd29hMTg0c25oNWlsNUdTUUZieGs5RkZuZXVkYmtQSllRdgpHdDRpNkZKRk53Qkl3RTVmZjZkRk5Wck4yZjlBNUs4eTFDQWplNmU5cGl5T2cwZVNIK05sQ0ZCdnFHM1pGbXE4CmsrMGxITXdzMi8yaFZOMjdHWkE3MkxMZ0pWK013OSsxcEljS2dNYkVubi9nWjYvN0xYc056MVBSKzM2RnFhbHgKRXVEaysrRWJvaGthcHdlQkN1TU9GNDRxKzZTck1wVzZsSzJVY1FodjNiUVlaZ29SQ2x6UWk3eFNmckFjbm9wKwpySk51T3ppcmVLaXFlc0lRM0VBM0VlbjFTaGZmRU5jL0J4SGFyRnZ1MVFMMTRSdmEyaHRPc0REOGxXWUpoV1ZUCkZQS1dBdGcwSW9BcVo0UFRzc3gzR09XY0lrUUk3OWtoQW9JQkFRQ1RUTDFpYkFmS3JRd1AwZmxaTFZzVmRCV28KazRwSXd5OVFoL1E1R3Jua3o2TDYwclRIanhLamFXeTk1N1h0a2RwRlRYeWpBa2c1WEFnYlVtZGtSam55UC9zawplS0kwSUZ0NXJTVU8yL3NUakpDODNwVlJRNVFsdXBtaklqVTFVbXFZOWRYdnIyZEltMGY0dU1QYXRvQ2FOL2dmCnczdHc0MC9GamJ1NGdPOHNYYkxIMllwQVFmRWpBeUxUN0ZZbVVpM3cza09kMGM2Sm1wUENMdXp6cjdDMHdla0YKY08yMHNmY2p0OTVCekFSWGxIeEtXaG9udlIvejl4dzZyQzFYTk1HVDdjMFhaVHY1SVJINmlucGkra3cxVnZRUApacFVjd08zTDZROUx0SGQ0Z2UyeE02N2xibjF1TzZ3aGFyVFc5SlpGQVJPcCtreWZ5WktBTkxEVDdSK24KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K kind: Secret metadata: name: replication-cert diff --git a/testing/kuttl/e2e/switchover/01-assert.yaml b/testing/kuttl/e2e/switchover/01-assert.yaml index 904239aae8..d0b1543c89 100644 --- a/testing/kuttl/e2e/switchover/01-assert.yaml +++ b/testing/kuttl/e2e/switchover/01-assert.yaml @@ -17,7 +17,7 @@ kind: Pod metadata: labels: ivory-operator.ivorysql.org/cluster: switchover - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary --- apiVersion: v1 kind: Pod diff --git a/testing/kuttl/e2e/switchover/02-annotate.yaml b/testing/kuttl/e2e/switchover/02-annotate.yaml index 33e0275381..12ea77f93d 100644 --- a/testing/kuttl/e2e/switchover/02-annotate.yaml +++ b/testing/kuttl/e2e/switchover/02-annotate.yaml @@ -6,7 +6,7 @@ commands: # because switchover does not recreate any pods. - script: | kubectl label --namespace="${NAMESPACE}" pods \ - --selector='ivory-operator.ivorysql.org/role=master' \ + --selector='ivory-operator.ivorysql.org/role=primary' \ 'testing/role-before=master' - script: | kubectl label --namespace="${NAMESPACE}" pods \ diff --git a/testing/kuttl/e2e/switchover/03-assert.yaml b/testing/kuttl/e2e/switchover/03-assert.yaml index f0e9914958..9d163fe44c 100644 --- a/testing/kuttl/e2e/switchover/03-assert.yaml +++ b/testing/kuttl/e2e/switchover/03-assert.yaml @@ -7,7 +7,7 @@ metadata: ivory-operator.ivorysql.org/cluster: switchover ivory-operator.ivorysql.org/data: ivory - ivory-operator.ivorysql.org/role: master + ivory-operator.ivorysql.org/role: primary testing/role-before: replica --- From a64f2f2e12fc597fa08a3616f088adba1023b9d7 Mon Sep 17 00:00:00 2001 From: liangxiangyu Date: Tue, 27 May 2025 14:14:50 +0800 Subject: [PATCH 2/2] ivorysql v4 release --- ReleaseNotes.md | 26 ------------------------ ivyo_release_notes.md | 46 ++++++++++++++++++++++++++++++++++++++++++ ivyo_release_notes.txt | 30 --------------------------- 3 files changed, 46 insertions(+), 56 deletions(-) delete mode 100644 ReleaseNotes.md create mode 100644 ivyo_release_notes.md delete mode 100644 ivyo_release_notes.txt diff --git a/ReleaseNotes.md b/ReleaseNotes.md deleted file mode 100644 index 7c794071a1..0000000000 --- a/ReleaseNotes.md +++ /dev/null @@ -1,26 +0,0 @@ -# IvorySQL Operator V4 Release Note - -[**发行日期:2025年06月24日**] - -IvorySQL Operator V4 适配了 IvorySQL 4.5 版本,并升级了系统组件版本和数据库扩展版本,详情如下: - -组件版本: -| 组件名 | 版本 | 描述 | -|---------|---------|---------| -| IvorySQL | 4.5 | 基于PG 17.5兼容Oracle的开源数据库最新版本 IvorySQL | -| pgBackrest | 2.54.1 | PostgreSQL 备份和恢复工具 | -| PgBouncer | 1.23.0 | PostgreSQL 轻量级连接池工具 | -| Patroni | 4.0.4 | PostgreSQL 高可用集群管理工具 | -| pgAdmin4 | 8.14.0 | PostgreSQL 官方图形化管理工具 | -| pgExporter | 0.17.0 | 为 PostgreSQL 提供 Prometheus 监控指标导出的工具 | - -扩展版本: -| 扩展名 | 版本 | 描述 | -|---------|---------|---------| -| PostGIS | 3.4.0 | PostgreSQL 的空间数据库扩展 | -| pgaudit | 17.0 | PostgreSQL 的审计扩展 | -| pg_cron | 1.6.5 | PostgreSQL 定时执行 SQL 语句的扩展 | -| timescaledb | 2.17.2 | PostgreSQL 的时间序列数据库扩展 | -| wal2json | 2.6 | 将 PostgreSQL 的 WAL 日志数据转换为 JSON 格式的扩展 | -| pgnodemx | 1.7 | 收集操作系统级别和实例级别的运行时指标的扩展 | - diff --git a/ivyo_release_notes.md b/ivyo_release_notes.md new file mode 100644 index 0000000000..302526936c --- /dev/null +++ b/ivyo_release_notes.md @@ -0,0 +1,46 @@ +# IvorySQL Operator Release Notes + +## IvorySQL Operator 1.0 +- 实例管理(订阅、连接、重启、关闭、自定义配置、调整CPU mem和磁盘、删除) +- 用户/数据库管理(创建用户、权限控制、修改密码、删除用户、删除数据库) +- 备份恢复(备份、按时间点恢复至新/旧实例) +- 数据库管理工具pgadmin +- 高可用(故障恢复、主备切换) +- 数据库监控 + +## IvorySQL Operator 1.1 +- 实例管理(自定义tls、初始化sql) +- 连接池(添加连接池、连接到连接池、配置TLS) +- 备份恢复(设置自动备份计划和保留策略、备份至云存储、恢复单个数据库、加密备份、Ipv6支持、备用实例) +- 数据库插件支持(Postgis、TimescaleDB、pg_cron、pgAudit、pgBouncer、wal2json) +- 高可用(同步复制、亲和性、Pod拓扑分布约束) +- 其他功能(暂停operator的调协、轮换 TLS 证书) + +## IvorySQL Operator 2.0 +- 数据库版本支持**ivorysql 3.0** +- 组件版本升级 + - pgbackrest 2.47 + - pgadmin4 8.0 + - pgbouncer 1.21 + - pgexporter 0.15 + - postgis 3.4 + - pgaudit 16 + - pg_cron 1.6.2 + - pgnodemx 1.6 + - wal2json 2.5 +## IvorySQL Operator 4.0 +- 数据库版本支持**ivorysql 4.5** +- 组件版本升级 + - pgBackrest 4.5 + - PgBouncer 1.23.0 + - Patroni 4.0.4 + - pgAdmin4 8.14.0 + - pgExporter 0.17.0 +- 插件版本升级 + - PostGIS 3.4.0 + - pgaudit 17.0 + - pg_cron 1.6.5 + - timescaledb 2.17.2 + - wal2json 2.6 + - pgnodemx 1.7 + diff --git a/ivyo_release_notes.txt b/ivyo_release_notes.txt deleted file mode 100644 index 788387002e..0000000000 --- a/ivyo_release_notes.txt +++ /dev/null @@ -1,30 +0,0 @@ -ivyo release notes - -********************ivyo 1.0******************** -1、实例管理(订阅、连接、重启、关闭、自定义配置、调整CPU mem和磁盘、删除) -2、用户/数据库管理(创建用户、权限控制、修改密码、删除用户、删除数据库) -3、备份恢复(备份、按时间点恢复至新/旧实例) -4、数据库管理工具pgadmin -5、高可用(故障恢复、主备切换) -6、数据库监控 - -********************ivyo 1.1******************** -1、实例管理(自定义tls、初始化sql) -2、连接池(添加连接池、连接到连接池、配置TLS) -3、备份恢复(设置自动备份计划和保留策略、备份至云存储、恢复单个数据库、加密备份、Ipv6支持、备用实例) -4、数据库插件支持(Postgis、TimescaleDB、pg_cron、pgAudit、pgBouncer、wal2json) -5、高可用(同步复制、亲和性、Pod拓扑分布约束) -6、其他功能(暂停operator的调谐、轮换 TLS 证书) - -********************ivyo 2.0******************** -1、数据库版本支持ivorysql3.0 -2、其他组件版本升级 - pgbackrest 2.47 - pgadmin4 8.0 - pgbouncer 1.21 - pgexporter 0.15 - postgis 3.4 - pgaudit 16 - pg_cron 1.6.2 - pgnodemx 1.6 - wal2json 2.5 \ No newline at end of file