Skip to content

Commit 5a522a3

Browse files
authored
Merge pull request #1327 from percona/K8SPG-869
K8SPG-869 minimum repos should be required only when backups are enabled
2 parents 0a61f74 + 51a6d6d commit 5a522a3

File tree

7 files changed

+107
-6
lines changed

7 files changed

+107
-6
lines changed

build/crd/percona/generated/pgv2.percona.com_perconapgclusters.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5870,7 +5870,6 @@ spec:
58705870
required:
58715871
- name
58725872
type: object
5873-
minItems: 1
58745873
type: array
58755874
x-kubernetes-list-map-keys:
58765875
- name
@@ -7091,6 +7090,11 @@ spec:
70917090
description: Enable tracking latest restorable time
70927091
type: boolean
70937092
type: object
7093+
x-kubernetes-validations:
7094+
- message: At least one repository must be configured when backups
7095+
are enabled
7096+
rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos)
7097+
> 0
70947098
crVersion:
70957099
description: |-
70967100
Version of the operator. Update this to new version after operator

config/crd/bases/pgv2.percona.com_perconapgclusters.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6275,7 +6275,6 @@ spec:
62756275
required:
62766276
- name
62776277
type: object
6278-
minItems: 1
62796278
type: array
62806279
x-kubernetes-list-map-keys:
62816280
- name
@@ -7496,6 +7495,11 @@ spec:
74967495
description: Enable tracking latest restorable time
74977496
type: boolean
74987497
type: object
7498+
x-kubernetes-validations:
7499+
- message: At least one repository must be configured when backups
7500+
are enabled
7501+
rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos)
7502+
> 0
74997503
crVersion:
75007504
description: |-
75017505
Version of the operator. Update this to new version after operator

deploy/bundle.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6572,7 +6572,6 @@ spec:
65726572
required:
65736573
- name
65746574
type: object
6575-
minItems: 1
65766575
type: array
65776576
x-kubernetes-list-map-keys:
65786577
- name
@@ -7793,6 +7792,11 @@ spec:
77937792
description: Enable tracking latest restorable time
77947793
type: boolean
77957794
type: object
7795+
x-kubernetes-validations:
7796+
- message: At least one repository must be configured when backups
7797+
are enabled
7798+
rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos)
7799+
> 0
77967800
crVersion:
77977801
description: |-
77987802
Version of the operator. Update this to new version after operator

deploy/crd.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6572,7 +6572,6 @@ spec:
65726572
required:
65736573
- name
65746574
type: object
6575-
minItems: 1
65766575
type: array
65776576
x-kubernetes-list-map-keys:
65786577
- name
@@ -7793,6 +7792,11 @@ spec:
77937792
description: Enable tracking latest restorable time
77947793
type: boolean
77957794
type: object
7795+
x-kubernetes-validations:
7796+
- message: At least one repository must be configured when backups
7797+
are enabled
7798+
rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos)
7799+
> 0
77967800
crVersion:
77977801
description: |-
77987802
Version of the operator. Update this to new version after operator

deploy/cw-bundle.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6572,7 +6572,6 @@ spec:
65726572
required:
65736573
- name
65746574
type: object
6575-
minItems: 1
65766575
type: array
65776576
x-kubernetes-list-map-keys:
65786577
- name
@@ -7793,6 +7792,11 @@ spec:
77937792
description: Enable tracking latest restorable time
77947793
type: boolean
77957794
type: object
7795+
x-kubernetes-validations:
7796+
- message: At least one repository must be configured when backups
7797+
are enabled
7798+
rule: (has(self.enabled) && self.enabled == false) || size(self.pgbackrest.repos)
7799+
> 0
77967800
crVersion:
77977801
description: |-
77987802
Version of the operator. Update this to new version after operator

percona/controller/pgcluster/controller_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2353,6 +2353,86 @@ var _ = Describe("CR Validations", Ordered, func() {
23532353
})
23542354
})
23552355
})
2356+
2357+
Context("Backup repository validations", Ordered, func() {
2358+
When("creating a CR with valid backup configurations", func() {
2359+
It("should accept backups disabled with no repositories", func() {
2360+
cr, err := readDefaultCR("cr-validation-backup-1", ns)
2361+
Expect(err).NotTo(HaveOccurred())
2362+
2363+
cr.Spec.Backups.Enabled = &f
2364+
cr.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{}
2365+
2366+
Expect(k8sClient.Create(ctx, cr)).Should(Succeed())
2367+
})
2368+
2369+
It("should accept backups enabled with at least one repository", func() {
2370+
cr, err := readDefaultCR("cr-validation-backup-2", ns)
2371+
Expect(err).NotTo(HaveOccurred())
2372+
2373+
cr.Spec.Backups.Enabled = &t
2374+
cr.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{
2375+
{Name: "repo1"},
2376+
}
2377+
2378+
Expect(k8sClient.Create(ctx, cr)).Should(Succeed())
2379+
})
2380+
2381+
It("should accept backups disabled with at least one repository", func() {
2382+
cr, err := readDefaultCR("cr-validation-backup-3", ns)
2383+
Expect(err).NotTo(HaveOccurred())
2384+
2385+
cr.Spec.Backups.Enabled = &f
2386+
cr.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{
2387+
{Name: "repo1"},
2388+
}
2389+
2390+
Expect(k8sClient.Create(ctx, cr)).Should(Succeed())
2391+
})
2392+
2393+
It("should accept backups enabled (nil - default true) with repositories", func() {
2394+
cr, err := readDefaultCR("cr-validation-backup-4", ns)
2395+
Expect(err).NotTo(HaveOccurred())
2396+
2397+
cr.Spec.Backups.Enabled = nil // defaults to enabled
2398+
cr.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{
2399+
{Name: "repo1"},
2400+
}
2401+
2402+
Expect(k8sClient.Create(ctx, cr)).Should(Succeed())
2403+
})
2404+
})
2405+
2406+
When("creating a CR with invalid backup configurations", func() {
2407+
It("should reject backups enabled with no repositories", func() {
2408+
cr, err := readDefaultCR("cr-validation-backup-5", ns)
2409+
Expect(err).NotTo(HaveOccurred())
2410+
2411+
cr.Spec.Backups.Enabled = &t
2412+
cr.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{}
2413+
2414+
err = k8sClient.Create(ctx, cr)
2415+
Expect(err).To(HaveOccurred())
2416+
Expect(err.Error()).To(ContainSubstring(
2417+
"At least one repository must be configured when backups are enabled",
2418+
))
2419+
})
2420+
2421+
It("should reject backups enabled (nil - default true) with no repositories", func() {
2422+
cr, err := readDefaultCR("cr-validation-backup-6", ns)
2423+
Expect(err).NotTo(HaveOccurred())
2424+
2425+
cr.Spec.Backups.Enabled = nil // defaults to enabled
2426+
cr.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{}
2427+
2428+
err = k8sClient.Create(ctx, cr)
2429+
Expect(err).To(HaveOccurred())
2430+
Expect(err.Error()).To(ContainSubstring(
2431+
"At least one repository must be configured when backups are enabled",
2432+
))
2433+
})
2434+
})
2435+
})
23562436
})
23572437

23582438
var _ = Describe("Init Container", Ordered, func() {

pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ type Patroni struct {
476476
Version string `json:"version"`
477477
}
478478

479+
// Backups struct.
480+
// +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"
479481
type Backups struct {
480482
Enabled *bool `json:"enabled,omitempty"`
481483

@@ -562,7 +564,6 @@ type PGBackRestArchive struct {
562564
Jobs *crunchyv1beta1.BackupJobs `json:"jobs,omitempty"`
563565

564566
// Defines a pgBackRest repository
565-
// +kubebuilder:validation:MinItems=1
566567
// +listType=map
567568
// +listMapKey=name
568569
Repos []crunchyv1beta1.PGBackRestRepo `json:"repos"`

0 commit comments

Comments
 (0)