From aea8deee03d26f1b642b4c63ea746218f28e233e Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Wed, 7 Feb 2018 16:12:41 -0500 Subject: [PATCH] fix --watch on multiple requests --- hack/make-rules/test-cmd-util.sh | 12 ++++++++++++ pkg/kubectl/cmd/resource/get.go | 21 +++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 0528c2f740d..68e3bb0fac2 100755 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -1430,6 +1430,18 @@ run_kubectl_get_tests() { # Post-condition: Check if we get a limit and continue kube::test::if_has_string "${output_message}" "/clusterroles?limit=500 200 OK" + ### Test kubectl get chunk size does not result in a --watch error when resource list is served in multiple chunks + # Pre-condition: no ConfigMaps exist + kube::test::get_object_assert configmap "{{range.items}}{{$id_field}}:{{end}}" '' + # Post-condition: Create three configmaps and ensure that we can --watch them with a --chunk-size of 1 + kubectl create cm one "${kube_flags[@]}" + kubectl create cm two "${kube_flags[@]}" + kubectl create cm three "${kube_flags[@]}" + output_message=$(kubectl get configmap --chunk-size=1 --watch --request-timeout=1s 2>&1 "${kube_flags[@]}") + kube::test::if_has_not_string "${output_message}" "watch is only supported on individual resources" + output_message=$(kubectl get configmap --chunk-size=1 --watch-only --request-timeout=1s 2>&1 "${kube_flags[@]}") + kube::test::if_has_not_string "${output_message}" "watch is only supported on individual resources" + ### Test --allow-missing-template-keys # Pre-condition: no POD exists create_and_use_new_namespace diff --git a/pkg/kubectl/cmd/resource/get.go b/pkg/kubectl/cmd/resource/get.go index 1264b14d321..234c413c3a9 100644 --- a/pkg/kubectl/cmd/resource/get.go +++ b/pkg/kubectl/cmd/resource/get.go @@ -463,8 +463,25 @@ func (options *GetOptions) watch(f cmdutil.Factory, cmd *cobra.Command, args []s if err != nil { return err } - if len(infos) != 1 { - return i18n.Errorf("watch is only supported on individual resources and resource collections - %d resources were found", len(infos)) + if len(infos) > 1 { + gvk := infos[0].Mapping.GroupVersionKind + uniqueGVKs := 1 + + // If requesting a resource count greater than a request's --chunk-size, + // we will end up making multiple requests to the server, with each + // request producing its own "Info" object. Although overall we are + // dealing with a single resource type, we will end up with multiple + // infos returned by the builder. To handle this case, only fail if we + // have at least one info with a different GVK than the others. + for _, info := range infos { + if info.Mapping.GroupVersionKind != gvk { + uniqueGVKs++ + } + } + + if uniqueGVKs > 1 { + return i18n.Errorf("watch is only supported on individual resources and resource collections - %d resources were found", uniqueGVKs) + } } filterOpts := cmdutil.ExtractCmdPrintOptions(cmd, options.AllNamespaces)