From a95fdcf68fdf05ef5194bef80bf519b24ea1b13e Mon Sep 17 00:00:00 2001
From: Paulo Janotti <pjanotti@splunk.com>
Date: Tue, 4 May 2021 12:11:29 -0700
Subject: [PATCH] Make selector required by default

---
 internal/configsource/envvarconfigsource/session.go   | 11 ++++++-----
 .../configsource/envvarconfigsource/session_test.go   | 11 ++++-------
 .../testdata/env_config_source_end_2_end.yaml         |  4 ++--
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/internal/configsource/envvarconfigsource/session.go b/internal/configsource/envvarconfigsource/session.go
index 5764599b9e..81dc86e05b 100644
--- a/internal/configsource/envvarconfigsource/session.go
+++ b/internal/configsource/envvarconfigsource/session.go
@@ -34,10 +34,11 @@ type (
 )
 
 type retrieveParams struct {
-	// Retrieve parameter for the config source. If set to true and the environment
-	// variable specified on the selector is not defined or not available on the
-	// defaults the call to Retrieve will fail.
-	Required bool `mapstructure:"required"`
+	// Optional is used to change the default behavior when an environment variable
+	// requested via the config source is not defined. By default the value of this
+	// field is 'false' which will cause an error if the specified environment variable
+	// is not defined. Set it to 'true' to ignore not defined environment variables.
+	Optional bool `mapstructure:"optional"`
 }
 
 // envVarSession implements the configsource.Session interface.
@@ -64,7 +65,7 @@ func (e *envVarSession) Retrieve(_ context.Context, selector string, params inte
 
 	defaultValue, ok := e.defaults[selector]
 	if !ok {
-		if actualParams.Required {
+		if !actualParams.Optional {
 			return nil, &errMissingRequiredEnvVar{fmt.Errorf("env var %q is required but not defined and not present on defaults", selector)}
 		}
 
diff --git a/internal/configsource/envvarconfigsource/session_test.go b/internal/configsource/envvarconfigsource/session_test.go
index e48712c1fb..960fde06f8 100644
--- a/internal/configsource/envvarconfigsource/session_test.go
+++ b/internal/configsource/envvarconfigsource/session_test.go
@@ -45,6 +45,9 @@ func TestEnvVarConfigSource_Session(t *testing.T) {
 		{
 			name:     "missing_not_required",
 			selector: "UNDEFINED_ENV_VAR",
+			params: map[string]interface{}{
+				"optional": true,
+			},
 			expected: "", // The default behavior for undefined env var is empty string.
 		},
 		{
@@ -55,18 +58,12 @@ func TestEnvVarConfigSource_Session(t *testing.T) {
 			wantErr: &errInvalidRetrieveParams{},
 		},
 		{
-			name: "missing_required",
-			params: map[string]interface{}{
-				"required": true,
-			},
+			name:     "missing_required",
 			selector: "UNDEFINED_ENV_VAR",
 			wantErr:  &errMissingRequiredEnvVar{},
 		},
 		{
 			name: "required_on_defaults",
-			params: map[string]interface{}{
-				"required": true,
-			},
 			defaults: map[string]interface{}{
 				"FALLBACK_ENV_VAR": "fallback_env_var",
 			},
diff --git a/internal/configsource/envvarconfigsource/testdata/env_config_source_end_2_end.yaml b/internal/configsource/envvarconfigsource/testdata/env_config_source_end_2_end.yaml
index 4ac819a987..7e36120ae1 100644
--- a/internal/configsource/envvarconfigsource/testdata/env_config_source_end_2_end.yaml
+++ b/internal/configsource/envvarconfigsource/testdata/env_config_source_end_2_end.yaml
@@ -8,6 +8,6 @@ config_sources:
 
 config:
   from_defined_env_var: ${env:_TEST_ENV_VAR_CFG_SRC}
-  from_undefined_env_var: ${env:_UNDEFINED_ENV_VAR}/some/path
+  from_undefined_env_var: ${env:_UNDEFINED_ENV_VAR?optional=true}/some/path
   field_from_default: $env:k0
-  map_from_default: $env:cfg?required=true
+  map_from_default: $env:cfg?optional=true