From 619862a46bb99cebf4d7698dca741ffb2c596d4b Mon Sep 17 00:00:00 2001 From: Jose Garcia Date: Thu, 5 Aug 2021 15:21:26 +0000 Subject: [PATCH 1/3] initial spike for multiple port support --- cmd/ghcs/ports.go | 79 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/cmd/ghcs/ports.go b/cmd/ghcs/ports.go index 77d1b00f7..b51490ddc 100644 --- a/cmd/ghcs/ports.go +++ b/cmd/ghcs/ports.go @@ -15,6 +15,7 @@ import ( "github.com/muhammadmuzzammil1998/jsonc" "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" + "golang.org/x/sync/errgroup" ) func NewPortsCmd() *cobra.Command { @@ -249,18 +250,23 @@ func NewPortsForwardCmd() *cobra.Command { Short: "forward", Long: "forward", RunE: func(cmd *cobra.Command, args []string) error { - if len(args) < 3 { - return errors.New("[codespace_name] [source] [dst] port number are required.") + if len(args) < 2 { + return errors.New("[codespace_name] [source]:[dst] port number are required.") } - return forwardPort(args[0], args[1], args[2]) + return forwardPort(args[0], args[1:]) }, } } -func forwardPort(codespaceName, sourcePort, destPort string) error { +func forwardPort(codespaceName string, ports []string) error { ctx := context.Background() apiClient := api.New(os.Getenv("GITHUB_TOKEN")) + portPairs, err := getPortPairs(ports) + if err != nil { + return fmt.Errorf("get port pairs: %v", err) + } + user, err := apiClient.GetUser(ctx) if err != nil { return fmt.Errorf("error getting user: %v", err) @@ -286,25 +292,58 @@ func forwardPort(codespaceName, sourcePort, destPort string) error { return fmt.Errorf("error creating server: %v", err) } - sourcePortInt, err := strconv.Atoi(sourcePort) - if err != nil { - return fmt.Errorf("error reading source port: %v", err) + g, gctx := errgroup.WithContext(ctx) + for _, portPair := range portPairs { + portPair := portPair + + srcstr := strconv.Itoa(portPair.Src) + if err := server.StartSharing(gctx, "share-"+srcstr, portPair.Src); err != nil { + return fmt.Errorf("start sharing port: %v", err) + } + + g.Go(func() error { + fmt.Println("Forwarding port: " + srcstr + " ==> " + strconv.Itoa(portPair.Dst)) + portForwarder := liveshare.NewPortForwarder(lsclient, server, portPair.Dst) + if err := portForwarder.Start(gctx); err != nil { + return fmt.Errorf("error forwarding port: %v", err) + } + + return nil + }) } - dstPortInt, err := strconv.Atoi(destPort) - if err != nil { - return fmt.Errorf("error reading destination port: %v", err) - } - - if err := server.StartSharing(ctx, "share-"+sourcePort, sourcePortInt); err != nil { - return fmt.Errorf("error sharing source port: %v", err) - } - - fmt.Println("Forwarding port: " + sourcePort + " -> " + destPort) - portForwarder := liveshare.NewPortForwarder(lsclient, server, dstPortInt) - if err := portForwarder.Start(ctx); err != nil { - return fmt.Errorf("error forwarding port: %v", err) + if err := g.Wait(); err != nil { + return err } return nil } + +type portPair struct { + Src, Dst int +} + +func getPortPairs(ports []string) ([]portPair, error) { + pp := make([]portPair, 0, len(ports)) + + for _, portString := range ports { + parts := strings.Split(portString, ":") + if len(parts) < 2 { + return pp, fmt.Errorf("port pair: '%v' is not valid", portString) + } + + srcp, err := strconv.Atoi(parts[0]) + if err != nil { + return pp, fmt.Errorf("convert source port to int: %v", err) + } + + dstp, err := strconv.Atoi(parts[1]) + if err != nil { + return pp, fmt.Errorf("convert dest port to int: %v", err) + } + + pp = append(pp, portPair{srcp, dstp}) + } + + return pp, nil +} From b5670252decdcc142d3efd928403c67c771d1c22 Mon Sep 17 00:00:00 2001 From: Jose Garcia Date: Tue, 17 Aug 2021 12:58:46 +0000 Subject: [PATCH 2/3] small update to description --- cmd/ghcs/ports.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/ghcs/ports.go b/cmd/ghcs/ports.go index 9985c708a..5c3f5a166 100644 --- a/cmd/ghcs/ports.go +++ b/cmd/ghcs/ports.go @@ -242,7 +242,7 @@ func updatePortVisibility(log *output.Logger, codespaceName, sourcePort string, func NewPortsForwardCmd() *cobra.Command { return &cobra.Command{ Use: "forward ", - Short: "Forward port", + Short: "Forward ports", Args: cobra.MinimumNArgs(2), RunE: func(cmd *cobra.Command, args []string) error { log := output.NewLogger(os.Stdout, os.Stderr, false) From 8533d084614a373412d20013e3c7e0a7d77dd833 Mon Sep 17 00:00:00 2001 From: Jose Garcia Date: Tue, 17 Aug 2021 13:07:40 +0000 Subject: [PATCH 3/3] rename var --- cmd/ghcs/ports.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/ghcs/ports.go b/cmd/ghcs/ports.go index 5c3f5a166..0f2460e0a 100644 --- a/cmd/ghcs/ports.go +++ b/cmd/ghcs/ports.go @@ -287,16 +287,16 @@ func forwardPorts(log *output.Logger, codespaceName string, ports []string) erro g, gctx := errgroup.WithContext(ctx) for _, portPair := range portPairs { - portPair := portPair + pp := portPair srcstr := strconv.Itoa(portPair.Src) - if err := server.StartSharing(gctx, "share-"+srcstr, portPair.Src); err != nil { + if err := server.StartSharing(gctx, "share-"+srcstr, pp.Src); err != nil { return fmt.Errorf("start sharing port: %v", err) } g.Go(func() error { - log.Println("Forwarding port: " + srcstr + " ==> " + strconv.Itoa(portPair.Dst)) - portForwarder := liveshare.NewPortForwarder(lsclient, server, portPair.Dst) + log.Println("Forwarding port: " + srcstr + " ==> " + strconv.Itoa(pp.Dst)) + portForwarder := liveshare.NewPortForwarder(lsclient, server, pp.Dst) if err := portForwarder.Start(gctx); err != nil { return fmt.Errorf("error forwarding port: %v", err) }