diff --git a/internal/config/config.go b/internal/config/config.go index 80807de..b143434 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -16,6 +16,7 @@ type Config struct { LogLevel string UpdateTimeout time.Duration OptInLabel string + Mode string } // Load reads configuration from environment variables, applies defaults, @@ -28,12 +29,17 @@ func Load() (*Config, error) { Port: getenvDefault("PORT", "8080"), LogLevel: getenvDefault("LOG_LEVEL", "info"), OptInLabel: getenvDefault("OPT_IN_LABEL", "se.shcizo.auto-update"), + Mode: getenvDefault("MODE", "compose"), } if cfg.APIKey == "" { return nil, errors.New("UPDATER_API_KEY is required") } + if cfg.Mode != "compose" && cfg.Mode != "swarm" { + return nil, fmt.Errorf("MODE %q is invalid: must be %q or %q", cfg.Mode, "compose", "swarm") + } + timeoutStr := getenvDefault("UPDATE_TIMEOUT", "5m") d, err := time.ParseDuration(timeoutStr) if err != nil { diff --git a/internal/config/config_test.go b/internal/config/config_test.go index bd50ab7..6e3fe88 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -57,3 +57,26 @@ func TestLoad_InvalidTimeoutErrors(t *testing.T) { require.Error(t, err) require.Contains(t, err.Error(), "UPDATE_TIMEOUT") } + +func TestLoad_DefaultsToComposeMode(t *testing.T) { + t.Setenv("UPDATER_API_KEY", "secret") + cfg, err := config.Load() + require.NoError(t, err) + require.Equal(t, "compose", cfg.Mode) +} + +func TestLoad_AcceptsSwarmMode(t *testing.T) { + t.Setenv("UPDATER_API_KEY", "secret") + t.Setenv("MODE", "swarm") + cfg, err := config.Load() + require.NoError(t, err) + require.Equal(t, "swarm", cfg.Mode) +} + +func TestLoad_RejectsInvalidMode(t *testing.T) { + t.Setenv("UPDATER_API_KEY", "secret") + t.Setenv("MODE", "kubernetes") + _, err := config.Load() + require.Error(t, err) + require.Contains(t, err.Error(), "MODE") +}