diff --git a/apis/v1/clusterworkloadresourcemapping_webhook.go b/apis/v1/clusterworkloadresourcemapping_webhook.go index 3056adee..6049ae2b 100644 --- a/apis/v1/clusterworkloadresourcemapping_webhook.go +++ b/apis/v1/clusterworkloadresourcemapping_webhook.go @@ -21,30 +21,25 @@ import ( "fmt" "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/client-go/util/jsonpath" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) func (r *ClusterWorkloadResourceMapping) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). + return ctrl.NewWebhookManagedBy(mgr, r). WithDefaulter(r). WithValidator(r). Complete() } -var _ webhook.CustomDefaulter = &ClusterWorkloadResourceMapping{} +var _ admission.Defaulter[*ClusterWorkloadResourceMapping] = &ClusterWorkloadResourceMapping{} // Default implements webhook.CustomDefaulter so a webhook will be registered for the type -func (r *ClusterWorkloadResourceMapping) Default(ctx context.Context, obj runtime.Object) error { - r = obj.(*ClusterWorkloadResourceMapping) - - for i := range r.Spec.Versions { - r.Spec.Versions[i].Default() +func (*ClusterWorkloadResourceMapping) Default(ctx context.Context, obj *ClusterWorkloadResourceMapping) error { + for i := range obj.Spec.Versions { + obj.Spec.Versions[i].Default() } return nil @@ -83,33 +78,29 @@ func (r *ClusterWorkloadResourceMappingTemplate) Default() { //+kubebuilder:webhook:path=/validate-servicebinding-io-v1-clusterworkloadresourcemapping,mutating=false,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=clusterworkloadresourcemappings,verbs=create;update,versions=v1,name=v1.clusterworkloadresourcemappings.servicebinding.io,admissionReviewVersions={v1,v1beta1} -var _ webhook.CustomValidator = &ClusterWorkloadResourceMapping{} +var _ admission.Validator[*ClusterWorkloadResourceMapping] = &ClusterWorkloadResourceMapping{} // ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type -func (r *ClusterWorkloadResourceMapping) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (*ClusterWorkloadResourceMapping) ValidateCreate(ctx context.Context, obj *ClusterWorkloadResourceMapping) (admission.Warnings, error) { log := logr.FromContextOrDiscard(ctx) log.V(1).Info("Validating Create") - r = obj.(*ClusterWorkloadResourceMapping) - - (&ClusterWorkloadResourceMapping{}).Default(ctx, r) - return nil, r.validate().ToAggregate() + (&ClusterWorkloadResourceMapping{}).Default(ctx, obj) + return nil, obj.validate().ToAggregate() } // ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type -func (r *ClusterWorkloadResourceMapping) ValidateUpdate(ctx context.Context, old, obj runtime.Object) (admission.Warnings, error) { +func (*ClusterWorkloadResourceMapping) ValidateUpdate(ctx context.Context, old, obj *ClusterWorkloadResourceMapping) (admission.Warnings, error) { log := logr.FromContextOrDiscard(ctx) log.V(1).Info("Validating Update") - r = obj.(*ClusterWorkloadResourceMapping) - - (&ClusterWorkloadResourceMapping{}).Default(ctx, r) + (&ClusterWorkloadResourceMapping{}).Default(ctx, obj) // TODO(user): check for immutable fields, if any - return nil, r.validate().ToAggregate() + return nil, obj.validate().ToAggregate() } // ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type -func (r *ClusterWorkloadResourceMapping) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (*ClusterWorkloadResourceMapping) ValidateDelete(ctx context.Context, obj *ClusterWorkloadResourceMapping) (admission.Warnings, error) { log := logr.FromContextOrDiscard(ctx) log.V(1).Info("Validating Delete") diff --git a/apis/v1/servicebinding_test.go b/apis/v1/servicebinding_test.go index 8c72296d..c9794d24 100644 --- a/apis/v1/servicebinding_test.go +++ b/apis/v1/servicebinding_test.go @@ -20,9 +20,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ) @@ -280,7 +278,7 @@ func TestServiceBindingValidate_Immutable(t *testing.T) { tests := []struct { name string seed *ServiceBinding - old runtime.Object + old *ServiceBinding expected field.ErrorList }{ { @@ -399,32 +397,6 @@ func TestServiceBindingValidate_Immutable(t *testing.T) { }, }, }, - { - name: "unkonwn old object", - seed: &ServiceBinding{ - Spec: ServiceBindingSpec{ - Name: "my-binding", - Service: ServiceBindingServiceReference{ - APIVersion: "v1", - Kind: "Secret", - Name: "my-service", - }, - Workload: ServiceBindingWorkloadReference{ - APIVersion: "apps/v1", - Kind: "Deloyment", - Name: "new-workload", - }, - }, - }, - old: &corev1.Pod{}, - expected: field.ErrorList{ - { - Type: field.ErrorTypeInternal, - Field: "", - Detail: "old object must be of type v1.ServiceBinding", - }, - }, - }, } for _, c := range tests { diff --git a/apis/v1/servicebinding_webhook.go b/apis/v1/servicebinding_webhook.go index ebbd2c54..b7072f2c 100644 --- a/apis/v1/servicebinding_webhook.go +++ b/apis/v1/servicebinding_webhook.go @@ -18,34 +18,27 @@ package v1 import ( "context" - "fmt" "github.com/go-logr/logr" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/conversion" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) func (r *ServiceBinding) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). + return ctrl.NewWebhookManagedBy(mgr, r). WithDefaulter(r). WithValidator(r). Complete() } -var _ webhook.CustomDefaulter = &ServiceBinding{} +var _ admission.Defaulter[*ServiceBinding] = &ServiceBinding{} // Default implements webhook.CustomDefaulter so a webhook will be registered for the type -func (r *ServiceBinding) Default(ctx context.Context, obj runtime.Object) error { - r = obj.(*ServiceBinding) - - if r.Spec.Name == "" { - r.Spec.Name = r.Name +func (*ServiceBinding) Default(ctx context.Context, obj *ServiceBinding) error { + if obj.Spec.Name == "" { + obj.Spec.Name = obj.Name } return nil @@ -53,64 +46,45 @@ func (r *ServiceBinding) Default(ctx context.Context, obj runtime.Object) error //+kubebuilder:webhook:path=/validate-servicebinding-io-v1-servicebinding,mutating=false,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=servicebindings,verbs=create;update,versions=v1,name=v1.servicebindings.servicebinding.io,admissionReviewVersions={v1,v1beta1} -var _ webhook.CustomValidator = &ServiceBinding{} +var _ admission.Validator[*ServiceBinding] = &ServiceBinding{} // ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type -func (r *ServiceBinding) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (*ServiceBinding) ValidateCreate(ctx context.Context, obj *ServiceBinding) (admission.Warnings, error) { log := logr.FromContextOrDiscard(ctx) log.V(1).Info("Validating Create") - r = obj.(*ServiceBinding) - - (&ServiceBinding{}).Default(ctx, r) - return nil, r.validate().ToAggregate() + (&ServiceBinding{}).Default(ctx, obj) + return nil, obj.validate().ToAggregate() } // ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type -func (r *ServiceBinding) ValidateUpdate(ctx context.Context, old, obj runtime.Object) (admission.Warnings, error) { +func (*ServiceBinding) ValidateUpdate(ctx context.Context, old, obj *ServiceBinding) (admission.Warnings, error) { log := logr.FromContextOrDiscard(ctx) log.V(1).Info("Validating Update") - r = obj.(*ServiceBinding) - - (&ServiceBinding{}).Default(ctx, r) + (&ServiceBinding{}).Default(ctx, obj) errs := field.ErrorList{} // check immutable fields - var ro *ServiceBinding - if o, ok := old.(*ServiceBinding); ok { - ro = o - } else if o, ok := old.(conversion.Convertible); ok { - ro = &ServiceBinding{} - if err := o.ConvertTo(ro); err != nil { - return nil, err - } - } else { + if obj.Spec.Workload.APIVersion != old.Spec.Workload.APIVersion { errs = append(errs, - field.InternalError(nil, fmt.Errorf("old object must be of type v1.ServiceBinding")), + field.Forbidden(field.NewPath("spec", "workload", "apiVersion"), "Workload apiVersion is immutable. Delete and recreate the ServiceBinding to update."), ) } - if len(errs) == 0 { - if r.Spec.Workload.APIVersion != ro.Spec.Workload.APIVersion { - errs = append(errs, - field.Forbidden(field.NewPath("spec", "workload", "apiVersion"), "Workload apiVersion is immutable. Delete and recreate the ServiceBinding to update."), - ) - } - if r.Spec.Workload.Kind != ro.Spec.Workload.Kind { - errs = append(errs, - field.Forbidden(field.NewPath("spec", "workload", "kind"), "Workload kind is immutable. Delete and recreate the ServiceBinding to update."), - ) - } + if obj.Spec.Workload.Kind != old.Spec.Workload.Kind { + errs = append(errs, + field.Forbidden(field.NewPath("spec", "workload", "kind"), "Workload kind is immutable. Delete and recreate the ServiceBinding to update."), + ) } // validate new object - errs = append(errs, r.validate()...) + errs = append(errs, obj.validate()...) return nil, errs.ToAggregate() } // ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type -func (r *ServiceBinding) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (*ServiceBinding) ValidateDelete(ctx context.Context, obj *ServiceBinding) (admission.Warnings, error) { log := logr.FromContextOrDiscard(ctx) log.V(1).Info("Validating Delete") diff --git a/apis/v1/zz_generated.deepcopy.go b/apis/v1/zz_generated.deepcopy.go index 0cd0edb6..d7765b35 100644 --- a/apis/v1/zz_generated.deepcopy.go +++ b/apis/v1/zz_generated.deepcopy.go @@ -22,7 +22,7 @@ package v1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" + runtime "k8s.io/apimachinery/pkg/runtime" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 85b3ece3..56d277fb 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -6,6 +6,7 @@ metadata: rules: - apiGroups: - "" + - events.k8s.io resources: - events verbs: diff --git a/config/servicebinding-runtime.yaml b/config/servicebinding-runtime.yaml index 70afb1f4..edc722a0 100644 --- a/config/servicebinding-runtime.yaml +++ b/config/servicebinding-runtime.yaml @@ -1213,6 +1213,7 @@ metadata: rules: - apiGroups: - "" + - events.k8s.io resources: - events verbs: diff --git a/controllers/servicebinding_controller.go b/controllers/servicebinding_controller.go index 361c2827..3bb34934 100644 --- a/controllers/servicebinding_controller.go +++ b/controllers/servicebinding_controller.go @@ -40,7 +40,7 @@ import ( //+kubebuilder:rbac:groups=servicebinding.io,resources=servicebindings,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=servicebinding.io,resources=servicebindings/status,verbs=get;update;patch //+kubebuilder:rbac:groups=servicebinding.io,resources=servicebindings/finalizers,verbs=update -//+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=core;events.k8s.io,resources=events,verbs=get;list;watch;create;update;patch;delete // ServiceBindingReconciler reconciles a ServiceBinding object func ServiceBindingReconciler(c reconcilers.Config, hooks lifecycle.ServiceBindingHooks) *reconcilers.ResourceReconciler[*servicebindingv1.ServiceBinding] { diff --git a/controllers/webhook_controller.go b/controllers/webhook_controller.go index c1f62a53..fdc78fbd 100644 --- a/controllers/webhook_controller.go +++ b/controllers/webhook_controller.go @@ -179,7 +179,7 @@ func AdmissionProjectorWebhook(c reconcilers.Config, hooks lifecycle.ServiceBind } //+kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=validatingwebhookconfigurations,verbs=get;list;watch;create;update;patch -//+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=core;events.k8s.io,resources=events,verbs=get;list;watch;create;update;patch;delete // TriggerReconciler reconciles a ValidatingWebhookConfiguration object func TriggerReconciler(c reconcilers.Config, name string, accessChecker rbac.AccessChecker) *reconcilers.AggregateReconciler[*admissionregistrationv1.ValidatingWebhookConfiguration] { diff --git a/go.mod b/go.mod index 0f136b5c..1417017b 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,8 @@ require ( k8s.io/client-go v0.35.0 k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 reconciler.io/dies v0.18.0 - reconciler.io/runtime v0.24.1 - sigs.k8s.io/controller-runtime v0.22.4 + reconciler.io/runtime v0.25.1 + sigs.k8s.io/controller-runtime v0.23.1 sigs.k8s.io/yaml v1.6.0 ) @@ -53,12 +53,12 @@ require ( go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/net v0.47.0 // indirect + golang.org/x/net v0.49.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/term v0.39.0 // indirect + golang.org/x/text v0.33.0 // indirect golang.org/x/time v0.9.0 // indirect gomodules.xyz/jsonpatch/v3 v3.0.1 // indirect gomodules.xyz/orderedmap v0.1.0 // indirect @@ -71,5 +71,5 @@ require ( k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 // indirect ) diff --git a/go.sum b/go.sum index 3897701f..d66c3173 100644 --- a/go.sum +++ b/go.sum @@ -113,26 +113,26 @@ go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gomodules.xyz/jsonpatch/v3 v3.0.1 h1:Te7hKxV52TKCbNYq3t84tzKav3xhThdvSsSp/W89IyI= @@ -167,15 +167,15 @@ k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzk k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= reconciler.io/dies v0.18.0 h1:XY0knxZSjfbgXMOcCL39lqaOSj2tBg3jPwP/FeIoxpg= reconciler.io/dies v0.18.0/go.mod h1:nH3PU3+dJEJ7GBFzslUFKOVbq/Gc0SIGL0Ltlp22/Ks= -reconciler.io/runtime v0.24.1 h1:wY/X1FY1Ondn8gR957nvXEABK1VzvBNJFJs1YqmvLhg= -reconciler.io/runtime v0.24.1/go.mod h1:0gyqgJGaKFoPxUZzqYZHrmUL7PCgbtW9aEOih1aqh3U= -sigs.k8s.io/controller-runtime v0.22.4 h1:GEjV7KV3TY8e+tJ2LCTxUTanW4z/FmNB7l327UfMq9A= -sigs.k8s.io/controller-runtime v0.22.4/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +reconciler.io/runtime v0.25.1 h1:pNUX11zVVb9MVI2R4Dt+WMjxQCIbN/G9na74MzzDF14= +reconciler.io/runtime v0.25.1/go.mod h1:JQBBDtGFZKWmZ9FkhmBcS0sYbZuQdw4hVu3Qtz2hZGI= +sigs.k8s.io/controller-runtime v0.23.1 h1:TjJSM80Nf43Mg21+RCy3J70aj/W6KyvDtOlpKf+PupE= +sigs.k8s.io/controller-runtime v0.23.1/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 h1:2WOzJpHUBVrrkDjU4KBT8n5LDcj824eX0I5UKcgeRUs= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=