kubernetes/contrib/completions/bash/kubectl
Eric Paris 45a71bb8f3 fix kubectl log completion
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.
2014-11-19 14:17:51 -05:00

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