From dff2a952cb97259226faaee34f38b7b8f0d691ea Mon Sep 17 00:00:00 2001 From: Denis Karpelevich <56302307+dkarpele@users.noreply.github.com> Date: Mon, 21 Apr 2025 18:16:35 +0200 Subject: [PATCH] feat: Add GetDurationVal to handle optional duration config from env Adds a new utility function `GetDurationVal` to retrieve a time.Duration from an environment variable, with a default value fallback and error logging. Signed-off-by: Denis Karpelevich <56302307+dkarpele@users.noreply.github.com> --- registry-scanner/pkg/env/env.go | 15 +++++++++++++++ registry-scanner/pkg/env/env_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/registry-scanner/pkg/env/env.go b/registry-scanner/pkg/env/env.go index f000aa21..ceaead79 100644 --- a/registry-scanner/pkg/env/env.go +++ b/registry-scanner/pkg/env/env.go @@ -5,6 +5,7 @@ import ( "os" "strconv" "strings" + "time" "github.com/argoproj-labs/argocd-image-updater/registry-scanner/pkg/log" ) @@ -35,6 +36,20 @@ func GetStringVal(envVar string, defaultValue string) string { } } +// GetDurationVal retrieves a time.Duration value from given environment envVar +// Returns default value if envVar is not set or if the provided value is invalid. +func GetDurationVal(envVar string, defaultValue time.Duration) time.Duration { + if val := os.Getenv(envVar); val != "" { + duration, err := time.ParseDuration(val) + if err != nil { + log.Warnf("Invalid duration format '%s' for environment variable '%s'. Using default value: %s", val, envVar, defaultValue) + return defaultValue + } + return duration + } + return defaultValue +} + // Helper function to parse a number from an environment variable. Returns a // default if env is not set, is not parseable to a number, exceeds max (if // max is greater than 0) or is less than min. diff --git a/registry-scanner/pkg/env/env_test.go b/registry-scanner/pkg/env/env_test.go index 41ccaf97..db9a9226 100644 --- a/registry-scanner/pkg/env/env_test.go +++ b/registry-scanner/pkg/env/env_test.go @@ -3,6 +3,7 @@ package env import ( "os" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -37,6 +38,29 @@ func Test_GetStringVal(t *testing.T) { }) } +func Test_GetDurationVal(t *testing.T) { + t.Run("Get duration value from existing env var", func(t *testing.T) { + _ = os.Setenv("TEST_DURATION_VAL", "1m") + defer os.Setenv("TEST_DURATION_VAL", "") + assert.Equal(t, time.Minute, GetDurationVal("TEST_DURATION_VAL", 2*time.Minute)) + }) + t.Run("Get default value from non-existing env var", func(t *testing.T) { + _ = os.Setenv("TEST_DURATION_VAL", "") + defer os.Setenv("TEST_DURATION_VAL", "") + assert.Equal(t, 2*time.Minute, GetDurationVal("TEST_DURATION_VAL", 2*time.Minute)) + }) + t.Run("Get default value for bad format env var", func(t *testing.T) { + _ = os.Setenv("TEST_DURATION_VAL", "bad format") + defer os.Setenv("TEST_DURATION_VAL", "") + assert.Equal(t, 2*time.Minute, GetDurationVal("TEST_DURATION_VAL", 2*time.Minute)) + }) + t.Run("Get 0 duration value for 0 env var", func(t *testing.T) { + _ = os.Setenv("TEST_DURATION_VAL", "0") + defer os.Setenv("TEST_DURATION_VAL", "") + assert.Equal(t, 0*time.Minute, GetDurationVal("TEST_DURATION_VAL", 2*time.Minute)) + }) +} + func Test_ParseNumFromEnv(t *testing.T) { t.Run("Get number from existing env var within range", func(t *testing.T) { _ = os.Setenv("TEST_NUM_VAL", "5")