k8s.zsh 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #!/bin/zsh
  2. function kf {
  3. # Set up completion on first call
  4. if [[ -z "$_kf_completion_setup" ]]; then
  5. compdef _kf_completion kf 2>/dev/null
  6. _kf_completion_setup=1
  7. fi
  8. if [[ "$1" == "-h" || "$1" == "--help" ]]; then
  9. echo "Usage: kf <cluster> [service-name[:port]] [service-name[:port]] ..."
  10. echo "Example: kf oc-dev-internal-eks-cluster oc-activate-web"
  11. echo "Example: kf oc-dev-internal-eks-cluster oc-activate-web:8080"
  12. echo "Example: kf oc-dev-internal-eks-cluster oc-activate-web:8080 oc-member-dossier:8081"
  13. return 0
  14. fi
  15. local cluster="$1"
  16. shift
  17. if [[ -z "$cluster" ]]; then
  18. echo "Error: Missing cluster" >&2
  19. echo "Usage: kf <cluster> [service-name[:port]] [service-name[:port]] ..." >&2
  20. return 1
  21. fi
  22. if [[ $# -eq 0 ]]; then
  23. echo "🔌 Available services in cluster: $cluster"
  24. kubectl --context "$cluster" -n oc-app get svc -o name | sed 's/service\// - /'
  25. return 0
  26. fi
  27. echo "🔌 Forwarding services (cluster: $cluster)"
  28. local existing_pids
  29. existing_pids=$(pgrep -f "kubectl.*port-forward" || true)
  30. if [[ -n "$existing_pids" ]]; then
  31. echo "$existing_pids" | xargs kill 2>/dev/null || true
  32. existing_pids=$(pgrep -f "kubectl.*port-forward" || true)
  33. if [[ -n "$existing_pids" ]]; then
  34. echo "$existing_pids" | xargs kill -9 2>/dev/null || true
  35. sleep 0.5
  36. fi
  37. fi
  38. local pids=()
  39. for service_spec in "$@"; do
  40. local service_name local_port
  41. if [[ "$service_spec" == *":"* ]]; then
  42. service_name="${service_spec%:*}"
  43. local_port="${service_spec##*:}"
  44. else
  45. service_name="$service_spec"
  46. local_port=""
  47. fi
  48. local svc
  49. svc=$(kubectl --context "$cluster" -n oc-app get svc -o name | grep "^service/$service_name$" || true)
  50. if [[ -z "$svc" ]]; then
  51. echo "⚠️ Service '$service_name' not found in namespace 'oc-app' - skipping"
  52. echo " Available services:"
  53. kubectl --context "$cluster" -n oc-app get svc -o name | sed 's/service\// - /' | head -5
  54. continue
  55. fi
  56. local name="${svc#service/}"
  57. local service_port
  58. service_port=$(kubectl --context "$cluster" -n oc-app get "svc/$name" -o jsonpath='{.spec.ports[0].port}')
  59. local forward_port="${local_port:-$service_port}"
  60. local port_info
  61. port_info=$(lsof -i :$forward_port 2>/dev/null)
  62. if [[ -n "$port_info" ]]; then
  63. local pid=$(echo "$port_info" | tail -n +2 | awk '{print $2}' | head -1)
  64. local process=$(echo "$port_info" | tail -n +2 | awk '{print $1}' | head -1)
  65. echo "⚠️ Port $forward_port in use by $process (PID: $pid) - skipping $name"
  66. continue
  67. fi
  68. if [[ -n "$local_port" ]]; then
  69. echo "→ Forwarding $name (service port $service_port) to local port $forward_port"
  70. else
  71. echo "→ Forwarding $name on port $forward_port"
  72. fi
  73. kubectl --context "$cluster" -n oc-app port-forward "svc/$name" "$forward_port:$service_port" >/dev/null 2>&1 &
  74. local pid=$!
  75. sleep 0.5
  76. if ! kill -0 $pid 2>/dev/null; then
  77. echo "❌ Failed to start port-forward for $name on port $forward_port"
  78. continue
  79. fi
  80. pids+=($pid)
  81. done
  82. if [[ ${#pids[@]} -eq 0 ]]; then
  83. echo "❌ No port-forwards were started successfully"
  84. return 1
  85. fi
  86. echo "→ All forwards running (PIDs: ${pids[*]})"
  87. echo "→ Press Ctrl+C to stop"
  88. 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
  89. wait
  90. }
  91. _kf_completion() {
  92. local -a contexts
  93. contexts=($(kubectx 2>/dev/null | sed 's/-read$//; s/-security$//' | sort -u))
  94. if [[ ${#contexts[@]} -gt 0 ]]; then
  95. _describe 'cluster' contexts
  96. fi
  97. }
  98. _rmq_passwd_completion() {
  99. local -a environments
  100. environments=($(kubectl config get-contexts -o name 2>/dev/null | grep '^oc-.*-eks-cluster$' | sed 's/^oc-//; s/-eks-cluster$//' | sort -u))
  101. if [[ ${#environments[@]} -gt 0 ]]; then
  102. _describe 'environments' environments
  103. fi
  104. }
  105. compdef _rmq_passwd_completion rmq-passwd
  106. compdef _kf_completion kf