dotfiles/zsh/.config/zsh/functions/k8s.zsh

126 lines
3.9 KiB
Bash

#!/bin/zsh
function kf {
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
echo "Usage: kf <cluster> [service-name[:port]] [service-name[:port]] ..."
echo "Example: kf oc-dev-internal-eks-cluster oc-activate-web"
echo "Example: kf oc-dev-internal-eks-cluster oc-activate-web:8080"
echo "Example: kf oc-dev-internal-eks-cluster oc-activate-web:8080 oc-member-dossier:8081"
return 0
fi
local cluster="$1"
shift
if [[ -z "$cluster" ]]; then
echo "Error: Missing cluster" >&2
echo "Usage: kf <cluster> [service-name[:port]] [service-name[:port]] ..." >&2
return 1
fi
if [[ $# -eq 0 ]]; then
echo "🔌 Available services in cluster: $cluster"
kubectl --context "$cluster" -n oc-app get svc -o name | sed 's/service\// - /'
return 0
fi
echo "🔌 Forwarding services (cluster: $cluster)"
local existing_pids
existing_pids=$(pgrep -f "kubectl.*port-forward" || true)
if [[ -n "$existing_pids" ]]; then
echo "$existing_pids" | xargs kill 2>/dev/null || true
existing_pids=$(pgrep -f "kubectl.*port-forward" || true)
if [[ -n "$existing_pids" ]]; then
echo "$existing_pids" | xargs kill -9 2>/dev/null || true
sleep 0.5
fi
fi
local pids=()
for service_spec in "$@"; do
local service_name local_port
if [[ "$service_spec" == *":"* ]]; then
service_name="${service_spec%:*}"
local_port="${service_spec##*:}"
else
service_name="$service_spec"
local_port=""
fi
local svc
svc=$(kubectl --context "$cluster" -n oc-app get svc -o name | grep "^service/$service_name$" || true)
if [[ -z "$svc" ]]; then
echo "⚠️ Service '$service_name' not found in namespace 'oc-app' - skipping"
echo " Available services:"
kubectl --context "$cluster" -n oc-app get svc -o name | sed 's/service\// - /' | head -5
continue
fi
local name="${svc#service/}"
local service_port
service_port=$(kubectl --context "$cluster" -n oc-app get "svc/$name" -o jsonpath='{.spec.ports[0].port}')
local forward_port="${local_port:-$service_port}"
local port_info
port_info=$(lsof -i :$forward_port 2>/dev/null)
if [[ -n "$port_info" ]]; then
local pid=$(echo "$port_info" | tail -n +2 | awk '{print $2}' | head -1)
local process=$(echo "$port_info" | tail -n +2 | awk '{print $1}' | head -1)
echo "⚠️ Port $forward_port in use by $process (PID: $pid) - skipping $name"
continue
fi
if [[ -n "$local_port" ]]; then
echo "→ Forwarding $name (service port $service_port) to local port $forward_port"
else
echo "→ Forwarding $name on port $forward_port"
fi
kubectl --context "$cluster" -n oc-app port-forward "svc/$name" "$forward_port:$service_port" >/dev/null 2>&1 &
local pid=$!
sleep 0.5
if ! kill -0 $pid 2>/dev/null; then
echo "❌ Failed to start port-forward for $name on port $forward_port"
continue
fi
pids+=($pid)
done
if [[ ${#pids[@]} -eq 0 ]]; then
echo "❌ No port-forwards were started successfully"
return 1
fi
echo "→ All forwards running (PIDs: ${pids[*]})"
echo "→ Press Ctrl+C to stop"
trap 'echo; echo "🛑 Stopping port-forwards..."; for pid in ${pids[*]}; do kill $pid 2>/dev/null; done; sleep 1; for pid in ${pids[*]}; do kill -9 $pid 2>/dev/null; done; wait ${pids[*]} 2>/dev/null; return 0' INT
wait
}
_kf_completion() {
local -a contexts
contexts=($(kubectx 2>/dev/null | sed 's/-read$//; s/-security$//' | sort -u))
if [[ ${#contexts[@]} -gt 0 ]]; then
_describe 'cluster' contexts
fi
}
_rmq_passwd_completion() {
local -a environments
environments=($(kubectl config get-contexts -o name 2>/dev/null | grep '^oc-.*-eks-cluster$' | sed 's/^oc-//; s/-eks-cluster$//' | sort -u))
if [[ ${#environments[@]} -gt 0 ]]; then
_describe 'environments' environments
fi
}
compdef _kf_completion kf
compdef _rmq_passwd_completion rmq-passwd