kic on mac: add random port support to service cmd

pull/6811/head
Jose Donizetti 2020-02-26 22:09:48 -03:00
parent 5f73506ff6
commit 1752d7c004
2 changed files with 51 additions and 3 deletions

View File

@ -49,7 +49,11 @@ func (t *ServiceTunnel) Start(svcName, namespace string) ([]string, error) {
return nil, err
}
t.sshConn = createSSHConn(svcName, t.sshPort, t.sshKey, svc)
t.sshConn, err = createSSHConnWithRandomPorts(svcName, t.sshPort, t.sshKey, svc)
if err != nil {
glog.Errorf("error creating ssh conn: %v", err)
return nil, err
}
go func() {
err = t.sshConn.startAndWait()
@ -59,8 +63,8 @@ func (t *ServiceTunnel) Start(svcName, namespace string) ([]string, error) {
}()
urls := make([]string, 0, len(svc.Spec.Ports))
for _, port := range svc.Spec.Ports {
urls = append(urls, fmt.Sprintf("http://127.0.0.1:%d", port.Port))
for _, port := range t.sshConn.ports {
urls = append(urls, fmt.Sprintf("http://127.0.0.1:%d", port))
}
return urls, nil

View File

@ -20,6 +20,8 @@ import (
"fmt"
"os/exec"
"github.com/phayes/freeport"
v1 "k8s.io/api/core/v1"
)
@ -27,6 +29,7 @@ type sshConn struct {
name string
service string
cmd *exec.Cmd
ports []int
}
func createSSHConn(name, sshPort, sshKey string, svc *v1.Service) *sshConn {
@ -61,6 +64,47 @@ func createSSHConn(name, sshPort, sshKey string, svc *v1.Service) *sshConn {
}
}
func createSSHConnWithRandomPorts(name, sshPort, sshKey string, svc *v1.Service) (*sshConn, error) {
// extract sshArgs
sshArgs := []string{
// TODO: document the options here
"-o", "UserKnownHostsFile=/dev/null",
"-o", "StrictHostKeyChecking no",
"-N",
"docker@127.0.0.1",
"-p", sshPort,
"-i", sshKey,
}
usedPorts := make([]int, 0, len(svc.Spec.Ports))
for _, port := range svc.Spec.Ports {
freeport, err := freeport.GetFreePort()
if err != nil {
return nil, err
}
arg := fmt.Sprintf(
"-L %d:%s:%d",
freeport,
svc.Spec.ClusterIP,
port.Port,
)
sshArgs = append(sshArgs, arg)
usedPorts = append(usedPorts, freeport)
}
cmd := exec.Command("ssh", sshArgs...)
return &sshConn{
name: name,
service: svc.Name,
cmd: cmd,
ports: usedPorts,
}, nil
}
func (c *sshConn) startAndWait() error {
fmt.Printf("starting tunnel for %s\n", c.service)
err := c.cmd.Start()