From c9e6ce5387d98e909301b955846248ffc5cb133b Mon Sep 17 00:00:00 2001 From: SataQiu Date: Wed, 13 Nov 2024 21:37:06 +0800 Subject: [PATCH] karmada-search: support field selector for corev1 resources Signed-off-by: SataQiu --- .../plugins/cache/apis/core/v1/conversion.go | 167 ++++++++++++++++++ .../plugins/cache/apis/core/v1/register.go | 32 ++++ .../proxy/framework/plugins/cache/cache.go | 2 +- .../proxy/framework/plugins/cache/scheme.go | 35 ++++ 4 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 pkg/search/proxy/framework/plugins/cache/apis/core/v1/conversion.go create mode 100644 pkg/search/proxy/framework/plugins/cache/apis/core/v1/register.go create mode 100644 pkg/search/proxy/framework/plugins/cache/scheme.go diff --git a/pkg/search/proxy/framework/plugins/cache/apis/core/v1/conversion.go b/pkg/search/proxy/framework/plugins/cache/apis/core/v1/conversion.go new file mode 100644 index 000000000000..efdb80c011b6 --- /dev/null +++ b/pkg/search/proxy/framework/plugins/cache/apis/core/v1/conversion.go @@ -0,0 +1,167 @@ +/* +Copyright 2024 The Karmada Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/runtime" +) + +// addConversionFuncs ensures that the cache plugin can handle the field selectors for corev1 resources. +// It is copied from "k8s.io/kubernetes/pkg/apis/core/v1/conversion.go". +func addConversionFuncs(scheme *runtime.Scheme) error { + // Add field conversion funcs. + err := scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Pod"), + func(label, value string) (string, string, error) { + switch label { + case "metadata.name", + "metadata.namespace", + "spec.nodeName", + "spec.restartPolicy", + "spec.schedulerName", + "spec.serviceAccountName", + "spec.hostNetwork", + "status.phase", + "status.podIP", + "status.podIPs", + "status.nominatedNodeName": + return label, value, nil + // This is for backwards compatibility with old v1 clients which send spec.host + case "spec.host": + return "spec.nodeName", value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }, + ) + if err != nil { + return err + } + err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Node"), + func(label, value string) (string, string, error) { + switch label { + case "metadata.name": + return label, value, nil + case "spec.unschedulable": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }, + ) + if err != nil { + return err + } + err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("ReplicationController"), + func(label, value string) (string, string, error) { + switch label { + case "metadata.name", + "metadata.namespace", + "status.replicas": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }) + if err != nil { + return err + } + if err := AddFieldLabelConversionsForEvent(scheme); err != nil { + return err + } + if err := AddFieldLabelConversionsForNamespace(scheme); err != nil { + return err + } + if err := AddFieldLabelConversionsForSecret(scheme); err != nil { + return err + } + if err := AddFieldLabelConversionsForService(scheme); err != nil { + return err + } + return nil +} + +// AddFieldLabelConversionsForEvent adds field label conversions for Event. +func AddFieldLabelConversionsForEvent(scheme *runtime.Scheme) error { + return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Event"), + func(label, value string) (string, string, error) { + switch label { + case "involvedObject.kind", + "involvedObject.namespace", + "involvedObject.name", + "involvedObject.uid", + "involvedObject.apiVersion", + "involvedObject.resourceVersion", + "involvedObject.fieldPath", + "reason", + "reportingComponent", + "source", + "type", + "metadata.namespace", + "metadata.name": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }) +} + +// AddFieldLabelConversionsForNamespace adds field label conversions for Namespace. +func AddFieldLabelConversionsForNamespace(scheme *runtime.Scheme) error { + return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Namespace"), + func(label, value string) (string, string, error) { + switch label { + case "status.phase", + "metadata.name": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }) +} + +// AddFieldLabelConversionsForSecret adds field label conversions for Secret. +func AddFieldLabelConversionsForSecret(scheme *runtime.Scheme) error { + return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Secret"), + func(label, value string) (string, string, error) { + switch label { + case "type", + "metadata.namespace", + "metadata.name": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }) +} + +// AddFieldLabelConversionsForService adds field label conversions for Service. +func AddFieldLabelConversionsForService(scheme *runtime.Scheme) error { + return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Service"), + func(label, value string) (string, string, error) { + switch label { + case "metadata.namespace", + "metadata.name", + "spec.clusterIP", + "spec.type": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }) +} diff --git a/pkg/search/proxy/framework/plugins/cache/apis/core/v1/register.go b/pkg/search/proxy/framework/plugins/cache/apis/core/v1/register.go new file mode 100644 index 000000000000..bf4fdd70cdac --- /dev/null +++ b/pkg/search/proxy/framework/plugins/cache/apis/core/v1/register.go @@ -0,0 +1,32 @@ +/* +Copyright 2024 The Karmada Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +// SchemeGroupVersion is group version used to register these objects. +var SchemeGroupVersion = corev1.SchemeGroupVersion + +var ( + // SchemeBuilder points to a list of functions added to Scheme. + SchemeBuilder = runtime.NewSchemeBuilder(addConversionFuncs) + // AddToScheme applies all the stored functions to the scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/pkg/search/proxy/framework/plugins/cache/cache.go b/pkg/search/proxy/framework/plugins/cache/cache.go index a93e0fef1df1..48858fb1c811 100644 --- a/pkg/search/proxy/framework/plugins/cache/cache.go +++ b/pkg/search/proxy/framework/plugins/cache/cache.go @@ -110,7 +110,7 @@ func (c *Cache) Connect(_ context.Context, request framework.ProxyRequest) (http ClusterScoped: mapping.Scope.Name() == meta.RESTScopeNameRoot, }, Serializer: scheme.Codecs.WithoutConversion(), - Convertor: runtime.NewScheme(), + Convertor: cacheScheme, Subresource: requestInfo.Subresource, MetaGroupVersion: metav1.SchemeGroupVersion, TableConvertor: r.tableConvertor, diff --git a/pkg/search/proxy/framework/plugins/cache/scheme.go b/pkg/search/proxy/framework/plugins/cache/scheme.go new file mode 100644 index 000000000000..66b9c90e7ef1 --- /dev/null +++ b/pkg/search/proxy/framework/plugins/cache/scheme.go @@ -0,0 +1,35 @@ +/* +Copyright 2024 The Karmada Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cache + +import ( + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + + corev1 "github.com/karmada-io/karmada/pkg/search/proxy/framework/plugins/cache/apis/core/v1" +) + +var cacheScheme = runtime.NewScheme() + +func init() { + AddToScheme(cacheScheme) +} + +// AddToScheme applies all the stored functions to the scheme. +func AddToScheme(scheme *runtime.Scheme) { + utilruntime.Must(corev1.AddToScheme(scheme)) +}