Skip to content

Commit 2165971

Browse files
feat: update RGD controller to set CRD ownership and optimize watches
Updated the ResourceGraphDefinition controller to set correct ownership references on CRDs and switched to metadata-only watches for improved performance and reduced memory consumption. Added integration tests to validate CRD ownership. Signed-off-by: Jakob Möller <[email protected]>
1 parent 5c38829 commit 2165971

File tree

3 files changed

+34
-46
lines changed

3 files changed

+34
-46
lines changed

pkg/controller/resourcegraphdefinition/controller.go

Lines changed: 11 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,11 @@ import (
2020

2121
"github.com/go-logr/logr"
2222
extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
23-
"k8s.io/apimachinery/pkg/api/meta"
24-
"k8s.io/apimachinery/pkg/types"
2523
ctrl "sigs.k8s.io/controller-runtime"
2624
"sigs.k8s.io/controller-runtime/pkg/builder"
2725
"sigs.k8s.io/controller-runtime/pkg/client"
2826
ctrlrtcontroller "sigs.k8s.io/controller-runtime/pkg/controller"
2927
"sigs.k8s.io/controller-runtime/pkg/event"
30-
"sigs.k8s.io/controller-runtime/pkg/handler"
3128
"sigs.k8s.io/controller-runtime/pkg/predicate"
3229
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3330

@@ -109,50 +106,18 @@ func (r *ResourceGraphDefinitionReconciler) SetupWithManager(mgr ctrl.Manager) e
109106
MaxConcurrentReconciles: r.maxConcurrentReconciles,
110107
},
111108
).
112-
WatchesMetadata(
113-
&extv1.CustomResourceDefinition{},
114-
handler.EnqueueRequestsFromMapFunc(r.findRGDsForCRD),
115-
builder.WithPredicates(predicate.Funcs{
116-
UpdateFunc: func(e event.UpdateEvent) bool {
117-
return true
118-
},
119-
CreateFunc: func(e event.CreateEvent) bool {
120-
return false
121-
},
122-
DeleteFunc: func(e event.DeleteEvent) bool {
123-
return false
124-
},
125-
}),
126-
).
127-
Complete(reconcile.AsReconciler[*v1alpha1.ResourceGraphDefinition](mgr.GetClient(), r))
128-
}
129-
130-
// findRGDsForCRD returns a list of reconcile requests for the ResourceGraphDefinition
131-
// that owns the given CRD. It is used to trigger reconciliation when a CRD is updated.
132-
func (r *ResourceGraphDefinitionReconciler) findRGDsForCRD(ctx context.Context, obj client.Object) []reconcile.Request {
133-
mobj, err := meta.Accessor(obj)
134-
if err != nil {
135-
return nil
136-
}
137-
138-
// Check if the CRD is owned by a ResourceGraphDefinition
139-
if !metadata.IsKROOwned(mobj) {
140-
return nil
141-
}
142-
143-
rgdName, ok := mobj.GetLabels()[metadata.ResourceGraphDefinitionNameLabel]
144-
if !ok {
145-
return nil
146-
}
147-
148-
// Return a reconcile request for the corresponding RGD
149-
return []reconcile.Request{
150-
{
151-
NamespacedName: types.NamespacedName{
152-
Name: rgdName,
109+
Owns(&extv1.CustomResourceDefinition{}, builder.WithPredicates(predicate.Funcs{
110+
UpdateFunc: func(e event.UpdateEvent) bool {
111+
return true
153112
},
154-
},
155-
}
113+
CreateFunc: func(e event.CreateEvent) bool {
114+
return false
115+
},
116+
DeleteFunc: func(e event.DeleteEvent) bool {
117+
return false
118+
},
119+
}), builder.OnlyMetadata).
120+
Complete(reconcile.AsReconciler[*v1alpha1.ResourceGraphDefinition](mgr.GetClient(), r))
156121
}
157122

158123
func (r *ResourceGraphDefinitionReconciler) Reconcile(ctx context.Context, o *v1alpha1.ResourceGraphDefinition) (ctrl.Result, error) {

pkg/controller/resourcegraphdefinition/controller_reconcile.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ func (r *ResourceGraphDefinitionReconciler) reconcileResourceGraphDefinition(
5959

6060
crd := processedRGD.Instance.GetCRD()
6161
graphExecLabeler.ApplyLabels(&crd.ObjectMeta)
62+
if err := ctrl.SetControllerReference(rgd, crd, r.Scheme()); err != nil {
63+
mark.KindUnready(err.Error())
64+
return nil, nil, fmt.Errorf("failed to set controller reference of CRD: %w", err)
65+
}
6266

6367
// Ensure CRD exists and is up to date
6468
log.V(1).Info("reconciling resource graph definition CRD")

test/integration/suites/core/crd_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,25 @@ var _ = Describe("CRD", func() {
104104
g.Expect(props["spec"].Properties["field2"].Default.Raw).To(Equal([]byte("42")))
105105
}, 10*time.Second, time.Second).WithContext(ctx).Should(Succeed())
106106

107+
// Check ownership relationship
108+
owners := crd.GetOwnerReferences()
109+
ownerRefExists := false
110+
for _, owner := range owners {
111+
if owner.Controller != nil && *owner.Controller {
112+
ownerRefExists = true
113+
Expect(owner.Name).To(Equal(rgd.Name))
114+
Expect(owner.Kind).To(Equal("ResourceGraphDefinition"))
115+
Expect(owner.APIVersion).To(Equal(krov1alpha1.GroupVersion.String()))
116+
Expect(owner.UID).To(Equal(rgd.UID))
117+
Expect(owner.BlockOwnerDeletion).ToNot(BeNil())
118+
Expect(*owner.BlockOwnerDeletion).To(BeTrue())
119+
Expect(owner.Controller).ToNot(BeNil())
120+
Expect(*owner.Controller).To(BeTrue())
121+
break
122+
}
123+
}
124+
Expect(ownerRefExists).To(BeTrue(), "CRD should be owned by ResourceGraphDefinition")
125+
107126
Expect(env.Client.Delete(ctx, rgd)).To(Succeed())
108127
})
109128

0 commit comments

Comments
 (0)