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-app

but 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-kube

and from now on I can do something like:

po-kube s[TAB]
sms-api spam-api