Skip to content

Commit 2f437ae

Browse files
committed
Add helper function for adding OwnerReferences to metav1.Objects
1 parent e205778 commit 2f437ae

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

pkg/manager/internal.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@ limitations under the License.
1717
package manager
1818

1919
import (
20+
"fmt"
2021
"sync"
2122

23+
"k8s.io/apimachinery/pkg/apis/meta/v1"
2224
"k8s.io/apimachinery/pkg/runtime"
25+
"k8s.io/apimachinery/pkg/runtime/schema"
2326
"k8s.io/client-go/rest"
2427
"k8s.io/client-go/tools/record"
2528
"sigs.k8s.io/controller-runtime/pkg/cache"
2629
"sigs.k8s.io/controller-runtime/pkg/client"
30+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
2731
"sigs.k8s.io/controller-runtime/pkg/recorder"
2832
"sigs.k8s.io/controller-runtime/pkg/runtime/inject"
2933
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
@@ -132,6 +136,26 @@ func (cm *controllerManager) GetRecorder(name string) record.EventRecorder {
132136
return cm.recorderProvider.GetEventRecorderFor(name)
133137
}
134138

139+
func (cm *controllerManager) SetControllerReference(owner, object v1.Object) error {
140+
s := cm.GetScheme()
141+
ro, ok := owner.(runtime.Object)
142+
if !ok {
143+
return fmt.Errorf("is not a %T a runtime.Object, cannot call SetControllerReference", owner)
144+
}
145+
146+
gvk, err := apiutil.GVKForObject(ro, s)
147+
if err != nil {
148+
return err
149+
}
150+
151+
// Create a new ref
152+
ref := *v1.NewControllerRef(owner, schema.GroupVersionKind{Group: gvk.Group, Version: gvk.Version, Kind: gvk.Kind})
153+
154+
// Add it to the child
155+
object.SetOwnerReferences(append(object.GetOwnerReferences(), ref))
156+
return nil
157+
}
158+
135159
func (cm *controllerManager) Start(stop <-chan struct{}) error {
136160
func() {
137161
cm.mu.Lock()

pkg/manager/manager.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121

2222
"k8s.io/apimachinery/pkg/api/meta"
23+
"k8s.io/apimachinery/pkg/apis/meta/v1"
2324
"k8s.io/apimachinery/pkg/runtime"
2425
"k8s.io/client-go/kubernetes/scheme"
2526
"k8s.io/client-go/rest"
@@ -63,6 +64,11 @@ type Manager interface {
6364

6465
// GetRecorder returns a new EventRecorder for the provided name
6566
GetRecorder(name string) record.EventRecorder
67+
68+
// SetControllerReference sets owner as a Controller OwnerReference on owned.
69+
// This is used for garbage collection of the owned object and for
70+
// reconciling the owner object on changes to owned (with a Watch + EnqueueOwner).
71+
SetControllerReference(owner, owned v1.Object) error
6672
}
6773

6874
// Options are the arguments for creating a new Manager

pkg/manager/manager_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ import (
2121

2222
. "github.com/onsi/ginkgo"
2323
. "github.com/onsi/gomega"
24+
appsv1 "k8s.io/api/apps/v1"
25+
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
2426
"k8s.io/apimachinery/pkg/api/meta"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2528
"k8s.io/apimachinery/pkg/runtime"
2629
"k8s.io/client-go/rest"
2730
"sigs.k8s.io/controller-runtime/pkg/cache"
@@ -43,6 +46,45 @@ var _ = Describe("manger.Manager", func() {
4346
close(stop)
4447
})
4548

49+
Describe("SetControllerReference", func() {
50+
It("should set the OwnerReference if it can find the group version kind", func() {
51+
m, err := New(cfg, Options{})
52+
Expect(err).NotTo(HaveOccurred())
53+
54+
rs := &appsv1.ReplicaSet{}
55+
dep := &extensionsv1beta1.Deployment{
56+
ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "foo-uid"},
57+
}
58+
Expect(m.SetControllerReference(dep, rs)).NotTo(HaveOccurred())
59+
t := true
60+
Expect(rs.OwnerReferences).To(ConsistOf(metav1.OwnerReference{
61+
Name: "foo",
62+
Kind: "Deployment",
63+
APIVersion: "extensions/v1beta1",
64+
UID: "foo-uid",
65+
Controller: &t,
66+
BlockOwnerDeletion: &t,
67+
}))
68+
})
69+
70+
It("should return an error if it can't find the group version kind of the owner", func() {
71+
m, err := New(cfg, Options{Scheme: runtime.NewScheme()})
72+
Expect(err).NotTo(HaveOccurred())
73+
rs := &appsv1.ReplicaSet{}
74+
dep := &extensionsv1beta1.Deployment{
75+
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
76+
}
77+
Expect(m.SetControllerReference(dep, rs)).To(HaveOccurred())
78+
})
79+
80+
It("should return an error if the owner isn't a runtime.Object", func() {
81+
m, err := New(cfg, Options{Scheme: runtime.NewScheme()})
82+
Expect(err).NotTo(HaveOccurred())
83+
rs := &appsv1.ReplicaSet{}
84+
Expect(m.SetControllerReference(&errMetaObj{}, rs)).To(HaveOccurred())
85+
})
86+
})
87+
4688
Describe("New", func() {
4789
It("should return an error if there is no Config", func() {
4890
m, err := New(nil, Options{})
@@ -382,6 +424,12 @@ var _ = Describe("manger.Manager", func() {
382424
})
383425
})
384426

427+
var _ metav1.Object = &errMetaObj{}
428+
429+
type errMetaObj struct {
430+
metav1.ObjectMeta
431+
}
432+
385433
var _ reconcile.Reconcile = &failRec{}
386434
var _ inject.Client = &failRec{}
387435

0 commit comments

Comments
 (0)