Skip to content

Commit 12a09a8

Browse files
committed
Always set PVC override namespace to sts namespace
- this is related to bug reported in: #537 - k8s allows pvc template in sts to not have namespace specified and assumes it's the same namespace as the sts - operator needs to set namespace because controller reference can only be set when both object name and namespace are specified
1 parent a057a26 commit 12a09a8

File tree

2 files changed

+95
-7
lines changed

2 files changed

+95
-7
lines changed

internal/resource/statefulset.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ func (builder *StatefulSetBuilder) Build() (client.Object, error) {
8686
pvcList := make([]corev1.PersistentVolumeClaim, len(override))
8787
for i := range override {
8888
copyObjectMeta(&pvcList[i].ObjectMeta, override[i].EmbeddedObjectMeta)
89+
pvcList[i].Namespace = sts.Namespace // PVC should always be in the same namespace as the Stateful Set
8990
pvcList[i].Spec = override[i].Spec
9091
if err := controllerutil.SetControllerReference(builder.Instance, &pvcList[i], builder.Scheme); err != nil {
9192
return nil, fmt.Errorf("failed setting controller reference: %v", err)
@@ -820,15 +821,13 @@ func copyLabelsAnnotations(base *metav1.ObjectMeta, override rabbitmqv1beta1.Emb
820821
}
821822
}
822823

824+
// copyObjectMeta copies name, labels, and annotations from a given EmbeddedObjectMeta to a metav1.ObjectMeta
825+
// there is no need to copy the namespace because both PVCs and Pod have to be in the same namespace as its StatefulSet
823826
func copyObjectMeta(base *metav1.ObjectMeta, override rabbitmqv1beta1.EmbeddedObjectMeta) {
824827
if override.Name != "" {
825828
base.Name = override.Name
826829
}
827830

828-
if override.Namespace != "" {
829-
base.Namespace = override.Namespace
830-
}
831-
832831
if override.Labels != nil {
833832
base.Labels = mergeMap(base.Labels, override.Labels)
834833
}

internal/resource/statefulset_test.go

+92-3
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,97 @@ var _ = Describe("StatefulSet", func() {
262262
},
263263
))
264264
})
265+
266+
It("successfully overrides PVC list even when namespace not specified", func() {
267+
storageClass := "my-storage-class"
268+
builder.Instance.Spec.Override.StatefulSet = &rabbitmqv1beta1.StatefulSet{
269+
Spec: &rabbitmqv1beta1.StatefulSetSpec{
270+
VolumeClaimTemplates: []rabbitmqv1beta1.PersistentVolumeClaim{
271+
{
272+
EmbeddedObjectMeta: rabbitmqv1beta1.EmbeddedObjectMeta{
273+
Name: "pert-1",
274+
},
275+
Spec: corev1.PersistentVolumeClaimSpec{
276+
Resources: corev1.ResourceRequirements{
277+
Requests: corev1.ResourceList{
278+
corev1.ResourceStorage: *instance.Spec.Persistence.Storage,
279+
},
280+
},
281+
StorageClassName: &storageClass,
282+
},
283+
},
284+
{
285+
EmbeddedObjectMeta: rabbitmqv1beta1.EmbeddedObjectMeta{
286+
Name: "pert-2",
287+
},
288+
Spec: corev1.PersistentVolumeClaimSpec{
289+
Resources: corev1.ResourceRequirements{
290+
Requests: corev1.ResourceList{
291+
corev1.ResourceStorage: *instance.Spec.Persistence.Storage,
292+
},
293+
},
294+
StorageClassName: &storageClass,
295+
},
296+
},
297+
},
298+
},
299+
}
300+
stsBuilder := builder.StatefulSet()
301+
obj, err := stsBuilder.Build()
302+
Expect(err).NotTo(HaveOccurred())
303+
statefulSet := obj.(*appsv1.StatefulSet)
304+
305+
Expect(statefulSet.Spec.VolumeClaimTemplates).To(ConsistOf(
306+
corev1.PersistentVolumeClaim{
307+
ObjectMeta: metav1.ObjectMeta{
308+
Name: "pert-1",
309+
Namespace: "foo-namespace",
310+
OwnerReferences: []v1.OwnerReference{
311+
{
312+
APIVersion: "rabbitmq.com/v1beta1",
313+
Kind: "RabbitmqCluster",
314+
Name: instance.Name,
315+
UID: "",
316+
Controller: pointer.BoolPtr(true),
317+
BlockOwnerDeletion: pointer.BoolPtr(false),
318+
},
319+
},
320+
},
321+
Spec: corev1.PersistentVolumeClaimSpec{
322+
Resources: corev1.ResourceRequirements{
323+
Requests: corev1.ResourceList{
324+
corev1.ResourceStorage: *instance.Spec.Persistence.Storage,
325+
},
326+
},
327+
StorageClassName: &storageClass,
328+
},
329+
},
330+
corev1.PersistentVolumeClaim{
331+
ObjectMeta: metav1.ObjectMeta{
332+
Name: "pert-2",
333+
Namespace: "foo-namespace",
334+
OwnerReferences: []v1.OwnerReference{
335+
{
336+
APIVersion: "rabbitmq.com/v1beta1",
337+
Kind: "RabbitmqCluster",
338+
Name: instance.Name,
339+
UID: "",
340+
Controller: pointer.BoolPtr(true),
341+
BlockOwnerDeletion: pointer.BoolPtr(false),
342+
},
343+
},
344+
},
345+
Spec: corev1.PersistentVolumeClaimSpec{
346+
Resources: corev1.ResourceRequirements{
347+
Requests: corev1.ResourceList{
348+
corev1.ResourceStorage: *instance.Spec.Persistence.Storage,
349+
},
350+
},
351+
StorageClassName: &storageClass,
352+
},
353+
},
354+
))
355+
})
265356
})
266357
})
267358

@@ -1344,8 +1435,7 @@ var _ = Describe("StatefulSet", func() {
13441435
Spec: &rabbitmqv1beta1.StatefulSetSpec{
13451436
Template: &rabbitmqv1beta1.PodTemplateSpec{
13461437
EmbeddedObjectMeta: &rabbitmqv1beta1.EmbeddedObjectMeta{
1347-
Namespace: "my-ns",
1348-
Name: "my-name",
1438+
Name: "my-name",
13491439
Labels: map[string]string{
13501440
"my-label": "my-label",
13511441
},
@@ -1359,7 +1449,6 @@ var _ = Describe("StatefulSet", func() {
13591449
stsBuilder := builder.StatefulSet()
13601450
Expect(stsBuilder.Update(statefulSet)).To(Succeed())
13611451
Expect(statefulSet.Spec.Template.ObjectMeta.Name).To(Equal("my-name"))
1362-
Expect(statefulSet.Spec.Template.ObjectMeta.Namespace).To(Equal("my-ns"))
13631452
Expect(statefulSet.Spec.Template.ObjectMeta.Labels).To(Equal(map[string]string{
13641453
"my-label": "my-label",
13651454
"app.kubernetes.io/component": "rabbitmq",

0 commit comments

Comments
 (0)