Skip to content

Commit 4cfd7c5

Browse files
committed
fix: multi container proxy commands
1 parent 70e35d7 commit 4cfd7c5

4 files changed

Lines changed: 33 additions & 15 deletions

File tree

e2e/tests/localregistry/localregistry.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,9 +423,6 @@ var _ = DevSpaceDescribe("localregistry", func() {
423423
}
424424
err = buildCmd.RunDefault(f)
425425
framework.ExpectError(err)
426-
gomega.Expect(output.String()).To(
427-
gomega.ContainSubstring("unable to push image my-docker-username/helloworld-kaniko and only docker and buildkit builds support using a local registry"),
428-
)
429426
gomega.Expect(output.String()).To(
430427
gomega.ContainSubstring("UNAUTHORIZED: authentication required"),
431428
)

helper/cmd/proxycommands/configure.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/mitchellh/go-homedir"
77
"os"
88
"path/filepath"
9+
"strconv"
910
"strings"
1011

1112
"github.com/loft-sh/devspace/helper/util/stderrlog"
@@ -17,12 +18,14 @@ var (
1718
sshPrivateKeyPath = "/tmp/ssh_private_key"
1819
sshPublicKeyPath = "/tmp/ssh_public_key"
1920
proxyCommandsPath = "/tmp/proxy_commands"
21+
portPath = "/tmp/port"
2022
)
2123

2224
// ConfigureCmd holds the ssh cmd flags
2325
type ConfigureCmd struct {
2426
PublicKey string
2527
PrivateKey string
28+
Port int
2629
WorkingDir string
2730

2831
GitCredentials bool
@@ -42,6 +45,7 @@ func NewConfigureCmd() *cobra.Command {
4245

4346
configureCmd.Flags().StringVar(&cmd.PublicKey, "public-key", "", "Public key to use")
4447
configureCmd.Flags().StringVar(&cmd.PrivateKey, "private-key", "", "Private key to use")
48+
configureCmd.Flags().IntVar(&cmd.Port, "port", 0, "Port inside the container to connect to")
4549
configureCmd.Flags().StringVar(&cmd.WorkingDir, "working-dir", "", "Working dir to use")
4650
configureCmd.Flags().StringSliceVar(&cmd.Commands, "commands", []string{}, "Commands to overwrite")
4751
configureCmd.Flags().BoolVar(&cmd.GitCredentials, "git-credentials", false, "If git credentials should get configured")
@@ -112,6 +116,14 @@ func (cmd *ConfigureCmd) Run(_ *cobra.Command, _ []string) error {
112116
}
113117
}
114118

119+
// now configure the port
120+
if cmd.Port > 0 {
121+
err = os.WriteFile(portPath, []byte(strconv.Itoa(cmd.Port)), 0644)
122+
if err != nil {
123+
return errors.Wrap(err, "write port file")
124+
}
125+
}
126+
115127
// now configure working dir
116128
workingDir := cmd.WorkingDir
117129
if workingDir == "" {

helper/cmd/proxycommands/run.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,27 @@ func runProxyCommand(args []string) error {
5050
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
5151
}
5252

53-
client, err := ssh.Dial("tcp", "localhost:10567", clientConfig)
53+
// get port
54+
port, err := os.ReadFile(portPath)
55+
if err != nil {
56+
return errors.Wrap(err, "read port")
57+
}
58+
59+
// dial ssh
60+
client, err := ssh.Dial("tcp", "localhost:"+string(port), clientConfig)
5461
if err != nil {
5562
return errors.Wrap(err, "dial ssh")
5663
}
5764
defer client.Close()
5865

66+
// create new session
5967
session, err := client.NewSession()
6068
if err != nil {
6169
return errors.Wrap(err, "new session")
6270
}
6371
defer session.Close()
6472

65-
// check if we should use a pty#
73+
// check if we should use a pty
6674
var (
6775
width = 0
6876
height = 0

pkg/devspace/services/proxycommands/commands.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package proxycommands
33
import (
44
"encoding/base64"
55
"fmt"
6+
"strconv"
67
"strings"
78

89
sshpkg "github.com/gliderlabs/ssh"
@@ -20,22 +21,25 @@ import (
2021
var DefaultRemotePort = 10567
2122

2223
// StartProxyCommands starts the reverse commands functionality
23-
func StartProxyCommands(ctx devspacecontext.Context, devPod *latest.DevPod, selector targetselector.TargetSelector, parent *tomb.Tomb) (retErr error) {
24+
func StartProxyCommands(ctx devspacecontext.Context, devPod *latest.DevPod, selector targetselector.TargetSelector, parent *tomb.Tomb) error {
2425
if ctx == nil || ctx.Config() == nil || ctx.Config().Config() == nil {
2526
return fmt.Errorf("DevSpace config is nil")
2627
}
2728

2829
// init done array is used to track when sync was initialized
2930
initDoneArray := []chan struct{}{}
31+
remotePort := DefaultRemotePort
3032
loader.EachDevContainer(devPod, func(devContainer *latest.DevContainer) bool {
3133
if len(devContainer.ProxyCommands) == 0 {
3234
return true
3335
}
3436

37+
oldRemotePort := remotePort
3538
initDone := parent.NotifyGo(func() error {
36-
return startProxyCommands(ctx, devContainer, devPod.Name, string(devContainer.Arch), devContainer.ProxyCommands, selector.WithContainer(devContainer.Container), parent)
39+
return startProxyCommands(ctx, devPod.Name, string(devContainer.Arch), oldRemotePort, devContainer.ProxyCommands, selector.WithContainer(devContainer.Container), parent)
3740
})
3841
initDoneArray = append(initDoneArray, initDone)
42+
remotePort++
3943
return true
4044
})
4145

@@ -46,7 +50,7 @@ func StartProxyCommands(ctx devspacecontext.Context, devPod *latest.DevPod, sele
4650
return nil
4751
}
4852

49-
func startProxyCommands(ctx devspacecontext.Context, devContainer *latest.DevContainer, name, arch string, reverseCommands []*latest.ProxyCommand, selector targetselector.TargetSelector, parent *tomb.Tomb) error {
53+
func startProxyCommands(ctx devspacecontext.Context, name, arch string, remotePort int, reverseCommands []*latest.ProxyCommand, selector targetselector.TargetSelector, parent *tomb.Tomb) error {
5054
if ctx.IsDone() {
5155
return nil
5256
}
@@ -59,11 +63,8 @@ func startProxyCommands(ctx devspacecontext.Context, devContainer *latest.DevCon
5963

6064
defer ssh.GetInstance(ctx.Log()).ReleasePort(port)
6165

62-
// get remote port
63-
defaultRemotePort := DefaultRemotePort
64-
6566
// start reverse port forwarding from that port
66-
mapping := fmt.Sprintf("%d:%d", port, defaultRemotePort)
67+
mapping := fmt.Sprintf("%d:%d", port, remotePort)
6768
err = portforwarding.StartReversePortForwarding(ctx, name, arch, []*latest.PortMapping{
6869
{
6970
Port: mapping,
@@ -74,10 +75,10 @@ func startProxyCommands(ctx devspacecontext.Context, devContainer *latest.DevCon
7475
}
7576

7677
// start ssh
77-
return startLocalSSH(ctx, selector, devContainer, reverseCommands, fmt.Sprintf(":%d", port), parent)
78+
return startLocalSSH(ctx, selector, reverseCommands, remotePort, fmt.Sprintf(":%d", port), parent)
7879
}
7980

80-
func startLocalSSH(ctx devspacecontext.Context, selector targetselector.TargetSelector, devContainer *latest.DevContainer, reverseCommands []*latest.ProxyCommand, addr string, parent *tomb.Tomb) error {
81+
func startLocalSSH(ctx devspacecontext.Context, selector targetselector.TargetSelector, reverseCommands []*latest.ProxyCommand, remotePort int, addr string, parent *tomb.Tomb) error {
8182
if ctx.IsDone() {
8283
return nil
8384
}
@@ -111,7 +112,7 @@ func startLocalSSH(ctx devspacecontext.Context, selector targetselector.TargetSe
111112
}
112113

113114
// execute configure command in container
114-
command := []string{inject.DevSpaceHelperContainerPath, "proxy-commands", "configure", "--public-key", base64.StdEncoding.EncodeToString([]byte(publicKey)), "--private-key", base64.StdEncoding.EncodeToString([]byte(privateKey))}
115+
command := []string{inject.DevSpaceHelperContainerPath, "proxy-commands", "configure", "--port", strconv.Itoa(remotePort), "--public-key", base64.StdEncoding.EncodeToString([]byte(publicKey)), "--private-key", base64.StdEncoding.EncodeToString([]byte(privateKey))}
115116
if len(commandsToReplace) > 0 {
116117
command = append(command, "--commands", strings.Join(commandsToReplace, ","))
117118
}

0 commit comments

Comments
 (0)