Skip to content

Commit 5ee1651

Browse files
Fix permadiff on dataflow_flex_template_job (#14038) (#10168)
[upstream:ab863f2bdc7a243aeb78350e335959f8d4cfb84e] Signed-off-by: Modular Magician <[email protected]>
1 parent d2de0c9 commit 5ee1651

File tree

3 files changed

+129
-5
lines changed

3 files changed

+129
-5
lines changed

.changelog/14038.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
dataflow: Fields `network`, `subnetwork`, `numWorkers`, `maxNumWorkers` and `machineType` will no longer cause permadiff on `dataflow_flex_template_job`
3+
```

google-beta/services/dataflow/resource_dataflow_flex_template_job.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -492,12 +492,23 @@ func resourceDataflowFlexTemplateJobRead(d *schema.ResourceData, meta interface{
492492
}
493493
optionsMap := sdkPipelineOptions["options"].(map[string]interface{})
494494

495+
// sdkPipelineOptions is not always populated with these values, hence the fallback
496+
if _, ok := d.GetOk("num_workers"); !ok && optionsMap["numWorkers"] == nil || optionsMap["numWorkers"] == 0 {
497+
optionsMap["numWorkers"] = job.Environment.WorkerPools[0].NumWorkers
498+
}
499+
if _, ok := d.GetOk("max_num_workers"); !ok && optionsMap["maxNumWorkers"] == nil || optionsMap["maxNumWorkers"] == 0 {
500+
optionsMap["maxNumWorkers"] = job.Environment.WorkerPools[0].AutoscalingSettings.MaxNumWorkers
501+
}
502+
if _, ok := d.GetOk("machine_type"); !ok && optionsMap["workerMachineType"] == nil || optionsMap["workerMachineType"] == "" {
503+
optionsMap["workerMachineType"] = job.Environment.WorkerPools[0].MachineType
504+
}
505+
if _, ok := d.GetOk("sdk_container_image"); !ok && optionsMap["sdkContainerImage"] == nil || optionsMap["sdkContainerImage"] == "" {
506+
optionsMap["sdkContainerImage"] = job.Environment.WorkerPools[0].WorkerHarnessContainerImage
507+
}
508+
495509
if err := d.Set("temp_location", optionsMap["tempLocation"]); err != nil {
496510
return fmt.Errorf("Error setting temp_gcs_location: %s", err)
497511
}
498-
if err := d.Set("network", optionsMap["network"]); err != nil {
499-
return fmt.Errorf("Error setting network: %s", err)
500-
}
501512
if err := d.Set("num_workers", optionsMap["numWorkers"]); err != nil {
502513
return fmt.Errorf("Error setting num_workers: %s", err)
503514
}
@@ -510,10 +521,10 @@ func resourceDataflowFlexTemplateJobRead(d *schema.ResourceData, meta interface{
510521
if err := d.Set("sdk_container_image", optionsMap["sdkContainerImage"]); err != nil {
511522
return fmt.Errorf("Error setting sdk_container_image: %s", err)
512523
}
513-
if err := d.Set("network", optionsMap["network"]); err != nil {
524+
if err := d.Set("network", job.Environment.WorkerPools[0].Network); err != nil {
514525
return fmt.Errorf("Error setting network: %s", err)
515526
}
516-
if err := d.Set("subnetwork", optionsMap["subnetwork"]); err != nil {
527+
if err := d.Set("subnetwork", job.Environment.WorkerPools[0].Subnetwork); err != nil {
517528
return fmt.Errorf("Error setting subnetwork: %s", err)
518529
}
519530
if err := d.Set("machine_type", optionsMap["workerMachineType"]); err != nil {

google-beta/services/dataflow/resource_dataflow_flex_template_job_test.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,49 @@ func TestAccDataflowFlexTemplateJob_enableStreamingEngine(t *testing.T) {
658658
})
659659
}
660660

661+
func TestAccDataflowFlexTemplateJob_workerPoolsFallback(t *testing.T) {
662+
acctest.SkipIfVcr(t)
663+
t.Parallel()
664+
665+
context1 := map[string]interface{}{
666+
"random_id": acctest.RandString(t, 10),
667+
"max_workers": 2,
668+
"num_workers": 1,
669+
"machine_type": `"n1-standard-1"`,
670+
}
671+
672+
context2 := map[string]interface{}{
673+
"random_id": context1["random_id"],
674+
"max_workers": 3,
675+
"num_workers": 2,
676+
"machine_type": `"n1-standard-1"`,
677+
}
678+
679+
resource.Test(t, resource.TestCase{
680+
PreCheck: func() { acctest.AccTestPreCheck(t) },
681+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
682+
CheckDestroy: testAccCheckDataflowJobDestroyProducer(t),
683+
Steps: []resource.TestStep{
684+
{
685+
Config: testAccDataflowFlexTemplateJob_workerPoolFallback(context1),
686+
Check: resource.ComposeTestCheckFunc(
687+
testAccDataflowFlexJobExists(t, "google_dataflow_flex_template_job.flex_job", false),
688+
resource.TestCheckResourceAttr("google_dataflow_flex_template_job.flex_job", "num_workers", "1"),
689+
resource.TestCheckResourceAttr("google_dataflow_flex_template_job.flex_job", "max_workers", "2"),
690+
),
691+
},
692+
{
693+
Config: testAccDataflowFlexTemplateJob_workerPoolFallback(context2),
694+
Check: resource.ComposeTestCheckFunc(
695+
testAccDataflowFlexJobExists(t, "google_dataflow_flex_template_job.flex_job", true),
696+
resource.TestCheckResourceAttr("google_dataflow_flex_template_job.flex_job", "num_workers", "2"),
697+
resource.TestCheckResourceAttr("google_dataflow_flex_template_job.flex_job", "max_workers", "3"),
698+
),
699+
},
700+
},
701+
})
702+
}
703+
661704
func testAccDataflowFlexTemplateJobHasNetwork(t *testing.T, res, expected string, wait bool) resource.TestCheckFunc {
662705
return func(s *terraform.State) error {
663706
instanceTmpl, err := testAccDataflowFlexTemplateGetGeneratedInstanceTemplate(t, s, res)
@@ -2057,3 +2100,70 @@ resource "google_dataflow_flex_template_job" "flex_job" {
20572100
}
20582101
`, topicName, bucket, job)
20592102
}
2103+
2104+
func testAccDataflowFlexTemplateJob_workerPoolFallback(context map[string]interface{}) string {
2105+
return acctest.Nprintf(`
2106+
resource "google_pubsub_topic" "example" {
2107+
name = "tf-test-topic-%{random_id}"
2108+
}
2109+
2110+
data "google_storage_bucket_object" "flex_template" {
2111+
name = "latest/flex/Streaming_Data_Generator"
2112+
bucket = "dataflow-templates"
2113+
}
2114+
2115+
resource "google_storage_bucket" "bucket" {
2116+
name = "tf-test-bucket-%{random_id}"
2117+
location = "US-CENTRAL1"
2118+
force_destroy = true
2119+
uniform_bucket_level_access = true
2120+
}
2121+
2122+
resource "google_storage_bucket_object" "schema" {
2123+
name = "schema-%{random_id}.json"
2124+
bucket = google_storage_bucket.bucket.name
2125+
content = <<EOF
2126+
{
2127+
"eventId": "{{uuid()}}",
2128+
"eventTimestamp": {{timestamp()}},
2129+
"ipv4": "{{ipv4()}}",
2130+
"ipv6": "{{ipv6()}}",
2131+
"country": "{{country()}}",
2132+
"username": "{{username()}}",
2133+
"quest": "{{random("A Break In the Ice", "Ghosts of Perdition", "Survive the Low Road")}}",
2134+
"score": {{integer(100, 10000)}},
2135+
"completed": {{bool()}}
2136+
}
2137+
EOF
2138+
}
2139+
2140+
resource "google_compute_network" "test-network" {
2141+
name = "tf-test-network-%{random_id}"
2142+
auto_create_subnetworks = false
2143+
}
2144+
2145+
resource "google_compute_subnetwork" "test-subnetwork" {
2146+
name = "tf-test-subnetwork-%{random_id}"
2147+
ip_cidr_range = "192.168.0.0/24"
2148+
region = "us-central1"
2149+
network = google_compute_network.test-network.id
2150+
}
2151+
2152+
resource "google_dataflow_flex_template_job" "flex_job" {
2153+
name = "tf-test-flex-job-%{random_id}"
2154+
container_spec_gcs_path = "gs://${data.google_storage_bucket_object.flex_template.bucket}/${data.google_storage_bucket_object.flex_template.name}"
2155+
on_delete = "cancel"
2156+
parameters = {
2157+
schemaLocation = "gs://${google_storage_bucket_object.schema.bucket}/schema-%{random_id}.json"
2158+
qps = "1"
2159+
topic = google_pubsub_topic.example.id
2160+
}
2161+
2162+
max_workers = %{max_workers}
2163+
num_workers = %{num_workers}
2164+
machine_type = %{machine_type}
2165+
network = google_compute_network.test-network.name
2166+
subnetwork = google_compute_subnetwork.test-subnetwork.self_link
2167+
}
2168+
`, context)
2169+
}

0 commit comments

Comments
 (0)