From 10d0affe133f126bcbd1630510aa72822e08a969 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Mon, 29 Jan 2018 15:32:16 -0500 Subject: [PATCH] UPSTREAM: 58991: restore original object on apply err --- .../k8s.io/kubernetes/pkg/kubectl/cmd/apply.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go index e132743231c7..f4f9e57fd8c3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go +++ b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go @@ -674,13 +674,13 @@ func (p *patcher) patch(current runtime.Object, modified []byte, source, namespa } patchBytes, patchObject, err = p.patchSimple(current, modified, source, namespace, name, errOut) } - if err != nil && p.force { - patchBytes, patchObject, err = p.deleteAndCreate(modified, namespace, name) + if err != nil && errors.IsConflict(err) && p.force { + patchBytes, patchObject, err = p.deleteAndCreate(current, modified, namespace, name) } return patchBytes, patchObject, err } -func (p *patcher) deleteAndCreate(modified []byte, namespace, name string) ([]byte, runtime.Object, error) { +func (p *patcher) deleteAndCreate(original runtime.Object, modified []byte, namespace, name string) ([]byte, runtime.Object, error) { err := p.delete(namespace, name) if err != nil { return modified, nil, err @@ -699,5 +699,15 @@ func (p *patcher) deleteAndCreate(modified []byte, namespace, name string) ([]by return modified, nil, err } createdObject, err := p.helper.Create(namespace, true, versionedObject) + if err != nil { + // restore the original object if we fail to create the new one + // but still propagate and advertise error to user + var err2 error + createdObject, err2 = p.helper.Create(namespace, true, original) + if err2 != nil { + err = fmt.Errorf("An error ocurred force-replacing the existing object with the newly provided one:\n\n%v.\n\nAdditionally, an error ocurred attempting to restore the original object:\n\n%v\n", err, err2) + } + } + return modified, createdObject, err }