Skip to content

Commit 6f5721d

Browse files
committed
cross-namespace owner references should be disallowed in SetControllerReference()
1 parent 47744b5 commit 6f5721d

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

pkg/controller/controllerutil/controllerutil.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,17 @@ func SetControllerReference(owner, object metav1.Object, scheme *runtime.Scheme)
6060
return fmt.Errorf("%T is not a runtime.Object, cannot call SetControllerReference", owner)
6161
}
6262

63+
ownerNs := owner.GetNamespace()
64+
if ownerNs != "" {
65+
objNs := object.GetNamespace()
66+
if objNs == "" {
67+
return fmt.Errorf("cluster-scoped resource must not have a namespace-scoped owner, owner's namespace %s", ownerNs)
68+
}
69+
if ownerNs != objNs {
70+
return fmt.Errorf("cross-namespace owner references are disallowed, owner's namespace %s, obj's namespace %s", owner.GetNamespace(), object.GetNamespace())
71+
}
72+
}
73+
6374
gvk, err := apiutil.GVKForObject(ro, scheme)
6475
if err != nil {
6576
return err

pkg/controller/controllerutil/controllerutil_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,24 @@ var _ = Describe("Controllerutil", func() {
115115
BlockOwnerDeletion: &t,
116116
}))
117117
})
118+
119+
It("should return an error if it's setting a cross-namespace owner reference", func() {
120+
rs := &appsv1.ReplicaSet{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "namespace1"}}
121+
dep := &extensionsv1beta1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "namespace2", UID: "foo-uid"}}
122+
123+
err := controllerutil.SetControllerReference(dep, rs, scheme.Scheme)
124+
125+
Expect(err).To(HaveOccurred())
126+
})
127+
128+
It("should return an error if it's owner is namespaced resource but dependant is cluster-scoped resource", func() {
129+
pv := &corev1.PersistentVolume{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}
130+
pod := &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default", UID: "foo-uid"}}
131+
132+
err := controllerutil.SetControllerReference(pod, pv, scheme.Scheme)
133+
134+
Expect(err).To(HaveOccurred())
135+
})
118136
})
119137

120138
Describe("CreateOrUpdate", func() {

0 commit comments

Comments
 (0)