diff --git a/internal/cnpgi/operator/lifecycle.go b/internal/cnpgi/operator/lifecycle.go index 055b99a..f2a7307 100644 --- a/internal/cnpgi/operator/lifecycle.go +++ b/internal/cnpgi/operator/lifecycle.go @@ -370,7 +370,7 @@ func reconcilePodSpec( } if len(config.certificates) > 0 { - sidecarTemplate.VolumeMounts = append( + sidecarTemplate.VolumeMounts = ensureVolumeMount( sidecarTemplate.VolumeMounts, corev1.VolumeMount{ Name: barmanCertificatesVolumeName, @@ -417,7 +417,7 @@ func InjectPluginVolumePodSpec(spec *corev1.PodSpec, mainContainerName string) { return } - spec.Volumes = append(spec.Volumes, corev1.Volume{ + spec.Volumes = ensureVolume(spec.Volumes, corev1.Volume{ Name: pluginVolumeName, VolumeSource: corev1.VolumeSource{ EmptyDir: &corev1.EmptyDirVolumeSource{}, @@ -426,7 +426,7 @@ func InjectPluginVolumePodSpec(spec *corev1.PodSpec, mainContainerName string) { for i := range spec.Containers { if spec.Containers[i].Name == mainContainerName { - spec.Containers[i].VolumeMounts = append( + spec.Containers[i].VolumeMounts = ensureVolumeMount( spec.Containers[i].VolumeMounts, corev1.VolumeMount{ Name: pluginVolumeName, @@ -450,7 +450,7 @@ func injectPluginSidecarPodSpec( mainContainerFound := false for i := range spec.Containers { if spec.Containers[i].Name == mainContainerName { - sidecar.VolumeMounts = append(sidecar.VolumeMounts, spec.Containers[i].VolumeMounts...) + sidecar.VolumeMounts = ensureVolumeMount(sidecar.VolumeMounts, spec.Containers[i].VolumeMounts...) mainContainerFound = true } } @@ -491,6 +491,27 @@ func ensureVolume(volumes []corev1.Volume, volume corev1.Volume) []corev1.Volume return volumes } +// ensureVolumeMount makes sure the passed volume mounts are present in the list of volume mounts. +// If a volume mount is already present, it is updated. +func ensureVolumeMount(mounts []corev1.VolumeMount, volumeMounts ...corev1.VolumeMount) []corev1.VolumeMount { + for _, mount := range volumeMounts { + mountFound := false + for i := range mounts { + if mounts[i].Name == mount.Name { + mountFound = true + mounts[i] = mount + break + } + } + + if !mountFound { + mounts = append(mounts, mount) + } + } + + return mounts +} + // removeVolume removes a volume with a known name from a list of volumes. func removeVolume(volumes []corev1.Volume, name string) []corev1.Volume { var filteredVolumes []corev1.Volume diff --git a/internal/cnpgi/operator/lifecycle_test.go b/internal/cnpgi/operator/lifecycle_test.go index 4f9877e..abd7dff 100644 --- a/internal/cnpgi/operator/lifecycle_test.go +++ b/internal/cnpgi/operator/lifecycle_test.go @@ -279,3 +279,56 @@ var _ = Describe("removeVolumeMount", func() { Expect(result).To(BeEmpty()) }) }) + +var _ = Describe("ensureVolumeMount", func() { + It("adds a new volume mount to an empty list", func() { + var mounts []corev1.VolumeMount + newMount := corev1.VolumeMount{Name: "mount1", MountPath: "/path1"} + result := ensureVolumeMount(mounts, newMount) + Expect(result).To(HaveLen(1)) + Expect(result[0]).To(Equal(newMount)) + }) + + It("adds a new volume mount to a non-empty list", func() { + mounts := []corev1.VolumeMount{{Name: "mount1", MountPath: "/path1"}} + newMount := corev1.VolumeMount{Name: "mount2", MountPath: "/path2"} + result := ensureVolumeMount(mounts, newMount) + Expect(result).To(HaveLen(2)) + Expect(result[0].Name).To(Equal("mount1")) + Expect(result[1].Name).To(Equal("mount2")) + }) + + It("updates an existing volume mount", func() { + mounts := []corev1.VolumeMount{{Name: "mount1", MountPath: "/path1"}} + updatedMount := corev1.VolumeMount{Name: "mount1", MountPath: "/new-path"} + result := ensureVolumeMount(mounts, updatedMount) + Expect(result).To(HaveLen(1)) + Expect(result[0].MountPath).To(Equal("/new-path")) + }) + + It("adds multiple new volume mounts", func() { + mounts := []corev1.VolumeMount{{Name: "mount1", MountPath: "/path1"}} + newMount1 := corev1.VolumeMount{Name: "mount2", MountPath: "/path2"} + newMount2 := corev1.VolumeMount{Name: "mount3", MountPath: "/path3"} + result := ensureVolumeMount(mounts, newMount1, newMount2) + Expect(result).To(HaveLen(3)) + Expect(result[0].Name).To(Equal("mount1")) + Expect(result[1].Name).To(Equal("mount2")) + Expect(result[2].Name).To(Equal("mount3")) + }) + + It("handles a mix of new and existing volume mounts", func() { + mounts := []corev1.VolumeMount{ + {Name: "mount1", MountPath: "/path1"}, + {Name: "mount2", MountPath: "/path2"}, + } + updatedMount := corev1.VolumeMount{Name: "mount1", MountPath: "/new-path"} + newMount := corev1.VolumeMount{Name: "mount3", MountPath: "/path3"} + result := ensureVolumeMount(mounts, updatedMount, newMount) + Expect(result).To(HaveLen(3)) + Expect(result[0].Name).To(Equal("mount1")) + Expect(result[0].MountPath).To(Equal("/new-path")) + Expect(result[1].Name).To(Equal("mount2")) + Expect(result[2].Name).To(Equal("mount3")) + }) +})