diff --git a/pkg/command/commandbuilder.go b/pkg/command/commandbuilder.go index 71e717ee..a68bf4c2 100644 --- a/pkg/command/commandbuilder.go +++ b/pkg/command/commandbuilder.go @@ -18,6 +18,8 @@ package command import ( "context" + "os" + "strconv" barmanApi "github.com/cloudnative-pg/barman-cloud/pkg/api" ) @@ -117,16 +119,29 @@ type contextKey string // contextKeyUseDefaultAzureCredentials contains a bool indicating if the default azure credentials should be used const contextKeyUseDefaultAzureCredentials contextKey = "useDefaultAzureCredentials" +// Env variable overrides any value set in ctx value contextKeyUseDefaultAzureCredentials +const barmanUseDefaultAzureCredentials string = "BARMAN_USE_DEFAULT_AZURE_CREDENTIALS" + func useDefaultAzureCredentials(ctx context.Context) bool { - v := ctx.Value(contextKeyUseDefaultAzureCredentials) - if v == nil { - return false - } - result, ok := v.(bool) - if !ok { - return false + val := os.Getenv(barmanUseDefaultAzureCredentials) + if len(val) == 0 { + v := ctx.Value(contextKeyUseDefaultAzureCredentials) + if v == nil { + return false + } + result, ok := v.(bool) + if !ok { + return false + } + return result + } else { + v, err := strconv.ParseBool(val) + if err != nil { + return false + } + return v } - return result + } // ContextWithDefaultAzureCredentials create a context that contains the contextKeyUseDefaultAzureCredentials flag. diff --git a/pkg/command/commandbuilder_test.go b/pkg/command/commandbuilder_test.go index 9f7e16e4..a2009325 100644 --- a/pkg/command/commandbuilder_test.go +++ b/pkg/command/commandbuilder_test.go @@ -18,6 +18,7 @@ package command import ( "context" + "os" "strings" barmanApi "github.com/cloudnative-pg/barman-cloud/pkg/api" @@ -64,18 +65,50 @@ var _ = Describe("useDefaultAzureCredentials", func() { Expect(useDefaultAzureCredentials(ctx)).To(BeFalse()) }) - It("should be false if ctx contains an invalid value", func(ctx SpecContext) { + It("should be false if ctx contains an invalid value and not overwritten by env", func(ctx SpecContext) { newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, "invalidValue") Expect(useDefaultAzureCredentials(newCtx)).To(BeFalse()) }) - It("should be false if ctx contains false value", func(ctx SpecContext) { + It("should be false if ctx contains false value and not overwritten by env", func(ctx SpecContext) { newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, false) Expect(useDefaultAzureCredentials(newCtx)).To(BeFalse()) }) - It("should be true only if ctx contains true value", func(ctx SpecContext) { + It("should be true only if ctx contains true value and not overwritten by env", func(ctx SpecContext) { newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, true) Expect(useDefaultAzureCredentials(newCtx)).To(BeTrue()) }) + + // Env var should override the ctx value + + It("should be true if env var set to true even if ctx contains false value", func(ctx SpecContext) { + os.Setenv(barmanUseDefaultAzureCredentials, "true") + newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, false) + Expect(useDefaultAzureCredentials(newCtx)).To(BeTrue()) + }) + + It("should be false if env var set to false even if ctx contains true value", func(ctx SpecContext) { + os.Setenv(barmanUseDefaultAzureCredentials, "false") + newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, true) + Expect(useDefaultAzureCredentials(newCtx)).To(BeFalse()) + }) + + It("should be false if env var is empty if ctx contains false value", func(ctx SpecContext) { + os.Setenv(barmanUseDefaultAzureCredentials, "") + newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, false) + Expect(useDefaultAzureCredentials(newCtx)).To(BeFalse()) + }) + + It("should be true if env var is empty if ctx contains true value", func(ctx SpecContext) { + os.Setenv(barmanUseDefaultAzureCredentials, "") + newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, true) + Expect(useDefaultAzureCredentials(newCtx)).To(BeTrue()) + }) + + It("should be false if env var set with invalid value", func(ctx SpecContext) { + os.Setenv(barmanUseDefaultAzureCredentials, "invalidValue") + newCtx := context.WithValue(ctx, contextKeyUseDefaultAzureCredentials, true) + Expect(useDefaultAzureCredentials(newCtx)).To(BeFalse()) + }) })