Add zsh completion for 'docker node' commands

Signed-off-by: Steve Durrheimer <s.durrheimer@gmail.com>
master
Steve Durrheimer 2016-07-02 21:17:01 +02:00 committed by Tibor Vass
parent 8e2c3efc58
commit 825b9a3b33
1 changed files with 235 additions and 0 deletions

View File

@ -630,6 +630,224 @@ __docker_network_subcommand() {
return ret
}
# BO node
__docker_node_complete_ls_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(id)
__docker_complete_nodes_ids && ret=0
;;
(membership)
membership_opts=('accepted' 'pending' 'rejected')
_describe -t membership-opts "membership options" membership_opts && ret=0
;;
(name)
__docker_complete_nodes_names && ret=0
;;
(role)
role_opts=('manager' 'worker')
_describe -t role-opts "role options" role_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('id' 'label' 'membership' 'name' 'role')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_node_complete_tasks_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(desired-state)
state_opts=('accepted' 'running')
_describe -t state-opts "desired state options" state_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('desired-state' 'id' 'label' 'name')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_nodes() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local line s
declare -a lines nodes args
type=$1; shift
filter=$1; shift
[[ $filter != "none") ]] && args=("-f $filter")
lines=(${(f)"$(_call_program commands docker $docker_options node ls $args)"})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# Node ID
if [[ $type = (ids|all) ]]; then
for line in $lines; do
s="${line[${begin[ID]},${end[ID]}]%% ##}"
nodes=($nodes $s)
done
fi
# Names
if [[ $type = (names|all) ]]; then
for line in $lines; do
s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
nodes=($nodes $s)
done
fi
_describe -t nodes-list "nodes" nodes "$@" && ret=0
return ret
}
__docker_complete_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all none "$@"
}
__docker_complete_nodes_ids() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes ids none "$@"
}
__docker_complete_nodes_names() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes names none "$@"
}
__docker_complete_pending_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all "membership=pending" "$@"
}
__docker_complete_manager_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all "role=manager" "$@"
}
__docker_complete_worker_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all "role=worker" "$@"
}
__docker_node_commands() {
local -a _docker_node_subcommands
_docker_node_subcommands=(
"accept:Accept a node in the swarm"
"demote:Demote a node as manager in the swarm"
"inspect:Display detailed information on one or more nodes"
"ls:List nodes in the swarm"
"promote:Promote a node as manager in the swarm"
"rm:Remove a node from the swarm"
"tasks:List tasks running on a node"
"update:Update a node"
)
_describe -t docker-node-commands "docker node command" _docker_node_subcommands
}
__docker_node_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(accept|rm|remove)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:node:__docker_complete_pending_nodes" && ret=0
;;
(demote)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:node:__docker_complete_manager_nodes" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help -p --pretty)"{-p,--pretty}"[Print the information in a human friendly format]" \
"($help -)*:node:__docker_complete_nodes" && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
case $state in
(filter-options)
__docker_node_complete_ls_filters && ret=0
;;
esac
;;
(promote)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:node:__docker_complete_worker_nodes" && ret=0
;;
(tasks)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Display all instances]" \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \
"($help -n --no-resolve)"{-n,--no-resolve}"[Do not map IDs to Names]" \
"($help -)1:node:__docker_complete_nodes" && ret=0
case $state in
(filter-options)
__docker_node_complete_tasks_filters && ret=0
;;
esac
;;
(update)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--availability=[Availability of the node]:availability:(active pause drain)" \
"($help)--membership=[Membership of the node]:membership:(accepted rejected)" \
"($help)--role=[Role of the node]:role:(manager worker)" \
"($help -)1:node:__docker_complete_nodes" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0
;;
esac
return ret
}
# EO node
__docker_volume_complete_ls_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
@ -1162,6 +1380,23 @@ __docker_subcommand() {
;;
esac
;;
(node)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_node_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_node_subcommand && ret=0
;;
esac
;;
(pause|unpause)
_arguments $(__docker_arguments) \
$opts_help \