Skip to content

Commit 9bfd032

Browse files
committed
Add --persist flag to enable persistence
1 parent a132086 commit 9bfd032

5 files changed

Lines changed: 47 additions & 8 deletions

File tree

cmd/restart.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func newRestartCmd(cfg *env.Env, tel *telemetry.Client, logger log.Logger) *cobr
3535
stopOpts := container.StopOptions{
3636
Telemetry: tel,
3737
}
38-
startOpts := buildStartOptions(cfg, appConfig, logger, tel)
38+
startOpts := buildStartOptions(cfg, appConfig, logger, tel, false)
3939

4040
if isInteractiveMode(cfg) {
4141
return ui.RunRestart(cmd.Context(), rt, stopOpts, startOpts)

cmd/root.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ func NewRootCmd(cfg *env.Env, tel *telemetry.Client, logger log.Logger) *cobra.C
4040
if err != nil {
4141
return err
4242
}
43-
return startEmulator(cmd.Context(), rt, cfg, tel, logger)
43+
persist, err := cmd.Flags().GetBool("persist")
44+
if err != nil {
45+
return err
46+
}
47+
return startEmulator(cmd.Context(), rt, cfg, tel, logger, persist)
4448
},
4549
}
4650

@@ -50,6 +54,7 @@ func NewRootCmd(cfg *env.Env, tel *telemetry.Client, logger log.Logger) *cobra.C
5054

5155
root.PersistentFlags().String("config", "", "Path to config file")
5256
root.PersistentFlags().BoolVar(&cfg.NonInteractive, "non-interactive", false, "Disable interactive mode")
57+
root.Flags().Bool("persist", false, "Enable local persistence (sets LOCALSTACK_PERSISTENCE=1)")
5358

5459
configureHelp(root)
5560

@@ -132,7 +137,7 @@ func Execute(ctx context.Context) error {
132137
return nil
133138
}
134139

135-
func buildStartOptions(cfg *env.Env, appConfig *config.Config, logger log.Logger, tel *telemetry.Client) container.StartOptions {
140+
func buildStartOptions(cfg *env.Env, appConfig *config.Config, logger log.Logger, tel *telemetry.Client, persist bool) container.StartOptions {
136141
return container.StartOptions{
137142
PlatformClient: api.NewPlatformClient(cfg.APIEndpoint, logger),
138143
AuthToken: cfg.AuthToken,
@@ -141,19 +146,20 @@ func buildStartOptions(cfg *env.Env, appConfig *config.Config, logger log.Logger
141146
LocalStackHost: cfg.LocalStackHost,
142147
Containers: appConfig.Containers,
143148
Env: appConfig.Env,
149+
Persist: persist,
144150
Logger: logger,
145151
Telemetry: tel,
146152
}
147153
}
148154

149-
func startEmulator(ctx context.Context, rt runtime.Runtime, cfg *env.Env, tel *telemetry.Client, logger log.Logger) error {
155+
func startEmulator(ctx context.Context, rt runtime.Runtime, cfg *env.Env, tel *telemetry.Client, logger log.Logger, persist bool) error {
150156

151157
appConfig, err := config.Get()
152158
if err != nil {
153159
return fmt.Errorf("failed to get config: %w", err)
154160
}
155161

156-
opts := buildStartOptions(cfg, appConfig, logger, tel)
162+
opts := buildStartOptions(cfg, appConfig, logger, tel, persist)
157163

158164
notifyOpts := update.NotifyOptions{
159165
GitHubToken: cfg.GitHubToken,
@@ -259,7 +265,6 @@ func isInteractiveMode(cfg *env.Env) bool {
259265
return !cfg.NonInteractive && ui.IsInteractive()
260266
}
261267

262-
263268
const maxLogSize = 1 << 20 // 1 MB
264269

265270
func newLogger() (log.Logger, func(), error) {

cmd/start.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
)
1010

1111
func newStartCmd(cfg *env.Env, tel *telemetry.Client, logger log.Logger) *cobra.Command {
12-
return &cobra.Command{
12+
cmd := &cobra.Command{
1313
Use: "start",
1414
Short: "Start emulator",
1515
Long: "Start emulator and services.",
@@ -19,7 +19,13 @@ func newStartCmd(cfg *env.Env, tel *telemetry.Client, logger log.Logger) *cobra.
1919
if err != nil {
2020
return err
2121
}
22-
return startEmulator(cmd.Context(), rt, cfg, tel, logger)
22+
persist, err := cmd.Flags().GetBool("persist")
23+
if err != nil {
24+
return err
25+
}
26+
return startEmulator(cmd.Context(), rt, cfg, tel, logger, persist)
2327
},
2428
}
29+
cmd.Flags().Bool("persist", false, "Enable local persistence (sets LOCALSTACK_PERSISTENCE=1)")
30+
return cmd
2531
}

internal/container/start.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type StartOptions struct {
3838
LocalStackHost string
3939
Containers []config.ContainerConfig
4040
Env map[string]map[string]string
41+
Persist bool
4142
Logger log.Logger
4243
Telemetry *telemetry.Client
4344
}
@@ -103,6 +104,10 @@ func Start(ctx context.Context, rt runtime.Runtime, sink output.Sink, opts Start
103104

104105
env = append(env, hostEnv...)
105106

107+
if opts.Persist {
108+
env = append(env, "LOCALSTACK_PERSISTENCE=1")
109+
}
110+
106111
var binds []runtime.BindMount
107112
if socketPath := rt.SocketPath(); socketPath != "" {
108113
binds = append(binds, runtime.BindMount{HostPath: socketPath, ContainerPath: "/var/run/docker.sock"})

test/integration/start_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,29 @@ func TestStartCommandPassesCIAndLocalStackEnvVars(t *testing.T) {
345345
assert.NotEmpty(t, envVars["LOCALSTACK_AUTH_TOKEN"])
346346
}
347347

348+
func TestStartCommandPersistFlagSetsPersistenceEnv(t *testing.T) {
349+
requireDocker(t)
350+
_ = env.Require(t, env.AuthToken)
351+
352+
cleanup()
353+
t.Cleanup(cleanup)
354+
355+
mockServer := createMockLicenseServer(true)
356+
defer mockServer.Close()
357+
358+
ctx := testContext(t)
359+
_, stderr, err := runLstk(t, ctx, "", env.With(env.APIEndpoint, mockServer.URL), "start", "--persist")
360+
require.NoError(t, err, "lstk start --persist failed: %s", stderr)
361+
requireExitCode(t, 0, err)
362+
363+
inspect, err := dockerClient.ContainerInspect(ctx, containerName)
364+
require.NoError(t, err, "failed to inspect container")
365+
require.True(t, inspect.State.Running)
366+
367+
envVars := containerEnvToMap(inspect.Config.Env)
368+
assert.Equal(t, "1", envVars["LOCALSTACK_PERSISTENCE"])
369+
}
370+
348371
func TestStartCommandForwardsPersistenceEnvFromHost(t *testing.T) {
349372
requireDocker(t)
350373
_ = env.Require(t, env.AuthToken)

0 commit comments

Comments
 (0)