diff --git a/test/integration/apiserver/apply/apply_test.go b/test/integration/apiserver/apply/apply_test.go index 037b300188d..a6905b436f5 100644 --- a/test/integration/apiserver/apply/apply_test.go +++ b/test/integration/apiserver/apply/apply_test.go @@ -831,8 +831,8 @@ func TestApplyConvertsManagedFieldsVersion(t *testing.T) { } } -// TestClearManagedFields verifies it's possible to clear the managedFields -func TestClearManagedFields(t *testing.T) { +// TestClearManagedFieldsWithMergePatch verifies it's possible to clear the managedFields +func TestClearManagedFieldsWithMergePatch(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() _, client, closeFn := setup(t) @@ -886,3 +886,193 @@ func TestClearManagedFields(t *testing.T) { t.Fatalf("Failed to clear managedFields, got: %v", managedFields) } } + +// TestClearManagedFieldsWithStrategicMergePatch verifies it's possible to clear the managedFields +func TestClearManagedFieldsWithStrategicMergePatch(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() + + _, client, closeFn := setup(t) + defer closeFn() + + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace("default"). + Resource("configmaps"). + Name("test-cm"). + Param("fieldManager", "apply_test"). + Body([]byte(`{ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "test-cm", + "namespace": "default", + "labels": { + "test-label": "test" + } + }, + "data": { + "key": "value" + } + }`)). + Do(). + Get() + if err != nil { + t.Fatalf("Failed to create object using Apply patch: %v", err) + } + + _, err = client.CoreV1().RESTClient().Patch(types.StrategicMergePatchType). + Namespace("default"). + Resource("configmaps"). + Name("test-cm"). + Body([]byte(`{"metadata":{"managedFields": [{}]}}`)).Do().Get() + if err != nil { + t.Fatalf("Failed to patch object: %v", err) + } + + object, err := client.CoreV1().RESTClient().Get().Namespace("default").Resource("configmaps").Name("test-cm").Do().Get() + if err != nil { + t.Fatalf("Failed to retrieve object: %v", err) + } + + accessor, err := meta.Accessor(object) + if err != nil { + t.Fatalf("Failed to get meta accessor: %v", err) + } + + if managedFields := accessor.GetManagedFields(); len(managedFields) != 0 { + t.Fatalf("Failed to clear managedFields, got: %v", managedFields) + } + + if labels := accessor.GetLabels(); len(labels) < 1 { + t.Fatalf("Expected other fields to stay untouched, got: %v", object) + } +} + +// TestClearManagedFieldsWithJSONPatch verifies it's possible to clear the managedFields +func TestClearManagedFieldsWithJSONPatch(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() + + _, client, closeFn := setup(t) + defer closeFn() + + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace("default"). + Resource("configmaps"). + Name("test-cm"). + Param("fieldManager", "apply_test"). + Body([]byte(`{ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "test-cm", + "namespace": "default", + "labels": { + "test-label": "test" + } + }, + "data": { + "key": "value" + } + }`)). + Do(). + Get() + if err != nil { + t.Fatalf("Failed to create object using Apply patch: %v", err) + } + + _, err = client.CoreV1().RESTClient().Patch(types.JSONPatchType). + Namespace("default"). + Resource("configmaps"). + Name("test-cm"). + Body([]byte(`[{"op": "replace", "path": "/metadata/managedFields", "value": [{}]}]`)).Do().Get() + if err != nil { + t.Fatalf("Failed to patch object: %v", err) + } + + object, err := client.CoreV1().RESTClient().Get().Namespace("default").Resource("configmaps").Name("test-cm").Do().Get() + if err != nil { + t.Fatalf("Failed to retrieve object: %v", err) + } + + accessor, err := meta.Accessor(object) + if err != nil { + t.Fatalf("Failed to get meta accessor: %v", err) + } + + if managedFields := accessor.GetManagedFields(); len(managedFields) != 0 { + t.Fatalf("Failed to clear managedFields, got: %v", managedFields) + } +} + +// TestClearManagedFieldsWithUpdate verifies it's possible to clear the managedFields +func TestClearManagedFieldsWithUpdate(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() + + _, client, closeFn := setup(t) + defer closeFn() + + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace("default"). + Resource("configmaps"). + Name("test-cm"). + Param("fieldManager", "apply_test"). + Body([]byte(`{ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "test-cm", + "namespace": "default", + "labels": { + "test-label": "test" + } + }, + "data": { + "key": "value" + } + }`)). + Do(). + Get() + if err != nil { + t.Fatalf("Failed to create object using Apply patch: %v", err) + } + + _, err = client.CoreV1().RESTClient().Put(). + Namespace("default"). + Resource("configmaps"). + Name("test-cm"). + Body([]byte(`{ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "test-cm", + "namespace": "default", + "managedFields": [{}], + "labels": { + "test-label": "test" + } + }, + "data": { + "key": "value" + } + }`)).Do().Get() + if err != nil { + t.Fatalf("Failed to patch object: %v", err) + } + + object, err := client.CoreV1().RESTClient().Get().Namespace("default").Resource("configmaps").Name("test-cm").Do().Get() + if err != nil { + t.Fatalf("Failed to retrieve object: %v", err) + } + + accessor, err := meta.Accessor(object) + if err != nil { + t.Fatalf("Failed to get meta accessor: %v", err) + } + + if managedFields := accessor.GetManagedFields(); len(managedFields) != 0 { + t.Fatalf("Failed to clear managedFields, got: %v", managedFields) + } + + if labels := accessor.GetLabels(); len(labels) < 1 { + t.Fatalf("Expected other fields to stay untouched, got: %v", object) + } +}