From 3279c73945553e211ddb7812e07b3c9d46b5e96a Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Thu, 22 Aug 2019 13:27:38 -0700 Subject: [PATCH] Add tests --- .../fieldmanager/fieldmanager_test.go | 23 ++++++ .../integration/apiserver/apply/apply_test.go | 79 ++++++++++++++++++- 2 files changed, 101 insertions(+), 1 deletion(-) 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 9ac1db11c26..f4dd58b40f6 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 @@ -72,6 +72,29 @@ func TestFieldManagerCreation(t *testing.T) { } } +func TestUpdateOnlyDoesNotTrackManagedFields(t *testing.T) { + f := NewTestFieldManager() + + liveObj := &corev1.Pod{} + + updatedObj := liveObj.DeepCopy() + updatedObj.ObjectMeta.Labels = map[string]string{"k": "v"} + + newObj, err := f.Update(liveObj, updatedObj, "fieldmanager_test") + if err != nil { + t.Fatalf("failed to update object: %v", err) + } + + accessor, err := meta.Accessor(newObj) + if err != nil { + t.Fatalf("couldn't get accessor: %v", err) + } + + if m := accessor.GetManagedFields(); len(m) != 0 { + t.Fatalf("managedFields were tracked on update only: %v", m) + } +} + 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 8c5606764fc..95abb4ec42b 100644 --- a/test/integration/apiserver/apply/apply_test.go +++ b/test/integration/apiserver/apply/apply_test.go @@ -180,9 +180,11 @@ func TestNoOpUpdateSameResourceVersion(t *testing.T) { } }`) - _, err := client.CoreV1().RESTClient().Post(). + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). Namespace("default"). + Param("fieldManager", "apply_test"). Resource(podResource). + Name(podName). Body(podBytes). Do(). Get() @@ -367,6 +369,81 @@ 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)()