Skip to content

Commit 4328c11

Browse files
committed
Require At Lead One Repo to be Configured
At least one pgBackRest repository must be defined within a PostgresCluster spec for the proper operation of any/all PostgreSQL clusters created by PGO. This commit therefore updates the validation for the "repos" section of the spec to require that at least one repo always be defined when creating or modifying a PostgresCluster. Issue: [ch12418]
1 parent b284ed4 commit 4328c11

File tree

10 files changed

+633
-510
lines changed

10 files changed

+633
-510
lines changed

config/crd/bases/postgres-operator.crunchydata.com_postgresclusters.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,7 @@ spec:
14221422
required:
14231423
- name
14241424
type: object
1425+
minItems: 1
14251426
type: array
14261427
x-kubernetes-list-map-keys:
14271428
- name
@@ -2219,6 +2220,8 @@ spec:
22192220
- enabled
22202221
- repoName
22212222
type: object
2223+
required:
2224+
- repos
22222225
type: object
22232226
required:
22242227
- pgbackrest

docs/content/references/crd.md

Lines changed: 506 additions & 506 deletions
Large diffs are not rendered by default.

internal/controller/postgrescluster/cluster_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
corev1 "k8s.io/api/core/v1"
3636
v1 "k8s.io/api/core/v1"
3737
rbacv1 "k8s.io/api/rbac/v1"
38+
"k8s.io/apimachinery/pkg/api/resource"
3839
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3940
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
4041
"k8s.io/apimachinery/pkg/labels"
@@ -820,6 +821,19 @@ func TestReconcileClusterPrimaryService(t *testing.T) {
820821
cluster.Name = "pg8"
821822
cluster.Spec.PostgresVersion = 12
822823
cluster.Spec.InstanceSets = []v1beta1.PostgresInstanceSetSpec{{}}
824+
cluster.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{{
825+
Name: "repo1",
826+
Volume: &v1beta1.RepoPVC{
827+
VolumeClaimSpec: v1.PersistentVolumeClaimSpec{
828+
AccessModes: []v1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
829+
Resources: v1.ResourceRequirements{
830+
Requests: corev1.ResourceList{
831+
corev1.ResourceStorage: resource.MustParse("1Gi"),
832+
},
833+
},
834+
},
835+
},
836+
}}
823837

824838
assert.NilError(t, cc.Create(ctx, cluster))
825839

internal/controller/postgrescluster/controller_ref_manager_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
appsv1 "k8s.io/api/apps/v1"
2727
corev1 "k8s.io/api/core/v1"
28+
"k8s.io/apimachinery/pkg/api/resource"
2829
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2930
"k8s.io/apimachinery/pkg/util/rand"
3031
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -69,6 +70,21 @@ func TestManageControllerRefs(t *testing.T) {
6970
Spec: v1beta1.PostgresClusterSpec{
7071
PostgresVersion: 12,
7172
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{Name: "instance1"}},
73+
Backups: v1beta1.Backups{PGBackRest: v1beta1.PGBackRestArchive{
74+
Repos: []v1beta1.PGBackRestRepo{{
75+
Name: "repo1",
76+
Volume: &v1beta1.RepoPVC{
77+
VolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
78+
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
79+
Resources: corev1.ResourceRequirements{
80+
Requests: corev1.ResourceList{
81+
corev1.ResourceStorage: resource.MustParse("1Gi"),
82+
},
83+
},
84+
},
85+
},
86+
}},
87+
}},
7288
},
7389
}
7490

internal/controller/postgrescluster/controller_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ func TestDeleteControlled(t *testing.T) {
6363
instances: [{
6464
name: instance,
6565
}],
66+
backups: {
67+
pgbackrest: {
68+
repos: [{
69+
name: repo1,
70+
}],
71+
},
72+
},
6673
},
6774
}`), cluster))
6875

@@ -190,6 +197,17 @@ spec:
190197
resources:
191198
requests:
192199
storage: 1Gi
200+
backups:
201+
pgbackrest:
202+
repos:
203+
- name: repo1
204+
volume:
205+
volumeClaimSpec:
206+
accessModes:
207+
- "ReadWriteOnce"
208+
resources:
209+
requests:
210+
storage: 1Gi
193211
`)
194212
Expect(reconcile(cluster)).To(BeZero())
195213
})
@@ -348,6 +366,17 @@ spec:
348366
resources:
349367
requests:
350368
storage: 1Gi
369+
backups:
370+
pgbackrest:
371+
repos:
372+
- name: repo1
373+
volume:
374+
volumeClaimSpec:
375+
accessModes:
376+
- "ReadWriteOnce"
377+
resources:
378+
requests:
379+
storage: 1Gi
351380
`)
352381
Expect(reconcile(cluster)).To(BeZero())
353382

internal/controller/postgrescluster/patroni_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
appsv1 "k8s.io/api/apps/v1"
3232
corev1 "k8s.io/api/core/v1"
3333
v1 "k8s.io/api/core/v1"
34+
"k8s.io/apimachinery/pkg/api/resource"
3435
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3536
"k8s.io/apimachinery/pkg/types"
3637
"k8s.io/apimachinery/pkg/util/rand"
@@ -168,6 +169,19 @@ func TestReconcilePatroniLeaderLease(t *testing.T) {
168169
cluster.Name = "pg2"
169170
cluster.Spec.PostgresVersion = 12
170171
cluster.Spec.InstanceSets = []v1beta1.PostgresInstanceSetSpec{{}}
172+
cluster.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{{
173+
Name: "repo1",
174+
Volume: &v1beta1.RepoPVC{
175+
VolumeClaimSpec: v1.PersistentVolumeClaimSpec{
176+
AccessModes: []v1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
177+
Resources: v1.ResourceRequirements{
178+
Requests: corev1.ResourceList{
179+
corev1.ResourceStorage: resource.MustParse("1Gi"),
180+
},
181+
},
182+
},
183+
},
184+
}}
171185

172186
assert.NilError(t, cc.Create(ctx, cluster))
173187

internal/controller/postgrescluster/pgbouncer_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"gotest.tools/v3/assert"
2525
corev1 "k8s.io/api/core/v1"
26+
"k8s.io/apimachinery/pkg/api/resource"
2627
"sigs.k8s.io/controller-runtime/pkg/client"
2728

2829
"github.com/crunchydata/postgres-operator/internal/initialize"
@@ -185,6 +186,19 @@ func TestReconcilePGBouncerService(t *testing.T) {
185186
cluster.Name = "pg2"
186187
cluster.Spec.PostgresVersion = 12
187188
cluster.Spec.InstanceSets = []v1beta1.PostgresInstanceSetSpec{{}}
189+
cluster.Spec.Backups.PGBackRest.Repos = []v1beta1.PGBackRestRepo{{
190+
Name: "repo1",
191+
Volume: &v1beta1.RepoPVC{
192+
VolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
193+
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
194+
Resources: corev1.ResourceRequirements{
195+
Requests: corev1.ResourceList{
196+
corev1.ResourceStorage: resource.MustParse("1Gi"),
197+
},
198+
},
199+
},
200+
},
201+
}}
188202

189203
assert.NilError(t, cc.Create(ctx, cluster))
190204

internal/controller/postgrescluster/pki_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
"github.com/pkg/errors"
3030
apierrors "k8s.io/apimachinery/pkg/api/errors"
31+
"k8s.io/apimachinery/pkg/api/resource"
3132
"k8s.io/apimachinery/pkg/util/wait"
3233

3334
"gotest.tools/v3/assert"
@@ -80,6 +81,21 @@ func TestReconcileCerts(t *testing.T) {
8081
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{
8182
Name: "instance",
8283
}},
84+
Backups: v1beta1.Backups{PGBackRest: v1beta1.PGBackRestArchive{
85+
Repos: []v1beta1.PGBackRestRepo{{
86+
Name: "repo1",
87+
Volume: &v1beta1.RepoPVC{
88+
VolumeClaimSpec: v1.PersistentVolumeClaimSpec{
89+
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
90+
Resources: v1.ResourceRequirements{
91+
Requests: v1.ResourceList{
92+
v1.ResourceStorage: resource.MustParse("1Gi"),
93+
},
94+
},
95+
},
96+
},
97+
}},
98+
}},
8399
},
84100
}
85101
cluster1.SetGroupVersionKind(v1.SchemeGroupVersion.WithKind("postgrescluster"))
@@ -100,6 +116,21 @@ func TestReconcileCerts(t *testing.T) {
100116
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{
101117
Name: "instance",
102118
}},
119+
Backups: v1beta1.Backups{PGBackRest: v1beta1.PGBackRestArchive{
120+
Repos: []v1beta1.PGBackRestRepo{{
121+
Name: "repo1",
122+
Volume: &v1beta1.RepoPVC{
123+
VolumeClaimSpec: v1.PersistentVolumeClaimSpec{
124+
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
125+
Resources: v1.ResourceRequirements{
126+
Requests: v1.ResourceList{
127+
v1.ResourceStorage: resource.MustParse("1Gi"),
128+
},
129+
},
130+
},
131+
},
132+
}},
133+
}},
103134
},
104135
}
105136
cluster2.SetGroupVersionKind(v1.SchemeGroupVersion.WithKind("postgrescluster"))

pkg/apis/postgres-operator.crunchydata.com/v1beta1/pgbackrest_types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ type PGBackRestArchive struct {
121121
Image string `json:"image,omitempty"`
122122

123123
// Defines a pgBackRest repository
124-
// +kubebuilder:validation:Required
124+
// +kubebuilder:validation:MinItems=1
125125
// +listType=map
126126
// +listMapKey=name
127-
Repos []PGBackRestRepo `json:"repos,omitempty"`
127+
Repos []PGBackRestRepo `json:"repos"`
128128

129129
// Defines configuration for a pgBackRest dedicated repository host. This section is only
130130
// applicable if at least one "volume" (i.e. PVC-based) repository is defined in the "repos"

pkg/apis/postgres-operator.crunchydata.com/v1beta1/postgrescluster_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ metadata:
5151
creationTimestamp: null
5252
spec:
5353
backups:
54-
pgbackrest: {}
54+
pgbackrest:
55+
repos: null
5556
instances: null
5657
patroni:
5758
dynamicConfiguration: null
@@ -81,7 +82,8 @@ metadata:
8182
creationTimestamp: null
8283
spec:
8384
backups:
84-
pgbackrest: {}
85+
pgbackrest:
86+
repos: null
8587
instances:
8688
- dataVolumeClaimSpec:
8789
resources: {}

0 commit comments

Comments
 (0)