From b5a3ab67da1e5b6b859f3f8dd0bed1a8ad5a8b15 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Wed, 14 Oct 2015 11:07:47 -0700 Subject: [PATCH] let kubectl label use PATCH instead of PUT --- pkg/kubectl/cmd/label.go | 34 +++++++++++++++++++++++++++------- pkg/kubectl/cmd/label_test.go | 4 ++-- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/pkg/kubectl/cmd/label.go b/pkg/kubectl/cmd/label.go index 0f040a8d1f1..9f6f425c80e 100644 --- a/pkg/kubectl/cmd/label.go +++ b/pkg/kubectl/cmd/label.go @@ -17,6 +17,7 @@ limitations under the License. package cmd import ( + "encoding/json" "fmt" "io" "strings" @@ -28,6 +29,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/errors" + "k8s.io/kubernetes/pkg/util/strategicpatch" "k8s.io/kubernetes/pkg/util/validation" ) @@ -232,13 +234,31 @@ func RunLabel(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri } outputObj = info.Object } else { - outputObj, err = cmdutil.UpdateObject(info, func(obj runtime.Object) error { - err := labelFunc(obj, overwrite, resourceVersion, lbls, remove) - if err != nil { - return err - } - return nil - }) + name, namespace, obj := info.Name, info.Namespace, info.Object + oldData, err := json.Marshal(obj) + if err != nil { + return err + } + if err := labelFunc(obj, overwrite, resourceVersion, lbls, remove); err != nil { + return err + } + newData, err := json.Marshal(obj) + if err != nil { + return err + } + patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, obj) + if err != nil { + return err + } + + mapping := info.ResourceMapping() + client, err := f.RESTClient(mapping) + if err != nil { + return err + } + helper := resource.NewHelper(client, mapping) + + outputObj, err = helper.Patch(namespace, name, api.StrategicMergePatchType, patchBytes) if err != nil { return err } diff --git a/pkg/kubectl/cmd/label_test.go b/pkg/kubectl/cmd/label_test.go index 8e25cfeb51d..750f30ace31 100644 --- a/pkg/kubectl/cmd/label_test.go +++ b/pkg/kubectl/cmd/label_test.go @@ -339,7 +339,7 @@ func TestLabelForResourceFromFile(t *testing.T) { t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) return nil, nil } - case "PUT": + case "PATCH": switch req.URL.Path { case "/namespaces/test/pods/cassandra": return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil @@ -386,7 +386,7 @@ func TestLabelMultipleObjects(t *testing.T) { t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) return nil, nil } - case "PUT": + case "PATCH": switch req.URL.Path { case "/namespaces/test/pods/foo": return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil