From 121f6fb289be5754f26039da6c5e3b613e16f5a4 Mon Sep 17 00:00:00 2001 From: PingWang Date: Thu, 8 Sep 2016 19:15:36 +0800 Subject: [PATCH] change all jsonmerge to strategicpatch Signed-off-by: PingWang update preconditions define Signed-off-by: PingWang --- pkg/kubectl/cmd/edit.go | 22 +++++++-------------- pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go | 2 +- pkg/util/strategicpatch/patch.go | 22 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/pkg/kubectl/cmd/edit.go b/pkg/kubectl/cmd/edit.go index ae760b39619..54a725c35b5 100644 --- a/pkg/kubectl/cmd/edit.go +++ b/pkg/kubectl/cmd/edit.go @@ -35,7 +35,6 @@ import ( "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" - "k8s.io/kubernetes/pkg/kubectl/cmd/util/jsonmerge" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/crlf" @@ -392,25 +391,18 @@ func RunEdit(f *cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args return nil } - patch, err := strategicpatch.CreateStrategicMergePatch(originalJS, editedJS, currOriginalObj) - // TODO: change all jsonmerge to strategicpatch - // for checking preconditions - preconditions := []jsonmerge.PreconditionFunc{} + preconditions := []strategicpatch.PreconditionFunc{strategicpatch.RequireKeyUnchanged("apiVersion"), + strategicpatch.RequireKeyUnchanged("kind"), strategicpatch.RequireMetadataKeyUnchanged("name")} + patch, err := strategicpatch.CreateTwoWayMergePatch(originalJS, editedJS, currOriginalObj, preconditions...) if err != nil { glog.V(4).Infof("Unable to calculate diff, no merge is possible: %v", err) + if strategicpatch.IsPreconditionFailed(err) { + return preservedFile(nil, file, errOut) + } return err - } else { - preconditions = append(preconditions, jsonmerge.RequireKeyUnchanged("apiVersion")) - preconditions = append(preconditions, jsonmerge.RequireKeyUnchanged("kind")) - preconditions = append(preconditions, jsonmerge.RequireMetadataKeyUnchanged("name")) - results.version = defaultVersion - } - - if hold, msg := jsonmerge.TestPreconditionsHold(patch, preconditions); !hold { - fmt.Fprintf(errOut, "error: %s", msg) - return preservedFile(nil, file, errOut) } + results.version = defaultVersion patched, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, api.StrategicMergePatchType, patch) if err != nil { fmt.Fprintln(out, results.addError(err, info)) diff --git a/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go b/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go index 9685ce71c3d..2431588943c 100644 --- a/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go +++ b/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go @@ -67,7 +67,7 @@ func RequireKeyUnchanged(key string) PreconditionFunc { } } -// RequireKeyUnchanged creates a precondition function that fails +// RequireMetadataKeyUnchanged creates a precondition function that fails // if the metadata.key is present in the diff (indicating its value // has changed). func RequireMetadataKeyUnchanged(key string) PreconditionFunc { diff --git a/pkg/util/strategicpatch/patch.go b/pkg/util/strategicpatch/patch.go index 18d80f9b8d6..66a33f7ad08 100644 --- a/pkg/util/strategicpatch/patch.go +++ b/pkg/util/strategicpatch/patch.go @@ -110,6 +110,28 @@ func RequireKeyUnchanged(key string) PreconditionFunc { } } +// RequireMetadataKeyUnchanged creates a precondition function that fails +// if the metadata.key is present in the patch (indicating its value +// has changed). +func RequireMetadataKeyUnchanged(key string) PreconditionFunc { + return func(patch interface{}) bool { + patchMap, ok := patch.(map[string]interface{}) + if !ok { + return true + } + patchMap1, ok := patchMap["metadata"] + if !ok { + return true + } + patchMap2, ok := patchMap1.(map[string]interface{}) + if !ok { + return true + } + _, ok = patchMap2[key] + return !ok + } +} + // Deprecated: Use the synonym CreateTwoWayMergePatch, instead. func CreateStrategicMergePatch(original, modified []byte, dataStruct interface{}) ([]byte, error) { return CreateTwoWayMergePatch(original, modified, dataStruct)