diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go index f4dd58b40f6..7933d1717f5 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go @@ -95,6 +95,67 @@ func TestUpdateOnlyDoesNotTrackManagedFields(t *testing.T) { } } +// TestUpdateApplyConflict tests that applying to an object, which wasn't created by apply, will give conflicts +func TestUpdateApplyConflict(t *testing.T) { + f := NewTestFieldManager() + + obj := &corev1.Pod{} + obj.ObjectMeta.ManagedFields = []metav1.ManagedFieldsEntry{{}} + + patch := []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment", + "labels": {"app": "nginx"} + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest" + }] + } + } + } + }`) + newObj := &unstructured.Unstructured{Object: map[string]interface{}{}} + if err := yaml.Unmarshal(patch, &newObj.Object); err != nil { + t.Fatalf("error decoding YAML: %v", err) + } + + savedObject, err := f.Update(obj, newObj, "fieldmanager_test") + if err != nil { + t.Fatalf("failed to apply object: %v", err) + } + + _, err = f.Apply(savedObject, []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment", + }, + "spec": { + "replicas": 101, + } + }`), "fieldmanager_conflict", false) + if err == nil || !apierrors.IsConflict(err) { + t.Fatalf("Expecting to get conflicts but got %v", err) + } +} + func TestApplyStripsFields(t *testing.T) { f := NewTestFieldManager() diff --git a/test/integration/apiserver/apply/apply_test.go b/test/integration/apiserver/apply/apply_test.go index a374e6e7bf1..6456a3ff2a3 100644 --- a/test/integration/apiserver/apply/apply_test.go +++ b/test/integration/apiserver/apply/apply_test.go @@ -386,81 +386,6 @@ func TestApplyUpdateApplyConflictForced(t *testing.T) { } } -// TestUpdateApplyConflict tests that applying to an object, which wasn't created by apply, will give conflicts -func TestUpdateApplyConflict(t *testing.T) { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() - - _, client, closeFn := setup(t) - defer closeFn() - - obj := []byte(`{ - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "deployment", - "labels": {"app": "nginx"} - }, - "spec": { - "replicas": 3, - "selector": { - "matchLabels": { - "app": "nginx" - } - }, - "template": { - "metadata": { - "labels": { - "app": "nginx" - } - }, - "spec": { - "containers": [{ - "name": "nginx", - "image": "nginx:latest" - }] - } - } - } - }`) - - _, err := client.CoreV1().RESTClient().Post(). - AbsPath("/apis/apps/v1"). - Namespace("default"). - Resource("deployments"). - Body(obj).Do().Get() - if err != nil { - t.Fatalf("Failed to create object using post: %v", err) - } - - obj = []byte(`{ - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": { - "name": "deployment", - }, - "spec": { - "replicas": 101, - } - }`) - _, err = client.CoreV1().RESTClient().Patch(types.ApplyPatchType). - AbsPath("/apis/apps/v1"). - Namespace("default"). - Resource("deployments"). - Name("deployment"). - Param("fieldManager", "apply_test"). - Body([]byte(obj)).Do().Get() - if err == nil { - t.Fatalf("Expecting to get conflicts when applying object") - } - status, ok := err.(*errors.StatusError) - if !ok { - t.Fatalf("Expecting to get conflicts as API error") - } - if len(status.Status().Details.Causes) < 1 { - t.Fatalf("Expecting to get at least one conflict when applying object, got: %v", status.Status().Details.Causes) - } -} - // TestApplyManagedFields makes sure that managedFields api does not change func TestApplyManagedFields(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)()