diff --git a/build/crd/percona/generated/pgv2.percona.com_perconapgclusters.yaml b/build/crd/percona/generated/pgv2.percona.com_perconapgclusters.yaml index c6207c514..146702e4e 100644 --- a/build/crd/percona/generated/pgv2.percona.com_perconapgclusters.yaml +++ b/build/crd/percona/generated/pgv2.percona.com_perconapgclusters.yaml @@ -7083,8 +7083,6 @@ spec: type: object type: object type: object - required: - - repos type: object trackLatestRestorableTime: description: Enable tracking latest restorable time @@ -7093,8 +7091,8 @@ spec: x-kubernetes-validations: - message: At least one repository must be configured when backups are enabled - rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos) - > 0 + rule: (has(self.enabled) && self.enabled == false) || (has(self.pgbackrest.repos) + && size(self.pgbackrest.repos) > 0) crVersion: description: |- Version of the operator. Update this to new version after operator diff --git a/config/crd/bases/pgv2.percona.com_perconapgclusters.yaml b/config/crd/bases/pgv2.percona.com_perconapgclusters.yaml index 1dc1ef246..7f460f98e 100644 --- a/config/crd/bases/pgv2.percona.com_perconapgclusters.yaml +++ b/config/crd/bases/pgv2.percona.com_perconapgclusters.yaml @@ -7488,8 +7488,6 @@ spec: type: object type: object type: object - required: - - repos type: object trackLatestRestorableTime: description: Enable tracking latest restorable time @@ -7498,8 +7496,8 @@ spec: x-kubernetes-validations: - message: At least one repository must be configured when backups are enabled - rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos) - > 0 + rule: (has(self.enabled) && self.enabled == false) || (has(self.pgbackrest.repos) + && size(self.pgbackrest.repos) > 0) crVersion: description: |- Version of the operator. Update this to new version after operator diff --git a/deploy/bundle.yaml b/deploy/bundle.yaml index 2f326a7c7..31d068ee5 100644 --- a/deploy/bundle.yaml +++ b/deploy/bundle.yaml @@ -7785,8 +7785,6 @@ spec: type: object type: object type: object - required: - - repos type: object trackLatestRestorableTime: description: Enable tracking latest restorable time @@ -7795,8 +7793,8 @@ spec: x-kubernetes-validations: - message: At least one repository must be configured when backups are enabled - rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos) - > 0 + rule: (has(self.enabled) && self.enabled == false) || (has(self.pgbackrest.repos) + && size(self.pgbackrest.repos) > 0) crVersion: description: |- Version of the operator. Update this to new version after operator diff --git a/deploy/crd.yaml b/deploy/crd.yaml index 2e75d79bb..b60abde03 100644 --- a/deploy/crd.yaml +++ b/deploy/crd.yaml @@ -7785,8 +7785,6 @@ spec: type: object type: object type: object - required: - - repos type: object trackLatestRestorableTime: description: Enable tracking latest restorable time @@ -7795,8 +7793,8 @@ spec: x-kubernetes-validations: - message: At least one repository must be configured when backups are enabled - rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos) - > 0 + rule: (has(self.enabled) && self.enabled == false) || (has(self.pgbackrest.repos) + && size(self.pgbackrest.repos) > 0) crVersion: description: |- Version of the operator. Update this to new version after operator diff --git a/deploy/cw-bundle.yaml b/deploy/cw-bundle.yaml index 19bf06c04..55dc50b8c 100644 --- a/deploy/cw-bundle.yaml +++ b/deploy/cw-bundle.yaml @@ -7785,8 +7785,6 @@ spec: type: object type: object type: object - required: - - repos type: object trackLatestRestorableTime: description: Enable tracking latest restorable time @@ -7795,8 +7793,8 @@ spec: x-kubernetes-validations: - message: At least one repository must be configured when backups are enabled - rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos) - > 0 + rule: (has(self.enabled) && self.enabled == false) || (has(self.pgbackrest.repos) + && size(self.pgbackrest.repos) > 0) crVersion: description: |- Version of the operator. Update this to new version after operator diff --git a/percona/controller/pgcluster/controller_test.go b/percona/controller/pgcluster/controller_test.go index 548ef3a0c..cda9cd1ab 100644 --- a/percona/controller/pgcluster/controller_test.go +++ b/percona/controller/pgcluster/controller_test.go @@ -2401,11 +2401,21 @@ var _ = Describe("CR Validations", Ordered, func() { Expect(k8sClient.Create(ctx, cr)).Should(Succeed()) }) + + It("should accept backups disabled with repositories not existing (nil)", func() { + cr, err := readDefaultCR("cr-validation-backup-5", ns) + Expect(err).NotTo(HaveOccurred()) + + cr.Spec.Backups.Enabled = &f + cr.Spec.Backups.PGBackRest.Repos = nil + + Expect(k8sClient.Create(ctx, cr)).Should(Succeed()) + }) }) When("creating a CR with invalid backup configurations", func() { It("should reject backups enabled with no repositories", func() { - cr, err := readDefaultCR("cr-validation-backup-5", ns) + cr, err := readDefaultCR("cr-validation-backup-1", ns) Expect(err).NotTo(HaveOccurred()) cr.Spec.Backups.Enabled = &t @@ -2418,8 +2428,22 @@ var _ = Describe("CR Validations", Ordered, func() { )) }) + It("should reject backups enabled with no repositories (nil)", func() { + cr, err := readDefaultCR("cr-validation-backup-2", ns) + Expect(err).NotTo(HaveOccurred()) + + cr.Spec.Backups.Enabled = &t + cr.Spec.Backups.PGBackRest.Repos = nil + + err = k8sClient.Create(ctx, cr) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring( + "At least one repository must be configured when backups are enabled", + )) + }) + It("should reject backups enabled (nil - default true) with no repositories", func() { - cr, err := readDefaultCR("cr-validation-backup-6", ns) + cr, err := readDefaultCR("cr-validation-backup-3", ns) Expect(err).NotTo(HaveOccurred()) cr.Spec.Backups.Enabled = nil // defaults to enabled diff --git a/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go b/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go index ffa75d94e..df12c0790 100644 --- a/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go +++ b/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go @@ -477,7 +477,7 @@ type Patroni struct { } // Backups struct. -// +kubebuilder:validation:XValidation:rule="(has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos) > 0",message="At least one repository must be configured when backups are enabled" +// +kubebuilder:validation:XValidation:rule="(has(self.enabled) && self.enabled == false) || (has(self.pgbackrest.repos) && size(self.pgbackrest.repos) > 0)",message="At least one repository must be configured when backups are enabled" type Backups struct { Enabled *bool `json:"enabled,omitempty"` @@ -566,6 +566,7 @@ type PGBackRestArchive struct { // Defines a pgBackRest repository // +listType=map // +listMapKey=name + // +optional Repos []crunchyv1beta1.PGBackRestRepo `json:"repos"` // Defines configuration for a pgBackRest dedicated repository host. This section is only