mirror of
https://github.com/kubernetes/client-go.git
synced 2025-07-17 08:41:53 +00:00
FieldManagedObjectTracker: Fix to work with unstructured
Prior to this patch, this fails because the skipnonappliedfieldmanager
uses the `objectcreater` (aka `*runtime.Scheme`) to create a new object
for which it never sets the GVK. In the case of
`*unstructured.Unstructured`, the GVK can not be derived from the object
itself so the operation would subsequently fail [here][0] with an
```
Object 'Kind' is missing in 'unstructured object has no kind'
```
error. Fix this by explicitly setting the GVK in case of unstructured.
[0]: 02eb7d424a/staging/src/k8s.io/apimachinery/pkg/util/managedfields/internal/structuredmerge.go (L98)
Kubernetes-commit: dbdd6a3b4358d91a064de9c0f01d3050e606d553
This commit is contained in:
parent
e9ca982cec
commit
81ecec406a
@ -19,11 +19,12 @@ package testing
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sigs.k8s.io/yaml"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
|
||||||
jsonpatch "gopkg.in/evanphx/json-patch.v4"
|
jsonpatch "gopkg.in/evanphx/json-patch.v4"
|
||||||
|
|
||||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
@ -702,7 +703,6 @@ func (t *managedFieldObjectTracker) Update(gvr schema.GroupVersionResource, obj
|
|||||||
}
|
}
|
||||||
gvk, err := t.mapper().KindFor(gvr)
|
gvk, err := t.mapper().KindFor(gvr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
println("kindfor")
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
mgr, err := t.fieldManagerFor(gvk)
|
mgr, err := t.fieldManagerFor(gvk)
|
||||||
|
@ -23,7 +23,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
"sigs.k8s.io/structured-merge-diff/v4/typed"
|
"sigs.k8s.io/structured-merge-diff/v4/typed"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
@ -683,3 +685,58 @@ func TestManagedFieldsObjectTrackerReloadsScheme(t *testing.T) {
|
|||||||
err := tracker.Create(cmResource, cm, "default", metav1.CreateOptions{FieldManager: "test-manager"})
|
err := tracker.Create(cmResource, cm, "default", metav1.CreateOptions{FieldManager: "test-manager"})
|
||||||
assert.NoError(t, err, "Create should succeed after registering type")
|
assert.NoError(t, err, "Create should succeed after registering type")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestManagedFielsdObjectTrackerWithUnstructured(t *testing.T) {
|
||||||
|
cmResource := schema.GroupVersionResource{Version: "v1", Resource: "configmaps"}
|
||||||
|
cmGVK := schema.GroupVersionKind{Version: "v1", Kind: "ConfigMap"}
|
||||||
|
scheme := runtime.NewScheme()
|
||||||
|
scheme.AddKnownTypeWithName(cmGVK, &unstructured.Unstructured{})
|
||||||
|
codecs := serializer.NewCodecFactory(scheme)
|
||||||
|
|
||||||
|
tracker := NewFieldManagedObjectTracker(scheme, codecs.UniversalDecoder(), managedfields.NewDeducedTypeConverter())
|
||||||
|
|
||||||
|
cm := &unstructured.Unstructured{}
|
||||||
|
cm.SetAPIVersion("v1")
|
||||||
|
cm.SetKind("ConfigMap")
|
||||||
|
cm.SetName("test-cm")
|
||||||
|
cm.SetNamespace("default")
|
||||||
|
require.NoError(t, unstructured.SetNestedMap(cm.Object,
|
||||||
|
map[string]any{
|
||||||
|
"key": "value",
|
||||||
|
},
|
||||||
|
"data"),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Validate creating through apply works
|
||||||
|
cmOriginal := cm.DeepCopy()
|
||||||
|
|
||||||
|
require.NoError(t, tracker.Apply(cmResource, cm, "default", metav1.PatchOptions{FieldManager: "test-manager"}))
|
||||||
|
cmActualUntyped, err := tracker.Get(cmResource, "default", cm.GetName())
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
cmActual, ok := cmActualUntyped.(*unstructured.Unstructured)
|
||||||
|
require.True(t, ok)
|
||||||
|
|
||||||
|
unstructured.RemoveNestedField(cmActual.Object, "metadata", "managedFields")
|
||||||
|
require.Empty(t, cmp.Diff(cmOriginal, cmActual))
|
||||||
|
|
||||||
|
// Validate updating through apply works
|
||||||
|
require.NoError(t, unstructured.SetNestedMap(cmActual.Object,
|
||||||
|
map[string]any{
|
||||||
|
"key": "value",
|
||||||
|
"another-key": "another-value",
|
||||||
|
},
|
||||||
|
"data"),
|
||||||
|
)
|
||||||
|
|
||||||
|
cmOriginal = cmActual.DeepCopy()
|
||||||
|
require.NoError(t, tracker.Apply(cmResource, cmActual, "default", metav1.PatchOptions{FieldManager: "test-manager"}))
|
||||||
|
cmActualUntyped, err = tracker.Get(cmResource, "default", cm.GetName())
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
cmActual, ok = cmActualUntyped.(*unstructured.Unstructured)
|
||||||
|
require.True(t, ok)
|
||||||
|
|
||||||
|
unstructured.RemoveNestedField(cmActual.Object, "metadata", "managedFields")
|
||||||
|
require.Empty(t, cmp.Diff(cmOriginal, cmActual))
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user