Skip to content

Commit 39d291d

Browse files
committed
Define a struct to share validation rules for PVC specs
This adds some validation to the PGAdmin data volume spec. Tests show we can simplify these validation rules, which may help keep estimated validation costs low.
1 parent f7b18d4 commit 39d291d

33 files changed

+316
-249
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,6 +1560,12 @@ spec:
15601560
backing this claim.
15611561
type: string
15621562
type: object
1563+
x-kubernetes-map-type: atomic
1564+
x-kubernetes-validations:
1565+
- message: missing accessModes
1566+
rule: 0 < size(self.accessModes)
1567+
- message: missing storage request
1568+
rule: has(self.resources.requests.storage)
15631569
image:
15641570
description: The image name to use for pgAdmin instance.
15651571
type: string

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

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3197,13 +3197,12 @@ spec:
31973197
to the PersistentVolume backing this claim.
31983198
type: string
31993199
type: object
3200+
x-kubernetes-map-type: atomic
32003201
x-kubernetes-validations:
32013202
- message: missing accessModes
3202-
rule: has(self.accessModes) && size(self.accessModes)
3203-
> 0
3203+
rule: 0 < size(self.accessModes)
32043204
- message: missing storage request
3205-
rule: has(self.resources) && has(self.resources.requests)
3206-
&& has(self.resources.requests.storage)
3205+
rule: has(self.resources.requests.storage)
32073206
required:
32083207
- volumeClaimSpec
32093208
type: object
@@ -6524,13 +6523,12 @@ spec:
65246523
to the PersistentVolume backing this claim.
65256524
type: string
65266525
type: object
6526+
x-kubernetes-map-type: atomic
65276527
x-kubernetes-validations:
65286528
- message: missing accessModes
6529-
rule: has(self.accessModes) && size(self.accessModes)
6530-
> 0
6529+
rule: 0 < size(self.accessModes)
65316530
- message: missing storage request
6532-
rule: has(self.resources) && has(self.resources.requests)
6533-
&& has(self.resources.requests.storage)
6531+
rule: has(self.resources.requests.storage)
65346532
required:
65356533
- volumeClaimSpec
65366534
type: object
@@ -10412,12 +10410,12 @@ spec:
1041210410
PersistentVolume backing this claim.
1041310411
type: string
1041410412
type: object
10413+
x-kubernetes-map-type: atomic
1041510414
x-kubernetes-validations:
1041610415
- message: missing accessModes
10417-
rule: has(self.accessModes) && size(self.accessModes) > 0
10416+
rule: 0 < size(self.accessModes)
1041810417
- message: missing storage request
10419-
rule: has(self.resources) && has(self.resources.requests)
10420-
&& has(self.resources.requests.storage)
10418+
rule: has(self.resources.requests.storage)
1042110419
metadata:
1042210420
description: Metadata contains metadata for custom resources
1042310421
properties:
@@ -10797,13 +10795,12 @@ spec:
1079710795
the PersistentVolume backing this claim.
1079810796
type: string
1079910797
type: object
10798+
x-kubernetes-map-type: atomic
1080010799
x-kubernetes-validations:
1080110800
- message: missing accessModes
10802-
rule: has(self.accessModes) && size(self.accessModes)
10803-
> 0
10801+
rule: 0 < size(self.accessModes)
1080410802
- message: missing storage request
10805-
rule: has(self.resources) && has(self.resources.requests)
10806-
&& has(self.resources.requests.storage)
10803+
rule: has(self.resources.requests.storage)
1080710804
name:
1080810805
description: |-
1080910806
The name for the tablespace, used as the path name for the volume.
@@ -11238,12 +11235,12 @@ spec:
1123811235
PersistentVolume backing this claim.
1123911236
type: string
1124011237
type: object
11238+
x-kubernetes-map-type: atomic
1124111239
x-kubernetes-validations:
1124211240
- message: missing accessModes
11243-
rule: has(self.accessModes) && size(self.accessModes) > 0
11241+
rule: 0 < size(self.accessModes)
1124411242
- message: missing storage request
11245-
rule: has(self.resources) && has(self.resources.requests)
11246-
&& has(self.resources.requests.storage)
11243+
rule: has(self.resources.requests.storage)
1124711244
required:
1124811245
- dataVolumeClaimSpec
1124911246
type: object
@@ -17328,6 +17325,12 @@ spec:
1732817325
PersistentVolume backing this claim.
1732917326
type: string
1733017327
type: object
17328+
x-kubernetes-map-type: atomic
17329+
x-kubernetes-validations:
17330+
- message: missing accessModes
17331+
rule: 0 < size(self.accessModes)
17332+
- message: missing storage request
17333+
rule: has(self.resources.requests.storage)
1733117334
image:
1733217335
description: |-
1733317336
Name of a container image that can run pgAdmin 4. Changing this value causes

internal/controller/postgrescluster/helpers_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ func setupNamespace(t testing.TB, cc client.Client) *corev1.Namespace {
9090
return require.Namespace(t, cc)
9191
}
9292

93-
func testVolumeClaimSpec() corev1.PersistentVolumeClaimSpec {
93+
func testVolumeClaimSpec() v1beta1.VolumeClaimSpec {
9494
// Defines a volume claim spec that can be used to create instances
95-
return corev1.PersistentVolumeClaimSpec{
95+
return v1beta1.VolumeClaimSpec{
9696
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
9797
Resources: corev1.VolumeResourceRequirements{
9898
Requests: map[corev1.ResourceName]resource.Quantity{

internal/controller/postgrescluster/instance_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ func TestStoreDesiredRequest(t *testing.T) {
280280
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{
281281
Name: "red",
282282
Replicas: initialize.Int32(1),
283-
DataVolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
283+
DataVolumeClaimSpec: v1beta1.VolumeClaimSpec{
284284
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
285285
Resources: corev1.VolumeResourceRequirements{
286286
Limits: map[corev1.ResourceName]resource.Quantity{
@@ -1850,7 +1850,7 @@ func TestFindAvailableInstanceNames(t *testing.T) {
18501850
expectedInstanceNames: []string{"instance1-def"},
18511851
}, {
18521852
set: v1beta1.PostgresInstanceSetSpec{Name: "instance1",
1853-
WALVolumeClaimSpec: &corev1.PersistentVolumeClaimSpec{}},
1853+
WALVolumeClaimSpec: &v1beta1.VolumeClaimSpec{}},
18541854
fakeObservedInstances: newObservedInstances(
18551855
&v1beta1.PostgresCluster{Spec: v1beta1.PostgresClusterSpec{
18561856
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{Name: "instance1"}},
@@ -1877,7 +1877,7 @@ func TestFindAvailableInstanceNames(t *testing.T) {
18771877
expectedInstanceNames: []string{},
18781878
}, {
18791879
set: v1beta1.PostgresInstanceSetSpec{Name: "instance1",
1880-
WALVolumeClaimSpec: &corev1.PersistentVolumeClaimSpec{}},
1880+
WALVolumeClaimSpec: &v1beta1.VolumeClaimSpec{}},
18811881
fakeObservedInstances: newObservedInstances(
18821882
&v1beta1.PostgresCluster{Spec: v1beta1.PostgresClusterSpec{
18831883
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{Name: "instance1"}},
@@ -1901,7 +1901,7 @@ func TestFindAvailableInstanceNames(t *testing.T) {
19011901
expectedInstanceNames: []string{"instance1-def"},
19021902
}, {
19031903
set: v1beta1.PostgresInstanceSetSpec{Name: "instance1",
1904-
WALVolumeClaimSpec: &corev1.PersistentVolumeClaimSpec{}},
1904+
WALVolumeClaimSpec: &v1beta1.VolumeClaimSpec{}},
19051905
fakeObservedInstances: newObservedInstances(
19061906
&v1beta1.PostgresCluster{Spec: v1beta1.PostgresClusterSpec{
19071907
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{Name: "instance1"}},

internal/controller/postgrescluster/pgadmin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ func (r *Reconciler) reconcilePGAdminDataVolume(
405405
cluster.Spec.Metadata.GetLabelsOrNil(),
406406
labelMap,
407407
)
408-
pvc.Spec = cluster.Spec.UserInterface.PGAdmin.DataVolumeClaimSpec
408+
pvc.Spec = cluster.Spec.UserInterface.PGAdmin.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
409409

410410
err := errors.WithStack(r.setControllerReference(cluster, pvc))
411411

internal/controller/postgrescluster/pgadmin_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ func pgAdminTestCluster(ns corev1.Namespace) *v1beta1.PostgresCluster {
853853
Repos: []v1beta1.PGBackRestRepo{{
854854
Name: "repo1",
855855
Volume: &v1beta1.RepoPVC{
856-
VolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
856+
VolumeClaimSpec: v1beta1.VolumeClaimSpec{
857857
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
858858
Resources: corev1.VolumeResourceRequirements{
859859
Requests: corev1.ResourceList{
@@ -868,7 +868,7 @@ func pgAdminTestCluster(ns corev1.Namespace) *v1beta1.PostgresCluster {
868868
UserInterface: &v1beta1.UserInterfaceSpec{
869869
PGAdmin: &v1beta1.PGAdminPodSpec{
870870
Image: "test-image",
871-
DataVolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
871+
DataVolumeClaimSpec: v1beta1.VolumeClaimSpec{
872872
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
873873
Resources: corev1.VolumeResourceRequirements{
874874
Requests: corev1.ResourceList{

internal/controller/postgrescluster/pgbackrest.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2628,7 +2628,8 @@ func (r *Reconciler) reconcileRepos(ctx context.Context,
26282628
if repo.Volume == nil {
26292629
continue
26302630
}
2631-
repo, err := r.applyRepoVolumeIntent(ctx, postgresCluster, repo.Volume.VolumeClaimSpec,
2631+
repo, err := r.applyRepoVolumeIntent(ctx, postgresCluster,
2632+
repo.Volume.VolumeClaimSpec.AsPersistentVolumeClaimSpec(),
26322633
repo.Name, repoResources)
26332634
if err != nil {
26342635
log.Error(err, errMsg)

internal/controller/postgrescluster/pgbackrest_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func fakePostgresCluster(clusterName, namespace, clusterUID string,
6464
Image: "example.com/crunchy-postgres-ha:test",
6565
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{
6666
Name: "instance1",
67-
DataVolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
67+
DataVolumeClaimSpec: v1beta1.VolumeClaimSpec{
6868
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany},
6969
Resources: corev1.VolumeResourceRequirements{
7070
Requests: corev1.ResourceList{
@@ -115,7 +115,7 @@ func fakePostgresCluster(clusterName, namespace, clusterUID string,
115115
postgresCluster.Spec.Backups.PGBackRest.Repos[0] = v1beta1.PGBackRestRepo{
116116
Name: "repo1",
117117
Volume: &v1beta1.RepoPVC{
118-
VolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
118+
VolumeClaimSpec: v1beta1.VolumeClaimSpec{
119119
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany},
120120
Resources: corev1.VolumeResourceRequirements{
121121
Requests: map[corev1.ResourceName]resource.Quantity{
@@ -2268,7 +2268,7 @@ func TestCopyConfigurationResources(t *testing.T) {
22682268
Image: "example.com/crunchy-postgres-ha:test",
22692269
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{
22702270
Name: "instance1",
2271-
DataVolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
2271+
DataVolumeClaimSpec: v1beta1.VolumeClaimSpec{
22722272
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany},
22732273
Resources: corev1.VolumeResourceRequirements{
22742274
Requests: corev1.ResourceList{
@@ -2320,7 +2320,7 @@ func TestCopyConfigurationResources(t *testing.T) {
23202320
},
23212321
InstanceSets: []v1beta1.PostgresInstanceSetSpec{{
23222322
Name: "instance1",
2323-
DataVolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
2323+
DataVolumeClaimSpec: v1beta1.VolumeClaimSpec{
23242324
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany},
23252325
Resources: corev1.VolumeResourceRequirements{
23262326
Requests: corev1.ResourceList{

internal/controller/postgrescluster/postgres.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ func (r *Reconciler) reconcilePostgresDataVolume(
747747
labelMap,
748748
)
749749

750-
pvc.Spec = instanceSpec.DataVolumeClaimSpec
750+
pvc.Spec = instanceSpec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
751751

752752
// If a source cluster was provided and VolumeSnapshots are turned on in the source cluster and
753753
// there is a VolumeSnapshot available for the source cluster that is ReadyToUse, use it as the
@@ -910,7 +910,7 @@ func (r *Reconciler) reconcileTablespaceVolumes(
910910
labelMap,
911911
)
912912

913-
pvc.Spec = vol.DataVolumeClaimSpec
913+
pvc.Spec = vol.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
914914

915915
if err == nil {
916916
err = r.handlePersistentVolumeClaimError(cluster,
@@ -1017,7 +1017,7 @@ func (r *Reconciler) reconcilePostgresWALVolume(
10171017
labelMap,
10181018
)
10191019

1020-
pvc.Spec = *instanceSpec.WALVolumeClaimSpec
1020+
pvc.Spec = instanceSpec.WALVolumeClaimSpec.AsPersistentVolumeClaimSpec()
10211021

10221022
if err == nil {
10231023
err = r.handlePersistentVolumeClaimError(cluster,

internal/controller/postgrescluster/postgres_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@ func TestSetVolumeSize(t *testing.T) {
883883
instanceSetSpec := func(request, limit string) *v1beta1.PostgresInstanceSetSpec {
884884
return &v1beta1.PostgresInstanceSetSpec{
885885
Name: "some-instance",
886-
DataVolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
886+
DataVolumeClaimSpec: v1beta1.VolumeClaimSpec{
887887
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
888888
Resources: corev1.VolumeResourceRequirements{
889889
Requests: map[corev1.ResourceName]resource.Quantity{
@@ -911,7 +911,7 @@ func TestSetVolumeSize(t *testing.T) {
911911

912912
pvc := &corev1.PersistentVolumeClaim{ObjectMeta: naming.InstancePostgresDataVolume(instance)}
913913
spec := instanceSetSpec("4Gi", "3Gi")
914-
pvc.Spec = spec.DataVolumeClaimSpec
914+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
915915

916916
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
917917

@@ -948,7 +948,7 @@ resources:
948948
}},
949949
}
950950

951-
pvc.Spec = spec.DataVolumeClaimSpec
951+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
952952

953953
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
954954

@@ -984,14 +984,14 @@ resources:
984984
pvc := &corev1.PersistentVolumeClaim{ObjectMeta: naming.InstancePostgresDataVolume(instance)}
985985
spec := &v1beta1.PostgresInstanceSetSpec{
986986
Name: "some-instance",
987-
DataVolumeClaimSpec: corev1.PersistentVolumeClaimSpec{
987+
DataVolumeClaimSpec: v1beta1.VolumeClaimSpec{
988988
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
989989
Resources: corev1.VolumeResourceRequirements{
990990
Requests: map[corev1.ResourceName]resource.Quantity{
991991
corev1.ResourceStorage: resource.MustParse("1Gi"),
992992
}}}}
993993
cluster.Status = desiredStatus("2Gi")
994-
pvc.Spec = spec.DataVolumeClaimSpec
994+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
995995

996996
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
997997

@@ -1016,7 +1016,7 @@ resources:
10161016

10171017
pvc := &corev1.PersistentVolumeClaim{ObjectMeta: naming.InstancePostgresDataVolume(instance)}
10181018
spec := instanceSetSpec("1Gi", "2Gi")
1019-
pvc.Spec = spec.DataVolumeClaimSpec
1019+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
10201020

10211021
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
10221022

@@ -1041,7 +1041,7 @@ resources:
10411041
pvc := &corev1.PersistentVolumeClaim{ObjectMeta: naming.InstancePostgresDataVolume(instance)}
10421042
spec := instanceSetSpec("1Gi", "3Gi")
10431043
cluster.Status = desiredStatus("NotAValidValue")
1044-
pvc.Spec = spec.DataVolumeClaimSpec
1044+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
10451045

10461046
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
10471047

@@ -1068,7 +1068,7 @@ resources:
10681068
pvc := &corev1.PersistentVolumeClaim{ObjectMeta: naming.InstancePostgresDataVolume(instance)}
10691069
spec := instanceSetSpec("1Gi", "3Gi")
10701070
cluster.Status = desiredStatus("2Gi")
1071-
pvc.Spec = spec.DataVolumeClaimSpec
1071+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
10721072

10731073
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
10741074

@@ -1093,7 +1093,7 @@ resources:
10931093
pvc := &corev1.PersistentVolumeClaim{ObjectMeta: naming.InstancePostgresDataVolume(instance)}
10941094
spec := instanceSetSpec("1Gi", "2Gi")
10951095
cluster.Status = desiredStatus("2Gi")
1096-
pvc.Spec = spec.DataVolumeClaimSpec
1096+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
10971097

10981098
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
10991099

@@ -1122,7 +1122,7 @@ resources:
11221122
pvc := &corev1.PersistentVolumeClaim{ObjectMeta: naming.InstancePostgresDataVolume(instance)}
11231123
spec := instanceSetSpec("4Gi", "5Gi")
11241124
cluster.Status = desiredStatus("10Gi")
1125-
pvc.Spec = spec.DataVolumeClaimSpec
1125+
pvc.Spec = spec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
11261126

11271127
reconciler.setVolumeSize(ctx, &cluster, pvc, spec.Name)
11281128

internal/controller/postgrescluster/snapshots.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ func (r *Reconciler) createDedicatedSnapshotVolume(ctx context.Context,
313313
return pvc, err
314314
}
315315

316-
pvc.Spec = instanceSpec.DataVolumeClaimSpec
316+
pvc.Spec = instanceSpec.DataVolumeClaimSpec.AsPersistentVolumeClaimSpec()
317317

318318
// Set the snapshot volume to the same size as the pgdata volume. The size should scale with auto-grow.
319319
r.setVolumeSize(ctx, cluster, pvc, instanceSpec.Name)

internal/controller/postgrescluster/snapshots_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,9 @@ func TestReconcileDedicatedSnapshotVolume(t *testing.T) {
388388
naming.LabelData: naming.DataPostgres,
389389
},
390390
},
391-
Spec: testVolumeClaimSpec(),
392391
}
392+
spec := testVolumeClaimSpec()
393+
pvc.Spec = spec.AsPersistentVolumeClaimSpec()
393394
assert.NilError(t, r.setControllerReference(cluster, pvc))
394395
assert.NilError(t, r.apply(ctx, pvc))
395396

internal/controller/postgrescluster/volumes.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ func (r *Reconciler) configureExistingPGVolumes(
254254
Name: volName,
255255
Namespace: cluster.Namespace,
256256
},
257-
Spec: cluster.Spec.InstanceSets[0].DataVolumeClaimSpec,
257+
Spec: cluster.Spec.InstanceSets[0].DataVolumeClaimSpec.AsPersistentVolumeClaimSpec(),
258258
}
259259

260260
volume.ObjectMeta.Labels = map[string]string{
@@ -307,7 +307,7 @@ func (r *Reconciler) configureExistingPGWALVolume(
307307
Name: volName,
308308
Namespace: cluster.Namespace,
309309
},
310-
Spec: cluster.Spec.InstanceSets[0].DataVolumeClaimSpec,
310+
Spec: cluster.Spec.InstanceSets[0].DataVolumeClaimSpec.AsPersistentVolumeClaimSpec(),
311311
}
312312

313313
volume.ObjectMeta.Labels = map[string]string{
@@ -362,7 +362,7 @@ func (r *Reconciler) configureExistingRepoVolumes(
362362
cluster.Spec.Backups.PGBackRest.Repos[0].Name),
363363
},
364364
Spec: cluster.Spec.Backups.PGBackRest.Repos[0].Volume.
365-
VolumeClaimSpec,
365+
VolumeClaimSpec.AsPersistentVolumeClaimSpec(),
366366
}
367367

368368
//volume.ObjectMeta = naming.PGBackRestRepoVolume(cluster, cluster.Spec.Backups.PGBackRest.Repos[0].Name)

0 commit comments

Comments
 (0)