diff --git a/plugins/kube-ps1/README.md b/plugins/kube-ps1/README.md index ef6d781ad..b66ad5da1 100644 --- a/plugins/kube-ps1/README.md +++ b/plugins/kube-ps1/README.md @@ -127,6 +127,10 @@ The default prompt layout is: ```sh (|:) ``` +You can enable kube environment context (like dev/staging/test/prod) via `KUBE_ENV_CTX_ENABLE=true`. In this case, the layout will be: +```sh +[] (|:) +``` If the current-context is not set, kube-ps1 will return the following: @@ -204,6 +208,23 @@ the following variables: | `KUBE_PS1_CTX_COLOR_FUNCTION` | No default, must be user supplied | Function to customize context color based on context name | | `KUBE_PS1_HIDE_IF_NOCONTEXT` | `false` | Hide the kube-ps1 prompt if no context is set | +In case you would like to have more control over kube environment context, you can tackle: + +| Variable | Default | Meaning | +| :------- | :-----: | ------- | +| `KUBE_ENV_CTX_ENABLE` | `false` | Extract environment identifiers from `kube_ps1` context and display them as a separate block in square brackets | +| `KUBE_ENV_PADDING` | ` ` | Padding (spaces or characters) added around the environment block | +| `KUBE_ENV_OPEN_SYMBOL` | `[` | Opening symbol used for the environment block | +| `KUBE_ENV_CLOSE_SYMBOL` | `]${KUBE_ENV_PADDING}` | Closing symbol used for the environment block | +| `KUBE_ENV_PROD` | `prod` | Set default production label | +| `KUBE_ENV_STG` | `stag` | Set default staging label | +| `KUBE_ENV_TEST` | `test` | Set default testing label | +| `KUBE_ENV_DEV` | `dev` | Set default developing label | +| `KUBE_ENV_PROD_RE` | `(production|prod)-` | Regex used to detect production in the context name | +| `KUBE_ENV_STG_RE` | `(staging|stg)-` | Regex used to detect staging in the context name | +| `KUBE_ENV_TEST_RE` | `(testing|test)-` | Regex used to detect test in the context name | +| `KUBE_ENV_DEV_RE` | `develop-` | Regex used to detect development in the context name| + To disable a feature, set it to an empty string: ```sh @@ -223,6 +244,15 @@ The default colors are set with the following variables: | `KUBE_PS1_NS_COLOR` | `cyan` | Set default color of the namespace | | `KUBE_PS1_BG_COLOR` | `null` | Set default color of the prompt background | +If `KUBE_ENV_CTX_ENABLE` set to `true`, you can also adjust: + +| Variable | Default | Meaning | +| :------- | :-----: | ------- | +| `KUBE_ENV_PROD_COLOR` | `red` | Set default color of the production environment | +| `KUBE_ENV_STG_COLOR` | `yellow` | Set default color of the staging environment | +| `KUBE_ENV_TEST_COLOR` | `green` | Set default color of the testing environment | +| `KUBE_ENV_DEV_COLOR` | `blue` | Set default color of the development environment | + Blue was used for the default symbol to match the Kubernetes color as closely as possible. Red was chosen as the context name to stand out, and cyan for the namespace. diff --git a/plugins/kube-ps1/kube-ps1.plugin.zsh b/plugins/kube-ps1/kube-ps1.plugin.zsh index 9dcd6da44..943868b11 100644 --- a/plugins/kube-ps1/kube-ps1.plugin.zsh +++ b/plugins/kube-ps1/kube-ps1.plugin.zsh @@ -36,6 +36,28 @@ KUBE_PS1_SUFFIX="${KUBE_PS1_SUFFIX-)}" KUBE_PS1_HIDE_IF_NOCONTEXT="${KUBE_PS1_HIDE_IF_NOCONTEXT:-false}" +# Kube environment variables +KUBE_ENV_CTX_ENABLE="${KUBE_ENV_CTX_ENABLE:-false}" +KUBE_ENV_PADDING="${KUBE_ENV_PADDING:- }" + +KUBE_ENV_OPEN_SYMBOL="${KUBE_ENV_OPEN_SYMBOL:-${KUBE_ENV_PADDING}[}" +KUBE_ENV_CLOSE_SYMBOL="${KUBE_ENV_CLOSE_SYMBOL:-]${KUBE_ENV_PADDING}}" + +KUBE_ENV_PROD_COLOR="${KUBE_ENV_PROD_COLOR:-red}" +KUBE_ENV_STG_COLOR="${KUBE_ENV_STG_COLOR:-yellow}" +KUBE_ENV_TEST_COLOR="${KUBE_ENV_TEST_COLOR:-green}" +KUBE_ENV_DEV_COLOR="${KUBE_ENV_DEV_COLOR:-blue}" + +KUBE_ENV_PROD="${KUBE_ENV_PROD:-prod}" +KUBE_ENV_STG="${KUBE_ENV_STG:-stag}" +KUBE_ENV_TEST="${KUBE_ENV_TEST:-test}" +KUBE_ENV_DEV="${KUBE_ENV_DEV:-dev}" + +KUBE_ENV_PROD_RE="${KUBE_ENV_PROD_RE:-(production|prod)-}" +KUBE_ENV_STG_RE="${KUBE_ENV_STG_RE:-(staging|stg)-}" +KUBE_ENV_TEST_RE="${KUBE_ENV_TEST_RE:-(testing|test)-}" +KUBE_ENV_DEV_RE="${KUBE_ENV_DEV_RE:-develop-}" + _KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}" _KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled" _KUBE_PS1_LAST_TIME=0 @@ -316,6 +338,35 @@ _kube_ps1_get_context_ns() { _kube_ps1_get_ns } +_kube_ps1_cut_context() { + local pattern="$1" + KUBE_PS1_CONTEXT="$(sed -E "s/${pattern}//g" <<< "${KUBE_PS1_CONTEXT}")" +} + +_kube_ps1_set_env_ctx() { + local ctx_color env_label + + if grep -qE "${KUBE_ENV_PROD_RE}" <<< "${KUBE_PS1_CONTEXT}"; then + _kube_ps1_cut_context "${KUBE_ENV_PROD_RE}" + ctx_color=$(_kube_ps1_color_fg "${KUBE_ENV_PROD_COLOR}") + env_label=${KUBE_ENV_PROD} + elif grep -qE "${KUBE_ENV_STG_RE}" <<< "${KUBE_PS1_CONTEXT}"; then + _kube_ps1_cut_context "${KUBE_ENV_PROD_RE}" + ctx_color=$(_kube_ps1_color_fg "${KUBE_ENV_PROD_COLOR}") + env_label=${KUBE_ENV_PROD} + elif grep -qE "${KUBE_ENV_TEST_RE}" <<< "${KUBE_PS1_CONTEXT}"; then + _kube_ps1_cut_context "${KUBE_ENV_TEST_RE}" + ctx_color=$(_kube_ps1_color_fg "${KUBE_ENV_TEST_COLOR}") + env_label=${KUBE_ENV_TEST} + elif grep -qE "${KUBE_ENV_DEV_RE}" <<< "${KUBE_PS1_CONTEXT}"; then + _kube_ps1_cut_context "${KUBE_ENV_DEV_RE}" + ctx_color=$(_kube_ps1_color_fg "${KUBE_ENV_DEV_COLOR}") + env_label=${KUBE_ENV_DEV} + fi + + KUBE_PS1+="${KUBE_ENV_OPEN_SYMBOL}${ctx_color}${env_label}${KUBE_PS1_RESET_COLOR}${KUBE_ENV_CLOSE_SYMBOL}" +} + # Set kube-ps1 shell defaults _kube_ps1_init @@ -392,6 +443,11 @@ kube_ps1() { # Background Color [[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg "${KUBE_PS1_BG_COLOR}")" + # Context Env + if [[ -n "${KUBE_ENV_CTX_ENABLE}" ]] && [[ "${KUBE_ENV_CTX_ENABLE}" == true ]]; then + _kube_ps1_set_env_ctx + fi + # Prefix if [[ -z "${KUBE_PS1_PREFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_PREFIX}" ]]; then KUBE_PS1+="${KUBE_PS1_PREFIX}"