Skip to content

Commit cefbbd4

Browse files
authored
Merge pull request #57 from cortexapps/shawn/default-vars
Support defaults on env vars
2 parents fe01467 + 7787851 commit cefbbd4

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

agent/server/snykbroker/acceptfile/accept_file_test.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ func TestAcceptFileValidate(t *testing.T) {
8181
valid: true,
8282
envVars: map[string]string{"API": "value", "OTHER": "othervalue"},
8383
},
84+
{
85+
content: `{"vars": ["${API:foo.api.com}"], "private": []}`,
86+
valid: true,
87+
envVars: map[string]string{},
88+
},
8489
}
8590

8691
for _, file := range files {
@@ -119,9 +124,10 @@ func TestAcceptFileValidate(t *testing.T) {
119124
func TestRenderEnvVars(t *testing.T) {
120125

121126
vars := map[string]string{
122-
"API": "value",
123-
"OTHER": "othervalue",
124-
"plugin": "nope",
127+
"API": "value",
128+
"OTHER": "othervalue",
129+
"plugin": "nope",
130+
"NOT_MISSING": "set_value",
125131
}
126132

127133
for k, v := range vars {
@@ -136,13 +142,13 @@ func TestRenderEnvVars(t *testing.T) {
136142
cfg := axonConfig.NewAgentEnvConfig()
137143

138144
content := `{
139-
"$vars":["${env:API}", "${OTHER}", "${plugin:foo}", "${OTHER}"], "private": []}`
145+
"$vars":["${env:API}", "${OTHER}", "${plugin:foo}", "${OTHER}","${MISSING:default_value}","${NOT_MISSING:default_value}"], "private": []}`
140146

141147
af, err := NewAcceptFile([]byte(content), cfg, nil)
142148
require.NoError(t, err)
143149
rendered, err := af.Render(zap.NewNop())
144150
require.NoError(t, err)
145-
expected := `{"$vars":["${API}","${OTHER}","{{plugin:foo}}","${OTHER}"],"private":[{"method":"any","origin":"http://localhost:80","path":"/__axon/*"}],"public":[]}`
151+
expected := `{"$vars":["${API}","${OTHER}","{{plugin:foo}}","${OTHER}","default_value","${NOT_MISSING}"],"private":[{"method":"any","origin":"http://localhost:80","path":"/__axon/*"}],"public":[]}`
146152
require.Equal(t, expected, string(rendered), "Rendered accept file does not match expected output")
147153
}
148154

agent/server/snykbroker/acceptfile/resolver.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,23 @@ func preProcessContent(content []byte) ([]byte, error) {
2323
reEnv := regexp.MustCompile(`\$\{env:([^}]+)\}`)
2424
content = reEnv.ReplaceAll(content, []byte("${$1}"))
2525

26+
// Change all ${FOO:default_value} to default_value
27+
reEnvWithDefault := regexp.MustCompile(`\$\{([^:}]+):([^}]+)\}`)
28+
content = reEnvWithDefault.ReplaceAllFunc(content, func(match []byte) []byte {
29+
parts := reEnvWithDefault.FindSubmatch(match)
30+
31+
// inspect the value to see if it is set in the environment
32+
// if it is set, return ${FOO}, otherwise return the default value as a literal
33+
if len(parts) == 3 {
34+
varName := string(parts[1])
35+
if varIsSet(varName) {
36+
return fmt.Appendf(nil, "${%s}", varName)
37+
}
38+
return parts[2] // return the default value part
39+
}
40+
return match
41+
})
42+
2643
return content, nil
2744
}
2845

@@ -237,6 +254,8 @@ func findFileVars(content string) []fileVar {
237254
return envVars
238255
}
239256

257+
var regexEnvVarWithDefault = regexp.MustCompile(`([^:}]+):([^}]+)`)
258+
240259
func ensureAcceptFileVars(content string) error {
241260

242261
fileVars := findFileVars(content)
@@ -247,9 +266,13 @@ func ensureAcceptFileVars(content string) error {
247266
}
248267

249268
envVar := envVar.Name
250-
if os.Getenv(envVar) == "" && os.Getenv(envVar+"_POOL") == "" {
269+
if !varIsSet(envVar) {
251270
return fmt.Errorf("missing required environment variable %q", envVar)
252271
}
253272
}
254273
return nil
255274
}
275+
276+
func varIsSet(varName string) bool {
277+
return os.Getenv(varName) != "" || os.Getenv(varName+"_POOL") != ""
278+
}

0 commit comments

Comments
 (0)