mirror of
https://github.com/kubernetes/client-go.git
synced 2025-07-19 17:39:56 +00:00
Reorganize scheme type converter into apimachinery utils
This removes a dependency from generated applyconfigurations to a testing package. To do this, the type converter in the testing package has been moved out to the apimachinery package and the utilities the converter depend on have been reorganized. Kubernetes-commit: 4821604f83a6f4764497879b666087ba7cb05060
This commit is contained in:
parent
bf3d45b702
commit
571b9f39e0
@ -19,7 +19,6 @@ package testing
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"sigs.k8s.io/structured-merge-diff/v4/typed"
|
||||
"sigs.k8s.io/yaml"
|
||||
"sort"
|
||||
"strings"
|
||||
@ -945,62 +944,3 @@ func assertOptionalSingleArgument[T any](arguments []T) (T, error) {
|
||||
return a, fmt.Errorf("expected only one option argument but got %d", len(arguments))
|
||||
}
|
||||
}
|
||||
|
||||
type TypeResolver interface {
|
||||
Type(openAPIName string) typed.ParseableType
|
||||
}
|
||||
|
||||
type TypeConverter struct {
|
||||
Scheme *runtime.Scheme
|
||||
TypeResolver TypeResolver
|
||||
}
|
||||
|
||||
func (tc TypeConverter) ObjectToTyped(obj runtime.Object, opts ...typed.ValidationOptions) (*typed.TypedValue, error) {
|
||||
gvk := obj.GetObjectKind().GroupVersionKind()
|
||||
name, err := tc.openAPIName(gvk)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
t := tc.TypeResolver.Type(name)
|
||||
switch o := obj.(type) {
|
||||
case *unstructured.Unstructured:
|
||||
return t.FromUnstructured(o.UnstructuredContent(), opts...)
|
||||
default:
|
||||
return t.FromStructured(obj, opts...)
|
||||
}
|
||||
}
|
||||
|
||||
func (tc TypeConverter) TypedToObject(value *typed.TypedValue) (runtime.Object, error) {
|
||||
vu := value.AsValue().Unstructured()
|
||||
switch o := vu.(type) {
|
||||
case map[string]interface{}:
|
||||
return &unstructured.Unstructured{Object: o}, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("failed to convert value to unstructured for type %T", vu)
|
||||
}
|
||||
}
|
||||
|
||||
func (tc TypeConverter) openAPIName(kind schema.GroupVersionKind) (string, error) {
|
||||
example, err := tc.Scheme.New(kind)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
rtype := reflect.TypeOf(example).Elem()
|
||||
name := friendlyName(rtype.PkgPath() + "." + rtype.Name())
|
||||
return name, nil
|
||||
}
|
||||
|
||||
// This is a copy of openapi.friendlyName.
|
||||
// TODO: consider introducing a shared version of this function in apimachinery.
|
||||
func friendlyName(name string) string {
|
||||
nameParts := strings.Split(name, "/")
|
||||
// Reverse first part. e.g., io.k8s... instead of k8s.io...
|
||||
if len(nameParts) > 0 && strings.Contains(nameParts[0], ".") {
|
||||
parts := strings.Split(nameParts[0], ".")
|
||||
for i, j := 0, len(parts)-1; i < j; i, j = i+1, j-1 {
|
||||
parts[i], parts[j] = parts[j], parts[i]
|
||||
}
|
||||
nameParts[0] = strings.Join(parts, ".")
|
||||
}
|
||||
return strings.Join(nameParts, ".")
|
||||
}
|
||||
|
@ -572,7 +572,7 @@ func configMapTypeConverter(scheme *runtime.Scheme) managedfields.TypeConverter
|
||||
panic(fmt.Sprintf("Failed to parse schema: %v", err))
|
||||
}
|
||||
|
||||
return TypeConverter{Scheme: scheme, TypeResolver: parser}
|
||||
return managedfields.NewSchemeTypeConverter(scheme, parser)
|
||||
}
|
||||
|
||||
var configMapTypedSchema = typed.YAMLObject(`types:
|
||||
|
Loading…
Reference in New Issue
Block a user