From ea1a8a42a37346855156fd3c78941321346320a1 Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 18 Jun 2025 07:21:05 +0000 Subject: [PATCH 01/11] fix: path doesnt allow string starting with / --- .../resource_storage_transfer_job.go.tmpl | 20 ++ .../resource_storage_transfer_job_test.go | 179 ++++++++++++++++++ .../guides/version_7_upgrade.html.markdown | 6 +- 3 files changed, 202 insertions(+), 3 deletions(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index f283d995173d..4dda58c8bc56 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -4,6 +4,7 @@ import ( "fmt" "log" "reflect" + "regexp" "strings" "time" @@ -698,11 +699,30 @@ func gcsDataSchema() *schema.Resource { Computed: true, Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, + ValidateFunc: validatePath, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + old, new = strings.TrimSpace(old), strings.TrimSpace(new) + if strings.ToLower(old) == strings.ToLower(new) { + return true + } + return false + }, }, }, } } +func validatePath(v interface{}, k string) (ws []string, errors []error) { + value := v.(string) + value = strings.TrimSpace(value) + // checks if path not started with "/" + regex, err := regexp.Compile("^/+") + if err == nil && len(value) > 0 && regex.Match([]byte(value)) { + errors = append(errors, fmt.Errorf("%q cannot start with /", k)) + } + return +} + func awsS3DataSchema() *schema.Resource { return &schema.Resource{ Schema: map[string]*schema.Schema{ diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go index 1d50924e8060..fe930f5b8f31 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go @@ -4,6 +4,7 @@ package storagetransfer_test import ( "fmt" + "regexp" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -573,6 +574,28 @@ func TestAccStorageTransferJob_hdfsSource(t *testing.T) { }) } +func TestAccStorageTransferJob_transferPathError(t *testing.T) { + t.Parallel() + + testDataSourceBucketName := acctest.RandString(t, 10) + testDataSinkName := acctest.RandString(t, 10) + testTransferJobDescription := acctest.RandString(t, 10) + testTransferJobName := fmt.Sprintf("tf-test-transfer-job-%s", acctest.RandString(t, 10)) + errorMessage := string('"') + "transfer_spec.0.gcs_data_sink.0.path" + string('"') + " cannot start with /" + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccStorageTransferJobDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccStorageTransferJob_transferJobPathError(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName), + ExpectError: regexp.MustCompile(errorMessage), + }, + }, + }) +} + func testAccStorageTransferJobDestroyProducer(t *testing.T) func(s *terraform.State) error { return func(s *terraform.State) error { config := acctest.GoogleProviderConfig(t) @@ -2399,3 +2422,159 @@ resource "google_storage_transfer_job" "transfer_job" { } `, project, dataSourceBucketName, project, dataSinkBucketName, project, transferJobDescription, project) } + +func testAccStorageTransferJob_transferJobPathError(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string) string { + return fmt.Sprintf(` + data "google_storage_transfer_project_service_account" "default" { + project = "%s" + } + + resource "google_storage_bucket" "data_source" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_source" { + bucket = google_storage_bucket.data_source.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_bucket" "data_sink" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_sink" { + bucket = google_storage_bucket.data_sink.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_transfer_job" "transfer_job" { + name = "transferJobs/%s" + description = "%s" + project = "%s" + + transfer_spec { + gcs_data_source { + bucket_name = google_storage_bucket.data_source.name + path = "foo/" + } + gcs_data_sink { + bucket_name = google_storage_bucket.data_sink.name + path = "/" + } + } + + schedule { + schedule_start_date { + year = 2018 + month = 10 + day = 1 + } + schedule_end_date { + year = 2019 + month = 10 + day = 1 + } + start_time_of_day { + hours = 0 + minutes = 30 + seconds = 0 + nanos = 0 + } + repeat_interval = "604800s" + } + + depends_on = [ + google_storage_bucket_iam_member.data_source, + google_storage_bucket_iam_member.data_sink, + ] + } + `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project) +} + +func testAccStorageTransferJob_transferJobGcsPath(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string, gcsPath string) string { + return fmt.Sprintf(` + data "google_storage_transfer_project_service_account" "default" { + project = "%s" + } + + resource "google_storage_bucket" "data_source" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_source" { + bucket = google_storage_bucket.data_source.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_bucket" "data_sink" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_sink" { + bucket = google_storage_bucket.data_sink.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_transfer_job" "transfer_job" { + name = "transferJobs/%s" + description = "%s" + project = "%s" + + transfer_spec { + gcs_data_source { + bucket_name = google_storage_bucket.data_source.name + path = "foo/" + } + gcs_data_sink { + bucket_name = google_storage_bucket.data_sink.name + path = "%s" + } + } + + schedule { + schedule_start_date { + year = 2018 + month = 10 + day = 1 + } + schedule_end_date { + year = 2019 + month = 10 + day = 1 + } + start_time_of_day { + hours = 0 + minutes = 30 + seconds = 0 + nanos = 0 + } + repeat_interval = "604800s" + } + + depends_on = [ + google_storage_bucket_iam_member.data_source, + google_storage_bucket_iam_member.data_sink, + ] + } + `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project, gcsPath) +} diff --git a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown index 2b7ba1125ecb..a03eafc26314 100644 --- a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown +++ b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown @@ -102,8 +102,8 @@ Description of the change and how users should adjust their configuration (if ne ## Resources -## Resource: `google_product_resource` +## Resource: `google_storage_transfer_job` -### Resource-level change example header +### `path` does not allow strings starting with / -Description of the change and how users should adjust their configuration (if needed). +`path` does not allow strings starting with / From 09227b530f0c858bc3e09bb3db75bcb80d330576 Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 18 Jun 2025 08:22:18 +0000 Subject: [PATCH 02/11] update --- .../storagetransfer/resource_storage_transfer_job.go.tmpl | 1 - 1 file changed, 1 deletion(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index 4dda58c8bc56..4152f032e71e 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -696,7 +696,6 @@ func gcsDataSchema() *schema.Resource { }, "path": { Optional: true, - Computed: true, Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, ValidateFunc: validatePath, From cde54b2995190c84e2f5e1c22629395d9618ac35 Mon Sep 17 00:00:00 2001 From: gurusai-voleti Date: Wed, 18 Jun 2025 18:36:53 +0530 Subject: [PATCH 03/11] Update version_7_upgrade.html.markdown --- .../website/docs/guides/version_7_upgrade.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown index a03eafc26314..d29b27c92f4c 100644 --- a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown +++ b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown @@ -106,4 +106,4 @@ Description of the change and how users should adjust their configuration (if ne ### `path` does not allow strings starting with / -`path` does not allow strings starting with / +`path` does not allow strings starting with /. From 04e72e601bceb7fd653abeb3bae6426627f63c84 Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 25 Jun 2025 15:44:19 +0000 Subject: [PATCH 04/11] review comments --- .../resource_storage_transfer_job.go.tmpl | 7 -- .../resource_storage_transfer_job_test.go | 91 ++----------------- 2 files changed, 8 insertions(+), 90 deletions(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index 4152f032e71e..b486476dd7f2 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -699,13 +699,6 @@ func gcsDataSchema() *schema.Resource { Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, ValidateFunc: validatePath, - DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - old, new = strings.TrimSpace(old), strings.TrimSpace(new) - if strings.ToLower(old) == strings.ToLower(new) { - return true - } - return false - }, }, }, } diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go index fe930f5b8f31..09647d6ff895 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go @@ -4,7 +4,6 @@ package storagetransfer_test import ( "fmt" - "regexp" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -574,14 +573,13 @@ func TestAccStorageTransferJob_hdfsSource(t *testing.T) { }) } -func TestAccStorageTransferJob_transferPathError(t *testing.T) { +func TestAccStorageTransferJob_transferUpdateToEmptyString(t *testing.T) { t.Parallel() testDataSourceBucketName := acctest.RandString(t, 10) testDataSinkName := acctest.RandString(t, 10) testTransferJobDescription := acctest.RandString(t, 10) testTransferJobName := fmt.Sprintf("tf-test-transfer-job-%s", acctest.RandString(t, 10)) - errorMessage := string('"') + "transfer_spec.0.gcs_data_sink.0.path" + string('"') + " cannot start with /" acctest.VcrTest(t, resource.TestCase{ PreCheck: func() { acctest.AccTestPreCheck(t) }, @@ -589,8 +587,13 @@ func TestAccStorageTransferJob_transferPathError(t *testing.T) { CheckDestroy: testAccStorageTransferJobDestroyProducer(t), Steps: []resource.TestStep{ { - Config: testAccStorageTransferJob_transferJobPathError(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName), - ExpectError: regexp.MustCompile(errorMessage), + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), + }, + { + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, ""), + }, + { + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), }, }, }) @@ -2423,84 +2426,6 @@ resource "google_storage_transfer_job" "transfer_job" { `, project, dataSourceBucketName, project, dataSinkBucketName, project, transferJobDescription, project) } -func testAccStorageTransferJob_transferJobPathError(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string) string { - return fmt.Sprintf(` - data "google_storage_transfer_project_service_account" "default" { - project = "%s" - } - - resource "google_storage_bucket" "data_source" { - name = "%s" - project = "%s" - location = "US" - force_destroy = true - uniform_bucket_level_access = true - } - - resource "google_storage_bucket_iam_member" "data_source" { - bucket = google_storage_bucket.data_source.name - role = "roles/storage.admin" - member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" - } - - resource "google_storage_bucket" "data_sink" { - name = "%s" - project = "%s" - location = "US" - force_destroy = true - uniform_bucket_level_access = true - } - - resource "google_storage_bucket_iam_member" "data_sink" { - bucket = google_storage_bucket.data_sink.name - role = "roles/storage.admin" - member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" - } - - resource "google_storage_transfer_job" "transfer_job" { - name = "transferJobs/%s" - description = "%s" - project = "%s" - - transfer_spec { - gcs_data_source { - bucket_name = google_storage_bucket.data_source.name - path = "foo/" - } - gcs_data_sink { - bucket_name = google_storage_bucket.data_sink.name - path = "/" - } - } - - schedule { - schedule_start_date { - year = 2018 - month = 10 - day = 1 - } - schedule_end_date { - year = 2019 - month = 10 - day = 1 - } - start_time_of_day { - hours = 0 - minutes = 30 - seconds = 0 - nanos = 0 - } - repeat_interval = "604800s" - } - - depends_on = [ - google_storage_bucket_iam_member.data_source, - google_storage_bucket_iam_member.data_sink, - ] - } - `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project) -} - func testAccStorageTransferJob_transferJobGcsPath(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string, gcsPath string) string { return fmt.Sprintf(` data "google_storage_transfer_project_service_account" "default" { From 00164d27000656e2bc895572d040fa9b40383505 Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 25 Jun 2025 16:55:17 +0000 Subject: [PATCH 05/11] Revert "review comments" This reverts commit 04e72e601bceb7fd653abeb3bae6426627f63c84. --- .../resource_storage_transfer_job.go.tmpl | 7 ++ .../resource_storage_transfer_job_test.go | 91 +++++++++++++++++-- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index b486476dd7f2..4152f032e71e 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -699,6 +699,13 @@ func gcsDataSchema() *schema.Resource { Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, ValidateFunc: validatePath, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + old, new = strings.TrimSpace(old), strings.TrimSpace(new) + if strings.ToLower(old) == strings.ToLower(new) { + return true + } + return false + }, }, }, } diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go index 09647d6ff895..fe930f5b8f31 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go @@ -4,6 +4,7 @@ package storagetransfer_test import ( "fmt" + "regexp" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -573,13 +574,14 @@ func TestAccStorageTransferJob_hdfsSource(t *testing.T) { }) } -func TestAccStorageTransferJob_transferUpdateToEmptyString(t *testing.T) { +func TestAccStorageTransferJob_transferPathError(t *testing.T) { t.Parallel() testDataSourceBucketName := acctest.RandString(t, 10) testDataSinkName := acctest.RandString(t, 10) testTransferJobDescription := acctest.RandString(t, 10) testTransferJobName := fmt.Sprintf("tf-test-transfer-job-%s", acctest.RandString(t, 10)) + errorMessage := string('"') + "transfer_spec.0.gcs_data_sink.0.path" + string('"') + " cannot start with /" acctest.VcrTest(t, resource.TestCase{ PreCheck: func() { acctest.AccTestPreCheck(t) }, @@ -587,13 +589,8 @@ func TestAccStorageTransferJob_transferUpdateToEmptyString(t *testing.T) { CheckDestroy: testAccStorageTransferJobDestroyProducer(t), Steps: []resource.TestStep{ { - Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), - }, - { - Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, ""), - }, - { - Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), + Config: testAccStorageTransferJob_transferJobPathError(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName), + ExpectError: regexp.MustCompile(errorMessage), }, }, }) @@ -2426,6 +2423,84 @@ resource "google_storage_transfer_job" "transfer_job" { `, project, dataSourceBucketName, project, dataSinkBucketName, project, transferJobDescription, project) } +func testAccStorageTransferJob_transferJobPathError(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string) string { + return fmt.Sprintf(` + data "google_storage_transfer_project_service_account" "default" { + project = "%s" + } + + resource "google_storage_bucket" "data_source" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_source" { + bucket = google_storage_bucket.data_source.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_bucket" "data_sink" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_sink" { + bucket = google_storage_bucket.data_sink.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_transfer_job" "transfer_job" { + name = "transferJobs/%s" + description = "%s" + project = "%s" + + transfer_spec { + gcs_data_source { + bucket_name = google_storage_bucket.data_source.name + path = "foo/" + } + gcs_data_sink { + bucket_name = google_storage_bucket.data_sink.name + path = "/" + } + } + + schedule { + schedule_start_date { + year = 2018 + month = 10 + day = 1 + } + schedule_end_date { + year = 2019 + month = 10 + day = 1 + } + start_time_of_day { + hours = 0 + minutes = 30 + seconds = 0 + nanos = 0 + } + repeat_interval = "604800s" + } + + depends_on = [ + google_storage_bucket_iam_member.data_source, + google_storage_bucket_iam_member.data_sink, + ] + } + `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project) +} + func testAccStorageTransferJob_transferJobGcsPath(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string, gcsPath string) string { return fmt.Sprintf(` data "google_storage_transfer_project_service_account" "default" { From c3f949b9e06c3c4555d3c8bb2d42411ad23d3fec Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 18 Jun 2025 07:21:05 +0000 Subject: [PATCH 06/11] fix: path doesnt allow string starting with / --- .../resource_storage_transfer_job.go.tmpl | 20 ++ .../resource_storage_transfer_job_test.go | 179 ++++++++++++++++++ .../guides/version_7_upgrade.html.markdown | 6 +- 3 files changed, 202 insertions(+), 3 deletions(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index f283d995173d..4dda58c8bc56 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -4,6 +4,7 @@ import ( "fmt" "log" "reflect" + "regexp" "strings" "time" @@ -698,11 +699,30 @@ func gcsDataSchema() *schema.Resource { Computed: true, Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, + ValidateFunc: validatePath, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + old, new = strings.TrimSpace(old), strings.TrimSpace(new) + if strings.ToLower(old) == strings.ToLower(new) { + return true + } + return false + }, }, }, } } +func validatePath(v interface{}, k string) (ws []string, errors []error) { + value := v.(string) + value = strings.TrimSpace(value) + // checks if path not started with "/" + regex, err := regexp.Compile("^/+") + if err == nil && len(value) > 0 && regex.Match([]byte(value)) { + errors = append(errors, fmt.Errorf("%q cannot start with /", k)) + } + return +} + func awsS3DataSchema() *schema.Resource { return &schema.Resource{ Schema: map[string]*schema.Schema{ diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go index 1d50924e8060..fe930f5b8f31 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go @@ -4,6 +4,7 @@ package storagetransfer_test import ( "fmt" + "regexp" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -573,6 +574,28 @@ func TestAccStorageTransferJob_hdfsSource(t *testing.T) { }) } +func TestAccStorageTransferJob_transferPathError(t *testing.T) { + t.Parallel() + + testDataSourceBucketName := acctest.RandString(t, 10) + testDataSinkName := acctest.RandString(t, 10) + testTransferJobDescription := acctest.RandString(t, 10) + testTransferJobName := fmt.Sprintf("tf-test-transfer-job-%s", acctest.RandString(t, 10)) + errorMessage := string('"') + "transfer_spec.0.gcs_data_sink.0.path" + string('"') + " cannot start with /" + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccStorageTransferJobDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccStorageTransferJob_transferJobPathError(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName), + ExpectError: regexp.MustCompile(errorMessage), + }, + }, + }) +} + func testAccStorageTransferJobDestroyProducer(t *testing.T) func(s *terraform.State) error { return func(s *terraform.State) error { config := acctest.GoogleProviderConfig(t) @@ -2399,3 +2422,159 @@ resource "google_storage_transfer_job" "transfer_job" { } `, project, dataSourceBucketName, project, dataSinkBucketName, project, transferJobDescription, project) } + +func testAccStorageTransferJob_transferJobPathError(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string) string { + return fmt.Sprintf(` + data "google_storage_transfer_project_service_account" "default" { + project = "%s" + } + + resource "google_storage_bucket" "data_source" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_source" { + bucket = google_storage_bucket.data_source.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_bucket" "data_sink" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_sink" { + bucket = google_storage_bucket.data_sink.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_transfer_job" "transfer_job" { + name = "transferJobs/%s" + description = "%s" + project = "%s" + + transfer_spec { + gcs_data_source { + bucket_name = google_storage_bucket.data_source.name + path = "foo/" + } + gcs_data_sink { + bucket_name = google_storage_bucket.data_sink.name + path = "/" + } + } + + schedule { + schedule_start_date { + year = 2018 + month = 10 + day = 1 + } + schedule_end_date { + year = 2019 + month = 10 + day = 1 + } + start_time_of_day { + hours = 0 + minutes = 30 + seconds = 0 + nanos = 0 + } + repeat_interval = "604800s" + } + + depends_on = [ + google_storage_bucket_iam_member.data_source, + google_storage_bucket_iam_member.data_sink, + ] + } + `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project) +} + +func testAccStorageTransferJob_transferJobGcsPath(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string, gcsPath string) string { + return fmt.Sprintf(` + data "google_storage_transfer_project_service_account" "default" { + project = "%s" + } + + resource "google_storage_bucket" "data_source" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_source" { + bucket = google_storage_bucket.data_source.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_bucket" "data_sink" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_sink" { + bucket = google_storage_bucket.data_sink.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_transfer_job" "transfer_job" { + name = "transferJobs/%s" + description = "%s" + project = "%s" + + transfer_spec { + gcs_data_source { + bucket_name = google_storage_bucket.data_source.name + path = "foo/" + } + gcs_data_sink { + bucket_name = google_storage_bucket.data_sink.name + path = "%s" + } + } + + schedule { + schedule_start_date { + year = 2018 + month = 10 + day = 1 + } + schedule_end_date { + year = 2019 + month = 10 + day = 1 + } + start_time_of_day { + hours = 0 + minutes = 30 + seconds = 0 + nanos = 0 + } + repeat_interval = "604800s" + } + + depends_on = [ + google_storage_bucket_iam_member.data_source, + google_storage_bucket_iam_member.data_sink, + ] + } + `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project, gcsPath) +} diff --git a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown index 2b7ba1125ecb..a03eafc26314 100644 --- a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown +++ b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown @@ -102,8 +102,8 @@ Description of the change and how users should adjust their configuration (if ne ## Resources -## Resource: `google_product_resource` +## Resource: `google_storage_transfer_job` -### Resource-level change example header +### `path` does not allow strings starting with / -Description of the change and how users should adjust their configuration (if needed). +`path` does not allow strings starting with / From 76823cfc08661b35d464553728fad3b60c06ee8c Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 18 Jun 2025 08:22:18 +0000 Subject: [PATCH 07/11] update --- .../storagetransfer/resource_storage_transfer_job.go.tmpl | 1 - 1 file changed, 1 deletion(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index 4dda58c8bc56..4152f032e71e 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -696,7 +696,6 @@ func gcsDataSchema() *schema.Resource { }, "path": { Optional: true, - Computed: true, Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, ValidateFunc: validatePath, From fafefc7da0e2f100a01443b9f0392d3fb8cfc171 Mon Sep 17 00:00:00 2001 From: gurusai-voleti Date: Wed, 18 Jun 2025 18:36:53 +0530 Subject: [PATCH 08/11] Update version_7_upgrade.html.markdown --- .../website/docs/guides/version_7_upgrade.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown index a03eafc26314..d29b27c92f4c 100644 --- a/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown +++ b/mmv1/third_party/terraform/website/docs/guides/version_7_upgrade.html.markdown @@ -106,4 +106,4 @@ Description of the change and how users should adjust their configuration (if ne ### `path` does not allow strings starting with / -`path` does not allow strings starting with / +`path` does not allow strings starting with /. From c52752c888d3ed371e85403755181d6afa7cd5dc Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 25 Jun 2025 15:44:19 +0000 Subject: [PATCH 09/11] review comments --- .../resource_storage_transfer_job.go.tmpl | 7 -- .../resource_storage_transfer_job_test.go | 91 ++----------------- 2 files changed, 8 insertions(+), 90 deletions(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index 4152f032e71e..b486476dd7f2 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -699,13 +699,6 @@ func gcsDataSchema() *schema.Resource { Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, ValidateFunc: validatePath, - DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - old, new = strings.TrimSpace(old), strings.TrimSpace(new) - if strings.ToLower(old) == strings.ToLower(new) { - return true - } - return false - }, }, }, } diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go index fe930f5b8f31..09647d6ff895 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go @@ -4,7 +4,6 @@ package storagetransfer_test import ( "fmt" - "regexp" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -574,14 +573,13 @@ func TestAccStorageTransferJob_hdfsSource(t *testing.T) { }) } -func TestAccStorageTransferJob_transferPathError(t *testing.T) { +func TestAccStorageTransferJob_transferUpdateToEmptyString(t *testing.T) { t.Parallel() testDataSourceBucketName := acctest.RandString(t, 10) testDataSinkName := acctest.RandString(t, 10) testTransferJobDescription := acctest.RandString(t, 10) testTransferJobName := fmt.Sprintf("tf-test-transfer-job-%s", acctest.RandString(t, 10)) - errorMessage := string('"') + "transfer_spec.0.gcs_data_sink.0.path" + string('"') + " cannot start with /" acctest.VcrTest(t, resource.TestCase{ PreCheck: func() { acctest.AccTestPreCheck(t) }, @@ -589,8 +587,13 @@ func TestAccStorageTransferJob_transferPathError(t *testing.T) { CheckDestroy: testAccStorageTransferJobDestroyProducer(t), Steps: []resource.TestStep{ { - Config: testAccStorageTransferJob_transferJobPathError(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName), - ExpectError: regexp.MustCompile(errorMessage), + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), + }, + { + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, ""), + }, + { + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), }, }, }) @@ -2423,84 +2426,6 @@ resource "google_storage_transfer_job" "transfer_job" { `, project, dataSourceBucketName, project, dataSinkBucketName, project, transferJobDescription, project) } -func testAccStorageTransferJob_transferJobPathError(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string) string { - return fmt.Sprintf(` - data "google_storage_transfer_project_service_account" "default" { - project = "%s" - } - - resource "google_storage_bucket" "data_source" { - name = "%s" - project = "%s" - location = "US" - force_destroy = true - uniform_bucket_level_access = true - } - - resource "google_storage_bucket_iam_member" "data_source" { - bucket = google_storage_bucket.data_source.name - role = "roles/storage.admin" - member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" - } - - resource "google_storage_bucket" "data_sink" { - name = "%s" - project = "%s" - location = "US" - force_destroy = true - uniform_bucket_level_access = true - } - - resource "google_storage_bucket_iam_member" "data_sink" { - bucket = google_storage_bucket.data_sink.name - role = "roles/storage.admin" - member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" - } - - resource "google_storage_transfer_job" "transfer_job" { - name = "transferJobs/%s" - description = "%s" - project = "%s" - - transfer_spec { - gcs_data_source { - bucket_name = google_storage_bucket.data_source.name - path = "foo/" - } - gcs_data_sink { - bucket_name = google_storage_bucket.data_sink.name - path = "/" - } - } - - schedule { - schedule_start_date { - year = 2018 - month = 10 - day = 1 - } - schedule_end_date { - year = 2019 - month = 10 - day = 1 - } - start_time_of_day { - hours = 0 - minutes = 30 - seconds = 0 - nanos = 0 - } - repeat_interval = "604800s" - } - - depends_on = [ - google_storage_bucket_iam_member.data_source, - google_storage_bucket_iam_member.data_sink, - ] - } - `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project) -} - func testAccStorageTransferJob_transferJobGcsPath(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string, gcsPath string) string { return fmt.Sprintf(` data "google_storage_transfer_project_service_account" "default" { From a573a8c9fa96d3862b20fbb129d642f8fc2958f5 Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 25 Jun 2025 16:55:17 +0000 Subject: [PATCH 10/11] Revert "review comments" This reverts commit 04e72e601bceb7fd653abeb3bae6426627f63c84. --- .../resource_storage_transfer_job.go.tmpl | 7 ++ .../resource_storage_transfer_job_test.go | 91 +++++++++++++++++-- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index b486476dd7f2..4152f032e71e 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -699,6 +699,13 @@ func gcsDataSchema() *schema.Resource { Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, ValidateFunc: validatePath, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + old, new = strings.TrimSpace(old), strings.TrimSpace(new) + if strings.ToLower(old) == strings.ToLower(new) { + return true + } + return false + }, }, }, } diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go index 09647d6ff895..fe930f5b8f31 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go @@ -4,6 +4,7 @@ package storagetransfer_test import ( "fmt" + "regexp" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -573,13 +574,14 @@ func TestAccStorageTransferJob_hdfsSource(t *testing.T) { }) } -func TestAccStorageTransferJob_transferUpdateToEmptyString(t *testing.T) { +func TestAccStorageTransferJob_transferPathError(t *testing.T) { t.Parallel() testDataSourceBucketName := acctest.RandString(t, 10) testDataSinkName := acctest.RandString(t, 10) testTransferJobDescription := acctest.RandString(t, 10) testTransferJobName := fmt.Sprintf("tf-test-transfer-job-%s", acctest.RandString(t, 10)) + errorMessage := string('"') + "transfer_spec.0.gcs_data_sink.0.path" + string('"') + " cannot start with /" acctest.VcrTest(t, resource.TestCase{ PreCheck: func() { acctest.AccTestPreCheck(t) }, @@ -587,13 +589,8 @@ func TestAccStorageTransferJob_transferUpdateToEmptyString(t *testing.T) { CheckDestroy: testAccStorageTransferJobDestroyProducer(t), Steps: []resource.TestStep{ { - Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), - }, - { - Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, ""), - }, - { - Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), + Config: testAccStorageTransferJob_transferJobPathError(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName), + ExpectError: regexp.MustCompile(errorMessage), }, }, }) @@ -2426,6 +2423,84 @@ resource "google_storage_transfer_job" "transfer_job" { `, project, dataSourceBucketName, project, dataSinkBucketName, project, transferJobDescription, project) } +func testAccStorageTransferJob_transferJobPathError(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string) string { + return fmt.Sprintf(` + data "google_storage_transfer_project_service_account" "default" { + project = "%s" + } + + resource "google_storage_bucket" "data_source" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_source" { + bucket = google_storage_bucket.data_source.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_bucket" "data_sink" { + name = "%s" + project = "%s" + location = "US" + force_destroy = true + uniform_bucket_level_access = true + } + + resource "google_storage_bucket_iam_member" "data_sink" { + bucket = google_storage_bucket.data_sink.name + role = "roles/storage.admin" + member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" + } + + resource "google_storage_transfer_job" "transfer_job" { + name = "transferJobs/%s" + description = "%s" + project = "%s" + + transfer_spec { + gcs_data_source { + bucket_name = google_storage_bucket.data_source.name + path = "foo/" + } + gcs_data_sink { + bucket_name = google_storage_bucket.data_sink.name + path = "/" + } + } + + schedule { + schedule_start_date { + year = 2018 + month = 10 + day = 1 + } + schedule_end_date { + year = 2019 + month = 10 + day = 1 + } + start_time_of_day { + hours = 0 + minutes = 30 + seconds = 0 + nanos = 0 + } + repeat_interval = "604800s" + } + + depends_on = [ + google_storage_bucket_iam_member.data_source, + google_storage_bucket_iam_member.data_sink, + ] + } + `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project) +} + func testAccStorageTransferJob_transferJobGcsPath(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string, gcsPath string) string { return fmt.Sprintf(` data "google_storage_transfer_project_service_account" "default" { From 72c8be4fec6b7958388e5663c21c069dda4711e5 Mon Sep 17 00:00:00 2001 From: Guru Sai Rama Subbarao Voleti Date: Wed, 25 Jun 2025 17:07:36 +0000 Subject: [PATCH 11/11] Reapply "review comments" This reverts commit 00164d27000656e2bc895572d040fa9b40383505. --- .../resource_storage_transfer_job.go.tmpl | 7 -- .../resource_storage_transfer_job_test.go | 91 ++----------------- 2 files changed, 8 insertions(+), 90 deletions(-) diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl index 4152f032e71e..b486476dd7f2 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job.go.tmpl @@ -699,13 +699,6 @@ func gcsDataSchema() *schema.Resource { Type: schema.TypeString, Description: `Google Cloud Storage path in bucket to transfer`, ValidateFunc: validatePath, - DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - old, new = strings.TrimSpace(old), strings.TrimSpace(new) - if strings.ToLower(old) == strings.ToLower(new) { - return true - } - return false - }, }, }, } diff --git a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go index fe930f5b8f31..09647d6ff895 100644 --- a/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go +++ b/mmv1/third_party/terraform/services/storagetransfer/resource_storage_transfer_job_test.go @@ -4,7 +4,6 @@ package storagetransfer_test import ( "fmt" - "regexp" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -574,14 +573,13 @@ func TestAccStorageTransferJob_hdfsSource(t *testing.T) { }) } -func TestAccStorageTransferJob_transferPathError(t *testing.T) { +func TestAccStorageTransferJob_transferUpdateToEmptyString(t *testing.T) { t.Parallel() testDataSourceBucketName := acctest.RandString(t, 10) testDataSinkName := acctest.RandString(t, 10) testTransferJobDescription := acctest.RandString(t, 10) testTransferJobName := fmt.Sprintf("tf-test-transfer-job-%s", acctest.RandString(t, 10)) - errorMessage := string('"') + "transfer_spec.0.gcs_data_sink.0.path" + string('"') + " cannot start with /" acctest.VcrTest(t, resource.TestCase{ PreCheck: func() { acctest.AccTestPreCheck(t) }, @@ -589,8 +587,13 @@ func TestAccStorageTransferJob_transferPathError(t *testing.T) { CheckDestroy: testAccStorageTransferJobDestroyProducer(t), Steps: []resource.TestStep{ { - Config: testAccStorageTransferJob_transferJobPathError(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName), - ExpectError: regexp.MustCompile(errorMessage), + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), + }, + { + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, ""), + }, + { + Config: testAccStorageTransferJob_transferJobGcsPath(envvar.GetTestProjectFromEnv(), testDataSourceBucketName, testDataSinkName, testTransferJobDescription, testTransferJobName, "bar/"), }, }, }) @@ -2423,84 +2426,6 @@ resource "google_storage_transfer_job" "transfer_job" { `, project, dataSourceBucketName, project, dataSinkBucketName, project, transferJobDescription, project) } -func testAccStorageTransferJob_transferJobPathError(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string) string { - return fmt.Sprintf(` - data "google_storage_transfer_project_service_account" "default" { - project = "%s" - } - - resource "google_storage_bucket" "data_source" { - name = "%s" - project = "%s" - location = "US" - force_destroy = true - uniform_bucket_level_access = true - } - - resource "google_storage_bucket_iam_member" "data_source" { - bucket = google_storage_bucket.data_source.name - role = "roles/storage.admin" - member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" - } - - resource "google_storage_bucket" "data_sink" { - name = "%s" - project = "%s" - location = "US" - force_destroy = true - uniform_bucket_level_access = true - } - - resource "google_storage_bucket_iam_member" "data_sink" { - bucket = google_storage_bucket.data_sink.name - role = "roles/storage.admin" - member = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}" - } - - resource "google_storage_transfer_job" "transfer_job" { - name = "transferJobs/%s" - description = "%s" - project = "%s" - - transfer_spec { - gcs_data_source { - bucket_name = google_storage_bucket.data_source.name - path = "foo/" - } - gcs_data_sink { - bucket_name = google_storage_bucket.data_sink.name - path = "/" - } - } - - schedule { - schedule_start_date { - year = 2018 - month = 10 - day = 1 - } - schedule_end_date { - year = 2019 - month = 10 - day = 1 - } - start_time_of_day { - hours = 0 - minutes = 30 - seconds = 0 - nanos = 0 - } - repeat_interval = "604800s" - } - - depends_on = [ - google_storage_bucket_iam_member.data_source, - google_storage_bucket_iam_member.data_sink, - ] - } - `, project, dataSourceBucketName, project, dataSinkBucketName, project, testTransferJobName, transferJobDescription, project) -} - func testAccStorageTransferJob_transferJobGcsPath(project string, dataSourceBucketName string, dataSinkBucketName string, transferJobDescription string, testTransferJobName string, gcsPath string) string { return fmt.Sprintf(` data "google_storage_transfer_project_service_account" "default" {