...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package controller
17
18 import (
19 "github.com/pkg/errors"
20 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21 "k8s.io/apimachinery/pkg/runtime"
22 "sigs.k8s.io/controller-runtime/pkg/client/apiutil"
23 )
24
25 func SetOwnerReference(owner, object metav1.Object, scheme *runtime.Scheme) error {
26 ro, ok := owner.(runtime.Object)
27 if !ok {
28 return errors.Errorf("%T is not a runtime.Object, cannot call SetControllerReference", owner)
29 }
30
31 gvk, err := apiutil.GVKForObject(ro, scheme)
32 if err != nil {
33 return err
34 }
35
36
37 isController := false
38 blockOwnerDeletion := true
39 ref := metav1.OwnerReference{
40 APIVersion: gvk.GroupVersion().String(),
41 Kind: gvk.Kind,
42 Name: owner.GetName(),
43 UID: owner.GetUID(),
44 BlockOwnerDeletion: &blockOwnerDeletion,
45 Controller: &isController,
46 }
47
48 existingRefs := object.GetOwnerReferences()
49 fi := -1
50
51 for i, r := range existingRefs {
52 if ref.UID == r.UID {
53 fi = i
54 }
55 }
56 if fi == -1 {
57 existingRefs = append(existingRefs, ref)
58 } else {
59 existingRefs[fi] = ref
60 }
61
62
63 object.SetOwnerReferences(existingRefs)
64 return nil
65 }
66