diff --git a/pkg/controllers/mcs/endpointslice_controller.go b/pkg/controllers/mcs/endpointslice_controller.go index 73eb0e702..189e10ec0 100644 --- a/pkg/controllers/mcs/endpointslice_controller.go +++ b/pkg/controllers/mcs/endpointslice_controller.go @@ -8,7 +8,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" "k8s.io/klog/v2" controllerruntime "sigs.k8s.io/controller-runtime" @@ -88,8 +87,8 @@ func (c *EndpointSliceController) collectEndpointSliceFromWork(work *workv1alpha return controllerruntime.Result{Requeue: true}, err } - endpointSlice := &discoveryv1beta1.EndpointSlice{} - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), endpointSlice); err != nil { + endpointSlice, err := helper.ConvertToEndpointSlice(unstructObj) + if err != nil { klog.Errorf("failed to convert unstructured to typed object: %v", err) return controllerruntime.Result{Requeue: true}, err } diff --git a/pkg/controllers/status/cluster_status_controller.go b/pkg/controllers/status/cluster_status_controller.go index 3b2b35f2e..a733adbad 100644 --- a/pkg/controllers/status/cluster_status_controller.go +++ b/pkg/controllers/status/cluster_status_controller.go @@ -29,6 +29,7 @@ import ( clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1" "github.com/karmada-io/karmada/pkg/util" + "github.com/karmada-io/karmada/pkg/util/helper" "github.com/karmada-io/karmada/pkg/util/informermanager" ) @@ -454,9 +455,8 @@ func getResourceSummary(nodes []*corev1.Node, pods []*corev1.Pod) *clusterv1alph func convertObjectsToNodes(nodeList []runtime.Object) ([]*corev1.Node, error) { nodes := make([]*corev1.Node, 0, len(nodeList)) for _, obj := range nodeList { - unstructObj := obj.(*unstructured.Unstructured) - node := &corev1.Node{} - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), node); err != nil { + node, err := helper.ConvertToNode(obj.(*unstructured.Unstructured)) + if err != nil { return nil, fmt.Errorf("failed to convert unstructured to typed object: %v", err) } nodes = append(nodes, node) @@ -467,9 +467,8 @@ func convertObjectsToNodes(nodeList []runtime.Object) ([]*corev1.Node, error) { func convertObjectsToPods(podList []runtime.Object) ([]*corev1.Pod, error) { pods := make([]*corev1.Pod, 0, len(podList)) for _, obj := range podList { - unstructObj := obj.(*unstructured.Unstructured) - pod := &corev1.Pod{} - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), pod); err != nil { + pod, err := helper.ConvertToPod(obj.(*unstructured.Unstructured)) + if err != nil { return nil, fmt.Errorf("failed to convert unstructured to typed object: %v", err) } pods = append(pods, pod) diff --git a/pkg/util/helper/unstructured.go b/pkg/util/helper/unstructured.go index 31e2eeee0..c629b5e09 100644 --- a/pkg/util/helper/unstructured.go +++ b/pkg/util/helper/unstructured.go @@ -4,6 +4,7 @@ import ( appsv1 "k8s.io/api/apps/v1" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" + discoveryv1beta1 "k8s.io/api/discovery/v1beta1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -51,6 +52,16 @@ func ConvertToPod(obj *unstructured.Unstructured) (*corev1.Pod, error) { return typedObj, nil } +// ConvertToNode converts a Node object from unstructured to typed. +func ConvertToNode(obj *unstructured.Unstructured) (*corev1.Node, error) { + typedObj := &corev1.Node{} + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.UnstructuredContent(), typedObj); err != nil { + return nil, err + } + + return typedObj, nil +} + // ConvertToReplicaSet converts a ReplicaSet object from unstructured to typed. func ConvertToReplicaSet(obj *unstructured.Unstructured) (*appsv1.ReplicaSet, error) { typedObj := &appsv1.ReplicaSet{} @@ -100,3 +111,13 @@ func ConvertToJob(obj *unstructured.Unstructured) (*batchv1.Job, error) { return typedObj, nil } + +// ConvertToEndpointSlice converts a EndpointSlice object from unstructured to typed. +func ConvertToEndpointSlice(obj *unstructured.Unstructured) (*discoveryv1beta1.EndpointSlice, error) { + typedObj := &discoveryv1beta1.EndpointSlice{} + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.UnstructuredContent(), typedObj); err != nil { + return nil, err + } + + return typedObj, nil +} diff --git a/pkg/webhook/work/mutating.go b/pkg/webhook/work/mutating.go index ca3ca8764..73fead453 100644 --- a/pkg/webhook/work/mutating.go +++ b/pkg/webhook/work/mutating.go @@ -7,7 +7,6 @@ import ( "net/http" "strings" - batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -16,6 +15,7 @@ import ( workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1" "github.com/karmada-io/karmada/pkg/util" + "github.com/karmada-io/karmada/pkg/util/helper" ) // MutatingAdmission mutates API request if necessary. @@ -120,8 +120,7 @@ func removeIrrelevantField(workload *unstructured.Unstructured) error { } if workload.GetKind() == util.JobKind { - job := &batchv1.Job{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(workload.UnstructuredContent(), job) + job, err := helper.ConvertToJob(workload) if err != nil { return err }