From 7ea1dc473f70aa1cf6117fb194e348c4d40df41d Mon Sep 17 00:00:00 2001 From: George Tsiolis Date: Thu, 7 May 2026 14:02:14 +0300 Subject: [PATCH] Detect externally-named containers in AWS proxy commmnds --- cmd/aws.go | 5 +++-- internal/container/running.go | 4 ++-- internal/container/status.go | 2 +- internal/container/stop.go | 2 +- test/integration/aws_cmd_test.go | 25 +++++++++++++++++++++++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/cmd/aws.go b/cmd/aws.go index 878f9419..08a7a9b8 100644 --- a/cmd/aws.go +++ b/cmd/aws.go @@ -8,6 +8,7 @@ import ( "github.com/localstack/lstk/internal/awscli" "github.com/localstack/lstk/internal/awsconfig" "github.com/localstack/lstk/internal/config" + "github.com/localstack/lstk/internal/container" "github.com/localstack/lstk/internal/endpoint" "github.com/localstack/lstk/internal/env" "github.com/localstack/lstk/internal/output" @@ -60,11 +61,11 @@ Examples: return output.NewSilentError(fmt.Errorf("runtime not healthy: %w", err)) } - running, err := rt.IsRunning(cmd.Context(), awsContainer.Name()) + runningName, err := container.ResolveRunningContainerName(cmd.Context(), rt, awsContainer) if err != nil { return fmt.Errorf("checking emulator status: %w", err) } - if !running { + if runningName == "" { sink.Emit(output.ErrorEvent{ Title: fmt.Sprintf("%s is not running", awsContainer.DisplayName()), Actions: []output.ErrorAction{ diff --git a/internal/container/running.go b/internal/container/running.go index b4c99d43..81a1bb4b 100644 --- a/internal/container/running.go +++ b/internal/container/running.go @@ -23,7 +23,7 @@ func StillRunningMessage(running []config.ContainerConfig) string { func RunningEmulators(ctx context.Context, rt runtime.Runtime, containers []config.ContainerConfig) ([]config.ContainerConfig, error) { var running []config.ContainerConfig for _, c := range containers { - name, err := resolveRunningContainerName(ctx, rt, c) + name, err := ResolveRunningContainerName(ctx, rt, c) if err != nil { return nil, err } @@ -34,7 +34,7 @@ func RunningEmulators(ctx context.Context, rt runtime.Runtime, containers []conf return running, nil } -func resolveRunningContainerName(ctx context.Context, rt runtime.Runtime, c config.ContainerConfig) (string, error) { +func ResolveRunningContainerName(ctx context.Context, rt runtime.Runtime, c config.ContainerConfig) (string, error) { running, err := rt.IsRunning(ctx, c.Name()) if err != nil { return "", fmt.Errorf("checking %s running: %w", c.Name(), err) diff --git a/internal/container/status.go b/internal/container/status.go index 6e18696c..792f3d4e 100644 --- a/internal/container/status.go +++ b/internal/container/status.go @@ -25,7 +25,7 @@ func Status(ctx context.Context, rt runtime.Runtime, containers []config.Contain defer cancel() for _, c := range containers { - name, err := resolveRunningContainerName(ctx, rt, c) + name, err := ResolveRunningContainerName(ctx, rt, c) if err != nil { return fmt.Errorf("checking %s running: %w", c.Name(), err) } diff --git a/internal/container/stop.go b/internal/container/stop.go index cf9ca3d5..7e37dfd3 100644 --- a/internal/container/stop.go +++ b/internal/container/stop.go @@ -24,7 +24,7 @@ func Stop(ctx context.Context, rt runtime.Runtime, sink output.Sink, containers const stopTimeout = 30 * time.Second for _, c := range containers { - name, err := resolveRunningContainerName(ctx, rt, c) + name, err := ResolveRunningContainerName(ctx, rt, c) if err != nil { return err } diff --git a/test/integration/aws_cmd_test.go b/test/integration/aws_cmd_test.go index e2492c3c..15efa411 100644 --- a/test/integration/aws_cmd_test.go +++ b/test/integration/aws_cmd_test.go @@ -1,12 +1,14 @@ package integration_test import ( + "context" "fmt" "os" "path/filepath" "runtime" "testing" + "github.com/docker/docker/api/types/image" "github.com/localstack/lstk/test/integration/env" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -275,6 +277,29 @@ func TestAWSCommandHintsSetupCommandWhenProfileMissing(t *testing.T) { assert.Contains(t, stdout, "lstk setup aws") } +func TestAWSCommandWorksWithExternalContainer(t *testing.T) { + requireDocker(t) + cleanup() + t.Cleanup(cleanup) + + ctx := testContext(t) + + const fakeImage = "localstack/localstack-pro:test-fake" + require.NoError(t, dockerClient.ImageTag(ctx, testImage, fakeImage)) + t.Cleanup(func() { + _, _ = dockerClient.ImageRemove(context.Background(), fakeImage, image.RemoveOptions{}) + }) + + startExternalContainer(t, ctx, fakeImage, "localstack-main", "4566") + + fakeDir := writeFakeAWS(t) + e := env.With(env.DisableEvents, "1").With("PATH", fakeDir).With(env.Home, t.TempDir()) + + stdout, stderr, err := runLstk(t, ctx, t.TempDir(), e, "aws", "s3", "ls") + require.NoError(t, err, "lstk aws should work with externally-named container: %s", stderr) + assert.Contains(t, stdout, "ENDPOINT:http://") +} + func TestAWSCommandSuppressesHintWhenProfileExists(t *testing.T) { requireDocker(t) cleanup()