diff --git a/hack/test-cmd.sh b/hack/test-cmd.sh index fb440acd01c..54108b3cf77 100755 --- a/hack/test-cmd.sh +++ b/hack/test-cmd.sh @@ -808,7 +808,6 @@ __EOF__ ###################### kube::log::status "Testing kubectl(${version}:multiple resources)" - # TODO: add test for types like ReplicationControllerList, ServiceList FILES="hack/testdata/multi-resource-yaml hack/testdata/multi-resource-list @@ -866,8 +865,13 @@ __EOF__ fi fi # Command - # kubectl create -f "${file}" "${kube_flags[@]}" # test fails here now kubectl get -f "${file}" "${kube_flags[@]}" + # Command: watching multiple resources should return "not supported" error + WATCH_ERROR_FILE="${KUBE_TEMP}/kubectl-watch-error" + kubectl get -f "${file}" "${kube_flags[@]}" "--watch" 2> ${WATCH_ERROR_FILE} || true + if ! grep -q "watch is only supported on individual resources and resource collections" "${WATCH_ERROR_FILE}"; then + kube::log::error_exit "kubectl watch multiple resource returns unexpected error or non-error: $(cat ${WATCH_ERROR_FILE})" "1" + fi kubectl describe -f "${file}" "${kube_flags[@]}" # Command kubectl replace -f $replace_file --force "${kube_flags[@]}" diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 88f18fedc14..0396423a26b 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -146,7 +146,7 @@ func RunGet(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string return err } if len(infos) != 1 { - return fmt.Errorf("watch is only supported on a single resource - %d resources were found", len(infos)) + return fmt.Errorf("watch is only supported on individual resources and resource collections - %d resources were found", len(infos)) } info := infos[0] mapping := info.ResourceMapping() diff --git a/pkg/kubectl/resource/result.go b/pkg/kubectl/resource/result.go index f82e8d8faab..aaf7fd07e0a 100644 --- a/pkg/kubectl/resource/result.go +++ b/pkg/kubectl/resource/result.go @@ -199,7 +199,7 @@ func (r *Result) Watch(resourceVersion string) (watch.Interface, error) { return nil, err } if len(info) != 1 { - return nil, fmt.Errorf("watch is only supported on a single resource - %d resources were found", len(info)) + return nil, fmt.Errorf("watch is only supported on individual resources and resource collections - %d resources were found", len(info)) } return info[0].Watch(resourceVersion) } diff --git a/pkg/kubectl/resource/visitor.go b/pkg/kubectl/resource/visitor.go index 494be0ed676..79dbe26d7f3 100644 --- a/pkg/kubectl/resource/visitor.go +++ b/pkg/kubectl/resource/visitor.go @@ -564,6 +564,9 @@ func RetrieveLatest(info *Info, err error) error { if err != nil { return err } + if runtime.IsListType(info.Object) { + return fmt.Errorf("watch is only supported on individual resources and resource collections, but a list of resources is found") + } if len(info.Name) == 0 { return nil }