diff options
Diffstat (limited to 'plugins/kube-ps1')
| -rw-r--r-- | plugins/kube-ps1/README.md | 73 | ||||
| -rw-r--r-- | plugins/kube-ps1/kube-ps1.plugin.zsh | 159 | ||||
| -rw-r--r-- | plugins/kube-ps1/kube-ps1.zsh | 123 | 
3 files changed, 209 insertions, 146 deletions
diff --git a/plugins/kube-ps1/README.md b/plugins/kube-ps1/README.md index a572773a3..19dac42e9 100644 --- a/plugins/kube-ps1/README.md +++ b/plugins/kube-ps1/README.md @@ -1,13 +1,12 @@ -Kubernetes prompt for zsh -========================= +# Kubernetes prompt for zsh -A Kubernetes (k8s) zsh prompt that displays the current cluster cluster +A Kubernetes zsh prompt that displays the current cluster cluster  and the namespace.  Inspired by several tools used to simplify usage of kubectl -NOTE: If you are not using zsh, check out [kube-ps1](https://github.com/jonmosco/kube-ps1) designed for bash -as well as zsh. +NOTE: If you are not using zsh, check out [kube-ps1](https://github.com/jonmosco/kube-ps1) +designed for bash as well as zsh.  ## Requirements @@ -32,29 +31,51 @@ fast switching between clusters and namespaces.  The prompt layout is:  ``` -(<logo>|<cluster>:<namespace>) +(<symbol>|<cluster>:<namespace>)  ``` -Supported platforms: -* k8s - Kubernetes -* ocp - OpenShift +## Enabling -## Install +In order to use kube-ps1 with Oh My Zsh, you'll need to enable them in the +.zshrc file. You'll find the zshrc file in your $HOME directory. Open it with +your favorite text editor and you'll see a spot to list all the plugins you +want to load. -1. Clone this repository -2. Source the kube-ps1.zsh in your ~./.zshrc +```shell +vim $HOME/.zshrc +``` + +Add kube-ps1 to the list of enabled plugins and enable it on the prompt: + +```shell +plugins=( +  git +  kube-ps1 +) -ZSH: +PROMPT=$PROMPT'$(kube_ps1) '  ``` -source path/kube-ps1.sh -PROMPT='$(kube_ps1) ' + +Note: the `PROMPT` example above was tested with the theme `robbyrussell` + +## Enabling / Disabling on the current shell + +Sometimes the kubernetes information can be anoying, you can easily  +switch it on and off with the following commands: + +```shell +kubeon +``` + +```shell +kubeoff  ```  ## Colors -The colors are of my opinion. Blue was used as the prefix to match the Kubernetes -color as closely as possible. Red was chosen as the cluster name to stand out, and cyan -for the namespace.  These can of course be changed. +Blue was used as the prefix to match the Kubernetes color as closely as +possible. Red was chosen as the cluster name to stand out, and cyan +for the namespace. Check the customization section for changing them.  ## Customization @@ -62,15 +83,21 @@ The default settings can be overridden in ~/.zshrc  | Variable | Default | Meaning |  | :------- | :-----: | ------- | -| `KUBE_PS1_DEFAULT` | `true` | Default settings for the prompt | +| `KUBE_PS1_BINARY` | `kubectl` | Default Kubernetes binary |  | `KUBE_PS1_PREFIX` | `(` | Prompt opening character  | -| `KUBE_PS1_DEFAULT_LABEL` | `⎈ ` | Default prompt symbol | +| `KUBE_PS1_SYMBOL_ENABLE` | `true ` | Display the prompt Symbol. If set to `false`, this will also disable `KUBE_PS1_SEPARATOR` | +| `KUBE_PS1_SYMBOL_DEFAULT` | `⎈ ` | Default prompt symbol. Unicode `\u2388` | +| `KUBE_PS1_SYMBOL_USE_IMG` | `false` | ☸️  ,  Unicode `\u2638` as the prompt symbol | +| `KUBE_PS1_NS_ENABLE` | `true` | Display the namespace. If set to `false`, this will also disable `KUBE_PS1_DIVIDER` |  | `KUBE_PS1_SEPERATOR` | `\|` | Separator between symbol and cluster name | -| `KUBE_PS1_PLATFORM` | `kubectl` | Cluster type and binary to use |  | `KUBE_PS1_DIVIDER` | `:` | Separator between cluster and namespace |  | `KUBE_PS1_SUFFIX` | `)` | Prompt closing character | -| `KUBE_PS1_DEFAULT_LABEL_IMG` | `false` | Use Kubernetes img as the label: ☸️  | +| `KUBE_PS1_COLOR_SYMBOL` | `"%F{blue}"` | Custom color for the symbol | +| `KUBE_PS1_COLOR_CONTEXT` | `"%F{red}"` | Custom color for the context | +| `KUBE_PS1_COLOR_NS` | `"%F{cyan}"` | Custom color for the namespace | +| `KUBE_PS1_ENABLED` | `true` | Set to false to start disabled on any new shell, `kubeon`/`kubeoff` will flip this value on the current shell |  ## Contributors -Jared Yanovich +- Jared Yanovich +- Pedro Moranga
\ No newline at end of file diff --git a/plugins/kube-ps1/kube-ps1.plugin.zsh b/plugins/kube-ps1/kube-ps1.plugin.zsh new file mode 100644 index 000000000..8a751bda8 --- /dev/null +++ b/plugins/kube-ps1/kube-ps1.plugin.zsh @@ -0,0 +1,159 @@ +#!/bin/zsh + +# Kubernetes prompt helper for bash/zsh +# ported to oh-my-zsh +# Displays current context and namespace + +# Copyright 2018 Jon Mosco +# +#  Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +#     https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Debug +[[ -n $DEBUG ]] && set -x + +setopt PROMPT_SUBST +autoload -U add-zsh-hook +add-zsh-hook precmd _kube_ps1_update_cache +zmodload zsh/stat +zmodload zsh/datetime + +# Default values for the prompt +# Override these values in ~/.zshrc +KUBE_PS1_BINARY="${KUBE_PS1_BINARY:-kubectl}" +KUBE_PS1_SYMBOL_ENABLE="${KUBE_PS1_SYMBOL_ENABLE:-true}" +KUBE_PS1_SYMBOL_DEFAULT="${KUBE_PS1_SYMBOL_DEFAULT:-\u2388 }" +KUBE_PS1_SYMBOL_USE_IMG="${KUBE_PS1_SYMBOL_USE_IMG:-false}" +KUBE_PS1_NS_ENABLE="${KUBE_PS1_NS_ENABLE:-true}" +KUBE_PS1_SEPARATOR="${KUBE_PS1_SEPARATOR-|}" +KUBE_PS1_DIVIDER="${KUBE_PS1_DIVIDER-:}" +KUBE_PS1_PREFIX="${KUBE_PS1_PREFIX-(}" +KUBE_PS1_SUFFIX="${KUBE_PS1_SUFFIX-)}" +KUBE_PS1_LAST_TIME=0 +KUBE_PS1_ENABLED=true + +KUBE_PS1_COLOR_SYMBOL="%F{blue}" +KUBE_PS1_COLOR_CONTEXT="%F{red}" +KUBE_PS1_COLOR_NS="%F{cyan}" + +_kube_ps1_binary_check() { +  command -v "$1" >/dev/null +} + +_kube_ps1_symbol() { +  [[ "${KUBE_PS1_SYMBOL_ENABLE}" == false ]] && return + +  KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_DEFAULT}" +  KUBE_PS1_SYMBOL_IMG="\u2638 " + +  if [[ "${KUBE_PS1_SYMBOL_USE_IMG}" == true ]]; then +    KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_IMG}" +  fi + +  echo "${KUBE_PS1_SYMBOL}" +} + +_kube_ps1_split() { +  type setopt >/dev/null 2>&1 && setopt SH_WORD_SPLIT +  local IFS=$1 +  echo $2 +} + +_kube_ps1_file_newer_than() { +  local mtime +  local file=$1 +  local check_time=$2 + +  zmodload -e "zsh/stat" +  if [[ "$?" -eq 0 ]]; then +    mtime=$(stat +mtime "${file}") +  elif stat -c "%s" /dev/null &> /dev/null; then +    # GNU stat +    mtime=$(stat -c %Y "${file}") +  else +    # BSD stat +    mtime=$(stat -f %m "$file") +  fi + +  [[ "${mtime}" -gt "${check_time}" ]] +} + +_kube_ps1_update_cache() { +  KUBECONFIG="${KUBECONFIG:=$HOME/.kube/config}" +  if ! _kube_ps1_binary_check "${KUBE_PS1_BINARY}"; then +    # No ability to fetch context/namespace; display N/A. +    KUBE_PS1_CONTEXT="BINARY-N/A" +    KUBE_PS1_NAMESPACE="N/A" +    return +  fi + +  if [[ "${KUBECONFIG}" != "${KUBE_PS1_KUBECONFIG_CACHE}" ]]; then +    # User changed KUBECONFIG; unconditionally refetch. +    KUBE_PS1_KUBECONFIG_CACHE=${KUBECONFIG} +    _kube_ps1_get_context_ns +    return +  fi + +  # kubectl will read the environment variable $KUBECONFIG +  # otherwise set it to ~/.kube/config +  local conf +  for conf in $(_kube_ps1_split : "${KUBECONFIG:-${HOME}/.kube/config}"); do +    [[ -r "${conf}" ]] || continue +    if _kube_ps1_file_newer_than "${conf}" "${KUBE_PS1_LAST_TIME}"; then +      _kube_ps1_get_context_ns +      return +    fi +  done +} + +_kube_ps1_get_context_ns() { + +  # Set the command time +  KUBE_PS1_LAST_TIME=$EPOCHSECONDS + +  KUBE_PS1_CONTEXT="$(${KUBE_PS1_BINARY} config current-context 2>/dev/null)" +  if [[ -z "${KUBE_PS1_CONTEXT}" ]]; then +    KUBE_PS1_CONTEXT="N/A" +    KUBE_PS1_NAMESPACE="N/A" +    return +  elif [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then +    KUBE_PS1_NAMESPACE="$(${KUBE_PS1_BINARY} config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)" +    # Set namespace to 'default' if it is not defined +    KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-default}" +  fi +} + +# function to disable the prompt on the current shell +kubeon(){ +  KUBE_PS1_ENABLED=true +} + +# function to disable the prompt on the current shell +kubeoff(){ +  KUBE_PS1_ENABLED=false +} + +# Build our prompt +kube_ps1 () { +  local reset_color="%{$reset_color%}" +  [[ ${KUBE_PS1_ENABLED} != 'true' ]] && return + +  KUBE_PS1="${reset_color}$KUBE_PS1_PREFIX" +  KUBE_PS1+="${KUBE_PS1_COLOR_SYMBOL}$(_kube_ps1_symbol)" +  KUBE_PS1+="${reset_color}$KUBE_PS1_SEPERATOR" +  KUBE_PS1+="${KUBE_PS1_COLOR_CONTEXT}$KUBE_PS1_CONTEXT${reset_color}" +  KUBE_PS1+="$KUBE_PS1_DIVIDER" +  KUBE_PS1+="${KUBE_PS1_COLOR_NS}$KUBE_PS1_NAMESPACE${reset_color}" +  KUBE_PS1+="$KUBE_PS1_SUFFIX" + +  echo "${KUBE_PS1}" +} diff --git a/plugins/kube-ps1/kube-ps1.zsh b/plugins/kube-ps1/kube-ps1.zsh deleted file mode 100644 index e1cb4339d..000000000 --- a/plugins/kube-ps1/kube-ps1.zsh +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/zsh - -# Kubernetes prompt helper for bash/zsh -# Displays current context and namespace - -# Copyright 2017 Jon Mosco -# -#  Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -#     http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Debug -[[ -n $DEBUG ]] && set -x - -setopt PROMPT_SUBST -add-zsh-hook precmd _kube_ps1_load -zmodload zsh/stat - -# Default values for the prompt -# Override these values in ~/.zshrc or ~/.bashrc -KUBE_PS1_DEFAULT="${KUBE_PS1_DEFAULT:=true}" -KUBE_PS1_PREFIX="(" -KUBE_PS1_DEFAULT_LABEL="${KUBE_PS1_DEFAULT_LABEL:="⎈ "}" -KUBE_PS1_DEFAULT_LABEL_IMG="${KUBE_PS1_DEFAULT_LABEL_IMG:=false}" -KUBE_PS1_SEPERATOR="|" -KUBE_PS1_PLATFORM="${KUBE_PS1_PLATFORM:="kubectl"}" -KUBE_PS1_DIVIDER=":" -KUBE_PS1_SUFFIX=")" -KUBE_PS1_UNAME=$(uname) -KUBE_PS1_LAST_TIME=0 - -kube_ps1_label () { - -  [[ "${KUBE_PS1_DEFAULT_LABEL_IMG}" == false ]] && return - -  if [[ "${KUBE_PS1_DEFAULT_LABEL_IMG}" == true ]]; then -    local KUBE_LABEL="☸️ " -  fi - -  KUBE_PS1_DEFAULT_LABEL="${KUBE_LABEL}" - -} - -_kube_ps1_split() { -  type setopt >/dev/null 2>&1 && setopt SH_WORD_SPLIT -  local IFS=$1 -  echo $2 -} - -_kube_ps1_file_newer_than() { - -  local mtime -  local file=$1 -  local check_time=$2 -  mtime=$(stat +mtime "${file}") - -  [ "${mtime}" -gt "${check_time}" ] - -} - -_kube_ps1_load() { -  # kubectl will read the environment variable $KUBECONFIG -  # otherwise set it to ~/.kube/config -  KUBECONFIG="${KUBECONFIG:=$HOME/.kube/config}" - -  for conf in $(_kube_ps1_split : "${KUBECONFIG}"); do -    # TODO: check existence of $conf -    if _kube_ps1_file_newer_than "${conf}" "${KUBE_PS1_LAST_TIME}"; then -      _kube_ps1_get_context_ns -      return -    fi -  done -} - -_kube_ps1_get_context_ns() { - -  # Set the command time -  KUBE_PS1_LAST_TIME=$(date +%s) - -  if [[ "${KUBE_PS1_DEFAULT}" == true ]]; then -    local KUBE_BINARY="${KUBE_PS1_PLATFORM}" -  elif [[ "${KUBE_PS1_DEFAULT}" == false ]] && [[ "${KUBE_PS1_PLATFORM}" == "kubectl" ]];then -    local KUBE_BINARY="kubectl" -  elif [[ "${KUBE_PS1_PLATFORM}" == "oc" ]]; then -    local KUBE_BINARY="oc" -  fi - -  KUBE_PS1_CONTEXT="$(${KUBE_BINARY} config current-context)" -  KUBE_PS1_NAMESPACE="$(${KUBE_BINARY} config view --minify --output 'jsonpath={..namespace}')" -  # Set namespace to default if it is not defined -  KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-default}" - -} - -# source our symbol -kube_ps1_label - -# Build our prompt -kube_ps1 () { -  local reset_color="%f" -  local blue="%F{blue}" -  local red="%F{red}" -  local cyan="%F{cyan}" - -  KUBE_PS1="${reset_color}$KUBE_PS1_PREFIX" -  KUBE_PS1+="${blue}$KUBE_PS1_DEFAULT_LABEL" -  KUBE_PS1+="${reset_color}$KUBE_PS1_SEPERATOR" -  KUBE_PS1+="${red}$KUBE_PS1_CONTEXT${reset_color}" -  KUBE_PS1+="$KUBE_PS1_DIVIDER" -  KUBE_PS1+="${cyan}$KUBE_PS1_NAMESPACE${reset_color}" -  KUBE_PS1+="$KUBE_PS1_SUFFIX" - -  echo "${KUBE_PS1}" - -}  | 
