From df836a481d26a4cac4a9cb1fa86cce3acd7f9cad Mon Sep 17 00:00:00 2001 From: Pavan <25031267+Pavan-SAP@users.noreply.github.com> Date: Tue, 19 May 2026 22:38:58 +0200 Subject: [PATCH] [Misc] Operator: Reconciles improved Ignore some unnecessary reconciles. --- go.mod | 2 +- go.sum | 4 ++-- internal/controller/informers.go | 12 +++++++++--- internal/controller/informers_test.go | 20 ++++++++++++++------ 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 028be1ee..9919998c 100644 --- a/go.mod +++ b/go.mod @@ -86,7 +86,7 @@ require ( gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/apiextensions-apiserver v0.36.1 // indirect - k8s.io/kube-openapi v0.0.0-20260512234627-ef417d054102 // indirect + k8s.io/kube-openapi v0.0.0-20260519202549-bbf5c5577288 // indirect k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 // indirect sigs.k8s.io/controller-runtime v0.24.1 // indirect sigs.k8s.io/gateway-api v1.5.1 // indirect diff --git a/go.sum b/go.sum index d2502fc1..dd1e03ff 100644 --- a/go.sum +++ b/go.sum @@ -218,8 +218,8 @@ k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0= k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kube-openapi v0.0.0-20260512234627-ef417d054102 h1:xs2ux1MvyrOdfKwS3vuFWrGuLgDOHk6id975Twx2Jss= -k8s.io/kube-openapi v0.0.0-20260512234627-ef417d054102/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY= +k8s.io/kube-openapi v0.0.0-20260519202549-bbf5c5577288 h1:A7Lby6ekC6nv+6oO38huCMFBRP0Os+tIeq1GkwxOQes= +k8s.io/kube-openapi v0.0.0-20260519202549-bbf5c5577288/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY= k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc= k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= diff --git a/internal/controller/informers.go b/internal/controller/informers.go index 529c6e00..82a688af 100644 --- a/internal/controller/informers.go +++ b/internal/controller/informers.go @@ -7,6 +7,7 @@ package controller import ( "reflect" + "time" "github.com/sap/cap-operator/pkg/apis/sme.sap.com/v1alpha1" "k8s.io/apimachinery/pkg/api/meta" @@ -106,7 +107,7 @@ func (c *Controller) getEventHandlerFuncsForResource(res int) cache.ResourceEven c.enqueueModifiedResource(res, new, old) }, DeleteFunc: func(old any) { - c.enqueueModifiedResource(res, old, nil) + c.enqueueModifiedResource(res, nil, old) }, } } @@ -183,6 +184,7 @@ func (c *Controller) registerGardenerDNSEntrytListeners() { func (c *Controller) enqueueModifiedResource(sourceKey int, new, old any) { newObj, ok := getMetaObject(new) + // Skip deletes in general! if !ok { return } @@ -208,12 +210,16 @@ func (c *Controller) enqueueModifiedResource(sourceKey int, new, old any) { } klog.InfoS(queuing, "namespace", newObj.GetNamespace(), "name", newObj.GetName(), "kind", dependentKind) q.Add(QueueItem{Key: dependentKey, ResourceKey: NamespacedResourceKey{Name: newObj.GetName(), Namespace: newObj.GetNamespace()}}) + } + // Only queue parent items on updates + if old == nil { + continue } else if owner, ok := getOwnerByKind(newObj.GetOwnerReferences(), dependentKind); ok { klog.InfoS(queuing, "namespace", newObj.GetNamespace(), "name", owner.Name, "kind", dependentKind) - q.Add(QueueItem{Key: dependentKey, ResourceKey: NamespacedResourceKey{Name: owner.Name, Namespace: newObj.GetNamespace()}}) + q.AddAfter(QueueItem{Key: dependentKey, ResourceKey: NamespacedResourceKey{Name: owner.Name, Namespace: newObj.GetNamespace()}}, time.Second) } else if owner, ok := getOwnerFromObjectMetadata(newObj, dependentKind); ok { klog.InfoS(queuing, "namespace", owner.Namespace, "name", owner.Name, "kind", dependentKind) - q.Add(QueueItem{Key: dependentKey, ResourceKey: NamespacedResourceKey{Name: owner.Name, Namespace: owner.Namespace}}) + q.AddAfter(QueueItem{Key: dependentKey, ResourceKey: NamespacedResourceKey{Name: owner.Name, Namespace: owner.Namespace}}, time.Second) } } } diff --git a/internal/controller/informers_test.go b/internal/controller/informers_test.go index 16c3d194..dfce2cb4 100644 --- a/internal/controller/informers_test.go +++ b/internal/controller/informers_test.go @@ -33,6 +33,7 @@ func TestController_initializeInformers(t *testing.T) { tests := []struct { name string expectedResult bool + ownerOnlyCheck bool invalidOwnerRef bool res int itemName string @@ -55,6 +56,7 @@ func TestController_initializeInformers(t *testing.T) { { name: "Test enqueueModifiedResource (ResourceCertificate) valid owner", res: ResourceCertificate, + ownerOnlyCheck: true, expectedResult: true, itemName: "test-cert", itemNamespace: corev1.NamespaceDefault, @@ -62,6 +64,7 @@ func TestController_initializeInformers(t *testing.T) { { name: "Test enqueueModifiedResource (ResourceCertificate) invalid owner", res: ResourceCertificate, + ownerOnlyCheck: true, expectedResult: false, invalidOwnerRef: true, itemName: "test-cert", @@ -114,7 +117,7 @@ func TestController_initializeInformers(t *testing.T) { } testC.initializeInformers() - var res any + var res, oldRes any switch tt.res { case ResourceCAPApplication: res = createCaCRO(tt.itemName, false) @@ -135,17 +138,22 @@ func TestController_initializeInformers(t *testing.T) { cert.Annotations[AnnotationOwnerIdentifier] = tt.itemNamespace + "." + tt.itemName cert.Labels[LabelOwnerIdentifierHash] = sha1Sum(tt.itemNamespace, tt.itemName) } - res = cert + oldRes = cert + newCert := cert.DeepCopy() + newCert.SetResourceVersion("2") + res = newCert case 999: res = &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: tt.itemName}} } // Add/delete - testC.enqueueModifiedResource(tt.res, res, nil) - if expectedResult != tt.expectedResult { - t.Error("Unexpected result", expectedResult) + if !tt.ownerOnlyCheck { + testC.enqueueModifiedResource(tt.res, res, nil) + if expectedResult != tt.expectedResult { + t.Error("Unexpected result", expectedResult) + } } // Update - testC.enqueueModifiedResource(tt.res, res, res) + testC.enqueueModifiedResource(tt.res, res, oldRes) if expectedResult != tt.expectedResult { t.Error("Unexpected result", expectedResult) }