Skip to content

Commit 639ddf3

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 639ddf3

File tree

3 files changed

+40
-54
lines changed

3 files changed

+40
-54
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: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@ import (
1919
"fmt"
2020
"time"
2121

22-
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
23-
"k8s.io/apimachinery/pkg/runtime/schema"
24-
ctrl "sigs.k8s.io/controller-runtime"
25-
2622
"github.com/kubernetes-sigs/kro/api/v1alpha1"
2723
instancectrl "github.com/kubernetes-sigs/kro/pkg/controller/instance"
2824
"github.com/kubernetes-sigs/kro/pkg/dynamiccontroller"
2925
"github.com/kubernetes-sigs/kro/pkg/graph"
3026
"github.com/kubernetes-sigs/kro/pkg/metadata"
27+
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
28+
"k8s.io/apimachinery/pkg/runtime/schema"
29+
ctrl "sigs.k8s.io/controller-runtime"
3130
)
3231

3332
// reconcileResourceGraphDefinition orchestrates the reconciliation of a ResourceGraphDefinition by:
@@ -59,6 +58,10 @@ func (r *ResourceGraphDefinitionReconciler) reconcileResourceGraphDefinition(
5958

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

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

test/integration/suites/core/crd_test.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ import (
1818
"fmt"
1919
"time"
2020

21+
krov1alpha1 "github.com/kubernetes-sigs/kro/api/v1alpha1"
22+
"github.com/kubernetes-sigs/kro/pkg/metadata"
23+
"github.com/kubernetes-sigs/kro/pkg/testutil/generator"
2124
. "github.com/onsi/ginkgo/v2"
2225
. "github.com/onsi/gomega"
2326
corev1 "k8s.io/api/core/v1"
@@ -26,10 +29,6 @@ import (
2629
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2730
"k8s.io/apimachinery/pkg/types"
2831
"k8s.io/apimachinery/pkg/util/rand"
29-
30-
krov1alpha1 "github.com/kubernetes-sigs/kro/api/v1alpha1"
31-
"github.com/kubernetes-sigs/kro/pkg/metadata"
32-
"github.com/kubernetes-sigs/kro/pkg/testutil/generator"
3332
)
3433

3534
var _ = Describe("CRD", func() {
@@ -104,6 +103,25 @@ var _ = Describe("CRD", func() {
104103
g.Expect(props["spec"].Properties["field2"].Default.Raw).To(Equal([]byte("42")))
105104
}, 10*time.Second, time.Second).WithContext(ctx).Should(Succeed())
106105

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

0 commit comments

Comments
 (0)