k3s/contrib/completions/bash/kubectl

342 lines
8.0 KiB
Bash

#!bash
#
# bash completion file for core kubectl commands
#
# This script provides completion of non replication controller options
#
# To enable the completions either:
# - place this file in /etc/bash_completion.d
# or
# - copy this file and add the line below to your .bashrc after
# bash completion features are loaded
# . kubectl
#
# Note:
# Currently, the completions will not work if the kube-apiserver daemon is not
# running on localhost on the standard port 8080
__contains_word()
{
local w word=$1; shift
for w in "$@"; do
[[ $w = "$word" ]] && return
done
return 1
}
__has_resource()
{
local all_resources=(pod pods service services minion minions replicationController replicationControllers)
local i
for ((i=command_word; i < cword; i++)); do
local word=${words[i]}
if __contains_word "${word}" "${all_resources[@]}"; then
return 0
fi
done
return 1
}
# call kubectl get $1,
# use the first column in compgen
# we could use templates, but then would need a template per resource
__kubectl_parse_get()
{
local kubectl_output out
if kubectl_output=$(kubectl get --no-headers "$1" 2>/dev/null); then
out=($(echo "${kubectl_output}" | awk '{print $1}'))
COMPREPLY=( $( compgen -W "${out[*]}" -- "$cur" ) )
fi
}
# $1 is the name of the pod we want to get the list of containers inside
__kubectl_get_containers()
{
local template
template="{{ range .desiredState.manifest.containers }}{{ .name }} {{ end }}"
local kubectl_out
if kubectl_out=$(kubectl get -o template --template="${template}" pods "$1" 2>/dev/null); then
COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) )
fi
}
__kubectl_pre_command()
{
local flags=(
--api-version=
-a
--auth-path=
--certificate-authority=
--client-certificate=
--client-key=
--insecure-skip-tls-verify=
--match-server-version=
--namespace=
-s
--server=
)
local api_versions=(v1beta1 v1beta2 v1beta3)
case $prev in
--api-version)
COMPREPLY=( $(compgen -W "${api_versions[*]}" -- "$cur") )
return 0
;;
-a | --auth-path | --certificate-authority | --client-certificate | --client-key)
_filedir
return 0
;;
--insecure-skip-tls-verify | --match-server-version)
COMPREPLY=( $(compgen -W "true false" -- "$cur") )
return 0
;;
-n | --namespace | -s | --server)
return 0
;;
*)
;;
esac
if [[ "$cur" = -* ]]; then
compopt -o nospace
COMPREPLY=( $(compgen -W "${flags[*]}" -- "$cur") )
[[ $COMPREPLY == *= ]] || compopt +o nospace
return 0
fi
COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
return 0
}
__kubectl_require_file()
{
local i
local flags=(-f)
for ((i=command_word; i < cword; i++)); do
local word=${words[i]}
if [[ "${word}" == "-f" ]]; then
flags=()
fi
done
case $prev in
-f)
_filedir '@(json|yml|yaml)'
return 0;
;;
esac
COMPREPLY=( $( compgen -W "${flags[*]}" -- "$cur" ) )
}
__kubectl_handle_flags_resources()
{
case $prev in
po | pod | pods)
__kubectl_parse_get pods
return 0
;;
rc | replicationController | replicationControllers)
__kubectl_parse_get replicationControllers
return 0
;;
se | service | services)
__kubectl_parse_get services
return 0
;;
me | minion | minions)
__kubectl_parse_get minions
return 0
;;
ev | event | events)
return 0
;;
esac
case $cur in
-*)
compopt -o nospace
COMPREPLY=( $(compgen -W "${flags[*]}" -- "$cur") )
[[ $COMPREPLY == *= ]] || compopt +o nospace
return 0;
;;
esac
COMPREPLY=( $(compgen -W "${resources[*]}" -- "$cur") )
}
__kubectl_get()
{
local resources=()
local flags=(-o --output=)
if __has_resource; then
resource=()
else
resources=(pods minions services replicationControllers)
fi
for ((i=command_word; i < cword; i++)); do
local word=${words[i]}
local next=$(( $i + 1 ))
case $word in
-o | --output)
if [[ $next -lt $(( $cword )) ]] &&
[[ ${words[$next]} == "template" ]]; then
resources+=(-t --template=)
flags=(-t --template=)
else
flags=()
fi
;;
-t | --templtate)
resources=(${resources[@]/--template=})
resources=(${resources[@]/-t})
flags=()
;;
esac
done
case $prev in
-o | --output)
COMPREPLY=( $(compgen -W "json yaml template templatefile" -- "$cur") )
return 0
;;
-t | --template)
_filedir
return 0
;;
esac
__kubectl_handle_flags_resources
}
# Require both a pod and a container to be specified
__kubectl_require_pod_and_container()
{
# check is cword-1 is $command
if [[ $prev == $command ]]; then
__kubectl_parse_get pods
return 0
fi;
# this is safe, we know $command is back there somewhere and we know cword-1
if [[ ${words[cword-2]} == $command ]]; then
__kubectl_get_containers $prev
return 0
fi
}
__kubectl_describe()
{
local resources=()
local flags=()
if __has_resource; then
resource=()
else
resources=(pods minions services replicationControllers)
fi
local resources=(pods minions services replicationControllers)
__kubectl_handle_flags_resources
}
__kubectl_delete()
{
local resources=()
local flags=()
if __has_resource; then
resource=()
flags=()
else
resources=(pods minions services replicationControllers -f)
flags=(-f)
fi
for ((i=command_word; i < cword; i++)); do
local word=${words[i]}
if [[ "${word}" == "-f" ]]; then
resources=()
flags=()
fi
done
case $prev in
-f)
_filedir '@(json|yml|yaml)'
return 0
;;
esac
__kubectl_handle_flags_resources
}
__kubectl_post_command()
{
case $command in
apply | create | update)
__kubectl_require_file
return 0
;;
get)
__kubectl_get
return 0
;;
describe)
__kubectl_describe
return 0
;;
delete)
__kubectl_delete
return 0
;;
log)
__kubectl_require_pod_and_container
return 0
;;
*)
;;
esac
}
_kubectl()
{
local command command_word
local cur prev words cword split
_init_completion -s -n : || return 0
_expand || return 0
COMPREPLY=()
local commands=(version proxy get describe create update delete namespace log apply help)
local two_word_flags=(
-a
-s
-n
)
# figure out which command they are running, remembering that arguments to
# options don't count as the command! So a hostname named 'create' won't
# trip things up
local i
for ((i=0; i < cword; i++)); do
if __contains_word "${words[i]}" "${commands[@]}" &&
! __contains_word "${words[i-1]}" "${two_word_flags[@]}"; then
command=${words[i]}
command_word=$i
break
fi
done
if [[ -z $command ]]; then
__kubectl_pre_command
return 0
fi
__kubectl_post_command
return 0
}
complete -F _kubectl kubectl
# ex: ts=4 sw=4 et filetype=sh