Skip to content

Commit d2a87ec

Browse files
committed
Fix expandEnvVars() to expand connStr and group fields
1 parent 3603cb3 commit d2a87ec

File tree

3 files changed

+112
-6
lines changed

3 files changed

+112
-6
lines changed

contrib/sample.sources.yaml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@
3838
pgbouncer_clients: 10
3939
is_enabled: true
4040

41-
- name: envvar
42-
kind: $kind
41+
- name: $MY_SOURCE_ENV
42+
group: $MY_GROUP_ENV
43+
conn_str: $MY_VERY_SECRET_CONN_STR
44+
kind: $MY_KIND_ENV
4345
is_enabled: true
44-
include_pattern: $include_pattern
45-
exclude_pattern: $exclude_pattern
46-
preset_metrics: $preset_metrics
47-
preset_metrics_standby: $preset_metrics_standby
46+
include_pattern: $MY_INCLUDE_PATTERN
47+
exclude_pattern: $MY_EXCLUDE_PATTERN
48+
preset_metrics: $MY_PRESET_METRICS
49+
preset_metrics_standby: $MY_PRESET_METRICS_STANDBY

internal/sources/yaml.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,12 @@ func (fcr *fileSourcesReaderWriter) loadSourcesFromFile(configFilePath string) (
143143
}
144144

145145
func (fcr *fileSourcesReaderWriter) expandEnvVars(md Source) Source {
146+
if strings.HasPrefix(md.ConnStr, "$") {
147+
md.ConnStr = os.ExpandEnv(md.ConnStr)
148+
}
149+
if strings.HasPrefix(md.Group, "$") {
150+
md.Group = os.ExpandEnv(md.Group)
151+
}
146152
if strings.HasPrefix(string(md.Kind), "$") {
147153
md.Kind = Kind(os.ExpandEnv(string(md.Kind)))
148154
}

internal/sources/yaml_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,104 @@ func TestYAMLCreateSource(t *testing.T) {
231231
})
232232
}
233233

234+
func TestExpandEnvVars(t *testing.T) {
235+
a := assert.New(t)
236+
237+
// Set environment variables for testing
238+
t.Setenv("PGW_TEST_NAME", "expanded_name")
239+
t.Setenv("PGW_TEST_GROUP", "expanded_group")
240+
t.Setenv("PGW_TEST_CONNSTR", "postgresql://localhost/expanded")
241+
t.Setenv("PGW_TEST_KIND", "postgres")
242+
t.Setenv("PGW_TEST_INCLUDE", "include_pattern")
243+
t.Setenv("PGW_TEST_EXCLUDE", "exclude_pattern")
244+
t.Setenv("PGW_TEST_PRESET", "exhaustive")
245+
t.Setenv("PGW_TEST_PRESET_STANDBY", "standby_preset")
246+
247+
t.Run("all fields expanded", func(*testing.T) {
248+
tmpFile := filepath.Join(t.TempDir(), "env_sources.yaml")
249+
yamlContent := `
250+
- name: $PGW_TEST_NAME
251+
group: $PGW_TEST_GROUP
252+
conn_str: $PGW_TEST_CONNSTR
253+
kind: $PGW_TEST_KIND
254+
include_pattern: $PGW_TEST_INCLUDE
255+
exclude_pattern: $PGW_TEST_EXCLUDE
256+
preset_metrics: $PGW_TEST_PRESET
257+
preset_metrics_standby: $PGW_TEST_PRESET_STANDBY
258+
`
259+
err := os.WriteFile(tmpFile, []byte(yamlContent), 0644)
260+
a.NoError(err)
261+
262+
yamlrw, err := sources.NewYAMLSourcesReaderWriter(ctx, tmpFile)
263+
a.NoError(err)
264+
265+
dbs, err := yamlrw.GetSources()
266+
a.NoError(err)
267+
a.Len(dbs, 1)
268+
269+
src := dbs[0]
270+
a.Equal("expanded_name", src.Name)
271+
a.Equal("expanded_group", src.Group)
272+
a.Equal("postgresql://localhost/expanded", src.ConnStr)
273+
a.Equal(sources.SourcePostgres, src.Kind)
274+
a.Equal("include_pattern", src.IncludePattern)
275+
a.Equal("exclude_pattern", src.ExcludePattern)
276+
a.Equal("exhaustive", src.PresetMetrics)
277+
a.Equal("standby_preset", src.PresetMetricsStandby)
278+
})
279+
280+
t.Run("no expansion without dollar prefix", func(*testing.T) {
281+
tmpFile := filepath.Join(t.TempDir(), "no_env_sources.yaml")
282+
yamlContent := `
283+
- name: literal_name
284+
group: literal_group
285+
conn_str: postgresql://localhost/literal
286+
kind: postgres
287+
include_pattern: literal_include
288+
exclude_pattern: literal_exclude
289+
preset_metrics: basic
290+
preset_metrics_standby: basic_standby
291+
`
292+
err := os.WriteFile(tmpFile, []byte(yamlContent), 0644)
293+
a.NoError(err)
294+
295+
yamlrw, err := sources.NewYAMLSourcesReaderWriter(ctx, tmpFile)
296+
a.NoError(err)
297+
298+
dbs, err := yamlrw.GetSources()
299+
a.NoError(err)
300+
a.Len(dbs, 1)
301+
302+
src := dbs[0]
303+
a.Equal("literal_name", src.Name)
304+
a.Equal("literal_group", src.Group)
305+
a.Equal("postgresql://localhost/literal", src.ConnStr)
306+
a.Equal(sources.SourcePostgres, src.Kind)
307+
a.Equal("literal_include", src.IncludePattern)
308+
a.Equal("literal_exclude", src.ExcludePattern)
309+
a.Equal("basic", src.PresetMetrics)
310+
a.Equal("basic_standby", src.PresetMetricsStandby)
311+
})
312+
313+
t.Run("unset env var expands to empty", func(*testing.T) {
314+
tmpFile := filepath.Join(t.TempDir(), "unset_env_sources.yaml")
315+
yamlContent := `
316+
- name: $PGW_UNSET_VAR
317+
conn_str: postgresql://localhost/test
318+
`
319+
err := os.WriteFile(tmpFile, []byte(yamlContent), 0644)
320+
a.NoError(err)
321+
322+
yamlrw, err := sources.NewYAMLSourcesReaderWriter(ctx, tmpFile)
323+
a.NoError(err)
324+
325+
dbs, err := yamlrw.GetSources()
326+
a.NoError(err)
327+
a.Len(dbs, 1)
328+
a.Equal("", dbs[0].Name)
329+
})
330+
}
331+
234332
func TestConcurrentSourceUpdates(t *testing.T) {
235333
a := assert.New(t)
236334
tempDir := t.TempDir()

0 commit comments

Comments
 (0)