From 2f485ec84b0d02faac1ca3c4e93cd0e5a2b1a4aa Mon Sep 17 00:00:00 2001 From: Shijiang Wei Date: Wed, 28 Mar 2018 11:25:55 +0800 Subject: [PATCH 1/2] kubectl: fix a panic when createGeneratedObject failed Reproduce: kubectl run --image=alpine hello -- sleep 1d kubectl run --image=alpine --stdin --tty --attach hello -- /bin/sh Signed-off-by: Shijiang Wei --- pkg/kubectl/cmd/run.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubectl/cmd/run.go b/pkg/kubectl/cmd/run.go index 59eca16bac9..f0ffeae233d 100644 --- a/pkg/kubectl/cmd/run.go +++ b/pkg/kubectl/cmd/run.go @@ -276,14 +276,14 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c params["env"] = cmdutil.GetFlagStringArray(cmd, "env") - allErrs := []error{} var runObjectMap = map[string]*RunObject{} runObject, err := createGeneratedObject(f, cmd, generator, names, params, cmdutil.GetFlagString(cmd, "overrides"), namespace) if err != nil { - allErrs = append(allErrs, err) + return err } else { runObjectMap[generatorName] = runObject } + allErrs := []error{} if cmdutil.GetFlagBool(cmd, "expose") { serviceGenerator := cmdutil.GetFlagString(cmd, "service-generator") if len(serviceGenerator) == 0 { From c0e0dafa4ba20d718f022eb5bee3209d1d94c42e Mon Sep 17 00:00:00 2001 From: Shijiang Wei Date: Wed, 28 Mar 2018 11:34:08 +0800 Subject: [PATCH 2/2] avoid resource leak when both `--rm` and `--expose` are specified Before this patch, the deployment `leak-test` won't be removed after the following command exits. kubectl run --image=nginx:alpine --stdin --attach \ --rm --expose --port 80 leak-test -- sh This patch ensures both the deployment and the service are all removed. Signed-off-by: Shijiang Wei --- pkg/kubectl/cmd/run.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/kubectl/cmd/run.go b/pkg/kubectl/cmd/run.go index f0ffeae233d..7baf95c3f88 100644 --- a/pkg/kubectl/cmd/run.go +++ b/pkg/kubectl/cmd/run.go @@ -276,12 +276,12 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c params["env"] = cmdutil.GetFlagStringArray(cmd, "env") - var runObjectMap = map[string]*RunObject{} + var createdObjects = []*RunObject{} runObject, err := createGeneratedObject(f, cmd, generator, names, params, cmdutil.GetFlagString(cmd, "overrides"), namespace) if err != nil { return err } else { - runObjectMap[generatorName] = runObject + createdObjects = append(createdObjects, runObject) } allErrs := []error{} if cmdutil.GetFlagBool(cmd, "expose") { @@ -293,7 +293,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c if err != nil { allErrs = append(allErrs, err) } else { - runObjectMap[generatorName] = serviceRunObject + createdObjects = append(createdObjects, serviceRunObject) } } @@ -345,7 +345,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c } if remove { - for _, obj := range runObjectMap { + for _, obj := range createdObjects { namespace, err = obj.Mapping.MetadataAccessor.Namespace(obj.Object) if err != nil { return err