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:
Joe Betz 2025-05-07 10:07:55 -04:00 committed by Kubernetes Publisher
parent bf3d45b702
commit 571b9f39e0
2 changed files with 1 additions and 61 deletions

View File

@ -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, ".")
}

View File

@ -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: