|
|
|
@ -41,6 +41,7 @@ import (
|
|
|
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
|
|
|
"k8s.io/apimachinery/pkg/types"
|
|
|
|
|
"k8s.io/apimachinery/pkg/util/jsonmergepatch"
|
|
|
|
|
"k8s.io/apimachinery/pkg/util/mergepatch"
|
|
|
|
|
"k8s.io/apimachinery/pkg/util/strategicpatch"
|
|
|
|
|
"k8s.io/apimachinery/pkg/watch"
|
|
|
|
|
"k8s.io/cli-runtime/pkg/genericclioptions"
|
|
|
|
@ -454,7 +455,13 @@ func createPatch(target *resource.Info, current runtime.Object) ([]byte, types.P
|
|
|
|
|
|
|
|
|
|
if isUnstructured || isCRD {
|
|
|
|
|
// fall back to generic JSON merge patch
|
|
|
|
|
patch, err := jsonmergepatch.CreateThreeWayJSONMergePatch(oldData, newData, currentData)
|
|
|
|
|
// from https://github.com/kubernetes/kubectl/blob/b83b2ec7d15f286720bccf7872b5c72372cb8e80/pkg/cmd/apply/patcher.go#L129
|
|
|
|
|
preconditions := []mergepatch.PreconditionFunc{mergepatch.RequireKeyUnchanged("apiVersion"),
|
|
|
|
|
mergepatch.RequireKeyUnchanged("kind"), mergepatch.RequireMetadataKeyUnchanged("name")}
|
|
|
|
|
patch, err := jsonmergepatch.CreateThreeWayJSONMergePatch(oldData, newData, currentData, preconditions...)
|
|
|
|
|
if err != nil && mergepatch.IsPreconditionFailed(err) {
|
|
|
|
|
err = fmt.Errorf("%s", "At least one of apiVersion, kind and name was changed")
|
|
|
|
|
}
|
|
|
|
|
return patch, types.MergePatchType, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|