From bd2017314fbe1b43aa2c80fbee708cf5e3e5e4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Wed, 26 Feb 2020 10:27:49 +0000 Subject: [PATCH] fix(backend): correctly load configuration using CONFIG_FILE env variable Fixes #1466 --- .../testscript/config_file_flag_over_env.txt | 28 +++++++++++++++++++ .../tests/testscript/config_file_from_env.txt | 15 ++++++++++ .../testscript/config_file_from_flag.txt | 15 ++++++++++ cmd/karma/tests/testscript/invalid_flag.txt | 6 ++++ internal/config/config.go | 14 ++++++++-- 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 cmd/karma/tests/testscript/config_file_flag_over_env.txt create mode 100644 cmd/karma/tests/testscript/config_file_from_env.txt create mode 100644 cmd/karma/tests/testscript/config_file_from_flag.txt create mode 100644 cmd/karma/tests/testscript/invalid_flag.txt diff --git a/cmd/karma/tests/testscript/config_file_flag_over_env.txt b/cmd/karma/tests/testscript/config_file_flag_over_env.txt new file mode 100644 index 000000000..253ba6d15 --- /dev/null +++ b/cmd/karma/tests/testscript/config_file_flag_over_env.txt @@ -0,0 +1,28 @@ +# Loads config file from flags when CONFIG_FILE env is also set +env CONFIG_FILE=env.yaml +karma.bin-should-work --check-config --config.file=flag.yaml +! stdout . +stderr 'msg="Reading configuration file flag.yaml"' +stderr 'msg="Configuration is valid"' +stderr 'msg="\[flag\] Configured Alertmanager source at http://localhost:8080 \(proxied: false\, readonly: false\)"' +! stderr 'level=error' +! stderr 'msg="Reading configuration file karma.yaml"' +! stderr 'msg="Reading configuration file env.yaml"' + +-- flag.yaml -- +alertmanager: + servers: + - name: flag + uri: "http://localhost:8080" + +-- env.yaml -- +alertmanager: + servers: + - name: env + uri: "http://localhost:8080" + +-- karma.yaml -- +alertmanager: + servers: + - name: karma + uri: "http://localhost:8080" diff --git a/cmd/karma/tests/testscript/config_file_from_env.txt b/cmd/karma/tests/testscript/config_file_from_env.txt new file mode 100644 index 000000000..f5ed35286 --- /dev/null +++ b/cmd/karma/tests/testscript/config_file_from_env.txt @@ -0,0 +1,15 @@ +# Loads config file from CONFIG_FILE env +env CONFIG_FILE=foo.yaml +karma.bin-should-work --check-config +! stdout . +stderr 'msg="Reading configuration file foo.yaml"' +stderr 'msg="Configuration is valid"' +stderr 'msg="\[cwd\] Configured Alertmanager source at http://localhost:8080 \(proxied: true\, readonly: false\)"' +! stderr 'level=error' + +-- foo.yaml -- +alertmanager: + servers: + - name: cwd + uri: "http://localhost:8080" + proxy: true diff --git a/cmd/karma/tests/testscript/config_file_from_flag.txt b/cmd/karma/tests/testscript/config_file_from_flag.txt new file mode 100644 index 000000000..906266cc5 --- /dev/null +++ b/cmd/karma/tests/testscript/config_file_from_flag.txt @@ -0,0 +1,15 @@ +# Loads config file from --config.file flag +env CONFIG_FILE=foo.yaml +karma.bin-should-work --check-config --config.file foo.yaml +! stdout . +stderr 'msg="Reading configuration file foo.yaml"' +stderr 'msg="Configuration is valid"' +stderr 'msg="\[cwd\] Configured Alertmanager source at http://localhost:8080 \(proxied: true\, readonly: false\)"' +! stderr 'level=error' + +-- foo.yaml -- +alertmanager: + servers: + - name: cwd + uri: "http://localhost:8080" + proxy: true diff --git a/cmd/karma/tests/testscript/invalid_flag.txt b/cmd/karma/tests/testscript/invalid_flag.txt new file mode 100644 index 000000000..16d720cfe --- /dev/null +++ b/cmd/karma/tests/testscript/invalid_flag.txt @@ -0,0 +1,6 @@ +# Fails on invalid flag usage +env CONFIG_FILE=foo.yaml +karma.bin-should-fail --check-config --invalid.flag +! stdout . +! stderr 'msg="Configuration is valid"' +stderr 'level=error msg="unknown flag: --invalid.flag"' diff --git a/internal/config/config.go b/internal/config/config.go index 6dda2fb42..bf21b7c2b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -121,9 +121,17 @@ func SetupFlags(f *pflag.FlagSet) { } func readConfigFile(k *koanf.Koanf, flags *pflag.FlagSet) string { - configFile, _ := flags.GetString("config.file") - // if config.file is not passed via flags then see if there's karma.yaml in - // current working directory + var configFile string + + // 1. Load file from flags is set + configFile, _ = flags.GetString("config.file") + // 2. Fallback to CONFIG_FILE env if there's no flag value + if configFile == "" { + if v, found := os.LookupEnv("CONFIG_FILE"); found { + configFile = v + } + } + // 3 see if there's karma.yaml in current working directory if configFile == "" { if _, err := os.Stat("karma.yaml"); !os.IsNotExist(err) { configFile = "karma.yaml"