Skip to content

Commit e204fb3

Browse files
committed
remove owner passed in to RemoveControlleReference only when that owner controller equals true
Signed-off-by: Troy Connor <[email protected]>
1 parent 2154ffb commit e204fb3

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

pkg/controller/controllerutil/controllerutil.go

+26-2
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,32 @@ func RemoveControllerReference(owner, object metav1.Object, scheme *runtime.Sche
171171
if ok := HasControllerReference(object); !ok {
172172
return fmt.Errorf("%T does not have a owner reference with controller equals true", object)
173173
}
174-
return RemoveOwnerReference(owner, object, scheme)
174+
ro, ok := owner.(runtime.Object)
175+
if !ok {
176+
return fmt.Errorf("%T is not a runtime.Object, cannot call RemoveControllerReference", owner)
177+
}
178+
gvk, err := apiutil.GVKForObject(ro, scheme)
179+
if err != nil {
180+
return err
181+
}
182+
ownerRefs := object.GetOwnerReferences()
183+
index := indexOwnerRef(ownerRefs, metav1.OwnerReference{
184+
APIVersion: gvk.GroupVersion().String(),
185+
Name: owner.GetName(),
186+
Kind: gvk.Kind,
187+
})
188+
189+
if index == -1 {
190+
return fmt.Errorf("%T does not have an controller reference for %T", object, owner)
191+
}
192+
193+
if ownerRefs[index].Controller == nil || !*ownerRefs[index].Controller {
194+
return fmt.Errorf("%T owner is not the controller reference for %T", owner, object)
195+
}
196+
197+
ownerRefs = append(ownerRefs[:index], ownerRefs[index+1:]...)
198+
object.SetOwnerReferences(ownerRefs)
199+
return nil
175200
}
176201

177202
func upsertOwnerRef(ref metav1.OwnerReference, object metav1.Object) {
@@ -219,7 +244,6 @@ func referSameObject(a, b metav1.OwnerReference) bool {
219244
if err != nil {
220245
return false
221246
}
222-
223247
return aGV.Group == bGV.Group && a.Kind == b.Kind && a.Name == b.Name
224248
}
225249

pkg/controller/controllerutil/controllerutil_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ var _ = Describe("Controllerutil", func() {
181181
Expect(controllerutil.RemoveOwnerReference(obj, rs, scheme.Scheme)).To(HaveOccurred())
182182
Expect(rs.GetOwnerReferences()).To(HaveLen(1))
183183
})
184+
184185
It("should error when trying to remove an owner that doesn't exist", func() {
185186
rs := &appsv1.ReplicaSet{
186187
ObjectMeta: metav1.ObjectMeta{},
@@ -229,6 +230,22 @@ var _ = Describe("Controllerutil", func() {
229230
Expect(controllerutil.RemoveControllerReference(dep, rs, scheme.Scheme)).To(HaveOccurred())
230231
})
231232

233+
It("should error when RemoveControllerReference passed in owner is not the owner", func() {
234+
rs := &appsv1.ReplicaSet{
235+
ObjectMeta: metav1.ObjectMeta{},
236+
}
237+
dep := &extensionsv1beta1.Deployment{
238+
ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "foo-uid-2"},
239+
}
240+
dep2 := &extensionsv1beta1.Deployment{
241+
ObjectMeta: metav1.ObjectMeta{Name: "foo-2", UID: "foo-uid-42"},
242+
}
243+
Expect(controllerutil.SetControllerReference(dep, rs, scheme.Scheme)).ToNot(HaveOccurred())
244+
Expect(controllerutil.SetOwnerReference(dep2, rs, scheme.Scheme)).ToNot(HaveOccurred())
245+
Expect(controllerutil.RemoveControllerReference(dep2, rs, scheme.Scheme)).To(HaveOccurred())
246+
Expect(rs.GetOwnerReferences()).To(HaveLen(2))
247+
})
248+
232249
It("should not error when RemoveControllerReference owner's controller is set to true", func() {
233250
rs := &appsv1.ReplicaSet{
234251
ObjectMeta: metav1.ObjectMeta{},

0 commit comments

Comments
 (0)