Skip to content

Commit f20185e

Browse files
Add data_source_google_site_verification_token (#10999) (#7704)
[upstream:b33d6de70b36556872c5d0d870116b057878daf2] Signed-off-by: Modular Magician <[email protected]>
1 parent 5f85165 commit f20185e

File tree

11 files changed

+376
-0
lines changed

11 files changed

+376
-0
lines changed

.changelog/10999.txt

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

google-beta/fwmodels/provider_model.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ type ProviderModel struct {
148148
ServiceManagementCustomEndpoint types.String `tfsdk:"service_management_custom_endpoint"`
149149
ServiceNetworkingCustomEndpoint types.String `tfsdk:"service_networking_custom_endpoint"`
150150
ServiceUsageCustomEndpoint types.String `tfsdk:"service_usage_custom_endpoint"`
151+
SiteVerificationCustomEndpoint types.String `tfsdk:"site_verification_custom_endpoint"`
151152
SourceRepoCustomEndpoint types.String `tfsdk:"source_repo_custom_endpoint"`
152153
SpannerCustomEndpoint types.String `tfsdk:"spanner_custom_endpoint"`
153154
SQLCustomEndpoint types.String `tfsdk:"sql_custom_endpoint"`

google-beta/fwprovider/framework_provider.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,12 @@ func (p *FrameworkProvider) Schema(_ context.Context, _ provider.SchemaRequest,
865865
transport_tpg.CustomEndpointValidator(),
866866
},
867867
},
868+
"site_verification_custom_endpoint": &schema.StringAttribute{
869+
Optional: true,
870+
Validators: []validator.String{
871+
transport_tpg.CustomEndpointValidator(),
872+
},
873+
},
868874
"source_repo_custom_endpoint": &schema.StringAttribute{
869875
Optional: true,
870876
Validators: []validator.String{

google-beta/fwtransport/framework_config.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ type FrameworkProviderConfig struct {
171171
ServiceManagementBasePath string
172172
ServiceNetworkingBasePath string
173173
ServiceUsageBasePath string
174+
SiteVerificationBasePath string
174175
SourceRepoBasePath string
175176
SpannerBasePath string
176177
SQLBasePath string
@@ -345,6 +346,7 @@ func (p *FrameworkProviderConfig) LoadAndValidateFramework(ctx context.Context,
345346
p.ServiceManagementBasePath = data.ServiceManagementCustomEndpoint.ValueString()
346347
p.ServiceNetworkingBasePath = data.ServiceNetworkingCustomEndpoint.ValueString()
347348
p.ServiceUsageBasePath = data.ServiceUsageCustomEndpoint.ValueString()
349+
p.SiteVerificationBasePath = data.SiteVerificationCustomEndpoint.ValueString()
348350
p.SourceRepoBasePath = data.SourceRepoCustomEndpoint.ValueString()
349351
p.SpannerBasePath = data.SpannerCustomEndpoint.ValueString()
350352
p.SQLBasePath = data.SQLCustomEndpoint.ValueString()
@@ -1447,6 +1449,14 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
14471449
data.ServiceUsageCustomEndpoint = types.StringValue(customEndpoint.(string))
14481450
}
14491451
}
1452+
if data.SiteVerificationCustomEndpoint.IsNull() {
1453+
customEndpoint := transport_tpg.MultiEnvDefault([]string{
1454+
"GOOGLE_SITE_VERIFICATION_CUSTOM_ENDPOINT",
1455+
}, transport_tpg.DefaultBasePaths[transport_tpg.SiteVerificationBasePathKey])
1456+
if customEndpoint != nil {
1457+
data.SiteVerificationCustomEndpoint = types.StringValue(customEndpoint.(string))
1458+
}
1459+
}
14501460
if data.SourceRepoCustomEndpoint.IsNull() {
14511461
customEndpoint := transport_tpg.MultiEnvDefault([]string{
14521462
"GOOGLE_SOURCE_REPO_CUSTOM_ENDPOINT",

google-beta/provider/provider.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,11 @@ func Provider() *schema.Provider {
744744
Optional: true,
745745
ValidateFunc: transport_tpg.ValidateCustomEndpoint,
746746
},
747+
"site_verification_custom_endpoint": {
748+
Type: schema.TypeString,
749+
Optional: true,
750+
ValidateFunc: transport_tpg.ValidateCustomEndpoint,
751+
},
747752
"source_repo_custom_endpoint": {
748753
Type: schema.TypeString,
749754
Optional: true,
@@ -1132,6 +1137,7 @@ func ProviderConfigure(ctx context.Context, d *schema.ResourceData, p *schema.Pr
11321137
config.ServiceManagementBasePath = d.Get("service_management_custom_endpoint").(string)
11331138
config.ServiceNetworkingBasePath = d.Get("service_networking_custom_endpoint").(string)
11341139
config.ServiceUsageBasePath = d.Get("service_usage_custom_endpoint").(string)
1140+
config.SiteVerificationBasePath = d.Get("site_verification_custom_endpoint").(string)
11351141
config.SourceRepoBasePath = d.Get("source_repo_custom_endpoint").(string)
11361142
config.SpannerBasePath = d.Get("spanner_custom_endpoint").(string)
11371143
config.SQLBasePath = d.Get("sql_custom_endpoint").(string)

google-beta/provider/provider_mmv1_resources.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ import (
125125
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/servicemanagement"
126126
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/servicenetworking"
127127
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/serviceusage"
128+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/siteverification"
128129
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/sourcerepo"
129130
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/spanner"
130131
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/sql"
@@ -301,6 +302,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
301302
"google_service_account_id_token": resourcemanager.DataSourceGoogleServiceAccountIdToken(),
302303
"google_service_account_jwt": resourcemanager.DataSourceGoogleServiceAccountJwt(),
303304
"google_service_account_key": resourcemanager.DataSourceGoogleServiceAccountKey(),
305+
"google_site_verification_token": siteverification.DataSourceSiteVerificationToken(),
304306
"google_sourcerepo_repository": sourcerepo.DataSourceGoogleSourceRepoRepository(),
305307
"google_spanner_instance": spanner.DataSourceSpannerInstance(),
306308
"google_sql_ca_certs": sql.DataSourceGoogleSQLCaCerts(),
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
// Copyright (c) HashiCorp, Inc.
4+
// SPDX-License-Identifier: MPL-2.0
5+
package siteverification
6+
7+
import (
8+
"fmt"
9+
"log"
10+
"net/http"
11+
"reflect"
12+
"regexp"
13+
"time"
14+
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
16+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
17+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
18+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/verify"
19+
)
20+
21+
func DataSourceSiteVerificationToken() *schema.Resource {
22+
return &schema.Resource{
23+
Read: dataSourceSiteVerificationTokenRead,
24+
25+
Timeouts: &schema.ResourceTimeout{
26+
Read: schema.DefaultTimeout(5 * time.Minute),
27+
},
28+
29+
Schema: map[string]*schema.Schema{
30+
"identifier": {
31+
Type: schema.TypeString,
32+
Required: true,
33+
ForceNew: true,
34+
Description: `The site identifier. If the type is set to SITE, the identifier is a URL. If the type is
35+
set to INET_DOMAIN, the identifier is a domain name.`,
36+
},
37+
"type": {
38+
Type: schema.TypeString,
39+
Required: true,
40+
ForceNew: true,
41+
ValidateFunc: verify.ValidateEnum([]string{"INET_DOMAIN", "SITE"}),
42+
Description: `The type of resource to be verified, either a domain or a web site. Possible values: ["INET_DOMAIN", "SITE"]`,
43+
},
44+
"verification_method": {
45+
Type: schema.TypeString,
46+
Required: true,
47+
ForceNew: true,
48+
ValidateFunc: verify.ValidateEnum([]string{"ANALYTICS", "DNS_CNAME", "DNS_TXT", "FILE", "META", "TAG_MANAGER"}),
49+
Description: `The verification method for the Site Verification system to use to verify
50+
this site or domain. Possible values: ["ANALYTICS", "DNS_CNAME", "DNS_TXT", "FILE", "META", "TAG_MANAGER"]`,
51+
},
52+
"token": {
53+
Type: schema.TypeString,
54+
Computed: true,
55+
Description: `The returned token for use in subsequent verification steps.`,
56+
},
57+
},
58+
UseJSONNumber: true,
59+
}
60+
}
61+
62+
func dataSourceSiteVerificationTokenRead(d *schema.ResourceData, meta interface{}) error {
63+
config := meta.(*transport_tpg.Config)
64+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
65+
if err != nil {
66+
return err
67+
}
68+
69+
obj := make(map[string]interface{})
70+
site := make(map[string]interface{})
71+
typeProp, err := expandSiteVerificationTokenType(d.Get("type"), d, config)
72+
if err != nil {
73+
return err
74+
} else if v, ok := d.GetOkExists("type"); !tpgresource.IsEmptyValue(reflect.ValueOf(typeProp)) && (ok || !reflect.DeepEqual(v, typeProp)) {
75+
site["type"] = typeProp
76+
}
77+
identifierProp, err := expandSiteVerificationTokenIdentifier(d.Get("identifier"), d, config)
78+
if err != nil {
79+
return err
80+
} else if v, ok := d.GetOkExists("identifier"); !tpgresource.IsEmptyValue(reflect.ValueOf(identifierProp)) && (ok || !reflect.DeepEqual(v, identifierProp)) {
81+
site["identifier"] = identifierProp
82+
}
83+
obj["site"] = site
84+
verification_methodProp, err := expandSiteVerificationTokenVerificationMethod(d.Get("verification_method"), d, config)
85+
if err != nil {
86+
return err
87+
} else if v, ok := d.GetOkExists("verification_method"); !tpgresource.IsEmptyValue(reflect.ValueOf(verification_methodProp)) && (ok || !reflect.DeepEqual(v, verification_methodProp)) {
88+
obj["verificationMethod"] = verification_methodProp
89+
}
90+
91+
url, err := tpgresource.ReplaceVars(d, config, "{{SiteVerificationBasePath}}token")
92+
if err != nil {
93+
return err
94+
}
95+
96+
log.Printf("[DEBUG] Reading Token: %#v", obj)
97+
billingProject := ""
98+
99+
if parts := regexp.MustCompile(`projects\/([^\/]+)\/`).FindStringSubmatch(url); parts != nil {
100+
billingProject = parts[1]
101+
}
102+
103+
// err == nil indicates that the billing_project value was found
104+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
105+
billingProject = bp
106+
}
107+
108+
headers := make(http.Header)
109+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
110+
Config: config,
111+
Method: "POST",
112+
Project: billingProject,
113+
RawURL: url,
114+
UserAgent: userAgent,
115+
Body: obj,
116+
Timeout: d.Timeout(schema.TimeoutCreate),
117+
Headers: headers,
118+
})
119+
if err != nil {
120+
return fmt.Errorf("Error reading Token: %s", err)
121+
}
122+
123+
// Store the ID now
124+
id, err := tpgresource.ReplaceVars(d, config, "{{identifier}}")
125+
if err != nil {
126+
return fmt.Errorf("Error constructing id: %s", err)
127+
}
128+
d.SetId(id)
129+
130+
if token, ok := res["token"].(string); ok {
131+
d.Set("token", token)
132+
}
133+
134+
log.Printf("[DEBUG] Finished reading Token %q: %#v", d.Id(), res)
135+
136+
return nil
137+
}
138+
139+
func expandSiteVerificationTokenType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
140+
return v, nil
141+
}
142+
143+
func expandSiteVerificationTokenIdentifier(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
144+
return v, nil
145+
}
146+
147+
func expandSiteVerificationTokenVerificationMethod(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
148+
return v, nil
149+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
// Copyright (c) HashiCorp, Inc.
4+
// SPDX-License-Identifier: MPL-2.0
5+
package siteverification_test
6+
7+
import (
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
12+
)
13+
14+
func TestAccSiteVerificationToken_siteverificationTokenSite(t *testing.T) {
15+
t.Parallel()
16+
17+
context := map[string]interface{}{
18+
"site": "https://www.example.com",
19+
}
20+
21+
acctest.VcrTest(t, resource.TestCase{
22+
PreCheck: func() { acctest.AccTestPreCheck(t) },
23+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccSiteVerificationToken_siteverificationTokenSite(context),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttrSet("data.google_site_verification_token.site_meta", "token"),
29+
resource.TestCheckResourceAttr("data.google_site_verification_token.site_meta", "type", "SITE"),
30+
resource.TestCheckResourceAttr("data.google_site_verification_token.site_meta", "identifier", context["site"].(string)),
31+
resource.TestCheckResourceAttr("data.google_site_verification_token.site_meta", "verification_method", "META"),
32+
),
33+
},
34+
},
35+
})
36+
}
37+
38+
func testAccSiteVerificationToken_siteverificationTokenSite(context map[string]interface{}) string {
39+
return acctest.Nprintf(`
40+
provider "google" {
41+
alias = "scoped"
42+
user_project_override = true
43+
scopes = [
44+
"https://www.googleapis.com/auth/siteverification",
45+
"https://www.googleapis.com/auth/cloud-platform",
46+
"https://www.googleapis.com/auth/userinfo.email",
47+
]
48+
}
49+
50+
data "google_site_verification_token" "site_meta" {
51+
provider = google.scoped
52+
type = "SITE"
53+
identifier = "%{site}"
54+
verification_method = "META"
55+
}
56+
`, context)
57+
}
58+
59+
func TestAccSiteVerificationToken_siteverificationTokenDomain(t *testing.T) {
60+
t.Parallel()
61+
62+
context := map[string]interface{}{
63+
"domain": "www.example.com",
64+
}
65+
66+
acctest.VcrTest(t, resource.TestCase{
67+
PreCheck: func() { acctest.AccTestPreCheck(t) },
68+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
69+
ExternalProviders: map[string]resource.ExternalProvider{
70+
"time": {},
71+
},
72+
Steps: []resource.TestStep{
73+
{
74+
Config: testAccSiteVerificationToken_siteverificationTokenDomain(context),
75+
Check: resource.ComposeTestCheckFunc(
76+
resource.TestCheckResourceAttrSet("data.google_site_verification_token.dns_text", "token"),
77+
resource.TestCheckResourceAttr("data.google_site_verification_token.dns_text", "type", "INET_DOMAIN"),
78+
resource.TestCheckResourceAttr("data.google_site_verification_token.dns_text", "identifier", context["domain"].(string)),
79+
resource.TestCheckResourceAttr("data.google_site_verification_token.dns_text", "verification_method", "DNS_TXT"),
80+
),
81+
},
82+
},
83+
})
84+
}
85+
86+
func testAccSiteVerificationToken_siteverificationTokenDomain(context map[string]interface{}) string {
87+
return acctest.Nprintf(`
88+
provider "google" {
89+
alias = "scoped"
90+
user_project_override = true
91+
scopes = [
92+
"https://www.googleapis.com/auth/siteverification",
93+
"https://www.googleapis.com/auth/cloud-platform",
94+
"https://www.googleapis.com/auth/userinfo.email",
95+
]
96+
}
97+
98+
data "google_site_verification_token" "dns_text" {
99+
provider = google.scoped
100+
type = "INET_DOMAIN"
101+
identifier = "%{domain}"
102+
verification_method = "DNS_TXT"
103+
}
104+
`, context)
105+
}

google-beta/sweeper/gcp_sweeper_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ import (
127127
_ "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/servicemanagement"
128128
_ "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/servicenetworking"
129129
_ "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/serviceusage"
130+
_ "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/siteverification"
130131
_ "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/sourcerepo"
131132
_ "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/spanner"
132133
_ "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/sql"

0 commit comments

Comments
 (0)