From 3654d637666386e40dd68d7f71fef22bf17e91a3 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Thu, 8 Dec 2016 19:28:48 -0500 Subject: [PATCH] Compute apply patch using versioned object --- pkg/kubectl/apply.go | 6 ++---- pkg/kubectl/cmd/apply.go | 11 ++++------- pkg/kubectl/resource/visitor.go | 4 ++-- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/pkg/kubectl/apply.go b/pkg/kubectl/apply.go index 6dd4f6bc32..362e13b637 100644 --- a/pkg/kubectl/apply.go +++ b/pkg/kubectl/apply.go @@ -17,8 +17,6 @@ limitations under the License. package kubectl import ( - "encoding/json" - "k8s.io/kubernetes/pkg/api/annotations" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/kubectl/resource" @@ -96,7 +94,7 @@ func GetModifiedConfiguration(info *resource.Info, annotate bool, codec runtime. accessor.SetAnnotations(annots) // TODO: this needs to be abstracted - there should be no assumption that versioned object // can be marshalled to JSON. - modified, err = json.Marshal(info.VersionedObject) + modified, err = runtime.Encode(codec, info.VersionedObject) if err != nil { return nil, err } @@ -106,7 +104,7 @@ func GetModifiedConfiguration(info *resource.Info, annotate bool, codec runtime. accessor.SetAnnotations(annots) // TODO: this needs to be abstracted - there should be no assumption that versioned object // can be marshalled to JSON. - modified, err = json.Marshal(info.VersionedObject) + modified, err = runtime.Encode(codec, info.VersionedObject) if err != nil { return nil, err } diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index f337b13eb6..8a6a9db16e 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -527,14 +527,11 @@ func (p *patcher) patchSimple(obj runtime.Object, modified []byte, source, names return nil, cmdutil.AddSourceToErr(fmt.Sprintf("retrieving original configuration from:\n%v\nfor:", obj), source, err) } - // Create the versioned struct from the original from the server for - // strategic patch. - // TODO: Move all structs in apply to use raw data. Can be done once - // builder has a RawResult method which delivers raw data instead of - // internal objects. - versionedObject, _, err := p.decoder.Decode(current, nil, nil) + // Create the versioned struct from the type defined in the restmapping + // (which is the API version we'll be submitting the patch to) + versionedObject, err := api.Scheme.New(p.mapping.GroupVersionKind) if err != nil { - return nil, cmdutil.AddSourceToErr(fmt.Sprintf("converting encoded server-side object back to versioned struct:\n%v\nfor:", obj), source, err) + return nil, cmdutil.AddSourceToErr(fmt.Sprintf("getting instance of versioned object for %v:", p.mapping.GroupVersionKind), source, err) } // Compute a three way strategic merge patch to send to server. diff --git a/pkg/kubectl/resource/visitor.go b/pkg/kubectl/resource/visitor.go index 854e77c6a6..42c45a02ec 100644 --- a/pkg/kubectl/resource/visitor.go +++ b/pkg/kubectl/resource/visitor.go @@ -81,9 +81,9 @@ type Info struct { // Optional, this is the provided object in a versioned type before defaulting // and conversions into its corresponding internal type. This is useful for // reflecting on user intent which may be lost after defaulting and conversions. - VersionedObject interface{} + VersionedObject runtime.Object // Optional, this is the most recent value returned by the server if available - runtime.Object + Object runtime.Object // Optional, this is the most recent resource version the server knows about for // this type of resource. It may not match the resource version of the object, // but if set it should be equal to or newer than the resource version of the