diff --git a/pkg/cluster/k8sres_test.go b/pkg/cluster/k8sres_test.go index 29908c0e52db09f24c76a400f54d578df03d2bd8..6dd42419cfdd32967a7fb42d6802d21d8fe3f40c 100644 --- a/pkg/cluster/k8sres_test.go +++ b/pkg/cluster/k8sres_test.go @@ -413,6 +413,7 @@ func TestShmVolume(t *testing.T) { Volumes: []v1.Volume{}, Containers: []v1.Container{ { + Name: "postgres", VolumeMounts: []v1.VolumeMount{}, }, }, @@ -425,6 +426,7 @@ func TestShmVolume(t *testing.T) { Volumes: []v1.Volume{{}}, Containers: []v1.Container{ { + Name: "postgres", VolumeMounts: []v1.VolumeMount{ {}, }, @@ -1055,168 +1057,119 @@ func TestTLS(t *testing.T) { func TestAdditionalVolume(t *testing.T) { testName := "TestAdditionalVolume" - tests := []struct { - subTest string - podSpec *v1.PodSpec - volumePos int - }{ + + client, _ := newFakeK8sTestClient() + clusterName := "acid-test-cluster" + namespace := "default" + sidecarName := "sidecar" + additionalVolumes := []acidv1.AdditionalVolume{ { - subTest: "empty PodSpec", - podSpec: &v1.PodSpec{ - Volumes: []v1.Volume{}, - Containers: []v1.Container{ - { - VolumeMounts: []v1.VolumeMount{}, - }, - }, + Name: "test1", + MountPath: "/test1", + TargetContainers: []string{"all"}, + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, }, - volumePos: 0, }, { - subTest: "non empty PodSpec", - podSpec: &v1.PodSpec{ - Volumes: []v1.Volume{{}}, - Containers: []v1.Container{ - { - Name: "postgres", - VolumeMounts: []v1.VolumeMount{ - { - Name: "data", - ReadOnly: false, - MountPath: "/data", - }, - }, - }, - }, + Name: "test2", + MountPath: "/test2", + TargetContainers: []string{sidecarName}, + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, }, - volumePos: 1, }, { - subTest: "non empty PodSpec with sidecar", - podSpec: &v1.PodSpec{ - Volumes: []v1.Volume{{}}, - Containers: []v1.Container{ - { - Name: "postgres", - VolumeMounts: []v1.VolumeMount{ - { - Name: "data", - ReadOnly: false, - MountPath: "/data", - }, - }, - }, - { - Name: "sidecar", - VolumeMounts: []v1.VolumeMount{ - { - Name: "data", - ReadOnly: false, - MountPath: "/data", - }, - }, - }, + Name: "test3", + MountPath: "/test3", + TargetContainers: []string{}, // should mount only to postgres + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, + }, + }, + { + Name: "test4", + MountPath: "/test4", + TargetContainers: nil, // should mount only to postgres + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, + }, + }, + } + + pg := acidv1.Postgresql{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterName, + Namespace: namespace, + }, + Spec: acidv1.PostgresSpec{ + TeamID: "myapp", NumberOfInstances: 1, + Resources: acidv1.Resources{ + ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, + ResourceLimits: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, + }, + Volume: acidv1.Volume{ + Size: "1G", + }, + AdditionalVolumes: additionalVolumes, + Sidecars: []acidv1.Sidecar{ + { + Name: sidecarName, }, }, - volumePos: 1, }, } var cluster = New( Config{ OpConfig: config.Config{ - ProtectedRoles: []string{"admin"}, - Auth: config.Auth{ - SuperUsername: superUserName, - ReplicationUsername: replicationUserName, - }, - }, - }, k8sutil.KubernetesClient{}, acidv1.Postgresql{}, logger, eventRecorder) - - for _, tt := range tests { - // Test with additional volume mounted in all containers - additionalVolumeMount := []acidv1.AdditionalVolume{ - { - Name: "test", - MountPath: "/test", - TargetContainers: []string{"all"}, - VolumeSource: v1.VolumeSource{ - EmptyDir: &v1.EmptyDirVolumeSource{}, + PodManagementPolicy: "ordered_ready", + Resources: config.Resources{ + ClusterLabels: map[string]string{"application": "spilo"}, + ClusterNameLabel: "cluster-name", + DefaultCPURequest: "300m", + DefaultCPULimit: "300m", + DefaultMemoryRequest: "300Mi", + DefaultMemoryLimit: "300Mi", + PodRoleLabel: "spilo-role", }, }, - } - - numMounts := len(tt.podSpec.Containers[0].VolumeMounts) - - cluster.addAdditionalVolumes(tt.podSpec, additionalVolumeMount) - volumeName := tt.podSpec.Volumes[tt.volumePos].Name - - if volumeName != additionalVolumeMount[0].Name { - t.Errorf("%s %s: Expected volume %v was not created, have %s instead", - testName, tt.subTest, additionalVolumeMount, volumeName) - } - - for i := range tt.podSpec.Containers { - volumeMountName := tt.podSpec.Containers[i].VolumeMounts[tt.volumePos].Name - - if volumeMountName != additionalVolumeMount[0].Name { - t.Errorf("%s %s: Expected mount %v was not created, have %s instead", - testName, tt.subTest, additionalVolumeMount, volumeMountName) - } - - } + }, client, pg, logger, eventRecorder) - numMountsCheck := len(tt.podSpec.Containers[0].VolumeMounts) + // create a statefulset + sts, err := cluster.createStatefulSet() + assert.NoError(t, err) - if numMountsCheck != numMounts+1 { - t.Errorf("Unexpected number of VolumeMounts: got %v instead of %v", - numMountsCheck, numMounts+1) - } + tests := []struct { + subTest string + container string + expectedMounts []string + }{ + { + subTest: "checking volume mounts of postgres container", + container: cluster.containerName(), + expectedMounts: []string{"pgdata", "test1", "test3", "test4"}, + }, + { + subTest: "checking volume mounts of sidecar container", + container: "sidecar", + expectedMounts: []string{"pgdata", "test1", "test2"}, + }, } for _, tt := range tests { - // Test with additional volume mounted only in first container - additionalVolumeMount := []acidv1.AdditionalVolume{ - { - Name: "test", - MountPath: "/test", - TargetContainers: []string{"postgres"}, - VolumeSource: v1.VolumeSource{ - EmptyDir: &v1.EmptyDirVolumeSource{}, - }, - }, - } - - numMounts := len(tt.podSpec.Containers[0].VolumeMounts) - - cluster.addAdditionalVolumes(tt.podSpec, additionalVolumeMount) - volumeName := tt.podSpec.Volumes[tt.volumePos].Name - - if volumeName != additionalVolumeMount[0].Name { - t.Errorf("%s %s: Expected volume %v was not created, have %s instead", - testName, tt.subTest, additionalVolumeMount, volumeName) - } + for _, container := range sts.Spec.Template.Spec.Containers { + if container.Name != tt.container { + continue + } + mounts := []string{} + for _, volumeMounts := range container.VolumeMounts { + mounts = append(mounts, volumeMounts.Name) + } - for _, container := range tt.podSpec.Containers { - if container.Name == "postgres" { - volumeMountName := container.VolumeMounts[tt.volumePos].Name - - if volumeMountName != additionalVolumeMount[0].Name { - t.Errorf("%s %s: Expected mount %v was not created, have %s instead", - testName, tt.subTest, additionalVolumeMount, volumeMountName) - } - - numMountsCheck := len(container.VolumeMounts) - if numMountsCheck != numMounts+1 { - t.Errorf("Unexpected number of VolumeMounts: got %v instead of %v", - numMountsCheck, numMounts+1) - } - } else { - numMountsCheck := len(container.VolumeMounts) - if numMountsCheck == numMounts+1 { - t.Errorf("Unexpected number of VolumeMounts: got %v instead of %v", - numMountsCheck, numMounts) - } + if !util.IsEqualIgnoreOrder(mounts, tt.expectedMounts) { + t.Errorf("%s %s: different volume mounts: got %v, epxected %v", + testName, tt.subTest, mounts, tt.expectedMounts) } } }