@@ -14,6 +14,9 @@ import (
1414 "time"
1515
1616 "github.com/revolyssup/k8sdebug/pkg"
17+ "github.com/revolyssup/k8sdebug/pkg/forwarder"
18+ "github.com/revolyssup/k8sdebug/pkg/portforward/mock"
19+ "github.com/revolyssup/k8sdebug/pkg/portforward/roundrobin"
1720 "github.com/spf13/cobra"
1821 v1 "k8s.io/api/core/v1"
1922 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -45,52 +48,21 @@ func forwardToPod(hostConn net.Conn, podCon net.Conn) {
4548 io .Copy (podCon , hostConn )
4649}
4750
48- func getPodConnection (fw forwarder ) (net.Conn , error ) {
49- port := fw .Port ()
51+ func getPodConnection (fw forwarder. Forwarder ) (net.Conn , error ) {
52+ port := fw .NextPort ()
5053 podConn , err := net .Dial ("tcp" , fmt .Sprintf (":%s" , port ))
5154 if err != nil {
5255 return nil , err
5356 }
5457 return podConn , nil
5558}
5659
57- type forwarder interface {
58- Port () string
59- }
60-
61- type roundRobin struct {
62- connNumber int
63- mx sync.Mutex
64- }
65-
66- func (rr * roundRobin ) Port () string {
67- rr .mx .Lock ()
68- defer rr .mx .Unlock ()
69-
70- initial := rr .connNumber
71- for {
72- rr .connNumber = (rr .connNumber + 1 ) % len (connPool )
73- portNum := connPool [rr .connNumber ]
74- if portNum != "" {
75- // Check if port is actually listening
76- conn , err := net .DialTimeout ("tcp" , ":" + portNum , 50 * time .Millisecond )
77- if err == nil {
78- conn .Close ()
79- fmt .Println ("PORT RETURNED " , portNum )
80- return portNum
81- }
82- }
83- if rr .connNumber == initial {
84- break // Avoid infinite loop
85- }
86- }
87- return ""
88- }
89-
90- func getForwarder (policy string ) forwarder {
60+ func getForwarder (policy string ) forwarder.Forwarder {
9161 switch policy {
9262 case "round-robin" :
93- return & roundRobin {}
63+ return roundrobin .New (connPool )
64+ case "mock" :
65+ return mock .New ()
9466 }
9567 return nil
9668}
0 commit comments