From bed5b8aab009b35959f9e08b99fc24212fbd8b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20K=C3=A4stner?= Date: Fri, 27 Mar 2026 18:10:07 +0100 Subject: [PATCH] Upgrade sigs.k8s.io/controller-runtime to v0.23.3 The priority queue is now enabled by default (kubernetes-sigs/controller-runtime#3332), so the explicit UsePriorityQueue: new(true) in cmd/main.go is dropped. The webhook builder API changed to a generic form (kubernetes-sigs/controller-runtime#3360). NewWebhookManagedBy(mgr).For(&T{}) is replaced by NewWebhookManagedBy(mgr, &T{}). Validators are migrated from the deprecated CustomValidator interface with runtime.Object signatures to the typed Validator[T] interface with concrete types, removing the type assertion boilerplate. Test cases for wrong-object-type errors are removed as they are no longer expressible at runtime. The events API changed from k8s.io/client-go/tools/record to k8s.io/client-go/tools/events (kubernetes-sigs/controller-runtime#3262). GetEventRecorderFor is replaced by GetEventRecorder. All controllers and the provisioning server are updated accordingly, and call sites are updated to the new Eventf signature which adds related object and action fields. Tests use the new events.NewFakeRecorder. --- cmd/main.go | 56 +++++++++---------- go.mod | 4 +- go.sum | 8 +-- .../cisco/nx/bordergateway_controller.go | 4 +- internal/controller/cisco/nx/suite_test.go | 4 +- .../controller/cisco/nx/system_controller.go | 4 +- .../cisco/nx/vpcdomain_controller.go | 4 +- internal/controller/core/acl_controller.go | 4 +- internal/controller/core/banner_controller.go | 4 +- internal/controller/core/bgp_controller.go | 4 +- .../controller/core/bgp_peer_controller.go | 4 +- .../controller/core/certificate_controller.go | 4 +- internal/controller/core/device_controller.go | 28 +++++----- internal/controller/core/dns_controller.go | 4 +- .../core/evpninstance_controller.go | 4 +- .../controller/core/interface_controller.go | 4 +- internal/controller/core/isis_controller.go | 4 +- internal/controller/core/lldp_controller.go | 4 +- .../core/managementaccess_controller.go | 4 +- internal/controller/core/ntp_controller.go | 4 +- internal/controller/core/nve_controller.go | 4 +- internal/controller/core/ospf_controller.go | 4 +- internal/controller/core/pim_controller.go | 4 +- .../controller/core/prefixset_controller.go | 4 +- .../core/routingpolicy_controller.go | 4 +- internal/controller/core/snmp_controller.go | 4 +- internal/controller/core/suite_test.go | 4 +- internal/controller/core/syslog_controller.go | 4 +- internal/controller/core/user_controller.go | 4 +- internal/controller/core/vlan_controller.go | 4 +- internal/controller/core/vrf_controller.go | 4 +- internal/provisioning/http.go | 6 +- internal/provisioning/http_test.go | 4 +- .../cisco/nx/v1alpha1/nveconfig_webhook.go | 32 +++-------- .../nx/v1alpha1/nveconfig_webhook_test.go | 5 -- internal/webhook/core/v1alpha1/bgp_webhook.go | 28 +++------- .../webhook/core/v1alpha1/bgppeer_webhook.go | 29 +++------- .../core/v1alpha1/interface_webhook.go | 29 +++------- internal/webhook/core/v1alpha1/nve_webhook.go | 33 +++-------- .../webhook/core/v1alpha1/nve_webhook_test.go | 5 -- .../core/v1alpha1/prefixset_webhook.go | 34 +++-------- internal/webhook/core/v1alpha1/vrf_webhook.go | 27 +++------ 42 files changed, 163 insertions(+), 273 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 465ff78a..07f46c3a 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -213,7 +213,7 @@ func main() { mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Cache: cache.Options{ReaderFailOnMissingInformer: true, DefaultNamespaces: watchNamespaces}, - Controller: config.Controller{UsePriorityQueue: new(true), MaxConcurrentReconciles: maxConcurrentReconciles}, + Controller: config.Controller{MaxConcurrentReconciles: maxConcurrentReconciles}, Scheme: scheme, Metrics: metricsServerOptions, WebhookServer: webhookServer, @@ -276,7 +276,7 @@ func main() { if err := (&corecontroller.DeviceReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("device-controller"), + Recorder: mgr.GetEventRecorder("device-controller"), WatchFilterValue: watchFilterValue, Provider: prov, RequeueInterval: requeueInterval, @@ -288,7 +288,7 @@ func main() { if err := (&corecontroller.InterfaceReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("interface-controller"), + Recorder: mgr.GetEventRecorder("interface-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -301,7 +301,7 @@ func main() { if err := (&corecontroller.BannerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("banner-controller"), + Recorder: mgr.GetEventRecorder("banner-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -313,7 +313,7 @@ func main() { if err := (&corecontroller.UserReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("user-controller"), + Recorder: mgr.GetEventRecorder("user-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -325,7 +325,7 @@ func main() { if err := (&corecontroller.DNSReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("dns-controller"), + Recorder: mgr.GetEventRecorder("dns-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -337,7 +337,7 @@ func main() { if err := (&corecontroller.NTPReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("ntp-controller"), + Recorder: mgr.GetEventRecorder("ntp-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -349,7 +349,7 @@ func main() { if err := (&corecontroller.AccessControlListReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("acl-controller"), + Recorder: mgr.GetEventRecorder("acl-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -361,7 +361,7 @@ func main() { if err := (&corecontroller.CertificateReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("certificate-controller"), + Recorder: mgr.GetEventRecorder("certificate-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -373,7 +373,7 @@ func main() { if err := (&corecontroller.SNMPReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("snmp-controller"), + Recorder: mgr.GetEventRecorder("snmp-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -385,7 +385,7 @@ func main() { if err := (&corecontroller.SyslogReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("syslog-controller"), + Recorder: mgr.GetEventRecorder("syslog-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -397,7 +397,7 @@ func main() { if err := (&corecontroller.ManagementAccessReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("managementaccess-controller"), + Recorder: mgr.GetEventRecorder("managementaccess-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -409,7 +409,7 @@ func main() { if err := (&corecontroller.ISISReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("isis-controller"), + Recorder: mgr.GetEventRecorder("isis-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -422,7 +422,7 @@ func main() { if err := (&corecontroller.PIMReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("pim-controller"), + Recorder: mgr.GetEventRecorder("pim-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -435,7 +435,7 @@ func main() { if err := (&corecontroller.BGPReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("bgp-controller"), + Recorder: mgr.GetEventRecorder("bgp-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -448,7 +448,7 @@ func main() { if err := (&corecontroller.BGPPeerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("bgppeer-controller"), + Recorder: mgr.GetEventRecorder("bgppeer-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -461,7 +461,7 @@ func main() { if err := (&corecontroller.LLDPReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("lldp-controller"), + Recorder: mgr.GetEventRecorder("lldp-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -474,7 +474,7 @@ func main() { if err := (&corecontroller.OSPFReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("ospf-controller"), + Recorder: mgr.GetEventRecorder("ospf-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -487,7 +487,7 @@ func main() { if err := (&corecontroller.VLANReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("vlan-controller"), + Recorder: mgr.GetEventRecorder("vlan-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -500,7 +500,7 @@ func main() { if err := (&corecontroller.VRFReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("vrf-controller"), + Recorder: mgr.GetEventRecorder("vrf-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -513,7 +513,7 @@ func main() { if err := (&nxcontroller.VPCDomainReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("cisco-nx-vpcdomain-controller"), + Recorder: mgr.GetEventRecorder("cisco-nx-vpcdomain-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -526,7 +526,7 @@ func main() { if err := (&corecontroller.NetworkVirtualizationEdgeReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("nve-controller"), + Recorder: mgr.GetEventRecorder("nve-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -539,7 +539,7 @@ func main() { if err := (&nxcontroller.SystemReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("cisco-nx-system-controller"), + Recorder: mgr.GetEventRecorder("cisco-nx-system-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -551,7 +551,7 @@ func main() { if err := (&corecontroller.EVPNInstanceReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("evpn-instance-controller"), + Recorder: mgr.GetEventRecorder("evpn-instance-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -563,7 +563,7 @@ func main() { if err := (&corecontroller.PrefixSetReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("prefixset-controller"), + Recorder: mgr.GetEventRecorder("prefixset-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -575,7 +575,7 @@ func main() { if err := (&corecontroller.RoutingPolicyReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("routingpolicy-controller"), + Recorder: mgr.GetEventRecorder("routingpolicy-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -587,7 +587,7 @@ func main() { if err := (&nxcontroller.BorderGatewayReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("cisco-nx-border-gateway-controller"), + Recorder: mgr.GetEventRecorder("cisco-nx-border-gateway-controller"), WatchFilterValue: watchFilterValue, Provider: prov, Locker: locker, @@ -642,7 +642,7 @@ func main() { provisioningServer := &provisioning.HTTPServer{ Client: mgr.GetClient(), Logger: klog.NewKlogr().WithName("provisioning"), - Recorder: mgr.GetEventRecorderFor("provisioning"), + Recorder: mgr.GetEventRecorder("provisioning"), ValidateSourceIP: provisioningHTTPValidateSourceIP, Provider: provisioningProvider, Port: provisioningHTTPPort, diff --git a/go.mod b/go.mod index a6ebf431..fb8aa548 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( k8s.io/client-go v0.35.0 k8s.io/klog/v2 v2.130.1 rsc.io/script v0.0.2 - sigs.k8s.io/controller-runtime v0.22.4 + sigs.k8s.io/controller-runtime v0.23.3 sigs.k8s.io/yaml v1.6.0 ) @@ -126,5 +126,5 @@ require ( sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // 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.1 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 // indirect ) diff --git a/go.sum b/go.sum index 18e73aef..de5b8841 100644 --- a/go.sum +++ b/go.sum @@ -300,13 +300,13 @@ rsc.io/script v0.0.2 h1:eYoG7A3GFC3z1pRx3A2+s/vZ9LA8cxojHyCvslnj4RI= rsc.io/script v0.0.2/go.mod h1:cKBjCtFBBeZ0cbYFRXkRoxP+xGqhArPa9t3VWhtXfzU= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.22.4 h1:GEjV7KV3TY8e+tJ2LCTxUTanW4z/FmNB7l327UfMq9A= -sigs.k8s.io/controller-runtime v0.22.4/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80= +sigs.k8s.io/controller-runtime v0.23.3/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.1 h1:JrhdFMqOd/+3ByqlP2I45kTOZmTRLBUm5pvRjeheg7E= -sigs.k8s.io/structured-merge-diff/v6 v6.3.1/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= diff --git a/internal/controller/cisco/nx/bordergateway_controller.go b/internal/controller/cisco/nx/bordergateway_controller.go index 51458a45..7fd83c2e 100644 --- a/internal/controller/cisco/nx/bordergateway_controller.go +++ b/internal/controller/cisco/nx/bordergateway_controller.go @@ -16,7 +16,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -47,7 +47,7 @@ type BorderGatewayReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the bordergateway. Provider provider.ProviderFunc diff --git a/internal/controller/cisco/nx/suite_test.go b/internal/controller/cisco/nx/suite_test.go index 406cda5d..6330fbd6 100644 --- a/internal/controller/cisco/nx/suite_test.go +++ b/internal/controller/cisco/nx/suite_test.go @@ -18,7 +18,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" @@ -92,7 +92,7 @@ var _ = BeforeSuite(func() { }) Expect(err).ToNot(HaveOccurred()) - recorder := record.NewFakeRecorder(0) + recorder := events.NewFakeRecorder(0) go func() { for event := range recorder.Events { GinkgoLogr.Info("Event", "event", event) diff --git a/internal/controller/cisco/nx/system_controller.go b/internal/controller/cisco/nx/system_controller.go index 27129133..c82fa0d3 100644 --- a/internal/controller/cisco/nx/system_controller.go +++ b/internal/controller/cisco/nx/system_controller.go @@ -15,7 +15,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -44,7 +44,7 @@ type SystemReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the system. Provider provider.ProviderFunc diff --git a/internal/controller/cisco/nx/vpcdomain_controller.go b/internal/controller/cisco/nx/vpcdomain_controller.go index 115d282e..c28afff9 100644 --- a/internal/controller/cisco/nx/vpcdomain_controller.go +++ b/internal/controller/cisco/nx/vpcdomain_controller.go @@ -16,7 +16,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -49,7 +49,7 @@ type VPCDomainReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the vPC Provider provider.ProviderFunc diff --git a/internal/controller/core/acl_controller.go b/internal/controller/core/acl_controller.go index 47d1b31d..3721f0ef 100644 --- a/internal/controller/core/acl_controller.go +++ b/internal/controller/core/acl_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type AccessControlListReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the accesscontrollist. Provider provider.ProviderFunc diff --git a/internal/controller/core/banner_controller.go b/internal/controller/core/banner_controller.go index 1ccd246a..1a5cdbbf 100644 --- a/internal/controller/core/banner_controller.go +++ b/internal/controller/core/banner_controller.go @@ -18,7 +18,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -48,7 +48,7 @@ type BannerReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the banner. Provider provider.ProviderFunc diff --git a/internal/controller/core/bgp_controller.go b/internal/controller/core/bgp_controller.go index 24fe0f1b..ae3bc009 100644 --- a/internal/controller/core/bgp_controller.go +++ b/internal/controller/core/bgp_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type BGPReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the bgp. Provider provider.ProviderFunc diff --git a/internal/controller/core/bgp_peer_controller.go b/internal/controller/core/bgp_peer_controller.go index 65714394..ef6f19f1 100644 --- a/internal/controller/core/bgp_peer_controller.go +++ b/internal/controller/core/bgp_peer_controller.go @@ -20,7 +20,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -49,7 +49,7 @@ type BGPPeerReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the bgppeer. Provider provider.ProviderFunc diff --git a/internal/controller/core/certificate_controller.go b/internal/controller/core/certificate_controller.go index 12c2e657..0de9650e 100644 --- a/internal/controller/core/certificate_controller.go +++ b/internal/controller/core/certificate_controller.go @@ -18,7 +18,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -48,7 +48,7 @@ type CertificateReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the certificate. Provider provider.ProviderFunc diff --git a/internal/controller/core/device_controller.go b/internal/controller/core/device_controller.go index 1f3c0b7b..cf65b415 100644 --- a/internal/controller/core/device_controller.go +++ b/internal/controller/core/device_controller.go @@ -19,7 +19,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -45,7 +45,7 @@ type DeviceReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the interface. Provider provider.ProviderFunc @@ -138,7 +138,7 @@ func (r *DeviceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ c // Skip provisioning if the provider does not support it. log.Info("Provider does not support provisioning, skipping") obj.Status.Phase = v1alpha1.DevicePhaseFailed - r.Recorder.Event(obj, "Warning", "Unsupported", "Provider does not support provisioning") + r.Recorder.Eventf(obj, nil, "Warning", "Unsupported", "Reconcile", "Provider does not support provisioning") return ctrl.Result{}, reconcile.TerminalError(errors.New("provider does not support provisioning")) } @@ -150,7 +150,7 @@ func (r *DeviceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ c Message: "Device is being provisioned", }) obj.Status.Phase = v1alpha1.DevicePhaseProvisioning - r.Recorder.Event(obj, "Normal", "ProvisioningStarted", "Device provisioning has started") + r.Recorder.Eventf(obj, nil, "Normal", "ProvisioningStarted", "Reconcile", "Device provisioning has started") return ctrl.Result{}, nil case v1alpha1.DevicePhaseProvisioning: @@ -161,7 +161,7 @@ func (r *DeviceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ c } if activeProv.StartTime.Add(time.Hour).After(time.Now()) { obj.Status.Phase = v1alpha1.DevicePhaseFailed - r.Recorder.Event(obj, "Warning", "ProvisioningFailed", "Device provisioning has timed out") + r.Recorder.Eventf(obj, nil, "Warning", "ProvisioningFailed", "Reconcile", "Device provisioning has timed out") return ctrl.Result{}, nil } return ctrl.Result{RequeueAfter: 20 * time.Minute}, nil @@ -185,7 +185,7 @@ func (r *DeviceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ c return ctrl.Result{RequeueAfter: r.RequeueInterval}, nil } activeProv.EndTime = metav1.Now() - r.Recorder.Event(obj, "Normal", "Provisioned", "Device provisioning has completed successfully") + r.Recorder.Eventf(obj, nil, "Normal", "Provisioned", "Reconcile", "Device provisioning has completed successfully") obj.Status.Phase = v1alpha1.DevicePhaseRunning return ctrl.Result{}, nil @@ -332,7 +332,7 @@ func (r *DeviceReconciler) reconcileMaintenance(ctx context.Context, obj *v1alph case v1alpha1.DeviceMaintenanceReboot: // Reboot triggers a device restart. The device remains in its current phase // and will resume normal operation after the reboot completes. - r.Recorder.Event(obj, "Normal", "RebootRequested", "Device reboot has been requested") + r.Recorder.Eventf(obj, nil, "Normal", "RebootRequested", "Maintenance", "Device reboot has been requested") if err := prov.Reboot(ctx, conn); err != nil { conditions.Set(obj, metav1.Condition{ Type: v1alpha1.ReadyCondition, @@ -340,14 +340,14 @@ func (r *DeviceReconciler) reconcileMaintenance(ctx context.Context, obj *v1alph Reason: v1alpha1.MaintenanceFailedReason, Message: fmt.Sprintf("Failed to reboot device: %v", err), }) - r.Recorder.Event(obj, "Warning", "RebootFailed", fmt.Sprintf("Device reboot has failed: %v", err)) + r.Recorder.Eventf(obj, nil, "Warning", "RebootFailed", "Maintenance", "Device reboot has failed: %v", err) return fmt.Errorf("failed to reboot device: %w", err) } case v1alpha1.DeviceMaintenanceFactoryReset: // FactoryReset erases all device configuration and returns it to its original state. // After completion, the device phase is reset to Pending to restart the lifecycle. - r.Recorder.Event(obj, "Normal", "FactoryResetRequested", "Device factory reset has been requested") + r.Recorder.Eventf(obj, nil, "Normal", "FactoryResetRequested", "Maintenance", "Device factory reset has been requested") if err := prov.FactoryReset(ctx, conn); err != nil { conditions.Set(obj, metav1.Condition{ Type: v1alpha1.ReadyCondition, @@ -355,7 +355,7 @@ func (r *DeviceReconciler) reconcileMaintenance(ctx context.Context, obj *v1alph Reason: v1alpha1.MaintenanceFailedReason, Message: fmt.Sprintf("Failed to factory reset device: %v", err), }) - r.Recorder.Event(obj, "Warning", "FactoryResetFailed", fmt.Sprintf("Device factory reset has failed: %v", err)) + r.Recorder.Eventf(obj, nil, "Warning", "FactoryResetFailed", "Maintenance", "Device factory reset has failed: %v", err) return fmt.Errorf("failed to reset device to factory defaults: %w", err) } obj.Status.Phase = v1alpha1.DevicePhasePending @@ -363,7 +363,7 @@ func (r *DeviceReconciler) reconcileMaintenance(ctx context.Context, obj *v1alph case v1alpha1.DeviceMaintenanceReprovision: // Reprovision prepares the device for re-provisioning without a full factory reset. // The provider initiates the provisioning process, then the phase is reset to Pending. - r.Recorder.Event(obj, "Normal", "ReprovisionRequested", "Device reprovisioning has been requested") + r.Recorder.Eventf(obj, nil, "Normal", "ReprovisionRequested", "Maintenance", "Device reprovisioning has been requested") if err := prov.Reprovision(ctx, conn); err != nil { conditions.Set(obj, metav1.Condition{ Type: v1alpha1.ReadyCondition, @@ -371,7 +371,7 @@ func (r *DeviceReconciler) reconcileMaintenance(ctx context.Context, obj *v1alph Reason: v1alpha1.MaintenanceFailedReason, Message: fmt.Sprintf("Failed to prepare device for reprovisioning: %v", err), }) - r.Recorder.Event(obj, "Warning", "ReprovisionFailed", fmt.Sprintf("Device reprovisioning preparation has failed: %v", err)) + r.Recorder.Eventf(obj, nil, "Warning", "ReprovisionFailed", "Maintenance", "Device reprovisioning preparation has failed: %v", err) return fmt.Errorf("failed to prepare device for reprovisioning: %w", err) } obj.Status.Phase = v1alpha1.DevicePhasePending @@ -380,11 +380,11 @@ func (r *DeviceReconciler) reconcileMaintenance(ctx context.Context, obj *v1alph // Reset phase is a soft reset that only changes the device phase to Pending without // performing any device-side operations. This is useful for recovering from terminal // states (e.g., Failed) after manual intervention. - r.Recorder.Event(obj, "Normal", "PhaseReset", "Device phase has been reset to Pending") + r.Recorder.Eventf(obj, nil, "Normal", "PhaseReset", "Maintenance", "Device phase has been reset to Pending") obj.Status.Phase = v1alpha1.DevicePhasePending default: - r.Recorder.Event(obj, "Warning", "UnknownMaintenanceAction", "Unknown maintenance action: %s"+action) + r.Recorder.Eventf(obj, nil, "Warning", "UnknownMaintenanceAction", "Maintenance", "Unknown maintenance action: %s", action) return fmt.Errorf("unknown maintenance action: %s", action) } diff --git a/internal/controller/core/dns_controller.go b/internal/controller/core/dns_controller.go index c84ffaf3..493714a5 100644 --- a/internal/controller/core/dns_controller.go +++ b/internal/controller/core/dns_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type DNSReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the dns. Provider provider.ProviderFunc diff --git a/internal/controller/core/evpninstance_controller.go b/internal/controller/core/evpninstance_controller.go index d2191a76..657be311 100644 --- a/internal/controller/core/evpninstance_controller.go +++ b/internal/controller/core/evpninstance_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type EVPNInstanceReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the evpninstance. Provider provider.ProviderFunc diff --git a/internal/controller/core/interface_controller.go b/internal/controller/core/interface_controller.go index d47932f3..fc7d55a8 100644 --- a/internal/controller/core/interface_controller.go +++ b/internal/controller/core/interface_controller.go @@ -19,7 +19,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -48,7 +48,7 @@ type InterfaceReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the interface. Provider provider.ProviderFunc diff --git a/internal/controller/core/isis_controller.go b/internal/controller/core/isis_controller.go index 8b0df54e..6ba5b72f 100644 --- a/internal/controller/core/isis_controller.go +++ b/internal/controller/core/isis_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type ISISReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the isis. Provider provider.ProviderFunc diff --git a/internal/controller/core/lldp_controller.go b/internal/controller/core/lldp_controller.go index 56424786..4d1d9923 100644 --- a/internal/controller/core/lldp_controller.go +++ b/internal/controller/core/lldp_controller.go @@ -19,7 +19,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -48,7 +48,7 @@ type LLDPReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the LLDP. Provider provider.ProviderFunc diff --git a/internal/controller/core/managementaccess_controller.go b/internal/controller/core/managementaccess_controller.go index c9924be7..9856c242 100644 --- a/internal/controller/core/managementaccess_controller.go +++ b/internal/controller/core/managementaccess_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type ManagementAccessReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the managementaccess. Provider provider.ProviderFunc diff --git a/internal/controller/core/ntp_controller.go b/internal/controller/core/ntp_controller.go index d0a43417..a20e9c03 100644 --- a/internal/controller/core/ntp_controller.go +++ b/internal/controller/core/ntp_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type NTPReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the ntp. Provider provider.ProviderFunc diff --git a/internal/controller/core/nve_controller.go b/internal/controller/core/nve_controller.go index e2f55f3d..ddd9fa92 100644 --- a/internal/controller/core/nve_controller.go +++ b/internal/controller/core/nve_controller.go @@ -19,7 +19,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -48,7 +48,7 @@ type NetworkVirtualizationEdgeReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the dns. Provider provider.ProviderFunc diff --git a/internal/controller/core/ospf_controller.go b/internal/controller/core/ospf_controller.go index 86e70c6b..4e828289 100644 --- a/internal/controller/core/ospf_controller.go +++ b/internal/controller/core/ospf_controller.go @@ -20,7 +20,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -49,7 +49,7 @@ type OSPFReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the ospf. Provider provider.ProviderFunc diff --git a/internal/controller/core/pim_controller.go b/internal/controller/core/pim_controller.go index b444b288..95fd9f0d 100644 --- a/internal/controller/core/pim_controller.go +++ b/internal/controller/core/pim_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type PIMReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the pim. Provider provider.ProviderFunc diff --git a/internal/controller/core/prefixset_controller.go b/internal/controller/core/prefixset_controller.go index 9ee8299c..3634bf43 100644 --- a/internal/controller/core/prefixset_controller.go +++ b/internal/controller/core/prefixset_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type PrefixSetReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the prefixset. Provider provider.ProviderFunc diff --git a/internal/controller/core/routingpolicy_controller.go b/internal/controller/core/routingpolicy_controller.go index 6faa037a..fb90023e 100644 --- a/internal/controller/core/routingpolicy_controller.go +++ b/internal/controller/core/routingpolicy_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type RoutingPolicyReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the routingpolicy. Provider provider.ProviderFunc diff --git a/internal/controller/core/snmp_controller.go b/internal/controller/core/snmp_controller.go index f01fbf3f..74f71398 100644 --- a/internal/controller/core/snmp_controller.go +++ b/internal/controller/core/snmp_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type SNMPReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the snmp. Provider provider.ProviderFunc diff --git a/internal/controller/core/suite_test.go b/internal/controller/core/suite_test.go index ae664b61..bee5e525 100644 --- a/internal/controller/core/suite_test.go +++ b/internal/controller/core/suite_test.go @@ -21,7 +21,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" @@ -90,7 +90,7 @@ var _ = BeforeSuite(func() { }) Expect(err).ToNot(HaveOccurred()) - recorder := record.NewFakeRecorder(0) + recorder := events.NewFakeRecorder(0) go func() { for event := range recorder.Events { GinkgoLogr.Info("Event", "event", event) diff --git a/internal/controller/core/syslog_controller.go b/internal/controller/core/syslog_controller.go index 44baaead..fee1c4a7 100644 --- a/internal/controller/core/syslog_controller.go +++ b/internal/controller/core/syslog_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type SyslogReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the syslog. Provider provider.ProviderFunc diff --git a/internal/controller/core/user_controller.go b/internal/controller/core/user_controller.go index 81295fd3..a3310821 100644 --- a/internal/controller/core/user_controller.go +++ b/internal/controller/core/user_controller.go @@ -18,7 +18,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -48,7 +48,7 @@ type UserReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the user. Provider provider.ProviderFunc diff --git a/internal/controller/core/vlan_controller.go b/internal/controller/core/vlan_controller.go index 9fbbec75..43f7a76f 100644 --- a/internal/controller/core/vlan_controller.go +++ b/internal/controller/core/vlan_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type VLANReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the vlan. Provider provider.ProviderFunc diff --git a/internal/controller/core/vrf_controller.go b/internal/controller/core/vrf_controller.go index 8d763d96..06844c05 100644 --- a/internal/controller/core/vrf_controller.go +++ b/internal/controller/core/vrf_controller.go @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -46,7 +46,7 @@ type VRFReconciler struct { // Recorder is used to record events for the controller. // More info: https://book.kubebuilder.io/reference/raising-events - Recorder record.EventRecorder + Recorder events.EventRecorder // Provider is the driver that will be used to create & delete the isis. Provider provider.ProviderFunc diff --git a/internal/provisioning/http.go b/internal/provisioning/http.go index 8a9eefaf..fdc876be 100644 --- a/internal/provisioning/http.go +++ b/internal/provisioning/http.go @@ -14,7 +14,7 @@ import ( "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/client" @@ -89,7 +89,7 @@ type HTTPServer struct { Client client.Client Logger klog.Logger Mux *http.ServeMux - Recorder record.EventRecorder + Recorder events.EventRecorder ValidateSourceIP bool Provider provider.ProvisioningProvider Port int @@ -216,7 +216,7 @@ func (s *HTTPServer) HandleStatusReport(w http.ResponseWriter, r *http.Request) act.Error = report.Detail } - s.Recorder.Eventf(device, "Normal", "Provisioning", "%s: %s", report.Status, report.Detail) + s.Recorder.Eventf(device, nil, "Normal", "Provisioning", "StatusReport", "%s: %s", report.Status, report.Detail) if err := s.Client.Status().Update(ctx, device); err != nil { s.Logger.Error(err, "Failed to update device status", "device", device.Name) diff --git a/internal/provisioning/http_test.go b/internal/provisioning/http_test.go index 361ef84e..2eee0a12 100644 --- a/internal/provisioning/http_test.go +++ b/internal/provisioning/http_test.go @@ -20,7 +20,7 @@ import ( "k8s.io/apimachinery/pkg/types" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -358,7 +358,7 @@ func TestHandleStatusReport(t *testing.T) { server := &HTTPServer{ Client: k8sClient, Logger: klog.NewKlogr(), - Recorder: record.NewFakeRecorder(10), + Recorder: events.NewFakeRecorder(10), } rr := httptest.NewRecorder() diff --git a/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook.go b/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook.go index 80bc24fe..e99271b5 100644 --- a/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook.go +++ b/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook.go @@ -9,11 +9,9 @@ import ( "fmt" "slices" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/ironcore-dev/network-operator/api/cisco/nx/v1alpha1" @@ -24,8 +22,7 @@ var vclog = logf.Log.WithName("networkvirtualizationedgeconfig-resource") // SetupNetworkVirtualizationEdgeConfigWebhookWithManager registers the webhook for NetworkVirtualizationEdge in the manager. func SetupNetworkVirtualizationEdgeConfigWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&v1alpha1.NetworkVirtualizationEdgeConfig{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.NetworkVirtualizationEdgeConfig{}). WithValidator(&NetworkVirtualizationEdgeConfigCustomValidator{Client: mgr.GetClient()}). Complete() } @@ -38,37 +35,24 @@ type NetworkVirtualizationEdgeConfigCustomValidator struct { Client client.Client } -var _ webhook.CustomValidator = &NetworkVirtualizationEdgeConfigCustomValidator{} +var _ admission.Validator[*v1alpha1.NetworkVirtualizationEdgeConfig] = &NetworkVirtualizationEdgeConfigCustomValidator{} -// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type NetworkVirtualizationEdgeConfig. -func (v *NetworkVirtualizationEdgeConfigCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) { - vc, ok := obj.(*v1alpha1.NetworkVirtualizationEdgeConfig) - if !ok { - return nil, fmt.Errorf("expected a NetworkVirtualizationEdgeConfig object but got %T", obj) - } +// ValidateCreate implements admission.Validator so a webhook will be registered for the type NetworkVirtualizationEdgeConfig. +func (v *NetworkVirtualizationEdgeConfigCustomValidator) ValidateCreate(_ context.Context, vc *v1alpha1.NetworkVirtualizationEdgeConfig) (admission.Warnings, error) { vclog.Info("Validation for NetworkVirtualizationEdgeConfig upon creation", "name", vc.GetName()) return nil, validateNetworkVirtualizationEdgeConfigSpec(vc) } -// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type NetworkVirtualizationEdgeConfig. -func (v *NetworkVirtualizationEdgeConfigCustomValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - vc, ok := newObj.(*v1alpha1.NetworkVirtualizationEdgeConfig) - - if !ok { - return nil, fmt.Errorf("expected a NetworkVirtualizationEdgeConfig object for the newObj but got %T", newObj) - } +// ValidateUpdate implements admission.Validator so a webhook will be registered for the type NetworkVirtualizationEdgeConfig. +func (v *NetworkVirtualizationEdgeConfigCustomValidator) ValidateUpdate(_ context.Context, _, vc *v1alpha1.NetworkVirtualizationEdgeConfig) (admission.Warnings, error) { vclog.Info("Validation for NetworkVirtualizationEdgeConfig upon update", "name", vc.GetName()) return nil, validateNetworkVirtualizationEdgeConfigSpec(vc) } -// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type NetworkVirtualizationEdgeConfig. -func (v *NetworkVirtualizationEdgeConfigCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - _, ok := obj.(*v1alpha1.NetworkVirtualizationEdgeConfig) - if !ok { - return nil, fmt.Errorf("expected a NetworkVirtualizationEdgeConfig object but got %T", obj) - } +// ValidateDelete implements admission.Validator so a webhook will be registered for the type NetworkVirtualizationEdgeConfig. +func (v *NetworkVirtualizationEdgeConfigCustomValidator) ValidateDelete(_ context.Context, _ *v1alpha1.NetworkVirtualizationEdgeConfig) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook_test.go b/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook_test.go index 47f658ed..53d75779 100644 --- a/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook_test.go +++ b/internal/webhook/cisco/nx/v1alpha1/nveconfig_webhook_test.go @@ -111,10 +111,5 @@ var _ = Describe("NetworkVirtualizationEdgeConfig Webhook", func() { _, err := validator.ValidateDelete(ctx, obj) Expect(err).NotTo(HaveOccurred()) }) - - It("rejects delete when object type is wrong", func() { - _, err := validator.ValidateDelete(ctx, &nxv1alpha1.NetworkVirtualizationEdgeConfigList{}) - Expect(err).To(HaveOccurred()) - }) }) }) diff --git a/internal/webhook/core/v1alpha1/bgp_webhook.go b/internal/webhook/core/v1alpha1/bgp_webhook.go index 69d8c96c..0a09d030 100644 --- a/internal/webhook/core/v1alpha1/bgp_webhook.go +++ b/internal/webhook/core/v1alpha1/bgp_webhook.go @@ -10,11 +10,9 @@ import ( "strconv" "strings" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/ironcore-dev/network-operator/api/core/v1alpha1" @@ -25,7 +23,7 @@ var bgplog = logf.Log.WithName("bgp-resource") // SetupBGPWebhookWithManager registers the webhook for BGP in the manager. func SetupBGPWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&v1alpha1.BGP{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.BGP{}). WithValidator(&BGPCustomValidator{}). Complete() } @@ -36,34 +34,24 @@ func SetupBGPWebhookWithManager(mgr ctrl.Manager) error { // when it is created, updated, or deleted. type BGPCustomValidator struct{} -var _ webhook.CustomValidator = &BGPCustomValidator{} - -// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type BGP. -func (v *BGPCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) { - bgp, ok := obj.(*v1alpha1.BGP) - if !ok { - return nil, fmt.Errorf("expected a BGP object but got %T", obj) - } +var _ admission.Validator[*v1alpha1.BGP] = &BGPCustomValidator{} +// ValidateCreate implements admission.Validator so a webhook will be registered for the type BGP. +func (v *BGPCustomValidator) ValidateCreate(_ context.Context, bgp *v1alpha1.BGP) (admission.Warnings, error) { bgplog.Info("Validation for BGP upon creation", "name", bgp.GetName()) return nil, validateASNumber(bgp.Spec.ASNumber) } -// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type BGP. -func (v *BGPCustomValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - bgp, ok := newObj.(*v1alpha1.BGP) - if !ok { - return nil, fmt.Errorf("expected a BGP object for the newObj but got %T", newObj) - } - +// ValidateUpdate implements admission.Validator so a webhook will be registered for the type BGP. +func (v *BGPCustomValidator) ValidateUpdate(_ context.Context, _, bgp *v1alpha1.BGP) (admission.Warnings, error) { bgplog.Info("Validation for BGP upon update", "name", bgp.GetName()) return nil, validateASNumber(bgp.Spec.ASNumber) } -// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type BGP. -func (v *BGPCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +// ValidateDelete implements admission.Validator so a webhook will be registered for the type BGP. +func (v *BGPCustomValidator) ValidateDelete(_ context.Context, _ *v1alpha1.BGP) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhook/core/v1alpha1/bgppeer_webhook.go b/internal/webhook/core/v1alpha1/bgppeer_webhook.go index 2363ffae..941f8aae 100644 --- a/internal/webhook/core/v1alpha1/bgppeer_webhook.go +++ b/internal/webhook/core/v1alpha1/bgppeer_webhook.go @@ -5,12 +5,9 @@ package v1alpha1 import ( "context" - "fmt" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/ironcore-dev/network-operator/api/core/v1alpha1" @@ -21,7 +18,7 @@ var bgppeerlog = logf.Log.WithName("bgppeer-resource") // SetupBGPPeerWebhookWithManager registers the webhook for BGPPeer in the manager. func SetupBGPPeerWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&v1alpha1.BGPPeer{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.BGPPeer{}). WithValidator(&BGPPeerCustomValidator{}). Complete() } @@ -32,33 +29,23 @@ func SetupBGPPeerWebhookWithManager(mgr ctrl.Manager) error { // when it is created, updated, or deleted. type BGPPeerCustomValidator struct{} -var _ webhook.CustomValidator = &BGPPeerCustomValidator{} - -// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type BGPPeer. -func (v *BGPPeerCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) { - bgppeer, ok := obj.(*v1alpha1.BGPPeer) - if !ok { - return nil, fmt.Errorf("expected a BGPPeer object but got %T", obj) - } +var _ admission.Validator[*v1alpha1.BGPPeer] = &BGPPeerCustomValidator{} +// ValidateCreate implements admission.Validator so a webhook will be registered for the type BGPPeer. +func (v *BGPPeerCustomValidator) ValidateCreate(_ context.Context, bgppeer *v1alpha1.BGPPeer) (admission.Warnings, error) { bgppeerlog.Info("Validation for BGPPeer upon creation", "name", bgppeer.GetName()) return nil, validateASNumber(bgppeer.Spec.ASNumber) } -// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type BGPPeer. -func (v *BGPPeerCustomValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - bgppeer, ok := newObj.(*v1alpha1.BGPPeer) - if !ok { - return nil, fmt.Errorf("expected a BGPPeer object for the newObj but got %T", newObj) - } - +// ValidateUpdate implements admission.Validator so a webhook will be registered for the type BGPPeer. +func (v *BGPPeerCustomValidator) ValidateUpdate(_ context.Context, _, bgppeer *v1alpha1.BGPPeer) (admission.Warnings, error) { bgppeerlog.Info("Validation for BGPPeer upon update", "name", bgppeer.GetName()) return nil, validateASNumber(bgppeer.Spec.ASNumber) } -// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type BGPPeer. -func (v *BGPPeerCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +// ValidateDelete implements admission.Validator so a webhook will be registered for the type BGPPeer. +func (v *BGPPeerCustomValidator) ValidateDelete(_ context.Context, _ *v1alpha1.BGPPeer) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhook/core/v1alpha1/interface_webhook.go b/internal/webhook/core/v1alpha1/interface_webhook.go index 9fab6cf5..245aa4a9 100644 --- a/internal/webhook/core/v1alpha1/interface_webhook.go +++ b/internal/webhook/core/v1alpha1/interface_webhook.go @@ -8,10 +8,8 @@ import ( "errors" "fmt" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/ironcore-dev/network-operator/api/core/v1alpha1" @@ -22,8 +20,7 @@ var interfacelog = logf.Log.WithName("interface-resource") // SetupInterfaceWebhookWithManager registers the webhook for Interfaces in the manager. func SetupInterfaceWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&v1alpha1.Interface{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.Interface{}). WithValidator(&InterfaceCustomValidator{}). Complete() } @@ -34,34 +31,24 @@ func SetupInterfaceWebhookWithManager(mgr ctrl.Manager) error { // when it is created, updated, or deleted. type InterfaceCustomValidator struct{} -var _ webhook.CustomValidator = &InterfaceCustomValidator{} - -// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type Interface. -func (v *InterfaceCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) { - intf, ok := obj.(*v1alpha1.Interface) - if !ok { - return nil, fmt.Errorf("expected a Interfaces object but got %T", obj) - } +var _ admission.Validator[*v1alpha1.Interface] = &InterfaceCustomValidator{} +// ValidateCreate implements admission.Validator so a webhook will be registered for the type Interface. +func (v *InterfaceCustomValidator) ValidateCreate(_ context.Context, intf *v1alpha1.Interface) (admission.Warnings, error) { interfacelog.Info("Validation for Interfaces upon creation", "name", intf.GetName()) return nil, validateInterfaceSpec(intf) } -// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type Interface. -func (v *InterfaceCustomValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - intf, ok := newObj.(*v1alpha1.Interface) - if !ok { - return nil, fmt.Errorf("expected a Interfaces object for the newObj but got %T", newObj) - } - +// ValidateUpdate implements admission.Validator so a webhook will be registered for the type Interface. +func (v *InterfaceCustomValidator) ValidateUpdate(_ context.Context, _, intf *v1alpha1.Interface) (admission.Warnings, error) { interfacelog.Info("Validation for Interfaces upon update", "name", intf.GetName()) return nil, validateInterfaceSpec(intf) } -// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type Interface. -func (v *InterfaceCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +// ValidateDelete implements admission.Validator so a webhook will be registered for the type Interface. +func (v *InterfaceCustomValidator) ValidateDelete(_ context.Context, _ *v1alpha1.Interface) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhook/core/v1alpha1/nve_webhook.go b/internal/webhook/core/v1alpha1/nve_webhook.go index 62bbc1cb..6960ff64 100644 --- a/internal/webhook/core/v1alpha1/nve_webhook.go +++ b/internal/webhook/core/v1alpha1/nve_webhook.go @@ -6,14 +6,11 @@ package v1alpha1 import ( "context" "errors" - "fmt" "net/netip" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/ironcore-dev/network-operator/api/core/v1alpha1" @@ -24,8 +21,7 @@ var nvelog = logf.Log.WithName("networkvirtualizationedge-resource") // SetupNetworkVirtualizationEdgeWebhookWithManager registers the webhook for NetworkVirtualizationEdge in the manager. func SetupNetworkVirtualizationEdgeWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&v1alpha1.NetworkVirtualizationEdge{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.NetworkVirtualizationEdge{}). WithValidator(&NetworkVirtualizationEdgeCustomValidator{mgr.GetClient()}). Complete() } @@ -37,37 +33,24 @@ type NetworkVirtualizationEdgeCustomValidator struct { Client client.Client } -var _ webhook.CustomValidator = &NetworkVirtualizationEdgeCustomValidator{} +var _ admission.Validator[*v1alpha1.NetworkVirtualizationEdge] = &NetworkVirtualizationEdgeCustomValidator{} -// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type NetworkVirtualizationEdge. -func (v *NetworkVirtualizationEdgeCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) { - nve, ok := obj.(*v1alpha1.NetworkVirtualizationEdge) - if !ok { - return nil, fmt.Errorf("expected a NetworkVirtualizationEdge object but got %T", obj) - } +// ValidateCreate implements admission.Validator so a webhook will be registered for the type NetworkVirtualizationEdge. +func (v *NetworkVirtualizationEdgeCustomValidator) ValidateCreate(_ context.Context, nve *v1alpha1.NetworkVirtualizationEdge) (admission.Warnings, error) { nvelog.Info("Validation for NetworkVirtualizationEdge upon creation", "name", nve.GetName()) return nil, v.validateNetworkVirtualizationEdgeSpec(nve) } -// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type NetworkVirtualizationEdge . -func (v *NetworkVirtualizationEdgeCustomValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - nve, ok := newObj.(*v1alpha1.NetworkVirtualizationEdge) - if !ok { - return nil, fmt.Errorf("expected a NetworkVirtualizationEdge object for the newObj but got %T", newObj) - } +// ValidateUpdate implements admission.Validator so a webhook will be registered for the type NetworkVirtualizationEdge. +func (v *NetworkVirtualizationEdgeCustomValidator) ValidateUpdate(_ context.Context, _, nve *v1alpha1.NetworkVirtualizationEdge) (admission.Warnings, error) { nvelog.Info("Validation for NetworkVirtualizationEdge upon update", "name", nve.GetName()) return nil, v.validateNetworkVirtualizationEdgeSpec(nve) } -// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type NetworkVirtualizationEdge. -func (v *NetworkVirtualizationEdgeCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - _, ok := obj.(*v1alpha1.NetworkVirtualizationEdge) - if !ok { - return nil, fmt.Errorf("expected a NetworkVirtualizationEdge object but got %T", obj) - } - +// ValidateDelete implements admission.Validator so a webhook will be registered for the type NetworkVirtualizationEdge. +func (v *NetworkVirtualizationEdgeCustomValidator) ValidateDelete(_ context.Context, _ *v1alpha1.NetworkVirtualizationEdge) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhook/core/v1alpha1/nve_webhook_test.go b/internal/webhook/core/v1alpha1/nve_webhook_test.go index 4d933b97..03bd5edc 100644 --- a/internal/webhook/core/v1alpha1/nve_webhook_test.go +++ b/internal/webhook/core/v1alpha1/nve_webhook_test.go @@ -106,10 +106,5 @@ var _ = Describe("NetworkVirtualizationEdge Webhook", func() { _, err := validator.ValidateDelete(ctx, obj) Expect(err).ToNot(HaveOccurred()) }) - - It("rejects delete when object type is wrong", func() { - _, err := validator.ValidateDelete(ctx, &corev1alpha1.NetworkVirtualizationEdgeList{}) - Expect(err).To(HaveOccurred()) - }) }) }) diff --git a/internal/webhook/core/v1alpha1/prefixset_webhook.go b/internal/webhook/core/v1alpha1/prefixset_webhook.go index 6a754982..2a0b7b97 100644 --- a/internal/webhook/core/v1alpha1/prefixset_webhook.go +++ b/internal/webhook/core/v1alpha1/prefixset_webhook.go @@ -8,10 +8,8 @@ import ( "errors" "fmt" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/ironcore-dev/network-operator/api/core/v1alpha1" @@ -22,8 +20,7 @@ var prefixsetlog = logf.Log.WithName("prefixset-resource") // SetupPrefixSetWebhookWithManager registers the webhook for PrefixSets in the manager. func SetupPrefixSetWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&v1alpha1.PrefixSet{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.PrefixSet{}). WithValidator(&PrefixSetCustomValidator{}). Complete() } @@ -34,32 +31,17 @@ func SetupPrefixSetWebhookWithManager(mgr ctrl.Manager) error { // when it is created, updated, or deleted. type PrefixSetCustomValidator struct{} -var _ webhook.CustomValidator = &PrefixSetCustomValidator{} - -// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type PrefixSet. -func (v *PrefixSetCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) { - ps, ok := obj.(*v1alpha1.PrefixSet) - if !ok { - return nil, fmt.Errorf("expected a PrefixSets object but got %T", obj) - } +var _ admission.Validator[*v1alpha1.PrefixSet] = &PrefixSetCustomValidator{} +// ValidateCreate implements admission.Validator so a webhook will be registered for the type PrefixSet. +func (v *PrefixSetCustomValidator) ValidateCreate(_ context.Context, ps *v1alpha1.PrefixSet) (admission.Warnings, error) { prefixsetlog.Info("Validation for PrefixSets upon creation", "name", ps.GetName()) return nil, validatePrefixSetSpec(ps) } -// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type PrefixSet. -func (v *PrefixSetCustomValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - prev, ok := oldObj.(*v1alpha1.PrefixSet) - if !ok { - return nil, fmt.Errorf("expected a PrefixSets object for the oldObj but got %T", oldObj) - } - - curr, ok := newObj.(*v1alpha1.PrefixSet) - if !ok { - return nil, fmt.Errorf("expected a PrefixSets object for the newObj but got %T", newObj) - } - +// ValidateUpdate implements admission.Validator so a webhook will be registered for the type PrefixSet. +func (v *PrefixSetCustomValidator) ValidateUpdate(_ context.Context, prev, curr *v1alpha1.PrefixSet) (admission.Warnings, error) { prefixsetlog.Info("Validation for PrefixSets upon update", "name", curr.GetName()) if err := validatePrefixSetSpec(curr); err != nil { @@ -73,8 +55,8 @@ func (v *PrefixSetCustomValidator) ValidateUpdate(_ context.Context, oldObj, new return nil, nil } -// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type PrefixSet. -func (v *PrefixSetCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +// ValidateDelete implements admission.Validator so a webhook will be registered for the type PrefixSet. +func (v *PrefixSetCustomValidator) ValidateDelete(_ context.Context, _ *v1alpha1.PrefixSet) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhook/core/v1alpha1/vrf_webhook.go b/internal/webhook/core/v1alpha1/vrf_webhook.go index 5a48b7ee..d66c9f1a 100644 --- a/internal/webhook/core/v1alpha1/vrf_webhook.go +++ b/internal/webhook/core/v1alpha1/vrf_webhook.go @@ -12,10 +12,8 @@ import ( "strconv" "strings" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/ironcore-dev/network-operator/api/core/v1alpha1" @@ -26,8 +24,7 @@ var vrflog = logf.Log.WithName("vrf-resource") // SetupVRFWebhookWithManager registers the webhook for VRF in the manager. func SetupVRFWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&v1alpha1.VRF{}). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.VRF{}). WithValidator(&VRFCustomValidator{}). Complete() } @@ -38,32 +35,24 @@ func SetupVRFWebhookWithManager(mgr ctrl.Manager) error { // when it is created, updated, or deleted. type VRFCustomValidator struct{} -var _ webhook.CustomValidator = &VRFCustomValidator{} +var _ admission.Validator[*v1alpha1.VRF] = &VRFCustomValidator{} -// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type VRF. -func (v *VRFCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) { - vrf, ok := obj.(*v1alpha1.VRF) - if !ok { - return nil, fmt.Errorf("expected a VRF object but got %T", obj) - } +// ValidateCreate implements admission.Validator so a webhook will be registered for the type VRF. +func (v *VRFCustomValidator) ValidateCreate(_ context.Context, vrf *v1alpha1.VRF) (admission.Warnings, error) { vrflog.Info("Validation for VRF upon creation", "name", vrf.GetName()) return nil, validateVRFSpec(vrf) } -// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type VRF. -func (v *VRFCustomValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - vrf, ok := newObj.(*v1alpha1.VRF) - if !ok { - return nil, fmt.Errorf("expected a VRF object for the newObj but got %T", newObj) - } +// ValidateUpdate implements admission.Validator so a webhook will be registered for the type VRF. +func (v *VRFCustomValidator) ValidateUpdate(_ context.Context, _, vrf *v1alpha1.VRF) (admission.Warnings, error) { vrflog.Info("Validation for VRF upon update", "name", vrf.GetName()) return nil, validateVRFSpec(vrf) } -// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type VRF. -func (v *VRFCustomValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +// ValidateDelete implements admission.Validator so a webhook will be registered for the type VRF. +func (v *VRFCustomValidator) ValidateDelete(_ context.Context, _ *v1alpha1.VRF) (admission.Warnings, error) { return nil, nil }