diff --git a/main.go b/main.go index 3fd8fb05..d3f8f1af 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/joomcode/errorx" "os" "os/signal" "strings" @@ -12,7 +11,9 @@ import ( "github.com/gin-gonic/gin" "github.com/jessevdk/go-flags" + "github.com/joomcode/errorx" "github.com/komodorio/helm-dashboard/pkg/dashboard" + "github.com/komodorio/helm-dashboard/pkg/dashboard/utils" "github.com/pkg/browser" log "github.com/sirupsen/logrus" ) @@ -50,7 +51,7 @@ func main() { opts.BindHost = host } - opts.Verbose = opts.Verbose || os.Getenv("DEBUG") != "" + opts.Verbose = opts.Verbose || utils.EnvAsBool("DEBUG", false) setupLogging(opts.Verbose) server := dashboard.Server{ diff --git a/pkg/dashboard/api.go b/pkg/dashboard/api.go index dcf7595d..55a97269 100644 --- a/pkg/dashboard/api.go +++ b/pkg/dashboard/api.go @@ -4,12 +4,12 @@ import ( "context" "html" "net/http" - "os" "path" "github.com/gin-gonic/gin" "github.com/komodorio/helm-dashboard/pkg/dashboard/handlers" "github.com/komodorio/helm-dashboard/pkg/dashboard/objects" + "github.com/komodorio/helm-dashboard/pkg/dashboard/utils" "github.com/komodorio/helm-dashboard/pkg/frontend" log "github.com/sirupsen/logrus" ) @@ -95,7 +95,7 @@ func NewRouter(abortWeb context.CancelFunc, data *objects.DataLayer, debug bool) api.Use(errorHandler) api.Use(corsMiddleware()) - if os.Getenv("HD_CORS") != "" { + if utils.EnvAsBool("HD_CORS", false) { api.Use(allowCORS) } diff --git a/pkg/dashboard/api_test.go b/pkg/dashboard/api_test.go index e43e3682..f79b7dcb 100644 --- a/pkg/dashboard/api_test.go +++ b/pkg/dashboard/api_test.go @@ -12,6 +12,7 @@ import ( "github.com/gin-gonic/gin" "github.com/komodorio/helm-dashboard/pkg/dashboard/handlers" "github.com/komodorio/helm-dashboard/pkg/dashboard/objects" + "github.com/komodorio/helm-dashboard/pkg/dashboard/utils" log "github.com/sirupsen/logrus" "gotest.tools/v3/assert" "helm.sh/helm/v3/pkg/action" @@ -27,7 +28,7 @@ var inMemStorage *storage.Storage var repoFile string func TestMain(m *testing.M) { // fixture to set logging level via env variable - if os.Getenv("DEBUG") != "" { + if utils.EnvAsBool("DEBUG", false) { log.SetLevel(log.DebugLevel) log.Debugf("Set logging level") } diff --git a/pkg/dashboard/objects/data.go b/pkg/dashboard/objects/data.go index 72abfdaf..8a62ee55 100644 --- a/pkg/dashboard/objects/data.go +++ b/pkg/dashboard/objects/data.go @@ -3,7 +3,6 @@ package objects import ( "context" "encoding/json" - "os" "strings" "sync" "time" @@ -11,6 +10,7 @@ import ( "io" "github.com/joomcode/errorx" + "github.com/komodorio/helm-dashboard/pkg/dashboard/utils" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "helm.sh/helm/v3/pkg/action" @@ -193,7 +193,7 @@ func (d *DataLayer) nsForCtx(ctx string) string { } func (d *DataLayer) PeriodicTasks(ctx context.Context) { - if os.Getenv("HD_NO_AUTOUPDATE") == "" { + if !utils.EnvAsBool("HD_NO_AUTOUPDATE", false) { // auto-update repos go d.loopUpdateRepos(ctx, 10*time.Minute) // TODO: parameterize interval? } diff --git a/pkg/dashboard/server.go b/pkg/dashboard/server.go index e0206827..b87a19fe 100644 --- a/pkg/dashboard/server.go +++ b/pkg/dashboard/server.go @@ -38,9 +38,7 @@ func (s *Server) StartServer(ctx context.Context, cancel context.CancelFunc) (st } data.LocalCharts = s.LocalCharts - - isDevModeWithAnalytics := os.Getenv("HD_DEV_ANALYTICS") == "true" - data.StatusInfo.Analytics = (!s.NoTracking && s.Version != "0.0.0") || isDevModeWithAnalytics + data.StatusInfo.Analytics = (!s.NoTracking && s.Version != "0.0.0") || utils.EnvAsBool("HD_DEV_ANALYTICS", false) err = s.detectClusterMode(data) if err != nil { @@ -58,7 +56,7 @@ func (s *Server) StartServer(ctx context.Context, cancel context.CancelFunc) (st } func (s *Server) detectClusterMode(data *objects.DataLayer) error { - data.StatusInfo.ClusterMode = os.Getenv("HD_CLUSTER_MODE") != "" + data.StatusInfo.ClusterMode = utils.EnvAsBool("HD_CLUSTER_MODE", false) if data.StatusInfo.ClusterMode { return nil } diff --git a/pkg/dashboard/utils/utils.go b/pkg/dashboard/utils/utils.go index a0232c36..eef3c4a7 100644 --- a/pkg/dashboard/utils/utils.go +++ b/pkg/dashboard/utils/utils.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" "regexp" + "slices" "strings" "github.com/gin-gonic/gin" @@ -116,3 +117,13 @@ func GetQueryProps(c *gin.Context) (*QueryProps, error) { return &qp, nil } + +func EnvAsBool(envKey string, envDef bool) bool { + validSettableValues := []string{"false", "true", "0", "1"} + envValue := os.Getenv(envKey) + if slices.Contains(validSettableValues, envValue) { + return envValue == "true" || envValue == "1" + } else { + return envDef + } +} diff --git a/pkg/dashboard/utils/utils_test.go b/pkg/dashboard/utils/utils_test.go index 5b01bcc3..6f1f2896 100644 --- a/pkg/dashboard/utils/utils_test.go +++ b/pkg/dashboard/utils/utils_test.go @@ -2,6 +2,7 @@ package utils import ( "net/http/httptest" + "os" "testing" "github.com/gin-gonic/gin" @@ -106,3 +107,53 @@ func TestChartAndVersion(t *testing.T) { }) } } + +func TestEnvAsBool(t *testing.T) { + // value: "true" | "1", default: false -> expect true + t.Setenv("TEST", "true") + want := true + if EnvAsBool("TEST", false) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } + t.Setenv("TEST", "1") + want = true + if EnvAsBool("TEST", false) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } + + // value: "false" | "0", default: true -> expect false + t.Setenv("TEST", "false") + want = false + if EnvAsBool("TEST", true) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } + t.Setenv("TEST", "0") + want = false + if EnvAsBool("TEST", true) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } + + // value: "" | *, default: false -> expect false + t.Setenv("TEST", "") + want = false + if EnvAsBool("TEST", false) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } + t.Setenv("TEST", "10random") + want = false + if EnvAsBool("TEST", false) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } + + // value: "" | *, default: true -> expect true + t.Setenv("TEST", "") + want = true + if EnvAsBool("TEST", true) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } + t.Setenv("TEST", "10random") + want = true + if EnvAsBool("TEST", true) != want { + t.Errorf("Env 'TEST' value '%v' should be parsed to %v", os.Getenv("TEST"), want) + } +}