Skip to content

Commit 44003a2

Browse files
Fix provider configuration code to handle Unknown values correctly (#8943) (#6312)
* Uncomment test cases for unknown values * Update test case names * Update unknown value test for `project`, make it pass * Update unknown value test for `access_token`, make `access_token` and `credentials` tests pass * Update unknown value tests for `region` and `zone`, make those tests pass * Update unknown value tests for `user_project_override`, make that test pass * Update unknown value test for `impersonate_service_account`, make that test pass * Update unknown value tests for `request_reason` and `request_timeout`, make those tests pass * Make unknown batching.send_after and batching.enable_batching values be set to same defaults as if they were null, update test * Update code to handle when the whole batching block is Unknown * Update the test function for `batching` unit tests to navigate how `GetBatchingConfig` is used by the code * Update code to handle null/unknown Scopes and ImpersonateServiceAccountDelegates values * Improve `impersonate_service_account_delegates` tests for unknown values * Add missing null test case for `batching` field * Add non-VCR acceptance test to assert handling of unknown values in provider config Only testing `credentials` currently. Signed-off-by: Modular Magician <[email protected]>
1 parent 8773d87 commit 44003a2

File tree

4 files changed

+381
-175
lines changed

4 files changed

+381
-175
lines changed

.changelog/8943.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
provider: addressed a bug where configuring the provider with unknown values did not behave as expected
3+
```

google-beta/fwtransport/framework_config.go

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ func (p *FrameworkProviderConfig) HandleZeroValues(ctx context.Context, data *fw
412412

413413
// HandleDefaults will handle all the defaults necessary in the provider
414414
func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmodels.ProviderModel, diags *diag.Diagnostics) {
415-
if data.AccessToken.IsNull() && data.Credentials.IsNull() {
415+
if (data.AccessToken.IsNull() || data.AccessToken.IsUnknown()) && (data.Credentials.IsNull() || data.Credentials.IsUnknown()) {
416416
credentials := transport_tpg.MultiEnvDefault([]string{
417417
"GOOGLE_CREDENTIALS",
418418
"GOOGLE_CLOUD_KEYFILE_JSON",
@@ -432,11 +432,11 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
432432
}
433433
}
434434

435-
if data.ImpersonateServiceAccount.IsNull() && os.Getenv("GOOGLE_IMPERSONATE_SERVICE_ACCOUNT") != "" {
435+
if (data.ImpersonateServiceAccount.IsNull() || data.ImpersonateServiceAccount.IsUnknown()) && os.Getenv("GOOGLE_IMPERSONATE_SERVICE_ACCOUNT") != "" {
436436
data.ImpersonateServiceAccount = types.StringValue(os.Getenv("GOOGLE_IMPERSONATE_SERVICE_ACCOUNT"))
437437
}
438438

439-
if data.Project.IsNull() {
439+
if data.Project.IsNull() || data.Project.IsUnknown() {
440440
project := transport_tpg.MultiEnvDefault([]string{
441441
"GOOGLE_PROJECT",
442442
"GOOGLE_CLOUD_PROJECT",
@@ -452,7 +452,7 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
452452
data.BillingProject = types.StringValue(os.Getenv("GOOGLE_BILLING_PROJECT"))
453453
}
454454

455-
if data.Region.IsNull() {
455+
if data.Region.IsNull() || data.Region.IsUnknown() {
456456
region := transport_tpg.MultiEnvDefault([]string{
457457
"GOOGLE_REGION",
458458
"GCLOUD_REGION",
@@ -464,7 +464,7 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
464464
}
465465
}
466466

467-
if data.Zone.IsNull() {
467+
if data.Zone.IsNull() || data.Zone.IsUnknown() {
468468
zone := transport_tpg.MultiEnvDefault([]string{
469469
"GOOGLE_ZONE",
470470
"GCLOUD_ZONE",
@@ -485,26 +485,26 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
485485
}
486486
}
487487

488-
if !data.Batching.IsNull() {
488+
if !data.Batching.IsNull() && !data.Batching.IsUnknown() {
489489
var pbConfigs []fwmodels.ProviderBatching
490490
d := data.Batching.ElementsAs(ctx, &pbConfigs, true)
491491
diags.Append(d...)
492492
if diags.HasError() {
493493
return
494494
}
495495

496-
if pbConfigs[0].SendAfter.IsNull() {
496+
if pbConfigs[0].SendAfter.IsNull() || pbConfigs[0].SendAfter.IsUnknown() {
497497
pbConfigs[0].SendAfter = types.StringValue("10s")
498498
}
499499

500-
if pbConfigs[0].EnableBatching.IsNull() {
500+
if pbConfigs[0].EnableBatching.IsNull() || pbConfigs[0].EnableBatching.IsUnknown() {
501501
pbConfigs[0].EnableBatching = types.BoolValue(true)
502502
}
503503

504504
data.Batching, d = types.ListValueFrom(ctx, types.ObjectType{}.WithAttributeTypes(fwmodels.ProviderBatchingAttributes), pbConfigs)
505505
}
506506

507-
if data.UserProjectOverride.IsNull() && os.Getenv("USER_PROJECT_OVERRIDE") != "" {
507+
if (data.UserProjectOverride.IsNull() || data.UserProjectOverride.IsUnknown()) && os.Getenv("USER_PROJECT_OVERRIDE") != "" {
508508
override, err := strconv.ParseBool(os.Getenv("USER_PROJECT_OVERRIDE"))
509509
if err != nil {
510510
diags.AddError(
@@ -513,11 +513,11 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
513513
data.UserProjectOverride = types.BoolValue(override)
514514
}
515515

516-
if data.RequestReason.IsNull() && os.Getenv("CLOUDSDK_CORE_REQUEST_REASON") != "" {
516+
if (data.RequestReason.IsNull() || data.RequestReason.IsUnknown()) && os.Getenv("CLOUDSDK_CORE_REQUEST_REASON") != "" {
517517
data.RequestReason = types.StringValue(os.Getenv("CLOUDSDK_CORE_REQUEST_REASON"))
518518
}
519519

520-
if data.RequestTimeout.IsNull() {
520+
if data.RequestTimeout.IsNull() || data.RequestTimeout.IsUnknown() {
521521
data.RequestTimeout = types.StringValue("120s")
522522
}
523523

@@ -1727,7 +1727,7 @@ func (p *FrameworkProviderConfig) logGoogleIdentities(ctx context.Context, data
17271727
// a separate diagnostics here
17281728
var d diag.Diagnostics
17291729

1730-
if data.ImpersonateServiceAccount.IsNull() {
1730+
if data.ImpersonateServiceAccount.IsNull() || data.ImpersonateServiceAccount.IsUnknown() {
17311731

17321732
tokenSource := GetTokenSource(ctx, data, true, diags)
17331733
if diags.HasError() {
@@ -1787,19 +1787,23 @@ func GetCredentials(ctx context.Context, data fwmodels.ProviderModel, initialCre
17871787
var clientScopes []string
17881788
var delegates []string
17891789

1790-
d := data.Scopes.ElementsAs(ctx, &clientScopes, false)
1791-
diags.Append(d...)
1792-
if diags.HasError() {
1793-
return googleoauth.Credentials{}
1790+
if !data.Scopes.IsNull() && !data.Scopes.IsUnknown() {
1791+
d := data.Scopes.ElementsAs(ctx, &clientScopes, false)
1792+
diags.Append(d...)
1793+
if diags.HasError() {
1794+
return googleoauth.Credentials{}
1795+
}
17941796
}
17951797

1796-
d = data.ImpersonateServiceAccountDelegates.ElementsAs(ctx, &delegates, false)
1797-
diags.Append(d...)
1798-
if diags.HasError() {
1799-
return googleoauth.Credentials{}
1798+
if !data.ImpersonateServiceAccountDelegates.IsNull() && !data.ImpersonateServiceAccountDelegates.IsUnknown() {
1799+
d := data.ImpersonateServiceAccountDelegates.ElementsAs(ctx, &delegates, false)
1800+
diags.Append(d...)
1801+
if diags.HasError() {
1802+
return googleoauth.Credentials{}
1803+
}
18001804
}
18011805

1802-
if !data.AccessToken.IsNull() {
1806+
if !data.AccessToken.IsNull() && !data.AccessToken.IsUnknown() {
18031807
contents, _, err := verify.PathOrContents(data.AccessToken.ValueString())
18041808
if err != nil {
18051809
diags.AddError("error loading access token", err.Error())
@@ -1824,7 +1828,7 @@ func GetCredentials(ctx context.Context, data fwmodels.ProviderModel, initialCre
18241828
}
18251829
}
18261830

1827-
if !data.Credentials.IsNull() {
1831+
if !data.Credentials.IsNull() && !data.Credentials.IsUnknown() {
18281832
contents, _, err := verify.PathOrContents(data.Credentials.ValueString())
18291833
if err != nil {
18301834
diags.AddError(fmt.Sprintf("error loading credentials: %s", err), err.Error())
@@ -1883,7 +1887,8 @@ func GetBatchingConfig(ctx context.Context, data types.List, diags *diag.Diagnos
18831887
EnableBatching: true,
18841888
}
18851889

1886-
if data.IsNull() {
1890+
// Handle if entire batching block is null/unknown
1891+
if data.IsNull() || data.IsUnknown() {
18871892
return bc
18881893
}
18891894

0 commit comments

Comments
 (0)