Skip to content

Commit c0853ea

Browse files
committed
separate cases of "cluster-scoped resource cannot have namespace-scoped resource" and "cross-namespaces owner references are disallowed"
1 parent 58a6142 commit c0853ea

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

pkg/controller/controllerutil/controllerutil.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,22 @@ func newAlreadyOwnedError(Object metav1.Object, Owner metav1.OwnerReference) *Al
5454
// reconciling the owner object on changes to owned (with a Watch + EnqueueRequestForOwner).
5555
// Since only one OwnerReference can be a controller, it returns an error if
5656
// there is another OwnerReference with Controller flag set.
57+
// Owner must be cluster-scoped resource or has the same namespace as object.
5758
func SetControllerReference(owner, object metav1.Object, scheme *runtime.Scheme) error {
5859
ro, ok := owner.(runtime.Object)
5960
if !ok {
6061
return fmt.Errorf("%T is not a runtime.Object, cannot call SetControllerReference", owner)
6162
}
6263

63-
if owner.GetNamespace() != "" && owner.GetNamespace() != object.GetNamespace() {
64-
return fmt.Errorf("cross-namespace owner references are disallowed, owner's namespace %s, obj's namespace %s", owner.GetNamespace(), object.GetNamespace())
64+
ownerNs := owner.GetNamespace()
65+
if ownerNs != "" {
66+
objNs := object.GetNamespace()
67+
if objNs == "" {
68+
return fmt.Errorf("cluster-scoped resource must not have a namespace-scoped owner, owner's namesapce %s", ownerNs)
69+
}
70+
if ownerNs != objNs {
71+
return fmt.Errorf("cross-namespace owner references are disallowed, owner's namespace %s, obj's namespace %s", ownerNs, objNs)
72+
}
6573
}
6674

6775
gvk, err := apiutil.GVKForObject(ro, scheme)

pkg/controller/controllerutil/controllerutil_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,16 @@ var _ = Describe("Controllerutil", func() {
124124

125125
Expect(err).To(HaveOccurred())
126126
})
127+
128+
It("should return an error if owner is namespaced-scope resource but dependent is cluster-scoped", func() {
129+
pv := &corev1.PersistentVolume{ObjectMeta: metav1.ObjectMeta{Name: "bar"}}
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+
136+
})
127137
})
128138

129139
Describe("CreateOrUpdate", func() {

0 commit comments

Comments
 (0)