Skip to content

Commit a8aa378

Browse files
Fix provider configuration code to handle Unknown values correctly (#8943) (#15898)
* 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 0844190 commit a8aa378

File tree

4 files changed

+381
-175
lines changed

4 files changed

+381
-175
lines changed

.changelog/8943.txt

+3
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/fwtransport/framework_config.go

+28-23
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ func (p *FrameworkProviderConfig) HandleZeroValues(ctx context.Context, data *fw
380380

381381
// HandleDefaults will handle all the defaults necessary in the provider
382382
func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmodels.ProviderModel, diags *diag.Diagnostics) {
383-
if data.AccessToken.IsNull() && data.Credentials.IsNull() {
383+
if (data.AccessToken.IsNull() || data.AccessToken.IsUnknown()) && (data.Credentials.IsNull() || data.Credentials.IsUnknown()) {
384384
credentials := transport_tpg.MultiEnvDefault([]string{
385385
"GOOGLE_CREDENTIALS",
386386
"GOOGLE_CLOUD_KEYFILE_JSON",
@@ -400,11 +400,11 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
400400
}
401401
}
402402

403-
if data.ImpersonateServiceAccount.IsNull() && os.Getenv("GOOGLE_IMPERSONATE_SERVICE_ACCOUNT") != "" {
403+
if (data.ImpersonateServiceAccount.IsNull() || data.ImpersonateServiceAccount.IsUnknown()) && os.Getenv("GOOGLE_IMPERSONATE_SERVICE_ACCOUNT") != "" {
404404
data.ImpersonateServiceAccount = types.StringValue(os.Getenv("GOOGLE_IMPERSONATE_SERVICE_ACCOUNT"))
405405
}
406406

407-
if data.Project.IsNull() {
407+
if data.Project.IsNull() || data.Project.IsUnknown() {
408408
project := transport_tpg.MultiEnvDefault([]string{
409409
"GOOGLE_PROJECT",
410410
"GOOGLE_CLOUD_PROJECT",
@@ -420,7 +420,7 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
420420
data.BillingProject = types.StringValue(os.Getenv("GOOGLE_BILLING_PROJECT"))
421421
}
422422

423-
if data.Region.IsNull() {
423+
if data.Region.IsNull() || data.Region.IsUnknown() {
424424
region := transport_tpg.MultiEnvDefault([]string{
425425
"GOOGLE_REGION",
426426
"GCLOUD_REGION",
@@ -432,7 +432,7 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
432432
}
433433
}
434434

435-
if data.Zone.IsNull() {
435+
if data.Zone.IsNull() || data.Zone.IsUnknown() {
436436
zone := transport_tpg.MultiEnvDefault([]string{
437437
"GOOGLE_ZONE",
438438
"GCLOUD_ZONE",
@@ -453,26 +453,26 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
453453
}
454454
}
455455

456-
if !data.Batching.IsNull() {
456+
if !data.Batching.IsNull() && !data.Batching.IsUnknown() {
457457
var pbConfigs []fwmodels.ProviderBatching
458458
d := data.Batching.ElementsAs(ctx, &pbConfigs, true)
459459
diags.Append(d...)
460460
if diags.HasError() {
461461
return
462462
}
463463

464-
if pbConfigs[0].SendAfter.IsNull() {
464+
if pbConfigs[0].SendAfter.IsNull() || pbConfigs[0].SendAfter.IsUnknown() {
465465
pbConfigs[0].SendAfter = types.StringValue("10s")
466466
}
467467

468-
if pbConfigs[0].EnableBatching.IsNull() {
468+
if pbConfigs[0].EnableBatching.IsNull() || pbConfigs[0].EnableBatching.IsUnknown() {
469469
pbConfigs[0].EnableBatching = types.BoolValue(true)
470470
}
471471

472472
data.Batching, d = types.ListValueFrom(ctx, types.ObjectType{}.WithAttributeTypes(fwmodels.ProviderBatchingAttributes), pbConfigs)
473473
}
474474

475-
if data.UserProjectOverride.IsNull() && os.Getenv("USER_PROJECT_OVERRIDE") != "" {
475+
if (data.UserProjectOverride.IsNull() || data.UserProjectOverride.IsUnknown()) && os.Getenv("USER_PROJECT_OVERRIDE") != "" {
476476
override, err := strconv.ParseBool(os.Getenv("USER_PROJECT_OVERRIDE"))
477477
if err != nil {
478478
diags.AddError(
@@ -481,11 +481,11 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
481481
data.UserProjectOverride = types.BoolValue(override)
482482
}
483483

484-
if data.RequestReason.IsNull() && os.Getenv("CLOUDSDK_CORE_REQUEST_REASON") != "" {
484+
if (data.RequestReason.IsNull() || data.RequestReason.IsUnknown()) && os.Getenv("CLOUDSDK_CORE_REQUEST_REASON") != "" {
485485
data.RequestReason = types.StringValue(os.Getenv("CLOUDSDK_CORE_REQUEST_REASON"))
486486
}
487487

488-
if data.RequestTimeout.IsNull() {
488+
if data.RequestTimeout.IsNull() || data.RequestTimeout.IsUnknown() {
489489
data.RequestTimeout = types.StringValue("120s")
490490
}
491491

@@ -1558,7 +1558,7 @@ func (p *FrameworkProviderConfig) logGoogleIdentities(ctx context.Context, data
15581558
// a separate diagnostics here
15591559
var d diag.Diagnostics
15601560

1561-
if data.ImpersonateServiceAccount.IsNull() {
1561+
if data.ImpersonateServiceAccount.IsNull() || data.ImpersonateServiceAccount.IsUnknown() {
15621562

15631563
tokenSource := GetTokenSource(ctx, data, true, diags)
15641564
if diags.HasError() {
@@ -1618,19 +1618,23 @@ func GetCredentials(ctx context.Context, data fwmodels.ProviderModel, initialCre
16181618
var clientScopes []string
16191619
var delegates []string
16201620

1621-
d := data.Scopes.ElementsAs(ctx, &clientScopes, false)
1622-
diags.Append(d...)
1623-
if diags.HasError() {
1624-
return googleoauth.Credentials{}
1621+
if !data.Scopes.IsNull() && !data.Scopes.IsUnknown() {
1622+
d := data.Scopes.ElementsAs(ctx, &clientScopes, false)
1623+
diags.Append(d...)
1624+
if diags.HasError() {
1625+
return googleoauth.Credentials{}
1626+
}
16251627
}
16261628

1627-
d = data.ImpersonateServiceAccountDelegates.ElementsAs(ctx, &delegates, false)
1628-
diags.Append(d...)
1629-
if diags.HasError() {
1630-
return googleoauth.Credentials{}
1629+
if !data.ImpersonateServiceAccountDelegates.IsNull() && !data.ImpersonateServiceAccountDelegates.IsUnknown() {
1630+
d := data.ImpersonateServiceAccountDelegates.ElementsAs(ctx, &delegates, false)
1631+
diags.Append(d...)
1632+
if diags.HasError() {
1633+
return googleoauth.Credentials{}
1634+
}
16311635
}
16321636

1633-
if !data.AccessToken.IsNull() {
1637+
if !data.AccessToken.IsNull() && !data.AccessToken.IsUnknown() {
16341638
contents, _, err := verify.PathOrContents(data.AccessToken.ValueString())
16351639
if err != nil {
16361640
diags.AddError("error loading access token", err.Error())
@@ -1655,7 +1659,7 @@ func GetCredentials(ctx context.Context, data fwmodels.ProviderModel, initialCre
16551659
}
16561660
}
16571661

1658-
if !data.Credentials.IsNull() {
1662+
if !data.Credentials.IsNull() && !data.Credentials.IsUnknown() {
16591663
contents, _, err := verify.PathOrContents(data.Credentials.ValueString())
16601664
if err != nil {
16611665
diags.AddError(fmt.Sprintf("error loading credentials: %s", err), err.Error())
@@ -1714,7 +1718,8 @@ func GetBatchingConfig(ctx context.Context, data types.List, diags *diag.Diagnos
17141718
EnableBatching: true,
17151719
}
17161720

1717-
if data.IsNull() {
1721+
// Handle if entire batching block is null/unknown
1722+
if data.IsNull() || data.IsUnknown() {
17181723
return bc
17191724
}
17201725

0 commit comments

Comments
 (0)