mirror of
https://github.com/zalando/postgres-operator.git
synced 2026-10-18 08:55:04 +02:00
Add volume selector (#1385)
* Add volume selector * Add slightly better documentation and gofmt changes * Update generated deepcopy * Add test for PV selector Co-authored-by: John Rood <j.rood@picturae.com>
This commit is contained in:
@@ -1272,7 +1272,7 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef
|
||||
}
|
||||
|
||||
if volumeClaimTemplate, err = generatePersistentVolumeClaimTemplate(spec.Volume.Size,
|
||||
spec.Volume.StorageClass); err != nil {
|
||||
spec.Volume.StorageClass, spec.Volume.Selector); err != nil {
|
||||
return nil, fmt.Errorf("could not generate volume claim template: %v", err)
|
||||
}
|
||||
|
||||
@@ -1520,7 +1520,8 @@ func (c *Cluster) addAdditionalVolumes(podSpec *v1.PodSpec,
|
||||
podSpec.Volumes = volumes
|
||||
}
|
||||
|
||||
func generatePersistentVolumeClaimTemplate(volumeSize, volumeStorageClass string) (*v1.PersistentVolumeClaim, error) {
|
||||
func generatePersistentVolumeClaimTemplate(volumeSize, volumeStorageClass string,
|
||||
volumeSelector *metav1.LabelSelector) (*v1.PersistentVolumeClaim, error) {
|
||||
|
||||
var storageClassName *string
|
||||
|
||||
@@ -1553,6 +1554,7 @@ func generatePersistentVolumeClaimTemplate(volumeSize, volumeStorageClass string
|
||||
},
|
||||
StorageClassName: storageClassName,
|
||||
VolumeMode: &volumeMode,
|
||||
Selector: volumeSelector,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -1509,3 +1509,106 @@ func TestGenerateCapabilities(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestVolumeSelector(t *testing.T) {
|
||||
testName := "TestVolumeSelector"
|
||||
makeSpec := func(volume acidv1.Volume) acidv1.PostgresSpec {
|
||||
return acidv1.PostgresSpec{
|
||||
TeamID: "myapp",
|
||||
NumberOfInstances: 0,
|
||||
Resources: acidv1.Resources{
|
||||
ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"},
|
||||
ResourceLimits: acidv1.ResourceDescription{CPU: "1", Memory: "10"},
|
||||
},
|
||||
Volume: volume,
|
||||
}
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
subTest string
|
||||
volume acidv1.Volume
|
||||
wantSelector *metav1.LabelSelector
|
||||
}{
|
||||
{
|
||||
subTest: "PVC template has no selector",
|
||||
volume: acidv1.Volume{
|
||||
Size: "1G",
|
||||
},
|
||||
wantSelector: nil,
|
||||
},
|
||||
{
|
||||
subTest: "PVC template has simple label selector",
|
||||
volume: acidv1.Volume{
|
||||
Size: "1G",
|
||||
Selector: &metav1.LabelSelector{
|
||||
MatchLabels: map[string]string{"environment": "unittest"},
|
||||
},
|
||||
},
|
||||
wantSelector: &metav1.LabelSelector{
|
||||
MatchLabels: map[string]string{"environment": "unittest"},
|
||||
},
|
||||
},
|
||||
{
|
||||
subTest: "PVC template has full selector",
|
||||
volume: acidv1.Volume{
|
||||
Size: "1G",
|
||||
Selector: &metav1.LabelSelector{
|
||||
MatchLabels: map[string]string{"environment": "unittest"},
|
||||
MatchExpressions: []metav1.LabelSelectorRequirement{
|
||||
{
|
||||
Key: "flavour",
|
||||
Operator: metav1.LabelSelectorOpIn,
|
||||
Values: []string{"banana", "chocolate"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
wantSelector: &metav1.LabelSelector{
|
||||
MatchLabels: map[string]string{"environment": "unittest"},
|
||||
MatchExpressions: []metav1.LabelSelectorRequirement{
|
||||
{
|
||||
Key: "flavour",
|
||||
Operator: metav1.LabelSelectorOpIn,
|
||||
Values: []string{"banana", "chocolate"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
cluster := New(
|
||||
Config{
|
||||
OpConfig: config.Config{
|
||||
PodManagementPolicy: "ordered_ready",
|
||||
ProtectedRoles: []string{"admin"},
|
||||
Auth: config.Auth{
|
||||
SuperUsername: superUserName,
|
||||
ReplicationUsername: replicationUserName,
|
||||
},
|
||||
},
|
||||
}, k8sutil.KubernetesClient{}, acidv1.Postgresql{}, logger, eventRecorder)
|
||||
|
||||
for _, tt := range tests {
|
||||
pgSpec := makeSpec(tt.volume)
|
||||
sts, err := cluster.generateStatefulSet(&pgSpec)
|
||||
if err != nil {
|
||||
t.Fatalf("%s %s: no statefulset created %v", testName, tt.subTest, err)
|
||||
}
|
||||
|
||||
volIdx := len(sts.Spec.VolumeClaimTemplates)
|
||||
for i, ct := range sts.Spec.VolumeClaimTemplates {
|
||||
if ct.ObjectMeta.Name == constants.DataVolumeName {
|
||||
volIdx = i
|
||||
break
|
||||
}
|
||||
}
|
||||
if volIdx == len(sts.Spec.VolumeClaimTemplates) {
|
||||
t.Errorf("%s %s: no datavolume found in sts", testName, tt.subTest)
|
||||
}
|
||||
|
||||
selector := sts.Spec.VolumeClaimTemplates[volIdx].Spec.Selector
|
||||
if !reflect.DeepEqual(selector, tt.wantSelector) {
|
||||
t.Errorf("%s %s: expected: %#v but got: %#v", testName, tt.subTest, tt.wantSelector, selector)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user