From 15bc445a9c9d90cb3312ac6d687722bb6f3333bf Mon Sep 17 00:00:00 2001
From: Matthew Mosesohn <mmosesohn@mirantis.com>
Date: Mon, 14 Nov 2016 12:22:46 +0400
Subject: [PATCH] Generate kubectl bash completion from kubectl instead of file

---
 .../master/files/kubectl_bash_completion.sh   | 3020 -----------------
 roles/kubernetes/master/tasks/main.yml        |   20 +-
 2 files changed, 15 insertions(+), 3025 deletions(-)
 delete mode 100644 roles/kubernetes/master/files/kubectl_bash_completion.sh

diff --git a/roles/kubernetes/master/files/kubectl_bash_completion.sh b/roles/kubernetes/master/files/kubectl_bash_completion.sh
deleted file mode 100644
index 52e51ff6d..000000000
--- a/roles/kubernetes/master/files/kubectl_bash_completion.sh
+++ /dev/null
@@ -1,3020 +0,0 @@
-#!/bin/bash
-
-__debug()
-{
-    if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then
-        echo "$*" >> "${BASH_COMP_DEBUG_FILE}"
-    fi
-}
-
-# Homebrew on Macs have version 1.3 of bash-completion which doesn't include
-# _init_completion. This is a very minimal version of that function.
-__my_init_completion()
-{
-    COMPREPLY=()
-    _get_comp_words_by_ref cur prev words cword
-}
-
-__index_of_word()
-{
-    local w word=$1
-    shift
-    index=0
-    for w in "$@"; do
-        [[ $w = "$word" ]] && return
-        index=$((index+1))
-    done
-    index=-1
-}
-
-__contains_word()
-{
-    local w word=$1; shift
-    for w in "$@"; do
-        [[ $w = "$word" ]] && return
-    done
-    return 1
-}
-
-__handle_reply()
-{
-    __debug "${FUNCNAME}"
-    case $cur in
-        -*)
-            if [[ $(type -t compopt) = "builtin" ]]; then
-                compopt -o nospace
-            fi
-            local allflags
-            if [ ${#must_have_one_flag[@]} -ne 0 ]; then
-                allflags=("${must_have_one_flag[@]}")
-            else
-                allflags=("${flags[*]} ${two_word_flags[*]}")
-            fi
-            COMPREPLY=( $(compgen -W "${allflags[*]}" -- "$cur") )
-            if [[ $(type -t compopt) = "builtin" ]]; then
-                [[ $COMPREPLY == *= ]] || compopt +o nospace
-            fi
-            return 0;
-            ;;
-    esac
-
-    # check if we are handling a flag with special work handling
-    local index
-    __index_of_word "${prev}" "${flags_with_completion[@]}"
-    if [[ ${index} -ge 0 ]]; then
-        ${flags_completion[${index}]}
-        return
-    fi
-
-    # we are parsing a flag and don't have a special handler, no completion
-    if [[ ${cur} != "${words[cword]}" ]]; then
-        return
-    fi
-
-    local completions
-    if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then
-        completions=("${must_have_one_flag[@]}")
-    elif [[ ${#must_have_one_noun[@]} -ne 0 ]]; then
-        completions=("${must_have_one_noun[@]}")
-    else
-        completions=("${commands[@]}")
-    fi
-    COMPREPLY=( $(compgen -W "${completions[*]}" -- "$cur") )
-
-    if [[ ${#COMPREPLY[@]} -eq 0 ]]; then
-        declare -F __custom_func >/dev/null && __custom_func
-    fi
-}
-
-# The arguments should be in the form "ext1|ext2|extn"
-__handle_filename_extension_flag()
-{
-    local ext="$1"
-    _filedir "@(${ext})"
-}
-
-__handle_subdirs_in_dir_flag()
-{
-    local dir="$1"
-    pushd "${dir}" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1
-}
-
-__handle_flag()
-{
-    __debug "${FUNCNAME}: c is $c words[c] is ${words[c]}"
-
-    # if a command required a flag, and we found it, unset must_have_one_flag()
-    local flagname=${words[c]}
-    # if the word contained an =
-    if [[ ${words[c]} == *"="* ]]; then
-        flagname=${flagname%=*} # strip everything after the =
-        flagname="${flagname}=" # but put the = back
-    fi
-    __debug "${FUNCNAME}: looking for ${flagname}"
-    if __contains_word "${flagname}" "${must_have_one_flag[@]}"; then
-        must_have_one_flag=()
-    fi
-
-    # skip the argument to a two word flag
-    if __contains_word "${words[c]}" "${two_word_flags[@]}"; then
-        c=$((c+1))
-        # if we are looking for a flags value, don't show commands
-        if [[ $c -eq $cword ]]; then
-            commands=()
-        fi
-    fi
-
-    # skip the flag itself
-    c=$((c+1))
-
-}
-
-__handle_noun()
-{
-    __debug "${FUNCNAME}: c is $c words[c] is ${words[c]}"
-
-    if __contains_word "${words[c]}" "${must_have_one_noun[@]}"; then
-        must_have_one_noun=()
-    fi
-
-    nouns+=("${words[c]}")
-    c=$((c+1))
-}
-
-__handle_command()
-{
-    __debug "${FUNCNAME}: c is $c words[c] is ${words[c]}"
-
-    local next_command
-    if [[ -n ${last_command} ]]; then
-        next_command="_${last_command}_${words[c]}"
-    else
-        next_command="_${words[c]}"
-    fi
-    c=$((c+1))
-    __debug "${FUNCNAME}: looking for ${next_command}"
-    declare -F $next_command >/dev/null && $next_command
-}
-
-__handle_word()
-{
-    if [[ $c -ge $cword ]]; then
-        __handle_reply
-        return
-    fi
-    __debug "${FUNCNAME}: c is $c words[c] is ${words[c]}"
-    if [[ "${words[c]}" == -* ]]; then
-        __handle_flag
-    elif __contains_word "${words[c]}" "${commands[@]}"; then
-        __handle_command
-    else
-        __handle_noun
-    fi
-    __handle_word
-}
-
-# call kubectl get $1,
-__kubectl_parse_get()
-{
-    local template
-    template="{{ range .items  }}{{ .metadata.name }} {{ end }}"
-    local kubectl_out
-    if kubectl_out=$(kubectl get -o template --template="${template}" "$1" 2>/dev/null); then
-        COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) )
-    fi
-}
-
-__kubectl_get_resource()
-{
-    if [[ ${#nouns[@]} -eq 0 ]]; then
-        return 1
-    fi
-    __kubectl_parse_get "${nouns[${#nouns[@]} -1]}"
-}
-
-__kubectl_get_resource_pod()
-{
-    __kubectl_parse_get "pod"
-}
-
-__kubectl_get_resource_rc()
-{
-    __kubectl_parse_get "rc"
-}
-
-# $1 is the name of the pod we want to get the list of containers inside
-__kubectl_get_containers()
-{
-    local template
-    template="{{ range .spec.containers  }}{{ .name }} {{ end }}"
-    __debug "${FUNCNAME} nouns are ${nouns[*]}"
-
-    local len="${#nouns[@]}"
-    if [[ ${len} -ne 1 ]]; then
-        return
-    fi
-    local last=${nouns[${len} -1]}
-    local kubectl_out
-    if kubectl_out=$(kubectl get -o template --template="${template}" pods "${last}" 2>/dev/null); then
-        COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) )
-    fi
-}
-
-# Require both a pod and a container to be specified
-__kubectl_require_pod_and_container()
-{
-    if [[ ${#nouns[@]} -eq 0 ]]; then
-        __kubectl_parse_get pods
-        return 0
-    fi;
-    __kubectl_get_containers
-    return 0
-}
-
-__custom_func() {
-    case ${last_command} in
-        kubectl_get | kubectl_describe | kubectl_delete | kubectl_label | kubectl_stop)
-            __kubectl_get_resource
-            return
-            ;;
-        kubectl_logs)
-            __kubectl_require_pod_and_container
-            return
-            ;;
-        kubectl_exec)
-            __kubectl_get_resource_pod
-            return
-            ;;
-        kubectl_rolling-update)
-            __kubectl_get_resource_rc
-            return
-            ;;
-        *)
-            ;;
-    esac
-}
-
-_kubectl_get()
-{
-    last_command="kubectl_get"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--all-namespaces")
-    flags+=("--export")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--label-columns=")
-    two_word_flags+=("-L")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--selector=")
-    two_word_flags+=("-l")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--watch")
-    flags+=("-w")
-    flags+=("--watch-only")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-    must_have_one_noun+=("componentstatus")
-    must_have_one_noun+=("configmap")
-    must_have_one_noun+=("daemonset")
-    must_have_one_noun+=("deployment")
-    must_have_one_noun+=("endpoints")
-    must_have_one_noun+=("event")
-    must_have_one_noun+=("horizontalpodautoscaler")
-    must_have_one_noun+=("ingress")
-    must_have_one_noun+=("job")
-    must_have_one_noun+=("limitrange")
-    must_have_one_noun+=("namespace")
-    must_have_one_noun+=("node")
-    must_have_one_noun+=("persistentvolume")
-    must_have_one_noun+=("persistentvolumeclaim")
-    must_have_one_noun+=("pod")
-    must_have_one_noun+=("podsecuritypolicy")
-    must_have_one_noun+=("podtemplate")
-    must_have_one_noun+=("replicaset")
-    must_have_one_noun+=("replicationcontroller")
-    must_have_one_noun+=("resourcequota")
-    must_have_one_noun+=("secret")
-    must_have_one_noun+=("service")
-    must_have_one_noun+=("serviceaccount")
-    must_have_one_noun+=("thirdpartyresource")
-    must_have_one_noun+=("thirdpartyresourcedata")
-}
-
-_kubectl_describe()
-{
-    last_command="kubectl_describe"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--selector=")
-    two_word_flags+=("-l")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-    must_have_one_noun+=("configmap")
-    must_have_one_noun+=("daemonset")
-    must_have_one_noun+=("deployment")
-    must_have_one_noun+=("endpoints")
-    must_have_one_noun+=("horizontalpodautoscaler")
-    must_have_one_noun+=("horizontalpodautoscaler")
-    must_have_one_noun+=("ingress")
-    must_have_one_noun+=("job")
-    must_have_one_noun+=("job")
-    must_have_one_noun+=("limitrange")
-    must_have_one_noun+=("namespace")
-    must_have_one_noun+=("node")
-    must_have_one_noun+=("persistentvolume")
-    must_have_one_noun+=("persistentvolumeclaim")
-    must_have_one_noun+=("pod")
-    must_have_one_noun+=("replicaset")
-    must_have_one_noun+=("replicationcontroller")
-    must_have_one_noun+=("resourcequota")
-    must_have_one_noun+=("secret")
-    must_have_one_noun+=("service")
-    must_have_one_noun+=("serviceaccount")
-}
-
-_kubectl_create_namespace()
-{
-    last_command="kubectl_create_namespace"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--dry-run")
-    flags+=("--generator=")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--save-config")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_create_secret_docker-registry()
-{
-    last_command="kubectl_create_secret_docker-registry"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--docker-email=")
-    flags+=("--docker-password=")
-    flags+=("--docker-server=")
-    flags+=("--docker-username=")
-    flags+=("--dry-run")
-    flags+=("--generator=")
-    flags+=("--include-extended-apis")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--save-config")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--docker-email=")
-    must_have_one_flag+=("--docker-password=")
-    must_have_one_flag+=("--docker-username=")
-    must_have_one_noun=()
-}
-
-_kubectl_create_secret_generic()
-{
-    last_command="kubectl_create_secret_generic"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--dry-run")
-    flags+=("--from-file=")
-    flags+=("--from-literal=")
-    flags+=("--generator=")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--save-config")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--type=")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_create_secret()
-{
-    last_command="kubectl_create_secret"
-    commands=()
-    commands+=("docker-registry")
-    commands+=("generic")
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_create_configmap()
-{
-    last_command="kubectl_create_configmap"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--dry-run")
-    flags+=("--from-file=")
-    flags+=("--from-literal=")
-    flags+=("--generator=")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--save-config")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_create_serviceaccount()
-{
-    last_command="kubectl_create_serviceaccount"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--dry-run")
-    flags+=("--generator=")
-    flags+=("--include-extended-apis")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--save-config")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_create()
-{
-    last_command="kubectl_create"
-    commands=()
-    commands+=("namespace")
-    commands+=("secret")
-    commands+=("configmap")
-    commands+=("serviceaccount")
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--save-config")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--filename=")
-    must_have_one_flag+=("-f")
-    must_have_one_noun=()
-}
-
-_kubectl_replace()
-{
-    last_command="kubectl_replace"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--cascade")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--force")
-    flags+=("--grace-period=")
-    flags+=("--include-extended-apis")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--save-config")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--timeout=")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--filename=")
-    must_have_one_flag+=("-f")
-    must_have_one_noun=()
-}
-
-_kubectl_patch()
-{
-    last_command="kubectl_patch"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--patch=")
-    two_word_flags+=("-p")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--type=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--patch=")
-    must_have_one_flag+=("-p")
-    must_have_one_noun=()
-}
-
-_kubectl_delete()
-{
-    last_command="kubectl_delete"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--all")
-    flags+=("--cascade")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--grace-period=")
-    flags+=("--ignore-not-found")
-    flags+=("--include-extended-apis")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--selector=")
-    two_word_flags+=("-l")
-    flags+=("--timeout=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-    must_have_one_noun+=("componentstatus")
-    must_have_one_noun+=("configmap")
-    must_have_one_noun+=("daemonset")
-    must_have_one_noun+=("deployment")
-    must_have_one_noun+=("endpoints")
-    must_have_one_noun+=("event")
-    must_have_one_noun+=("horizontalpodautoscaler")
-    must_have_one_noun+=("ingress")
-    must_have_one_noun+=("job")
-    must_have_one_noun+=("limitrange")
-    must_have_one_noun+=("namespace")
-    must_have_one_noun+=("node")
-    must_have_one_noun+=("persistentvolume")
-    must_have_one_noun+=("persistentvolumeclaim")
-    must_have_one_noun+=("pod")
-    must_have_one_noun+=("podsecuritypolicy")
-    must_have_one_noun+=("podtemplate")
-    must_have_one_noun+=("replicaset")
-    must_have_one_noun+=("replicationcontroller")
-    must_have_one_noun+=("resourcequota")
-    must_have_one_noun+=("secret")
-    must_have_one_noun+=("service")
-    must_have_one_noun+=("serviceaccount")
-    must_have_one_noun+=("thirdpartyresource")
-    must_have_one_noun+=("thirdpartyresourcedata")
-}
-
-_kubectl_edit()
-{
-    last_command="kubectl_edit"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--save-config")
-    flags+=("--windows-line-endings")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_apply()
-{
-    last_command="kubectl_apply"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--filename=")
-    must_have_one_flag+=("-f")
-    must_have_one_noun=()
-}
-
-_kubectl_namespace()
-{
-    last_command="kubectl_namespace"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_logs()
-{
-    last_command="kubectl_logs"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--container=")
-    two_word_flags+=("-c")
-    flags+=("--follow")
-    flags+=("-f")
-    flags+=("--include-extended-apis")
-    flags+=("--interactive")
-    flags+=("--limit-bytes=")
-    flags+=("--previous")
-    flags+=("-p")
-    flags+=("--since=")
-    flags+=("--since-time=")
-    flags+=("--tail=")
-    flags+=("--timestamps")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_rolling-update()
-{
-    last_command="kubectl_rolling-update"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--container=")
-    flags+=("--deployment-label-key=")
-    flags+=("--dry-run")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--image=")
-    flags+=("--include-extended-apis")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--poll-interval=")
-    flags+=("--rollback")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--timeout=")
-    flags+=("--update-period=")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--filename=")
-    must_have_one_flag+=("-f")
-    must_have_one_flag+=("--image=")
-    must_have_one_noun=()
-}
-
-_kubectl_scale()
-{
-    last_command="kubectl_scale"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--current-replicas=")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--replicas=")
-    flags+=("--resource-version=")
-    flags+=("--timeout=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--replicas=")
-    must_have_one_noun=()
-}
-
-_kubectl_cordon()
-{
-    last_command="kubectl_cordon"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_drain()
-{
-    last_command="kubectl_drain"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--force")
-    flags+=("--grace-period=")
-    flags+=("--ignore-daemonsets")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_uncordon()
-{
-    last_command="kubectl_uncordon"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_attach()
-{
-    last_command="kubectl_attach"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--container=")
-    two_word_flags+=("-c")
-    flags+=("--stdin")
-    flags+=("-i")
-    flags+=("--tty")
-    flags+=("-t")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_exec()
-{
-    last_command="kubectl_exec"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--container=")
-    two_word_flags+=("-c")
-    flags+=("--pod=")
-    two_word_flags+=("-p")
-    flags+=("--stdin")
-    flags+=("-i")
-    flags+=("--tty")
-    flags+=("-t")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_port-forward()
-{
-    last_command="kubectl_port-forward"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--pod=")
-    two_word_flags+=("-p")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_proxy()
-{
-    last_command="kubectl_proxy"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--accept-hosts=")
-    flags+=("--accept-paths=")
-    flags+=("--address=")
-    flags+=("--api-prefix=")
-    flags+=("--disable-filter")
-    flags+=("--port=")
-    two_word_flags+=("-p")
-    flags+=("--reject-methods=")
-    flags+=("--reject-paths=")
-    flags+=("--unix-socket=")
-    two_word_flags+=("-u")
-    flags+=("--www=")
-    two_word_flags+=("-w")
-    flags+=("--www-prefix=")
-    two_word_flags+=("-P")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_run()
-{
-    last_command="kubectl_run"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--attach")
-    flags+=("--command")
-    flags+=("--dry-run")
-    flags+=("--env=")
-    flags+=("--expose")
-    flags+=("--generator=")
-    flags+=("--hostport=")
-    flags+=("--image=")
-    flags+=("--include-extended-apis")
-    flags+=("--labels=")
-    two_word_flags+=("-l")
-    flags+=("--leave-stdin-open")
-    flags+=("--limits=")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--overrides=")
-    flags+=("--port=")
-    flags+=("--record")
-    flags+=("--replicas=")
-    two_word_flags+=("-r")
-    flags+=("--requests=")
-    flags+=("--restart=")
-    flags+=("--rm")
-    flags+=("--save-config")
-    flags+=("--service-generator=")
-    flags+=("--service-overrides=")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--stdin")
-    flags+=("-i")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--tty")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--image=")
-    must_have_one_noun=()
-}
-
-_kubectl_expose()
-{
-    last_command="kubectl_expose"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--container-port=")
-    flags+=("--create-external-load-balancer")
-    flags+=("--dry-run")
-    flags+=("--external-ip=")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--generator=")
-    flags+=("--labels=")
-    two_word_flags+=("-l")
-    flags+=("--load-balancer-ip=")
-    flags+=("--name=")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--overrides=")
-    flags+=("--port=")
-    flags+=("--protocol=")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--save-config")
-    flags+=("--selector=")
-    flags+=("--session-affinity=")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--target-port=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--type=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_autoscale()
-{
-    last_command="kubectl_autoscale"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--cpu-percent=")
-    flags+=("--dry-run")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--generator=")
-    flags+=("--include-extended-apis")
-    flags+=("--max=")
-    flags+=("--min=")
-    flags+=("--name=")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--save-config")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--max=")
-    must_have_one_noun=()
-}
-
-_kubectl_rollout_history()
-{
-    last_command="kubectl_rollout_history"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--revision=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_rollout_pause()
-{
-    last_command="kubectl_rollout_pause"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_rollout_resume()
-{
-    last_command="kubectl_rollout_resume"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_rollout_undo()
-{
-    last_command="kubectl_rollout_undo"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--to-revision=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_rollout()
-{
-    last_command="kubectl_rollout"
-    commands=()
-    commands+=("history")
-    commands+=("pause")
-    commands+=("resume")
-    commands+=("undo")
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_label()
-{
-    last_command="kubectl_label"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--all")
-    flags+=("--dry-run")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--overwrite")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--resource-version=")
-    flags+=("--selector=")
-    two_word_flags+=("-l")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-    must_have_one_noun+=("componentstatus")
-    must_have_one_noun+=("configmap")
-    must_have_one_noun+=("daemonset")
-    must_have_one_noun+=("deployment")
-    must_have_one_noun+=("endpoints")
-    must_have_one_noun+=("event")
-    must_have_one_noun+=("horizontalpodautoscaler")
-    must_have_one_noun+=("ingress")
-    must_have_one_noun+=("job")
-    must_have_one_noun+=("limitrange")
-    must_have_one_noun+=("namespace")
-    must_have_one_noun+=("node")
-    must_have_one_noun+=("persistentvolume")
-    must_have_one_noun+=("persistentvolumeclaim")
-    must_have_one_noun+=("pod")
-    must_have_one_noun+=("podsecuritypolicy")
-    must_have_one_noun+=("podtemplate")
-    must_have_one_noun+=("replicaset")
-    must_have_one_noun+=("replicationcontroller")
-    must_have_one_noun+=("resourcequota")
-    must_have_one_noun+=("secret")
-    must_have_one_noun+=("service")
-    must_have_one_noun+=("serviceaccount")
-    must_have_one_noun+=("thirdpartyresource")
-    must_have_one_noun+=("thirdpartyresourcedata")
-}
-
-_kubectl_annotate()
-{
-    last_command="kubectl_annotate"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--all")
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--overwrite")
-    flags+=("--record")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--resource-version=")
-    flags+=("--selector=")
-    two_word_flags+=("-l")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_view()
-{
-    last_command="kubectl_config_view"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--flatten")
-    flags+=("--merge=")
-    flags+=("--minify")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--raw")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_set-cluster()
-{
-    last_command="kubectl_config_set-cluster"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags_with_completion+=("--certificate-authority")
-    flags_completion+=("_filedir")
-    flags+=("--embed-certs=")
-    flags+=("--insecure-skip-tls-verify=")
-    flags+=("--server=")
-    flags+=("--alsologtostderr")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_set-credentials()
-{
-    last_command="kubectl_config_set-credentials"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--client-certificate=")
-    flags_with_completion+=("--client-certificate")
-    flags_completion+=("_filedir")
-    flags+=("--client-key=")
-    flags_with_completion+=("--client-key")
-    flags_completion+=("_filedir")
-    flags+=("--embed-certs=")
-    flags+=("--password=")
-    flags+=("--token=")
-    flags+=("--username=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--user=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_set-context()
-{
-    last_command="kubectl_config_set-context"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--cluster=")
-    flags+=("--namespace=")
-    flags+=("--user=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_set()
-{
-    last_command="kubectl_config_set"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_unset()
-{
-    last_command="kubectl_config_unset"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_current-context()
-{
-    last_command="kubectl_config_current-context"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config_use-context()
-{
-    last_command="kubectl_config_use-context"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_config()
-{
-    last_command="kubectl_config"
-    commands=()
-    commands+=("view")
-    commands+=("set-cluster")
-    commands+=("set-credentials")
-    commands+=("set-context")
-    commands+=("set")
-    commands+=("unset")
-    commands+=("current-context")
-    commands+=("use-context")
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--kubeconfig=")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_cluster-info()
-{
-    last_command="kubectl_cluster-info"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--include-extended-apis")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_api-versions()
-{
-    last_command="kubectl_api-versions"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_version()
-{
-    last_command="kubectl_version"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--client")
-    flags+=("-c")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_explain()
-{
-    last_command="kubectl_explain"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--include-extended-apis")
-    flags+=("--recursive")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-_kubectl_convert()
-{
-    last_command="kubectl_convert"
-    commands=()
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--filename=")
-    flags_with_completion+=("--filename")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    two_word_flags+=("-f")
-    flags_with_completion+=("-f")
-    flags_completion+=("__handle_filename_extension_flag json|yaml|yml")
-    flags+=("--include-extended-apis")
-    flags+=("--local")
-    flags+=("--no-headers")
-    flags+=("--output=")
-    two_word_flags+=("-o")
-    flags+=("--output-version=")
-    flags+=("--recursive")
-    flags+=("-R")
-    flags+=("--schema-cache-dir=")
-    flags_with_completion+=("--schema-cache-dir")
-    flags_completion+=("_filedir")
-    flags+=("--show-all")
-    flags+=("-a")
-    flags+=("--show-labels")
-    flags+=("--sort-by=")
-    flags+=("--template=")
-    flags_with_completion+=("--template")
-    flags_completion+=("_filedir")
-    two_word_flags+=("-t")
-    flags_with_completion+=("-t")
-    flags_completion+=("_filedir")
-    flags+=("--validate")
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_flag+=("--filename=")
-    must_have_one_flag+=("-f")
-    must_have_one_noun=()
-}
-
-_kubectl()
-{
-    last_command="kubectl"
-    commands=()
-    commands+=("get")
-    commands+=("describe")
-    commands+=("create")
-    commands+=("replace")
-    commands+=("patch")
-    commands+=("delete")
-    commands+=("edit")
-    commands+=("apply")
-    commands+=("namespace")
-    commands+=("logs")
-    commands+=("rolling-update")
-    commands+=("scale")
-    commands+=("cordon")
-    commands+=("drain")
-    commands+=("uncordon")
-    commands+=("attach")
-    commands+=("exec")
-    commands+=("port-forward")
-    commands+=("proxy")
-    commands+=("run")
-    commands+=("expose")
-    commands+=("autoscale")
-    commands+=("rollout")
-    commands+=("label")
-    commands+=("annotate")
-    commands+=("config")
-    commands+=("cluster-info")
-    commands+=("api-versions")
-    commands+=("version")
-    commands+=("explain")
-    commands+=("convert")
-
-    flags=()
-    two_word_flags=()
-    flags_with_completion=()
-    flags_completion=()
-
-    flags+=("--alsologtostderr")
-    flags+=("--api-version=")
-    flags+=("--certificate-authority=")
-    flags+=("--client-certificate=")
-    flags+=("--client-key=")
-    flags+=("--cluster=")
-    flags+=("--context=")
-    flags+=("--insecure-skip-tls-verify")
-    flags+=("--kubeconfig=")
-    flags+=("--log-backtrace-at=")
-    flags+=("--log-dir=")
-    flags+=("--log-flush-frequency=")
-    flags+=("--logtostderr")
-    flags+=("--match-server-version")
-    flags+=("--namespace=")
-    flags+=("--password=")
-    flags+=("--server=")
-    two_word_flags+=("-s")
-    flags+=("--stderrthreshold=")
-    flags+=("--token=")
-    flags+=("--user=")
-    flags+=("--username=")
-    flags+=("--v=")
-    flags+=("--vmodule=")
-
-    must_have_one_flag=()
-    must_have_one_noun=()
-}
-
-__start_kubectl()
-{
-    local cur prev words cword
-    if declare -F _init_completion >/dev/null 2>&1; then
-        _init_completion -s || return
-    else
-        __my_init_completion || return
-    fi
-
-    local c=0
-    local flags=()
-    local two_word_flags=()
-    local flags_with_completion=()
-    local flags_completion=()
-    local commands=("kubectl")
-    local must_have_one_flag=()
-    local must_have_one_noun=()
-    local last_command
-    local nouns=()
-
-    __handle_word
-}
-
-if [[ $(type -t compopt) = "builtin" ]]; then
-    complete -F __start_kubectl kubectl
-else
-    complete -o nospace -F __start_kubectl kubectl
-fi
-
-# ex: ts=4 sw=4 et filetype=sh
diff --git a/roles/kubernetes/master/tasks/main.yml b/roles/kubernetes/master/tasks/main.yml
index 419be1f5a..4dd748bcd 100644
--- a/roles/kubernetes/master/tasks/main.yml
+++ b/roles/kubernetes/master/tasks/main.yml
@@ -1,11 +1,6 @@
 ---
 - include: pre-upgrade.yml
 
-- name: Copy kubectl bash completion
-  copy:
-    src: kubectl_bash_completion.sh
-    dest: /etc/bash_completion.d/kubectl.sh
-  when: ansible_os_family in ["Debian","RedHat"]
 
 - name: Copy kubectl from hyperkube container
   command: "/usr/bin/docker run --rm -v {{ bin_dir }}:/systembindir {{ hyperkube_image_repo }}:{{ hyperkube_image_tag }} /bin/cp /hyperkube /systembindir/kubectl"
@@ -15,6 +10,21 @@
   delay: "{{ retry_stagger | random + 3 }}"
   changed_when: false
 
+- name: Gather kubectl bash completion
+  command: "{{ bin_dir }}/kubectl completion bash"
+  no_log: true
+  register: kubectl_bash_completion
+  when: ansible_os_family in ["Debian","RedHat"]
+
+- name: Write kubectl bash completion
+  copy:
+    content: "{{ kubectl_bash_completion.stdout }}"
+    dest: /etc/bash_completion.d/kubectl.sh
+    owner: root
+    group: root
+    mode: 0755
+  when: ansible_os_family in ["Debian","RedHat"] and kubectl_bash_completion.changed
+
 - name: Write kube-apiserver manifest
   template:
     src: manifests/kube-apiserver.manifest.j2
-- 
GitLab