From e4e1fc69f52f0e1256b6fab9b475d422cba725c5 Mon Sep 17 00:00:00 2001 From: The Magician Date: Thu, 20 Oct 2022 10:05:14 -0700 Subject: [PATCH] project_id validated in datasource (#6691) (#12846) Signed-off-by: Modular Magician Signed-off-by: Modular Magician --- .changelog/6691.txt | 3 +++ google/data_source_google_project.go | 1 + google/validation.go | 14 ++++++++++++++ google/validation_test.go | 23 +++++++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 .changelog/6691.txt diff --git a/.changelog/6691.txt b/.changelog/6691.txt new file mode 100644 index 0000000000..df72c9ebea --- /dev/null +++ b/.changelog/6691.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +cloudplatform: Validated `project_id` for `google_project` data-source +``` diff --git a/google/data_source_google_project.go b/google/data_source_google_project.go index 49ad537f61..80c328355d 100644 --- a/google/data_source_google_project.go +++ b/google/data_source_google_project.go @@ -12,6 +12,7 @@ func dataSourceGoogleProject() *schema.Resource { addOptionalFieldsToSchema(dsSchema, "project_id") + dsSchema["project_id"].ValidateFunc = validateDSProjectID() return &schema.Resource{ Read: datasourceGoogleProjectRead, Schema: dsSchema, diff --git a/google/validation.go b/google/validation.go index 4b70a2e7d6..a19a11915c 100644 --- a/google/validation.go +++ b/google/validation.go @@ -212,6 +212,20 @@ func validateProjectID() schema.SchemaValidateFunc { } } +func validateDSProjectID() schema.SchemaValidateFunc { + return func(v interface{}, k string) (ws []string, errors []error) { + value := v.(string) + ids := strings.Split(value, "/") + value = ids[len(ids)-1] + + if !regexp.MustCompile("^" + ProjectRegex + "$").MatchString(value) { + errors = append(errors, fmt.Errorf( + "%q project_id must be 6 to 30 with lowercase letters, digits, hyphens and start with a letter. Trailing hyphens are prohibited.", value)) + } + return + } +} + func validateProjectName() schema.SchemaValidateFunc { return func(v interface{}, k string) (ws []string, errors []error) { value := v.(string) diff --git a/google/validation_test.go b/google/validation_test.go index 46f9a03579..bfae089ce9 100644 --- a/google/validation_test.go +++ b/google/validation_test.go @@ -271,6 +271,29 @@ func TestValidateProjectID(t *testing.T) { } } +func TestValidateDSProjectID(t *testing.T) { + x := []StringValidationTestCase{ + // No errors + {TestName: "basic", Value: "foobar"}, + {TestName: "with numbers", Value: "foobar123"}, + {TestName: "short", Value: "foofoo"}, + {TestName: "long", Value: "foobarfoobarfoobarfoobarfoobar"}, + {TestName: "has projects", Value: "projects/foo-bar"}, + {TestName: "has multiple projects", Value: "projects/projects/foobar"}, + {TestName: "has a hyphen", Value: "foo-bar"}, + + // With errors + {TestName: "empty", Value: "", ExpectError: true}, + {TestName: "has an uppercase letter", Value: "foo-Bar", ExpectError: true}, + {TestName: "has a final hyphen", Value: "foo-bar-", ExpectError: true}, + } + + es := testStringValidationCases(x, validateDSProjectID()) + if len(es) > 0 { + t.Errorf("Failed to validate project ID's: %v", es) + } +} + func TestValidateProjectName(t *testing.T) { x := []StringValidationTestCase{ // No errors