@@ -6,6 +6,7 @@ NS="${NS:-default}" # Override with --ns
66POD_NAME=" " # Override with --pod
77SLEEP_BETWEEN=0.2
88CHECK_RETRIES=25 # 25 * 0.2s = 5s
9+ PORTS_ENV_FILE=" ${PORTS_ENV_FILE:- $(dirname " $0 " )/ .pf-env} "
910
1011usage () {
1112 echo " Usage: $0 [--ns <namespace>] [--pod <pod-name>]"
@@ -39,11 +40,15 @@ start_pf() {
3940 local target=" $1 " # pods/<pod> or service/<svc>
4041 local mapping=" $2 " # <local>:<remote>
4142 local local_port=" ${mapping%%:* } "
43+ local remote_port=" ${mapping##*: } "
4244
4345 free_port " $local_port "
4446
4547 # Start in background
46- kubectl -n " $NS " port-forward " $target " " $mapping " > /dev/null 2>&1 &
48+ # Capture logs for troubleshooting in CI
49+ mkdir -p " $( dirname " $PORTS_ENV_FILE " ) "
50+ local log_file=" $( dirname " $PORTS_ENV_FILE " ) /pf_${local_port} .log"
51+ kubectl -n " $NS " port-forward " $target " " $mapping " > " $log_file " 2>&1 &
4752 local pf_pid=$!
4853
4954 # Health check: wait for local port to open
@@ -69,14 +74,45 @@ start_pf() {
6974
7075 if [[ $ok -eq 1 ]]; then
7176 log " Forwarded $target (local $mapping )"
77+ # Record ports to env file for consumers (e.g., CI step/tests)
78+ case " $remote_port " in
79+ 8899)
80+ echo " export SOLANA_RPC_PORT=$local_port " >> " $PORTS_ENV_FILE " ;;
81+ 8900)
82+ echo " export SOLANA_WS_PORT=$local_port " >> " $PORTS_ENV_FILE " ;;
83+ 8080)
84+ echo " export REGISTRY_REST_PORT=$local_port " >> " $PORTS_ENV_FILE " ;;
85+ 9090)
86+ echo " export REGISTRY_GRPC_PORT=$local_port " >> " $PORTS_ENV_FILE " ;;
87+ esac
7288 return 0
7389 else
7490 err " Failed to forward $target (local $mapping ); killing pid $pf_pid "
7591 kill -9 " $pf_pid " > /dev/null 2>&1 || true
92+ # Surface port-forward logs to help debugging
93+ if [[ -f " $log_file " ]]; then
94+ err " ---- port-forward log ($log_file ) ----"
95+ tail -n +1 " $log_file " >&2 || true
96+ err " ---- end log ----"
97+ fi
7698 return 1
7799 fi
78100}
79101
102+ # Try a list of local ports for a given remote port and record the first success
103+ start_pf_any () {
104+ local target=" $1 "
105+ local remote_port=" $2 "
106+ shift 2
107+ local candidate
108+ for candidate in " $@ " ; do
109+ if start_pf " $target " " ${candidate} :${remote_port} " ; then
110+ return 0
111+ fi
112+ done
113+ return 1
114+ }
115+
80116# Resolve POD_NAME if not provided
81117resolve_pod () {
82118 if [[ -n " $POD_NAME " ]]; then
108144log " Using namespace: $NS "
109145log " Using pod: $POD_NAME "
110146
147+ # Reset env file for fresh run
148+ mkdir -p " $( dirname " $PORTS_ENV_FILE " ) "
149+ : > " $PORTS_ENV_FILE "
150+
111151success=0
112152
113153# ---- Pod/Service Ports (with fallback) ----
114154# Try pod first; if it fails, fall back to service/solana-genesis
115155( start_pf " pods/$POD_NAME " " 8899:8899" || start_pf " service/solana-genesis" " 8899:8899" ) && (( success++ )) # Solana RPC
116- ( start_pf " pods/$POD_NAME " " 8900:8900" || start_pf " service/solana-genesis" " 8900:8900" ) && (( success++ )) # Solana WS
156+
157+ # WebSocket: try default 8900 locally; if bind fails, try alternates and record selected port
158+ if start_pf " pods/$POD_NAME " " 8900:8900" || start_pf " service/solana-genesis" " 8900:8900" ; then
159+ (( success++ ))
160+ else
161+ # Try alternate local ports mapping to remote 8900
162+ if start_pf_any " pods/$POD_NAME " 8900 8910 18900 19000 29000 || \
163+ start_pf_any " service/solana-genesis" 8900 8910 18900 19000 29000; then
164+ (( success++ ))
165+ fi
166+ fi
117167start_pf " pods/$POD_NAME " " 8001:8001" && (( success++ )) # Exposer
118168start_pf " pods/$POD_NAME " " 9900:9900" && (( success++ )) # Faucet
119169
0 commit comments