From 96d0588440a96c5eba8b3ba0810563ad1e1a08b6 Mon Sep 17 00:00:00 2001 From: Bouke van der Bijl Date: Fri, 9 Nov 2018 19:25:02 +0000 Subject: [PATCH] client-go/testing: properly handle Patch actions for missing Objects Currently the fake client will return a default empty Object when a Patch action is submitted on a missing Object. The correct behavior is to instead propagate the NotFound error. --- staging/src/k8s.io/client-go/testing/BUILD | 1 + staging/src/k8s.io/client-go/testing/fixture.go | 3 +-- .../src/k8s.io/client-go/testing/fixture_test.go | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/client-go/testing/BUILD b/staging/src/k8s.io/client-go/testing/BUILD index d0849fcb1f4..85ba75c4b0c 100644 --- a/staging/src/k8s.io/client-go/testing/BUILD +++ b/staging/src/k8s.io/client-go/testing/BUILD @@ -42,6 +42,7 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", ], diff --git a/staging/src/k8s.io/client-go/testing/fixture.go b/staging/src/k8s.io/client-go/testing/fixture.go index b468b328c1a..055b5b29c2f 100644 --- a/staging/src/k8s.io/client-go/testing/fixture.go +++ b/staging/src/k8s.io/client-go/testing/fixture.go @@ -131,8 +131,7 @@ func ObjectReaction(tracker ObjectTracker) ReactionFunc { case PatchActionImpl: obj, err := tracker.Get(gvr, ns, action.GetName()) if err != nil { - // object is not registered - return false, nil, err + return true, nil, err } old, err := json.Marshal(obj) diff --git a/staging/src/k8s.io/client-go/testing/fixture_test.go b/staging/src/k8s.io/client-go/testing/fixture_test.go index 7b01c12a9c5..2f59e988941 100644 --- a/staging/src/k8s.io/client-go/testing/fixture_test.go +++ b/staging/src/k8s.io/client-go/testing/fixture_test.go @@ -30,6 +30,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/watch" ) @@ -258,3 +259,17 @@ func TestWatchAddAfterStop(t *testing.T) { t.Errorf("test resource creation failed: %v", err) } } + +func TestPatchWithMissingObject(t *testing.T) { + nodesResource := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "nodes"} + + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + o := NewObjectTracker(scheme, codecs.UniversalDecoder()) + reaction := ObjectReaction(o) + action := NewRootPatchSubresourceAction(nodesResource, "node-1", types.StrategicMergePatchType, []byte(`{}`)) + handled, node, err := reaction(action) + assert.True(t, handled) + assert.Nil(t, node) + assert.EqualError(t, err, `nodes "node-1" not found`) +}