From 832644f0b38d536be7a5adce9bc62b0902710091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arda=20G=C3=BC=C3=A7l=C3=BC?= Date: Fri, 2 Dec 2022 14:05:11 +0300 Subject: [PATCH] kubectl exec: return descriptive error message when multi resource passed `kubectl exec` command supports getting files as inputs. However, if the file contains multiple resources, it returns unclear error message; `cannot attach to *v1.List: selector for *v1.List not implemented`. Since `exec` command does not support multi resources, this PR handles that and returns descriptive error message earlier. --- .../src/k8s.io/kubectl/pkg/cmd/exec/exec.go | 5 ++++ test/cmd/exec.sh | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/exec/exec.go b/staging/src/k8s.io/kubectl/pkg/cmd/exec/exec.go index ff7a3750d76..3c312fac121 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/exec/exec.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/exec/exec.go @@ -33,6 +33,7 @@ import ( restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/remotecommand" + "k8s.io/apimachinery/pkg/api/meta" cmdutil "k8s.io/kubectl/pkg/cmd/util" "k8s.io/kubectl/pkg/cmd/util/podcmd" "k8s.io/kubectl/pkg/polymorphichelpers" @@ -310,6 +311,10 @@ func (p *ExecOptions) Run() error { return err } + if meta.IsListType(obj) { + return fmt.Errorf("cannot exec into multiple objects at a time") + } + p.Pod, err = p.ExecutablePodFn(p.restClientGetter, obj, p.GetPodTimeout) if err != nil { return err diff --git a/test/cmd/exec.sh b/test/cmd/exec.sh index a440850f2b3..58c2a035010 100755 --- a/test/cmd/exec.sh +++ b/test/cmd/exec.sh @@ -30,6 +30,29 @@ run_kubectl_exec_pod_tests() { # POD abc should error since it doesn't exist kube::test::if_has_string "${output_message}" 'pods "abc" not found' + ### Test execute multiple resources + output_message=$(! kubectl exec -f - 2>&1 -- echo test << __EOF__ +apiVersion: v1 +kind: Pod +metadata: + name: test +spec: + containers: + - name: nginx + image: nginx +--- +apiVersion: v1 +kind: Pod +metadata: + name: test2 +spec: + containers: + - name: nginx + image: nginx +__EOF__ +) + kube::test::if_has_string "${output_message}" 'cannot exec into multiple objects at a time' + ### Test execute existing POD # Create test-pod kubectl create -f hack/testdata/pod.yaml