custom bash autocomplete

Often I do need to check which containers in a given kubernetes deployment in which status, to retrieve such info following command might be used:
kubectl get po -l app=my-awesome-app -o json | jq "[.items[0].status.containerStatuses[] | {name: .name, ready: .ready, state: .state | keys[0]}]"which will return something like:
[
{
"name": "exporter",
"ready": true,
"state": "running"
},
{
"name": "nginx",
"ready": true,
"state": "running"
},
{
"name": "proxy",
"ready": true,
"state": "running"
}
]as you can imagine remembering such command is not possible, so we are going to create a function in ~/.bash_profile:
po-kube() {
kubectl get po -l app=$1 -o json | jq "[.items[0].status.containerStatuses[] | {name: .name, ready: .ready, state: .state | keys[0]}]"
}and from now on we cat instead run:
po-kube my-awesome-appbut what if you have many deploymnets with long names?
here are pretty nice documentation of how bash autocompletion works and how to create custom bash autocomplete
In my case I added /usr/local/etc/bash_completion.d/po-kube:
_po-kube() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts=$(kubectl get deployment --template '{{range .items}}{{.metadata.name}}{{" "}}{{end}}')
if [[ ${cur} == * ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _po-kube po-kubeand from now on I can do something like:
po-kube s[TAB]
sms-api spam-api