| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #!/bin/zsh
- function kf {
- # Set up completion on first call
- if [[ -z "$_kf_completion_setup" ]]; then
- compdef _kf_completion kf 2>/dev/null
- _kf_completion_setup=1
- fi
- 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 _rmq_passwd_completion rmq-passwd
- compdef _kf_completion kf
|