Skip to content

Commit da41833

Browse files
committedSep 23, 2023
add function RemoveControllerReference and HasControllerReference to controllerutil
Signed-off-by: Troy Connor <troy0820@users.noreply.github.com>
1 parent af3afdb commit da41833

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed
 

‎pkg/controller/controllerutil/controllerutil.go

+22
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,28 @@ func RemoveOwnerReference(owner, object metav1.Object, scheme *runtime.Scheme) e
152152
return nil
153153
}
154154

155+
// HasControllerReference returns true if the object
156+
// has an owner ref with controller equal to true
157+
func HasControllerReference(object metav1.Object) bool {
158+
owners := object.GetOwnerReferences()
159+
for _, owner := range owners {
160+
isTrue := owner.Controller
161+
if owner.Controller != nil && *isTrue {
162+
return true
163+
}
164+
}
165+
return false
166+
}
167+
168+
// RemoveControllerReference removes an owner reference where the controller
169+
// equals true
170+
func RemoveControllerReference(owner, object metav1.Object, scheme *runtime.Scheme) error {
171+
if ok := HasControllerReference(object); !ok {
172+
return fmt.Errorf("%T does not have a owner reference with controller equals true", object)
173+
}
174+
return RemoveOwnerReference(owner, object, scheme)
175+
}
176+
155177
func upsertOwnerRef(ref metav1.OwnerReference, object metav1.Object) {
156178
owners := object.GetOwnerReferences()
157179
if idx := indexOwnerRef(owners, ref); idx == -1 {

‎pkg/controller/controllerutil/controllerutil_test.go

+45
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,51 @@ var _ = Describe("Controllerutil", func() {
195195
Expect(controllerutil.RemoveOwnerReference(dep2, rs, scheme.Scheme)).To(HaveOccurred())
196196
Expect(rs.GetOwnerReferences()).To(HaveLen(1))
197197
})
198+
199+
It("should return true when HasControllerReference evaluates owner reference set by SetControllerReference", func() {
200+
rs := &appsv1.ReplicaSet{
201+
ObjectMeta: metav1.ObjectMeta{},
202+
}
203+
dep := &extensionsv1beta1.Deployment{
204+
ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "foo-uid-2"},
205+
}
206+
Expect(controllerutil.SetControllerReference(dep, rs, scheme.Scheme)).ToNot(HaveOccurred())
207+
Expect(controllerutil.HasControllerReference(rs)).To(BeTrue())
208+
})
209+
210+
It("should return false when HasControllerReference evaluates owner reference set by SetOwnerReference", func() {
211+
rs := &appsv1.ReplicaSet{
212+
ObjectMeta: metav1.ObjectMeta{},
213+
}
214+
dep := &extensionsv1beta1.Deployment{
215+
ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "foo-uid-2"},
216+
}
217+
Expect(controllerutil.SetOwnerReference(dep, rs, scheme.Scheme)).ToNot(HaveOccurred())
218+
Expect(controllerutil.HasControllerReference(rs)).To(BeFalse())
219+
})
220+
221+
It("should error when RemoveControllerReference owner's controller is set to false", func() {
222+
rs := &appsv1.ReplicaSet{
223+
ObjectMeta: metav1.ObjectMeta{},
224+
}
225+
dep := &extensionsv1beta1.Deployment{
226+
ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "foo-uid-2"},
227+
}
228+
Expect(controllerutil.SetOwnerReference(dep, rs, scheme.Scheme)).ToNot(HaveOccurred())
229+
Expect(controllerutil.RemoveControllerReference(dep, rs, scheme.Scheme)).To(HaveOccurred())
230+
})
231+
232+
It("should not error when RemoveControllerReference owner's controller is set to true", func() {
233+
rs := &appsv1.ReplicaSet{
234+
ObjectMeta: metav1.ObjectMeta{},
235+
}
236+
dep := &extensionsv1beta1.Deployment{
237+
ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "foo-uid-2"},
238+
}
239+
Expect(controllerutil.SetControllerReference(dep, rs, scheme.Scheme)).ToNot(HaveOccurred())
240+
Expect(controllerutil.RemoveControllerReference(dep, rs, scheme.Scheme)).ToNot(HaveOccurred())
241+
Expect(rs.GetOwnerReferences()).To(BeEmpty())
242+
})
198243
})
199244

200245
Describe("SetControllerReference", func() {

0 commit comments

Comments
 (0)