Skip to content

Commit d3d07dd

Browse files
Merge branch 'main' into carole/drg-622
2 parents 0fe1696 + 79fa694 commit d3d07dd

File tree

16 files changed

+109
-17
lines changed

16 files changed

+109
-17
lines changed

internal/config/containers.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ func (c *ContainerConfig) HealthPath() (string, error) {
8484
return path, nil
8585
}
8686

87+
func (c *ContainerConfig) ContainerPort() (string, error) {
88+
switch c.Type {
89+
case EmulatorAWS:
90+
return "4566/tcp", nil
91+
default:
92+
return "", fmt.Errorf("%s emulator not supported yet by lstk", c.Type)
93+
}
94+
}
95+
8796
func (c *ContainerConfig) DisplayName() string {
8897
name, ok := emulatorDisplayNames[c.Type]
8998
if !ok {

internal/container/start.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,25 @@ func Start(ctx context.Context, rt runtime.Runtime, sink output.Sink, opts Start
7272
return err
7373
}
7474

75+
containerPort, err := c.ContainerPort()
76+
if err != nil {
77+
return err
78+
}
79+
7580
resolvedEnv, err := c.ResolvedEnv(opts.Env)
7681
if err != nil {
7782
return err
7883
}
7984
env := append(resolvedEnv, "LOCALSTACK_AUTH_TOKEN="+token)
8085
containers[i] = runtime.ContainerConfig{
81-
Image: image,
82-
Name: c.Name(),
83-
Port: c.Port,
84-
HealthPath: healthPath,
85-
Env: env,
86-
Tag: c.Tag,
87-
ProductName: productName,
86+
Image: image,
87+
Name: c.Name(),
88+
Port: c.Port,
89+
ContainerPort: containerPort,
90+
HealthPath: healthPath,
91+
Env: env,
92+
Tag: c.Tag,
93+
ProductName: productName,
8894
}
8995
}
9096

internal/runtime/docker.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ func (d *DockerRuntime) PullImage(ctx context.Context, imageName string, progres
108108
}
109109

110110
func (d *DockerRuntime) Start(ctx context.Context, config ContainerConfig) (string, error) {
111-
port := nat.Port(config.Port + "/tcp")
112-
exposedPorts := nat.PortSet{port: struct{}{}}
113-
portBindings := nat.PortMap{port: []nat.PortBinding{{HostPort: config.Port}}}
111+
containerPort := nat.Port(config.ContainerPort)
112+
exposedPorts := nat.PortSet{containerPort: struct{}{}}
113+
portBindings := nat.PortMap{containerPort: []nat.PortBinding{{HostPort: config.Port}}}
114114

115115
resp, err := d.client.ContainerCreate(ctx,
116116
&container.Config{

internal/runtime/runtime.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ import (
88
)
99

1010
type ContainerConfig struct {
11-
Image string
12-
Name string
13-
Port string
14-
HealthPath string
15-
Env []string // e.g., ["KEY=value", "FOO=bar"]
16-
Tag string
17-
ProductName string
11+
Image string
12+
Name string
13+
Port string
14+
ContainerPort string // internal port the emulator listens on inside the container (e.g. "4566/tcp")
15+
HealthPath string
16+
Env []string // e.g., ["KEY=value", "FOO=bar"]
17+
Tag string
18+
ProductName string
1819
}
1920

2021
type PullProgress struct {

test/integration/awsconfig_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,5 +153,6 @@ func TestStartNonInteractiveEmitsNoteWhenAWSProfileMissing(t *testing.T) {
153153
"start",
154154
)
155155
require.NoError(t, err)
156+
requireExitCode(t, 0, err)
156157
assert.Contains(t, stdout, "No complete LocalStack AWS profile found")
157158
}

test/integration/config_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func TestConfigFileCreatedOnStartup(t *testing.T) {
2222
e := testEnvWithHome(tmpHome, xdgOverride)
2323
_, stderr, err := runLstk(t, testContext(t), workDir, e, "logout")
2424
require.NoError(t, err, stderr)
25+
requireExitCode(t, 0, err)
2526

2627
expectedConfigFile := filepath.Join(tmpHome, ".config", "lstk", "config.toml")
2728
assert.FileExists(t, expectedConfigFile)
@@ -36,6 +37,7 @@ func TestConfigFileCreatedOnStartup(t *testing.T) {
3637
e := testEnvWithHome(tmpHome, xdgOverride)
3738
_, stderr, err := runLstk(t, testContext(t), workDir, e, "logout")
3839
require.NoError(t, err, stderr)
40+
requireExitCode(t, 0, err)
3941

4042
expectedConfigFile := filepath.Join(expectedOSConfigDir(tmpHome, xdgOverride), "config.toml")
4143
assert.FileExists(t, expectedConfigFile)
@@ -69,6 +71,7 @@ IAM_SOFT_MODE = "1"
6971
ctx := testContext(t)
7072
_, stderr, err := runLstk(t, ctx, "", env.With(env.APIEndpoint, mockServer.URL), "--config", configFile, "start")
7173
require.NoError(t, err, "lstk start failed: %s", stderr)
74+
requireExitCode(t, 0, err)
7275

7376
inspect, err := dockerClient.ContainerInspect(ctx, containerName)
7477
require.NoError(t, err, "failed to inspect container")
@@ -81,6 +84,7 @@ func TestConfigFlagOverridesConfigPath(t *testing.T) {
8184

8285
stdout, stderr, err := runLstk(t, testContext(t), t.TempDir(), os.Environ(), "--config", customConfig, "config", "path")
8386
require.NoError(t, err, stderr)
87+
requireExitCode(t, 0, err)
8488

8589
assertSamePath(t, customConfig, stdout)
8690
}
@@ -98,6 +102,7 @@ func TestLocalConfigTakesPrecedence(t *testing.T) {
98102
e := testEnvWithHome(tmpHome, xdgOverride)
99103
stdout, stderr, err := runLstk(t, testContext(t), workDir, e, "config", "path")
100104
require.NoError(t, err, stderr)
105+
requireExitCode(t, 0, err)
101106

102107
expectedLocalPath, err := filepath.Abs(localConfigFile)
103108
require.NoError(t, err)
@@ -117,6 +122,7 @@ func TestXDGConfigTakesPrecedence(t *testing.T) {
117122
e := testEnvWithHome(tmpHome, xdgOverride)
118123
stdout, stderr, err := runLstk(t, testContext(t), workDir, e, "config", "path")
119124
require.NoError(t, err, stderr)
125+
requireExitCode(t, 0, err)
120126

121127
assertSamePath(t, xdgConfigFile, stdout)
122128
}
@@ -130,6 +136,7 @@ func TestConfigPathCommand(t *testing.T) {
130136
e := testEnvWithHome(tmpHome, filepath.Join(tmpHome, "xdg-config-home"))
131137
stdout, stderr, err := runLstk(t, testContext(t), workDir, e, "config", "path")
132138
require.NoError(t, err, stderr)
139+
requireExitCode(t, 0, err)
133140

134141
assertSamePath(t, xdgConfigFile, stdout)
135142
}
@@ -143,6 +150,7 @@ func TestConfigPathCommandDoesNotCreateConfig(t *testing.T) {
143150
e := testEnvWithHome(tmpHome, xdgOverride)
144151
stdout, stderr, err := runLstk(t, testContext(t), workDir, e, "config", "path")
145152
require.NoError(t, err, stderr)
153+
requireExitCode(t, 0, err)
146154

147155
assertSamePath(t, expectedConfigFile, stdout)
148156
assert.NoFileExists(t, expectedConfigFile)

test/integration/license_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ func TestLicenseValidationSuccess(t *testing.T) {
6565
}
6666

6767
require.NoError(t, err, "lstk start failed: %s", stderr)
68+
requireExitCode(t, 0, err)
6869

6970
inspect, err := dockerClient.ContainerInspect(ctx, containerName)
7071
require.NoError(t, err, "failed to inspect container")
@@ -82,6 +83,7 @@ func TestLicenseValidationFailure(t *testing.T) {
8283
ctx := testContext(t)
8384
_, stderr, err := runLstk(t, ctx, "", env.With(env.APIEndpoint, mockServer.URL).With(env.AuthToken, "test-token-for-license-validation"), "start")
8485
require.Error(t, err, "expected lstk start to fail with forbidden license")
86+
requireExitCode(t, 1, err)
8587
assert.Contains(t, stderr, "license validation failed")
8688
assert.Contains(t, stderr, "invalid, inactive, or expired")
8789

test/integration/login_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ func TestDeviceFlowSuccess(t *testing.T) {
120120

121121
out := output.String()
122122
require.NoError(t, err, "login should succeed: %s", out)
123+
requireExitCode(t, 0, err)
123124
assert.Contains(t, out, "Opening browser to login...")
124125
assert.Contains(t, out, "Browser didn't open? Visit")
125126
assert.Contains(t, out, "/auth/request/test-auth-req-id?code=TEST123")
@@ -176,6 +177,7 @@ func TestDeviceFlowFailure_RequestNotConfirmed(t *testing.T) {
176177

177178
out := output.String()
178179
require.Error(t, err, "expected login to fail when request not confirmed")
180+
requireExitCode(t, 1, err)
179181
assert.Contains(t, out, "Opening browser to login...")
180182
assert.Contains(t, out, "Browser didn't open? Visit")
181183
assert.Contains(t, out, "/auth/request/test-auth-req-id?code=TEST123")

test/integration/logout_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func TestLogoutCommandRemovesToken(t *testing.T) {
1919

2020
stdout, stderr, err := runLstk(t, testContext(t), "", nil, "logout")
2121
require.NoError(t, err, "lstk logout failed: %s", stderr)
22+
requireExitCode(t, 0, err)
2223
assert.Contains(t, stdout, "Logged out successfully")
2324

2425
_, err = GetAuthTokenFromKeyring()
@@ -30,6 +31,7 @@ func TestLogoutCommandSucceedsWhenNoToken(t *testing.T) {
3031

3132
stdout, stderr, err := runLstk(t, testContext(t), "", env.Without(env.AuthToken), "logout")
3233
require.NoError(t, err, "lstk logout should succeed even with no token: %s", stderr)
34+
requireExitCode(t, 0, err)
3335
assert.Contains(t, stdout, "Not currently logged in")
3436
}
3537

@@ -38,6 +40,7 @@ func TestLogoutCommandWithEnvVarToken(t *testing.T) {
3840

3941
stdout, stderr, err := runLstk(t, testContext(t), "", env.Without(env.AuthToken).With(env.AuthToken, "test-env-token"), "logout")
4042
require.NoError(t, err, "lstk logout should succeed: %s", stderr)
43+
requireExitCode(t, 0, err)
4144
assert.Contains(t, stdout, "LOCALSTACK_AUTH_TOKEN")
4245
}
4346

@@ -57,5 +60,6 @@ func TestLogoutCommandNotesWhenEmulatorStillRunning(t *testing.T) {
5760

5861
stdout, stderr, err := runLstk(t, ctx, "", nil, "logout")
5962
require.NoError(t, err, "lstk logout failed: %s", stderr)
63+
requireExitCode(t, 0, err)
6064
assert.Contains(t, stdout, "LocalStack is still running in the background")
6165
}

test/integration/logs_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func TestLogsExitsByDefault(t *testing.T) {
2222

2323
_, _, err := runLstk(t, ctx, "", nil, "logs")
2424
require.NoError(t, err, "lstk logs should exit cleanly when container is running")
25+
requireExitCode(t, 0, err)
2526
}
2627

2728
func TestLogsCommandFailsWhenNotRunning(t *testing.T) {
@@ -31,6 +32,7 @@ func TestLogsCommandFailsWhenNotRunning(t *testing.T) {
3132

3233
_, stderr, err := runLstk(t, testContext(t), "", nil, "logs", "--follow")
3334
require.Error(t, err, "expected lstk logs --follow to fail when container not running")
35+
requireExitCode(t, 1, err)
3436
assert.Contains(t, stderr, "emulator is not running")
3537
}
3638

0 commit comments

Comments
 (0)