Skip to content

Commit 24c9955

Browse files
add env profiles to config
1 parent 49815fb commit 24c9955

File tree

4 files changed

+79
-4
lines changed

4 files changed

+79
-4
lines changed

internal/config/config.go

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

1111
type Config struct {
12-
Containers []ContainerConfig `mapstructure:"containers"`
12+
Containers []ContainerConfig `mapstructure:"containers"`
13+
Env map[string]map[string]string `mapstructure:"env"`
1314
}
1415

1516
func setDefaults() {

internal/config/containers.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package config
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
"strings"
6+
)
47

58
type EmulatorType string
69

@@ -32,7 +35,24 @@ type ContainerConfig struct {
3235
Type EmulatorType `mapstructure:"type"`
3336
Tag string `mapstructure:"tag"`
3437
Port string `mapstructure:"port"`
35-
Env []string `mapstructure:"env"`
38+
// Env is a list of named environment references defined in the top-level [env.*] config sections.
39+
Env []string `mapstructure:"env"`
40+
}
41+
42+
// ResolvedEnv resolves the container's named environment references into KEY=value pairs.
43+
// namedEnvs is the top-level [env.*] map from Config.
44+
func (c *ContainerConfig) ResolvedEnv(namedEnvs map[string]map[string]string) ([]string, error) {
45+
var result []string
46+
for _, name := range c.Env {
47+
vars, ok := namedEnvs[name]
48+
if !ok {
49+
return nil, fmt.Errorf("environment %q referenced in container config not found", name)
50+
}
51+
for k, v := range vars {
52+
result = append(result, strings.ToUpper(k)+"="+v)
53+
}
54+
}
55+
return result, nil
3656
}
3757

3858
func (c *ContainerConfig) Image() (string, error) {

internal/config/containers_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package config
2+
3+
import (
4+
"sort"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestResolvedEnv_ResolvesNamedEnvs(t *testing.T) {
12+
c := &ContainerConfig{
13+
Env: []string{"test", "debug"},
14+
}
15+
namedEnvs := map[string]map[string]string{
16+
"test": {"iam_soft_mode": "1"},
17+
"debug": {"ls_log": "trace", "debug": "1"},
18+
}
19+
20+
resolved, err := c.ResolvedEnv(namedEnvs)
21+
require.NoError(t, err)
22+
23+
sort.Strings(resolved)
24+
assert.Equal(t, []string{"DEBUG=1", "IAM_SOFT_MODE=1", "LS_LOG=trace"}, resolved)
25+
}
26+
27+
func TestResolvedEnv_KeysAreUppercased(t *testing.T) {
28+
// Viper lowercases all config keys internally; ResolvedEnv must restore them.
29+
c := &ContainerConfig{Env: []string{"test"}}
30+
namedEnvs := map[string]map[string]string{
31+
"test": {"iam_soft_mode": "1"},
32+
}
33+
34+
resolved, err := c.ResolvedEnv(namedEnvs)
35+
require.NoError(t, err)
36+
assert.Equal(t, []string{"IAM_SOFT_MODE=1"}, resolved)
37+
}
38+
39+
func TestResolvedEnv_ErrorOnMissingEnv(t *testing.T) {
40+
c := &ContainerConfig{Env: []string{"missing"}}
41+
_, err := c.ResolvedEnv(map[string]map[string]string{})
42+
assert.ErrorContains(t, err, `"missing"`)
43+
}
44+
45+
func TestResolvedEnv_EmptyWhenNoEnvRefs(t *testing.T) {
46+
c := &ContainerConfig{}
47+
resolved, err := c.ResolvedEnv(map[string]map[string]string{})
48+
require.NoError(t, err)
49+
assert.Empty(t, resolved)
50+
}

internal/container/start.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ func Start(ctx context.Context, rt runtime.Runtime, sink output.Sink, platformCl
5454
return err
5555
}
5656

57-
env := append(c.Env, "LOCALSTACK_AUTH_TOKEN="+token)
57+
resolvedEnv, err := c.ResolvedEnv(cfg.Env)
58+
if err != nil {
59+
return err
60+
}
61+
env := append(resolvedEnv, "LOCALSTACK_AUTH_TOKEN="+token)
5862
containers[i] = runtime.ContainerConfig{
5963
Image: image,
6064
Name: c.Name(),

0 commit comments

Comments
 (0)