From 571b9f39e05ac6d7722ec2a88874d2c89b36c098 Mon Sep 17 00:00:00 2001 From: Joe Betz Date: Wed, 7 May 2025 10:07:55 -0400 Subject: [PATCH] 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 --- testing/fixture.go | 60 ----------------------------------------- testing/fixture_test.go | 2 +- 2 files changed, 1 insertion(+), 61 deletions(-) diff --git a/testing/fixture.go b/testing/fixture.go index 15b3e533..3e749782 100644 --- a/testing/fixture.go +++ b/testing/fixture.go @@ -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, ".") -} diff --git a/testing/fixture_test.go b/testing/fixture_test.go index 0954edc5..2fa67cd6 100644 --- a/testing/fixture_test.go +++ b/testing/fixture_test.go @@ -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: