Skip to content

Commit

Permalink
added kubens/kubectx and various small changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Aleksey Maksimov authored and lechat committed Feb 16, 2020
1 parent b40322a commit e9d528d
Show file tree
Hide file tree
Showing 6 changed files with 481 additions and 12 deletions.
22 changes: 11 additions & 11 deletions .vimrc
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,6 @@ Plugin 'dkprice/vim-easygrep'
" Grep plugin
Plugin 'scrooloose/nerdtree'
" Filesystem manipulation
" Plugin 'talek/obvious-resize'
" Resize split windows with Ctrl+move keys - doesn't work
" Plugin 'ervandew/supertab'
" Dropdown suggestions on TAB key press
" Plugin 'vim-scripts/mru.vim'
" Most recently used files
" Plugin 'basepi/vim-conque'
" Shell within VIM buffer
" Plugin 'kien/ctrlp.vim'
Plugin 'ctrlpvim/ctrlp.vim'
" Find files on Ctrl+P press
"Plugin 'Lokaltog/vim-powerline.git'
Expand Down Expand Up @@ -239,6 +230,9 @@ autocmd BufWritePre *.html call TrimWhiteSpace()
autocmd BufWritePre *.groovy call TrimWhiteSpace()

"autocmd BufWritePost *.py call Flake8()
autocmd FileType groovy let b:dispatch = '/home/sabuser/src/scom-pipeline-library/cd/lint.sh'
au BufRead *.groovy try | execute "compiler groovy" | catch /./| endtry


" CtrlP settings
set wildignore+=*.sw*,*.pyc,*.class
Expand Down Expand Up @@ -308,7 +302,7 @@ autocmd FileType go nmap <leader>gi <Plug>(go-install)

" Fugitive
nnoremap <leader>gg :Gstatus<CR>
nnoremap <leader>gg :15Gstatus<CR>
nnoremap <leader>ga :Gwrite<CR>
nnoremap <leader>gc :Gcommit %<CR>
nnoremap <leader>gd :Gdiff<CR>
Expand Down Expand Up @@ -426,7 +420,7 @@ function! LightLineFugitive()
try
if expand('%:t') !~? 'Tagbar\|Gundo\|NERD' && &ft !~? 'vimfiler' && exists('*fugitive#head')
let mark = '' " edit here for cool mark
let branch = fugitive#head()
let branch = fugitive#head(8)
return branch !=# '' ? mark.branch : ''
endif
catch
Expand Down Expand Up @@ -607,4 +601,10 @@ let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_python_checkers = ['pep8','pyflakes']
let g:syntastic_aggregate_errors = 1
<<<<<<< HEAD
>>>>>>> upgrade vundle and plugins
=======

let g:startify_change_to_vcs_root = 1
let g:startify_change_to_dir = 0
>>>>>>> added kubens/kubectx and various small changes
5 changes: 4 additions & 1 deletion .zshrc
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ plugins=(git python pip docker vi-mode kubectl tmux)
source $ZSH/oh-my-zsh.sh

alias ls-al='nocorrect ls -al'
alias grep='grep -n -I'
alias rsync='noglob rsync'
alias docker='sudo docker $@'
alias proxy='export http_proxy=http://10.65.128.43:8080;export https_proxy=http://10.65.128.43:8080'
Expand Down Expand Up @@ -98,6 +97,7 @@ bindkey '^w' backward-kill-word
# ctrl-r starts searching history backward
bindkey '^r' history-incremental-search-backward

export ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="bg=bold,underline"
function source_config() {
if [ -r $PWD/.zsh_config ]; then
print "Sourcing $PWD/.zsh_config"
Expand Down Expand Up @@ -168,3 +168,6 @@ export GPG_AGENT_INFO
# added by travis gem
[ -f /home/aleksey/.travis/travis.sh ] && source /home/aleksey/.travis/travis.sh
(cat ~/.cache/wal/sequences &)
eval "$(direnv hook zsh)"

[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
12 changes: 12 additions & 0 deletions completions/_kubectx.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#compdef kubectx kctx=kubectx

local KUBECTX="${HOME}/.kube/kubectx"
PREV=""
if [ -f "$KUBECTX" ]; then
# show '-' only if there's a saved previous context
local PREV=$(cat "${KUBECTX}")
_arguments "1: :(-
$(kubectl config get-contexts --output='name'))"
else
_arguments "1: :($(kubectl config get-contexts --output='name'))"
fi
2 changes: 2 additions & 0 deletions completions/_kubens.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#compdef kubens kns=kubens
_arguments "1: :(- $(kubectl get namespaces -o=jsonpath='{range .items[*].metadata.name}{@}{"\n"}{end}'))"
233 changes: 233 additions & 0 deletions local/bin/kubectx
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
#!/usr/bin/env bash
#
# kubectx(1) is a utility to manage and switch between kubectl contexts.

# Copyright 2017 Google Inc.
#
# 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.

[[ -n $DEBUG ]] && set -x

set -eou pipefail
IFS=$'\n\t'

SELF_CMD="$0"
KUBECTX="${XDG_CACHE_HOME:-$HOME/.kube}/kubectx"

usage() {
cat <<"EOF"
USAGE:
kubectx : list the contexts
kubectx <NAME> : switch to context <NAME>
kubectx - : switch to the previous context
kubectx -c, --current : show the current context name
kubectx <NEW_NAME>=<NAME> : rename context <NAME> to <NEW_NAME>
kubectx <NEW_NAME>=. : rename current-context to <NEW_NAME>
kubectx -d <NAME> [<NAME...>] : delete context <NAME> ('.' for current-context)
(this command won't delete the user/cluster entry
that is used by the context)
kubectx -h,--help : show this message
EOF
}

exit_err() {
echo >&2 "${1}"
exit 1
}

current_context() {
$KUBECTL config view -o=jsonpath='{.current-context}'
}

get_contexts() {
$KUBECTL config get-contexts -o=name | sort -n
}

list_contexts() {
set -u pipefail
local cur ctx_list
cur="$(current_context)" || exit_err "error getting current context"
ctx_list=$(get_contexts) || exit_err "error getting context list"

local yellow darkbg normal
yellow=$(tput setaf 3 || true)
darkbg=$(tput setab 0 || true)
normal=$(tput sgr0 || true)

local cur_ctx_fg cur_ctx_bg
cur_ctx_fg=${KUBECTX_CURRENT_FGCOLOR:-$yellow}
cur_ctx_bg=${KUBECTX_CURRENT_BGCOLOR:-$darkbg}

for c in $ctx_list; do
if [[ -n "${_KUBECTX_FORCE_COLOR:-}" || \
-t 1 && -z "${NO_COLOR:-}" ]]; then
# colored output mode
if [[ "${c}" = "${cur}" ]]; then
echo "${cur_ctx_bg}${cur_ctx_fg}${c}${normal}"
else
echo "${c}"
fi
else
echo "${c}"
fi
done
}

read_context() {
if [[ -f "${KUBECTX}" ]]; then
cat "${KUBECTX}"
fi
}

save_context() {
local saved
saved="$(read_context)"

if [[ "${saved}" != "${1}" ]]; then
printf %s "${1}" > "${KUBECTX}"
fi
}

switch_context() {
$KUBECTL config use-context "${1}"
}

choose_context_interactive() {
local choice
choice="$(_KUBECTX_FORCE_COLOR=1 \
FZF_DEFAULT_COMMAND="${SELF_CMD}" \
fzf --ansi || true)"
if [[ -z "${choice}" ]]; then
echo 2>&1 "error: you did not choose any of the options"
exit 1
else
set_context "${choice}"
fi
}

set_context() {
local prev
prev="$(current_context)" || exit_err "error getting current context"

switch_context "${1}"

if [[ "${prev}" != "${1}" ]]; then
save_context "${prev}"
fi
}

swap_context() {
local ctx
ctx="$(read_context)"
if [[ -z "${ctx}" ]]; then
echo "error: No previous context found." >&2
exit 1
fi
set_context "${ctx}"
}

context_exists() {
grep -q ^"${1}"\$ <($KUBECTL config get-contexts -o=name)
}

rename_context() {
local old_name="${1}"
local new_name="${2}"

if [[ "${old_name}" == "." ]]; then
old_name="$(current_context)"
fi

if ! context_exists "${old_name}"; then
echo "error: Context \"${old_name}\" not found, can't rename it." >&2
exit 1
fi

if context_exists "${new_name}"; then
echo "Context \"${new_name}\" exists, deleting..." >&2
$KUBECTL config delete-context "${new_name}" 1>/dev/null 2>&1
fi

$KUBECTL config rename-context "${old_name}" "${new_name}"
}

delete_contexts() {
for i in "${@}"; do
delete_context "${i}"
done
}

delete_context() {
local ctx
ctx="${1}"
if [[ "${ctx}" == "." ]]; then
ctx="$(current_context)" || exit_err "error getting current context"
fi
echo "Deleting context \"${ctx}\"..." >&2
$KUBECTL config delete-context "${ctx}"
}

main() {
if hash kubectl 2>/dev/null; then
KUBECTL=kubectl
elif hash kubectl.exe 2>/dev/null; then
KUBECTL=kubectl.exe
else
echo >&2 "kubectl is not installed"
exit 1
fi

if [[ "$#" -eq 0 ]]; then
if [[ -t 1 && -z "${KUBECTX_IGNORE_FZF:-}" && "$(type fzf &>/dev/null; echo $?)" -eq 0 ]]; then
choose_context_interactive
else
list_contexts
fi
elif [[ "${1}" == "-d" ]]; then
if [[ "$#" -lt 2 ]]; then
echo "error: missing context NAME" >&2
usage
exit 1
fi
delete_contexts "${@:2}"
elif [[ "$#" -gt 1 ]]; then
echo "error: too many arguments" >&2
usage
exit 1
elif [[ "$#" -eq 1 ]]; then
if [[ "${1}" == "-" ]]; then
swap_context
elif [[ "${1}" == '-c' || "${1}" == '--current' ]]; then
# we don't call current_context here for two reasons:
# - it does not fail when current-context property is not set
# - it does not return a trailing newline
kubectl config current-context
elif [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
usage
elif [[ "${1}" =~ ^-(.*) ]]; then
echo "error: unrecognized flag \"${1}\"" >&2
usage
exit 1
elif [[ "${1}" =~ (.+)=(.+) ]]; then
rename_context "${BASH_REMATCH[2]}" "${BASH_REMATCH[1]}"
else
set_context "${1}"
fi
else
usage
exit 1
fi
}

main "$@"
Loading

0 comments on commit e9d528d

Please sign in to comment.