Skip to content

Commit 3e09a69

Browse files
Merge pull request #11513 from c2thorn/sync-main-FEATURE-BRANCH-6.0.0 (#8012)
Sync main feature branch 6.0.0 - 8/21 [upstream:5041f537b74e607bc605f1fc5cb1b89f428f2a6f] Signed-off-by: Modular Magician <[email protected]>
1 parent e376147 commit 3e09a69

13 files changed

+307
-76
lines changed

.changelog/11513.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:none
2+
3+
```

google-beta/acctest/resource_test_utils.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,40 @@
33
package acctest
44

55
import (
6+
"context"
7+
"errors"
68
"fmt"
9+
"slices"
710
"testing"
811
"time"
912

13+
tfjson "github.com/hashicorp/terraform-json"
1014
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
15+
"github.com/hashicorp/terraform-plugin-testing/plancheck"
1116
"github.com/hashicorp/terraform-plugin-testing/terraform"
1217
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
1318
)
1419

1520
// General test utils
1621

22+
var _ plancheck.PlanCheck = expectNoDelete{}
23+
24+
type expectNoDelete struct{}
25+
26+
func (e expectNoDelete) CheckPlan(ctx context.Context, req plancheck.CheckPlanRequest, resp *plancheck.CheckPlanResponse) {
27+
var result error
28+
for _, rc := range req.Plan.ResourceChanges {
29+
if slices.Contains(rc.Change.Actions, tfjson.ActionDelete) {
30+
result = errors.Join(result, fmt.Errorf("expected no deletion of resources, but %s has planned deletion", rc.Address))
31+
}
32+
}
33+
resp.Error = result
34+
}
35+
36+
func ExpectNoDelete() plancheck.PlanCheck {
37+
return expectNoDelete{}
38+
}
39+
1740
// TestExtractResourceAttr navigates a test's state to find the specified resource (or data source) attribute and makes the value
1841
// accessible via the attributeValue string pointer.
1942
func TestExtractResourceAttr(resourceName string, attributeName string, attributeValue *string) resource.TestCheckFunc {

google-beta/services/composer/resource_composer_environment_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ func TestAccComposerEnvironment_basic(t *testing.T) {
8282
// Checks that all updatable fields can be updated in one apply
8383
// (PATCH for Environments only is per-field)
8484
func TestAccComposerEnvironment_update(t *testing.T) {
85+
// Currently failing
86+
acctest.SkipIfVcr(t)
8587
t.Parallel()
8688

8789
envName := fmt.Sprintf("%s-%d", testComposerEnvironmentPrefix, acctest.RandInt(t))
@@ -281,6 +283,8 @@ func TestAccComposerEnvironment_withDatabaseConfig(t *testing.T) {
281283
}
282284

283285
func TestAccComposerEnvironment_withWebServerConfig(t *testing.T) {
286+
// Currently failing
287+
acctest.SkipIfVcr(t)
284288
t.Parallel()
285289
envName := fmt.Sprintf("%s-%d", testComposerEnvironmentPrefix, acctest.RandInt(t))
286290
network := fmt.Sprintf("%s-%d", testComposerNetworkPrefix, acctest.RandInt(t))

google-beta/services/compute/resource_compute_global_address_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,48 @@ import (
88
"testing"
99

1010
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-testing/plancheck"
1112
)
1213

14+
func TestAccComputeGlobalAddress_update(t *testing.T) {
15+
t.Parallel()
16+
17+
context := map[string]interface{}{
18+
"random_suffix": acctest.RandString(t, 10),
19+
}
20+
21+
acctest.VcrTest(t, resource.TestCase{
22+
PreCheck: func() { acctest.AccTestPreCheck(t) },
23+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
24+
CheckDestroy: testAccCheckComputeGlobalAddressDestroyProducer(t),
25+
Steps: []resource.TestStep{
26+
{
27+
Config: testAccComputeGlobalAddress_update1(context),
28+
},
29+
{
30+
ResourceName: "google_compute_global_address.foobar",
31+
ImportState: true,
32+
ImportStateVerify: true,
33+
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
34+
},
35+
{
36+
Config: testAccComputeGlobalAddress_update2(context),
37+
ConfigPlanChecks: resource.ConfigPlanChecks{
38+
PreApply: []plancheck.PlanCheck{
39+
acctest.ExpectNoDelete(),
40+
},
41+
},
42+
},
43+
{
44+
ResourceName: "google_compute_global_address.foobar",
45+
ImportState: true,
46+
ImportStateVerify: true,
47+
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
48+
},
49+
},
50+
})
51+
}
52+
1353
func TestAccComputeGlobalAddress_ipv6(t *testing.T) {
1454
t.Parallel()
1555

@@ -76,3 +116,47 @@ resource "google_compute_global_address" "foobar" {
76116
}
77117
`, networkName, addressName)
78118
}
119+
120+
func testAccComputeGlobalAddress_update1(context map[string]interface{}) string {
121+
return acctest.Nprintf(`
122+
resource "google_compute_network" "foobar" {
123+
name = "tf-test-address-%{random_suffix}"
124+
}
125+
126+
resource "google_compute_global_address" "foobar" {
127+
address = "172.20.181.0"
128+
description = "Description"
129+
name = "tf-test-address-%{random_suffix}"
130+
labels = {
131+
foo = "bar"
132+
}
133+
ip_version = "IPV4"
134+
prefix_length = 24
135+
address_type = "INTERNAL"
136+
purpose = "VPC_PEERING"
137+
network = google_compute_network.foobar.self_link
138+
}
139+
`, context)
140+
}
141+
142+
func testAccComputeGlobalAddress_update2(context map[string]interface{}) string {
143+
return acctest.Nprintf(`
144+
resource "google_compute_network" "foobar" {
145+
name = "tf-test-address-%{random_suffix}"
146+
}
147+
148+
resource "google_compute_global_address" "foobar" {
149+
address = "172.20.181.0"
150+
description = "Description"
151+
name = "tf-test-address-%{random_suffix}"
152+
labels = {
153+
foo = "baz"
154+
}
155+
ip_version = "IPV4"
156+
prefix_length = 24
157+
address_type = "INTERNAL"
158+
purpose = "VPC_PEERING"
159+
network = google_compute_network.foobar.self_link
160+
}
161+
`, context)
162+
}

google-beta/services/dataflow/resource_dataflow_flex_template_job.go

Lines changed: 42 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -311,23 +311,38 @@ func resourceDataflowFlexTemplateJobCreate(d *schema.ResourceData, meta interfac
311311
func resourceDataflowFlexJobSetupEnv(d *schema.ResourceData, config *transport_tpg.Config) (dataflow.FlexTemplateRuntimeEnvironment, map[string]string, error) {
312312

313313
updatedParameters := tpgresource.ExpandStringMap(d, "parameters")
314-
if err := hasIllegalParametersErr(d); err != nil {
315-
return dataflow.FlexTemplateRuntimeEnvironment{}, updatedParameters, err
316-
}
317314

318315
additionalExperiments := tpgresource.ConvertStringSet(d.Get("additional_experiments").(*schema.Set))
319316

320317
var autoscalingAlgorithm string
321318
autoscalingAlgorithm, updatedParameters = dataflowFlexJobTypeTransferVar("autoscaling_algorithm", "autoscalingAlgorithm", updatedParameters, d)
322319

323-
numWorkers, err := parseInt64("num_workers", d)
324-
if err != nil {
325-
return dataflow.FlexTemplateRuntimeEnvironment{}, updatedParameters, err
320+
var numWorkers int
321+
if p, ok := d.GetOk("parameters.numWorkers"); ok {
322+
number, err := strconv.Atoi(p.(string))
323+
if err != nil {
324+
return dataflow.FlexTemplateRuntimeEnvironment{}, updatedParameters, fmt.Errorf("parameters.numWorkers must have a valid integer assigned to it, current value is %s", p.(string))
325+
}
326+
delete(updatedParameters, "numWorkers")
327+
numWorkers = number
328+
} else {
329+
if v, ok := d.GetOk("num_workers"); ok {
330+
numWorkers = v.(int)
331+
}
326332
}
327333

328-
maxNumWorkers, err := parseInt64("max_workers", d)
329-
if err != nil {
330-
return dataflow.FlexTemplateRuntimeEnvironment{}, updatedParameters, err
334+
var maxNumWorkers int
335+
if p, ok := d.GetOk("parameters.maxNumWorkers"); ok {
336+
number, err := strconv.Atoi(p.(string))
337+
if err != nil {
338+
return dataflow.FlexTemplateRuntimeEnvironment{}, updatedParameters, fmt.Errorf("parameters.maxNumWorkers must have a valid integer assigned to it, current value is %s", p.(string))
339+
}
340+
delete(updatedParameters, "maxNumWorkers")
341+
maxNumWorkers = number
342+
} else {
343+
if v, ok := d.GetOk("max_workers"); ok {
344+
maxNumWorkers = v.(int)
345+
}
331346
}
332347

333348
network, updatedParameters := dataflowFlexJobTypeTransferVar("network", "network", updatedParameters, d)
@@ -346,9 +361,22 @@ func resourceDataflowFlexJobSetupEnv(d *schema.ResourceData, config *transport_t
346361

347362
ipConfiguration, updatedParameters := dataflowFlexJobTypeTransferVar("ip_configuration", "ipConfiguration", updatedParameters, d)
348363

349-
enableStreamingEngine, err := parseBool("enable_streaming_engine", d)
350-
if err != nil {
351-
return dataflow.FlexTemplateRuntimeEnvironment{}, updatedParameters, err
364+
var enableStreamingEngine bool
365+
if p, ok := d.GetOk("parameters.enableStreamingEngine"); ok {
366+
delete(updatedParameters, "enableStreamingEngine")
367+
e := strings.ToLower(p.(string))
368+
switch e {
369+
case "true":
370+
enableStreamingEngine = true
371+
case "false":
372+
enableStreamingEngine = false
373+
default:
374+
return dataflow.FlexTemplateRuntimeEnvironment{}, nil, fmt.Errorf("error when handling parameters.enableStreamingEngine value: expected value to be true or false but got value `%s`", e)
375+
}
376+
} else {
377+
if v, ok := d.GetOk("enable_streaming_engine"); ok {
378+
enableStreamingEngine = v.(bool)
379+
}
352380
}
353381

354382
sdkContainerImage, updatedParameters := dataflowFlexJobTypeTransferVar("sdk_container_image", "sdkContainerImage", updatedParameters, d)
@@ -358,8 +386,8 @@ func resourceDataflowFlexJobSetupEnv(d *schema.ResourceData, config *transport_t
358386
env := dataflow.FlexTemplateRuntimeEnvironment{
359387
AdditionalUserLabels: tpgresource.ExpandStringMap(d, "effective_labels"),
360388
AutoscalingAlgorithm: autoscalingAlgorithm,
361-
NumWorkers: numWorkers,
362-
MaxWorkers: maxNumWorkers,
389+
NumWorkers: int64(numWorkers),
390+
MaxWorkers: int64(maxNumWorkers),
363391
Network: network,
364392
ServiceAccountEmail: serviceAccountEmail,
365393
Subnetwork: subnetwork,
@@ -812,43 +840,3 @@ func dataflowFlexJobTypeParameterOverride(ename, pname string, d *schema.Resourc
812840
}
813841
return nil
814842
}
815-
816-
func hasIllegalParametersErr(d *schema.ResourceData) error {
817-
pKey := "parameters"
818-
errFmt := "%s must not include Dataflow options, found: %s"
819-
for k := range ResourceDataflowFlexTemplateJob().Schema {
820-
if _, notOk := d.GetOk(fmt.Sprintf("%s.%s", pKey, k)); notOk {
821-
return fmt.Errorf(errFmt, pKey, k)
822-
}
823-
kk := tpgresource.SnakeToPascalCase(k)
824-
kk = strings.ToLower(kk)
825-
if _, notOk := d.GetOk(fmt.Sprintf("%s.%s", pKey, kk)); notOk {
826-
return fmt.Errorf(errFmt, pKey, kk)
827-
}
828-
}
829-
return nil
830-
}
831-
832-
func parseInt64(name string, d *schema.ResourceData) (int64, error) {
833-
v, ok := d.GetOk(name)
834-
if !ok {
835-
return 0, nil
836-
}
837-
vv, err := strconv.ParseInt(fmt.Sprint(v), 10, 64)
838-
if err != nil {
839-
return 0, fmt.Errorf("illegal value assigned to %s, got: %s", name, v)
840-
}
841-
return vv, nil
842-
}
843-
844-
func parseBool(name string, d *schema.ResourceData) (bool, error) {
845-
v, ok := d.GetOk(name)
846-
if !ok {
847-
return false, nil
848-
}
849-
vv, err := strconv.ParseBool(fmt.Sprint(v))
850-
if err != nil {
851-
return false, fmt.Errorf("illegal value assigned to %s, got: %s", name, v)
852-
}
853-
return vv, nil
854-
}

google-beta/services/dataflow/resource_dataflow_flex_template_job_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,12 +582,20 @@ func TestAccDataflowFlexTemplateJob_enableStreamingEngine(t *testing.T) {
582582
CheckDestroy: testAccCheckDataflowJobDestroyProducer(t),
583583
Steps: []resource.TestStep{
584584
{
585-
Config: testAccDataflowFlexTemplateJob_enableStreamingEngine_param(job, bucket, topic),
586-
ExpectError: regexp.MustCompile("must not include Dataflow options"),
585+
Config: testAccDataflowFlexTemplateJob_enableStreamingEngine_param(job, bucket, topic),
586+
Check: resource.ComposeTestCheckFunc(
587+
// Is set
588+
resource.TestCheckResourceAttr("google_dataflow_flex_template_job.flex_job", "parameters.enableStreamingEngine", "true"),
589+
// Is not set
590+
resource.TestCheckNoResourceAttr("google_dataflow_flex_template_job.flex_job", "enable_streaming_engine"),
591+
),
587592
},
588593
{
589594
Config: testAccDataflowFlexTemplateJob_enableStreamingEngine_field(job, bucket, topic),
590595
Check: resource.ComposeTestCheckFunc(
596+
// Now is unset
597+
resource.TestCheckNoResourceAttr("google_dataflow_flex_template_job.flex_job", "parameters.enableStreamingEngine"),
598+
// Now is set
591599
resource.TestCheckResourceAttr("google_dataflow_flex_template_job.flex_job", "enable_streaming_engine", "true"),
592600
),
593601
},

google-beta/services/securitycentermanagement/resource_scc_management_folder_security_health_analytics_custom_module_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ import (
1818

1919
// Custom Module tests cannot be run in parallel without running into 409 Conflict reponses.
2020
// Run them as individual steps of an update test instead.
21-
func TestAccSecurityCenterManagementFolderSecurityHealthAnalyticsCustomModule(t *testing.T) {
22-
t.Parallel()
21+
func testAccSecurityCenterManagementFolderSecurityHealthAnalyticsCustomModule(t *testing.T) {
2322

2423
context := map[string]interface{}{
2524
"org_id": envvar.GetTestOrgFromEnv(t),

google-beta/services/securitycentermanagement/resource_scc_management_organization_event_threat_detection_custom_module_test.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,28 @@ import (
1616
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
1717
)
1818

19-
func TestAccSecurityCenterManagementOrganizationEventThreatDetectionCustomModule(t *testing.T) {
20-
t.Parallel()
19+
func TestAccSecurityCenterManagement(t *testing.T) {
20+
testCases := map[string]func(t *testing.T){
21+
"orgSecurity": testAccSecurityCenterManagementOrganizationSecurityHealthAnalyticsCustomModule,
22+
"folderSecurity": testAccSecurityCenterManagementFolderSecurityHealthAnalyticsCustomModule,
23+
"projectSecurity": testAccSecurityCenterManagementProjectSecurityHealthAnalyticsCustomModule,
24+
"organization": testAccSecurityCenterManagementOrganizationEventThreatDetectionCustomModule,
25+
}
26+
27+
for name, tc := range testCases {
28+
// shadow the tc variable into scope so that when
29+
// the loop continues, if t.Run hasn't executed tc(t)
30+
// yet, we don't have a race condition
31+
// see https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables
32+
tc := tc
33+
t.Run(name, func(t *testing.T) {
34+
tc(t)
35+
})
36+
}
37+
}
38+
39+
func testAccSecurityCenterManagementOrganizationEventThreatDetectionCustomModule(t *testing.T) {
40+
// t.Parallel()
2141

2242
context := map[string]interface{}{
2343
"org_id": envvar.GetTestOrgFromEnv(t),

google-beta/services/securitycentermanagement/resource_scc_management_organization_project_security_health_analytics_custom_module_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ import (
1717

1818
// Custom Module tests cannot be run in parallel without running into 409 Conflict reponses.
1919
// Run them as individual steps of an update test instead.
20-
func TestAccSecurityCenterManagementProjectSecurityHealthAnalyticsCustomModule(t *testing.T) {
21-
t.Parallel()
20+
func testAccSecurityCenterManagementProjectSecurityHealthAnalyticsCustomModule(t *testing.T) {
2221

2322
context := map[string]interface{}{
2423
"random_suffix": acctest.RandString(t, 10),

google-beta/services/securitycentermanagement/resource_scc_management_organization_security_health_analytics_custom_module_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ import (
1818

1919
// Custom Module tests cannot be run in parallel without running into 409 Conflict reponses.
2020
// Run them as individual steps of an update test instead.
21-
func TestAccSecurityCenterManagementOrganizationSecurityHealthAnalyticsCustomModule(t *testing.T) {
22-
t.Parallel()
21+
func testAccSecurityCenterManagementOrganizationSecurityHealthAnalyticsCustomModule(t *testing.T) {
2322

2423
context := map[string]interface{}{
2524
"org_id": envvar.GetTestOrgFromEnv(t),

0 commit comments

Comments
 (0)