
When kubectl started returning the right object it changed the template that needed to be used to get the name of the containers inside the pod.
344 lines
8.1 KiB
Bash
344 lines
8.1 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=
|
|
-n
|
|
--namespace=
|
|
--ns-path=
|
|
-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 | --ns-path)
|
|
_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
|