ManagedFieldsObjectTracker: Reload scheme

In controller-runtime it is generally not expected to do any sort of
scheme registration if unstructured.Unstructured is used. To make this
work in the fakeclient, the fakeclient will register unstructured to
scheme if the scheme doesn't recognize the GVK.

This currently doesn't work with the `ManagedFieldsObjectTracker` as it
never reloads the scheme. This change makes it reload the scheme in an
inefficient but simple manner, which should be good enough for unit
tests.
This commit is contained in:
Alvaro Aleman
2025-03-02 12:43:08 -05:00
parent cefa8311bc
commit 1cd71cbb14
2 changed files with 32 additions and 7 deletions

View File

@@ -631,7 +631,7 @@ type managedFieldObjectTracker struct {
ObjectTracker
scheme ObjectScheme
objectConverter runtime.ObjectConvertor
mapper meta.RESTMapper
mapper func() meta.RESTMapper
typeConverter managedfields.TypeConverter
}
@@ -644,8 +644,10 @@ func NewFieldManagedObjectTracker(scheme *runtime.Scheme, decoder runtime.Decode
ObjectTracker: NewObjectTracker(scheme, decoder),
scheme: scheme,
objectConverter: scheme,
mapper: testrestmapper.TestOnlyStaticRESTMapper(scheme),
typeConverter: typeConverter,
mapper: func() meta.RESTMapper {
return testrestmapper.TestOnlyStaticRESTMapper(scheme)
},
typeConverter: typeConverter,
}
}
@@ -654,7 +656,7 @@ func (t *managedFieldObjectTracker) Create(gvr schema.GroupVersionResource, obj
if err != nil {
return err
}
gvk, err := t.mapper.KindFor(gvr)
gvk, err := t.mapper().KindFor(gvr)
if err != nil {
return err
}
@@ -698,8 +700,9 @@ func (t *managedFieldObjectTracker) Update(gvr schema.GroupVersionResource, obj
if err != nil {
return err
}
gvk, err := t.mapper.KindFor(gvr)
gvk, err := t.mapper().KindFor(gvr)
if err != nil {
println("kindfor")
return err
}
mgr, err := t.fieldManagerFor(gvk)
@@ -728,7 +731,7 @@ func (t *managedFieldObjectTracker) Patch(gvr schema.GroupVersionResource, patch
if err != nil {
return err
}
gvk, err := t.mapper.KindFor(gvr)
gvk, err := t.mapper().KindFor(gvr)
if err != nil {
return err
}
@@ -757,7 +760,7 @@ func (t *managedFieldObjectTracker) Apply(gvr schema.GroupVersionResource, apply
if err != nil {
return err
}
gvk, err := t.mapper.KindFor(gvr)
gvk, err := t.mapper().KindFor(gvr)
if err != nil {
return err
}

View File

@@ -661,3 +661,25 @@ var configMapTypedSchema = typed.YAMLObject(`types:
namedType: __untyped_deduced_
elementRelationship: separable
`)
func TestManagedFieldsObjectTrackerReloadsScheme(t *testing.T) {
cmResource := schema.GroupVersionResource{Version: "v1", Resource: "configmaps"}
scheme := runtime.NewScheme()
codecs := serializer.NewCodecFactory(scheme)
// Create tracker without registered ConfigMap type
tracker := NewFieldManagedObjectTracker(scheme, codecs.UniversalDecoder(), configMapTypeConverter(scheme))
cm := &v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "test-cm",
},
Data: map[string]string{"key": "value"},
}
// Register the type in scheme
scheme.AddKnownTypes(cmResource.GroupVersion(), &v1.ConfigMap{})
err := tracker.Create(cmResource, cm, "default", metav1.CreateOptions{FieldManager: "test-manager"})
assert.NoError(t, err, "Create should succeed after registering type")
}