diff --git a/internal/resource/statefulset.go b/internal/resource/statefulset.go index 6b84ed66a..3d5e44637 100644 --- a/internal/resource/statefulset.go +++ b/internal/resource/statefulset.go @@ -86,6 +86,7 @@ func (builder *StatefulSetBuilder) Build() (client.Object, error) { pvcList := make([]corev1.PersistentVolumeClaim, len(override)) for i := range override { copyObjectMeta(&pvcList[i].ObjectMeta, override[i].EmbeddedObjectMeta) + pvcList[i].Namespace = sts.Namespace // PVC should always be in the same namespace as the Stateful Set pvcList[i].Spec = override[i].Spec if err := controllerutil.SetControllerReference(builder.Instance, &pvcList[i], builder.Scheme); err != nil { return nil, fmt.Errorf("failed setting controller reference: %v", err) @@ -820,15 +821,13 @@ func copyLabelsAnnotations(base *metav1.ObjectMeta, override rabbitmqv1beta1.Emb } } +// copyObjectMeta copies name, labels, and annotations from a given EmbeddedObjectMeta to a metav1.ObjectMeta +// there is no need to copy the namespace because both PVCs and Pod have to be in the same namespace as its StatefulSet func copyObjectMeta(base *metav1.ObjectMeta, override rabbitmqv1beta1.EmbeddedObjectMeta) { if override.Name != "" { base.Name = override.Name } - if override.Namespace != "" { - base.Namespace = override.Namespace - } - if override.Labels != nil { base.Labels = mergeMap(base.Labels, override.Labels) } diff --git a/internal/resource/statefulset_test.go b/internal/resource/statefulset_test.go index 5c035c275..8faac62c9 100644 --- a/internal/resource/statefulset_test.go +++ b/internal/resource/statefulset_test.go @@ -262,6 +262,97 @@ var _ = Describe("StatefulSet", func() { }, )) }) + + It("successfully overrides PVC list even when namespace not specified", func() { + storageClass := "my-storage-class" + builder.Instance.Spec.Override.StatefulSet = &rabbitmqv1beta1.StatefulSet{ + Spec: &rabbitmqv1beta1.StatefulSetSpec{ + VolumeClaimTemplates: []rabbitmqv1beta1.PersistentVolumeClaim{ + { + EmbeddedObjectMeta: rabbitmqv1beta1.EmbeddedObjectMeta{ + Name: "pert-1", + }, + Spec: corev1.PersistentVolumeClaimSpec{ + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceStorage: *instance.Spec.Persistence.Storage, + }, + }, + StorageClassName: &storageClass, + }, + }, + { + EmbeddedObjectMeta: rabbitmqv1beta1.EmbeddedObjectMeta{ + Name: "pert-2", + }, + Spec: corev1.PersistentVolumeClaimSpec{ + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceStorage: *instance.Spec.Persistence.Storage, + }, + }, + StorageClassName: &storageClass, + }, + }, + }, + }, + } + stsBuilder := builder.StatefulSet() + obj, err := stsBuilder.Build() + Expect(err).NotTo(HaveOccurred()) + statefulSet := obj.(*appsv1.StatefulSet) + + Expect(statefulSet.Spec.VolumeClaimTemplates).To(ConsistOf( + corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pert-1", + Namespace: "foo-namespace", + OwnerReferences: []v1.OwnerReference{ + { + APIVersion: "rabbitmq.com/v1beta1", + Kind: "RabbitmqCluster", + Name: instance.Name, + UID: "", + Controller: pointer.BoolPtr(true), + BlockOwnerDeletion: pointer.BoolPtr(false), + }, + }, + }, + Spec: corev1.PersistentVolumeClaimSpec{ + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceStorage: *instance.Spec.Persistence.Storage, + }, + }, + StorageClassName: &storageClass, + }, + }, + corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pert-2", + Namespace: "foo-namespace", + OwnerReferences: []v1.OwnerReference{ + { + APIVersion: "rabbitmq.com/v1beta1", + Kind: "RabbitmqCluster", + Name: instance.Name, + UID: "", + Controller: pointer.BoolPtr(true), + BlockOwnerDeletion: pointer.BoolPtr(false), + }, + }, + }, + Spec: corev1.PersistentVolumeClaimSpec{ + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceStorage: *instance.Spec.Persistence.Storage, + }, + }, + StorageClassName: &storageClass, + }, + }, + )) + }) }) }) @@ -1344,8 +1435,7 @@ var _ = Describe("StatefulSet", func() { Spec: &rabbitmqv1beta1.StatefulSetSpec{ Template: &rabbitmqv1beta1.PodTemplateSpec{ EmbeddedObjectMeta: &rabbitmqv1beta1.EmbeddedObjectMeta{ - Namespace: "my-ns", - Name: "my-name", + Name: "my-name", Labels: map[string]string{ "my-label": "my-label", }, @@ -1359,7 +1449,6 @@ var _ = Describe("StatefulSet", func() { stsBuilder := builder.StatefulSet() Expect(stsBuilder.Update(statefulSet)).To(Succeed()) Expect(statefulSet.Spec.Template.ObjectMeta.Name).To(Equal("my-name")) - Expect(statefulSet.Spec.Template.ObjectMeta.Namespace).To(Equal("my-ns")) Expect(statefulSet.Spec.Template.ObjectMeta.Labels).To(Equal(map[string]string{ "my-label": "my-label", "app.kubernetes.io/component": "rabbitmq",