Skip to content

Commit f3b1479

Browse files
authored
feat: cdn support verifier (#1213)
1 parent 9c2d9b9 commit f3b1479

File tree

11 files changed

+3419
-1082
lines changed

11 files changed

+3419
-1082
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ require (
2727
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.409
2828
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.199
2929
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.409
30-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.425
30+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.466
3131
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.199
3232
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ckafka v1.0.403
3333
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.445

go.sum

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.199 h1:MkIdFgE
462462
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.199/go.mod h1:PTp058qpOV//RukBVdYQT962rZg71lIt6eHLK1zdvEc=
463463
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.409 h1:fKFSxvMzS8T+z2z2qm67dgTClnkryeVTykclVkHh3qE=
464464
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.409/go.mod h1:q89YBv3T1bzENpcovtwnjxfVn9vx9pCYAssp0HPuivU=
465-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.425 h1:Oarla/dwb+hB0Caz4z3MMRRgVwconi/kV7qCbRk86bg=
466-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.425/go.mod h1:ZIoqtsL6fBOUBIsUKPgbu3tbpKGd0GJ3boKlNwpRjpE=
465+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.466 h1:64xA7zyG0jrtBE63cqjALXiRRzAQIE719kZUsp79018=
466+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.466/go.mod h1:mESUvfIm3Ze/Ov8C45E3yh2EtjudAxvprGaxNjWUliA=
467467
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.199 h1:VyOKZOlgTXW0szboWhI1N35khPsaHE4CyH9pf42o7P8=
468468
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.199/go.mod h1:9ldm0D1ToaztnlD2bFC5yjMMqvQfVeAMhvcoCCVnZb8=
469469
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ckafka v1.0.403 h1:rD9H4dQkULnRpq1BiD2KuDKsd9VEKHun2gMT+V6DNOE=
@@ -488,12 +488,10 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.409/go.mod
488488
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.412/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
489489
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.413/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
490490
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.414/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
491-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.425/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
492491
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.438/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
493492
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.443/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
494493
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.445/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
495-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.470 h1:mzWxkpEvDr3QaxLuSJMsKMFXitiQh5k2vVyLrf9nVcM=
496-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.470/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
494+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.466/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
497495
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.472 h1:kQxDatbhm8AbZebhnP7xgBBsXHqt3WfGfIPxE9Qmdmk=
498496
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.472/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
499497
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445 h1:Bh7XD0ypNMHYyBOM8hhKsSu+y0VVKUnJVS+YKKhfpGg=
@@ -547,8 +545,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.267 h1:Aqnh1ed
547545
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.267/go.mod h1:SEUO10oGtg+4AGCfpJDn9ynf47P+ZiyvhzOyXLt0mOY=
548546
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.268 h1:ez5lvKQVWGQV90BV3m9SeFODaoDbrtkMzw2S0DRMncA=
549547
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.268/go.mod h1:fchXZhmqaYaG2c4wTCBTdnW6TFAtxl3D/P/yuuuLMfA=
550-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.470 h1:BKhlhypbdycSXlt1WxJ67SFjMFqhPwYUIeQIVDpM+uw=
551-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.470/go.mod h1:PWJnwsvanCABRxRdw2mnuGbM5WkSqZtxU2fSucp0ZLU=
552548
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.472 h1:9Jzrgx78+5XnZ8myNYjCYZn5ZF+tbSIpF6KWGgWr0uY=
553549
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.472/go.mod h1:ayIL2FNqk7HH5fPQrkWtYjgU4jL7if63f7x+yRwb4a0=
554550
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke v1.0.438 h1:pVN2u4lXOaz+A79IeBPnyDYwW3Z2unCi6rxCW2O7LPo=
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
/*
2+
Provides a resource to check or create a cdn Domain Verify Record
3+
4+
~> **NOTE:**
5+
6+
Example Usage
7+
8+
```hcl
9+
data "tencentcloud_cdn_domain_verifier" "vr" {
10+
domain = "www.examplexxx123.com"
11+
auto_verify = true # auto create record if not verified
12+
freeze_record = true # once been freeze and verified, it will never be changed again
13+
}
14+
15+
locals {
16+
recordValue = data.tencentcloud_cdn_domain_verifier.record
17+
recordType = data.tencentcloud_cdn_domain_verifier.record_type
18+
}
19+
```
20+
*/
21+
package tencentcloud
22+
23+
import (
24+
"context"
25+
"log"
26+
27+
"github.com/hashicorp/go-multierror"
28+
sdkError "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
29+
30+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
31+
cdn "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn/v20180606"
32+
)
33+
34+
func dataSourceTencentCloudCdnDomainVerifyRecord() *schema.Resource {
35+
return &schema.Resource{
36+
Read: resourceTencentCloudCdnDomainVerifyRecordRead,
37+
Schema: map[string]*schema.Schema{
38+
"domain": {
39+
Type: schema.TypeString,
40+
Required: true,
41+
Description: "Specify domain name, e.g. `www.examplexxx123.com`.",
42+
},
43+
"verify_type": {
44+
Type: schema.TypeString,
45+
Optional: true,
46+
Description: "Specify verify type, values: `dns` (default), `file`.",
47+
},
48+
"auto_verify": {
49+
Type: schema.TypeBool,
50+
Optional: true,
51+
Description: "Specify whether to keep first create result instead of re-create again.",
52+
},
53+
"freeze_record": {
54+
Type: schema.TypeBool,
55+
Optional: true,
56+
Description: "Specify whether the verification record needs to be freeze instead of refresh every 8 hours, this used for domain verification.",
57+
},
58+
"verify_result": {
59+
Type: schema.TypeBool,
60+
Computed: true,
61+
Description: "Verify result.",
62+
},
63+
"failed_reason": {
64+
Type: schema.TypeString,
65+
Optional: true,
66+
Description: "Indicates failed reason of verification.",
67+
},
68+
"sub_domain": {
69+
Type: schema.TypeString,
70+
Computed: true,
71+
Description: "Sub-domain resolution.",
72+
},
73+
"record": {
74+
Type: schema.TypeString,
75+
Computed: true,
76+
Description: "Resolution record value.",
77+
},
78+
"record_type": {
79+
Type: schema.TypeString,
80+
Computed: true,
81+
Description: "Type of resolution.",
82+
},
83+
"file_verify_url": {
84+
Type: schema.TypeString,
85+
Computed: true,
86+
Description: "File verify URL guidance.",
87+
},
88+
"file_verify_domains": {
89+
Type: schema.TypeList,
90+
Computed: true,
91+
Description: "List of file verified domains.",
92+
Elem: &schema.Schema{Type: schema.TypeString},
93+
},
94+
"file_verify_name": {
95+
Type: schema.TypeString,
96+
Computed: true,
97+
Description: "Name of file verifications.",
98+
},
99+
"result_output_file": {
100+
Type: schema.TypeString,
101+
Optional: true,
102+
Description: "Used for save result json.",
103+
},
104+
},
105+
}
106+
}
107+
108+
func resourceTencentCloudCdnDomainVerifyRecordRead(d *schema.ResourceData, meta interface{}) error {
109+
defer logElapsed("resource.tencentcloud_cdn_domain_verifier.read")()
110+
defer inconsistentCheck(d, meta)()
111+
112+
logId := getLogId(contextNil)
113+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
114+
115+
service := CdnService{client: meta.(*TencentCloudClient).apiV3Conn}
116+
117+
domainName := d.Get("domain").(string)
118+
freezeRecord := d.Get("freeze_record").(bool)
119+
autoVerify := d.Get("auto_verify").(bool)
120+
121+
verified, err := service.VerifyDomainRecord(ctx, domainName)
122+
123+
if err != nil {
124+
canContinue, reason := checkCdnDomainVerifyErrReason(err)
125+
if !canContinue {
126+
d.SetId("")
127+
return err
128+
}
129+
_ = d.Set("failed_reason", reason)
130+
}
131+
132+
_ = d.Set("verify_result", verified)
133+
d.SetId(domainName)
134+
135+
if !autoVerify || (verified && freezeRecord) {
136+
return nil
137+
}
138+
response, err := service.CreateVerifyRecord(ctx, domainName)
139+
140+
if err != nil {
141+
return err
142+
}
143+
144+
var errResults *multierror.Error
145+
146+
errResults = multierror.Append(errResults, d.Set("record", response.Record))
147+
errResults = multierror.Append(errResults, d.Set("record_type", response.RecordType))
148+
errResults = multierror.Append(errResults, d.Set("sub_domain", response.SubDomain))
149+
if len(response.FileVerifyDomains) > 0 {
150+
errResults = multierror.Append(errResults, d.Set("file_verify_domains", response.FileVerifyDomains))
151+
}
152+
errResults = multierror.Append(errResults, d.Set("file_verify_name", response.FileVerifyName))
153+
errResults = multierror.Append(errResults, d.Set("file_verify_url", response.FileVerifyUrl))
154+
155+
if e := errResults.ErrorOrNil(); e != nil {
156+
return e
157+
}
158+
159+
if err != nil {
160+
return err
161+
}
162+
163+
if output, ok := d.GetOk("result_output_file"); ok && output.(string) != "" {
164+
result := map[string]interface{}{
165+
"verify_result": verified,
166+
"failed_reason": d.Get("failed_reason"),
167+
"sub_domain": response.SubDomain,
168+
"record": response.Record,
169+
"record_type": response.RecordType,
170+
"file_verify_url": response.FileVerifyUrl,
171+
"file_verify_domains": response.FileVerifyDomains,
172+
"file_verify_name": response.FileVerifyName,
173+
}
174+
if err := writeToFile(output.(string), result); err != nil {
175+
log.Printf("[CRITAL]%s output file[%s] fail, reason[%v]",
176+
logId, output.(string), err)
177+
return err
178+
}
179+
}
180+
181+
return nil
182+
}
183+
184+
func checkCdnDomainVerifyErrReason(err error) (canContinue bool, code string) {
185+
sdkErr, ok := err.(*sdkError.TencentCloudSDKError)
186+
if !ok {
187+
return
188+
}
189+
errCode := sdkErr.Code
190+
if errCode == cdn.UNAUTHORIZEDOPERATION_CDNDOMAINRECORDNOTVERIFIED ||
191+
errCode == cdn.UNAUTHORIZEDOPERATION_CDNTXTRECORDVALUENOTMATCH {
192+
canContinue = true
193+
code = errCode
194+
}
195+
return
196+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudCdnDomainVerifyRecord_basic(t *testing.T) {
10+
t.Parallel()
11+
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY) },
14+
Providers: testAccProviders,
15+
Steps: []resource.TestStep{
16+
{
17+
Config: testAccCdnDomainVerifyRecord,
18+
Check: resource.ComposeTestCheckFunc(
19+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "id"),
20+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "verify_result"),
21+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "file_verify_domains.#"),
22+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "file_verify_name"),
23+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "file_verify_url"),
24+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "record"),
25+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "record_type"),
26+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "sub_domain"),
27+
resource.TestCheckResourceAttrSet("data.tencentcloud_cdn_domain_verifier.vr", "verify_result"),
28+
),
29+
},
30+
},
31+
})
32+
}
33+
34+
const testAccCdnDomainVerifyRecord = testAccDomainsDataSourceBasic + `
35+
resource "tencentcloud_dnspod_record" "demo" {
36+
domain = local.domain1
37+
record_type = "A"
38+
record_line = "默认"
39+
value = "1.2.3.9"
40+
sub_domain="test"
41+
}
42+
43+
data "tencentcloud_cdn_domain_verifier" "vr" {
44+
# test.xxxxxx.xxx
45+
domain = "${tencentcloud_dnspod_record.demo.sub_domain}.${local.domain1}"
46+
auto_verify = true
47+
}
48+
`

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ Auto Scaling(AS)
127127
Content Delivery Network(CDN)
128128
Data Source
129129
tencentcloud_cdn_domains
130+
tencentcloud_cdn_domain_verifier
130131
131132
Resource
132133
tencentcloud_cdn_domain
@@ -875,6 +876,7 @@ func Provider() terraform.ResourceProvider {
875876
"tencentcloud_cam_saml_providers": dataSourceTencentCloudCamSAMLProviders(),
876877
"tencentcloud_user_info": datasourceTencentCloudUserInfo(),
877878
"tencentcloud_cdn_domains": dataSourceTencentCloudCdnDomains(),
879+
"tencentcloud_cdn_domain_verifier": dataSourceTencentCloudCdnDomainVerifyRecord(),
878880
"tencentcloud_scf_functions": dataSourceTencentCloudScfFunctions(),
879881
"tencentcloud_scf_namespaces": dataSourceTencentCloudScfNamespaces(),
880882
"tencentcloud_scf_logs": dataSourceTencentCloudScfLogs(),

tencentcloud/service_tencentcloud_cdn.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,6 @@ func (me *CdnService) VerifyDomainRecord(ctx context.Context, domain string) (re
172172
response, err := me.client.UseCdnClient().VerifyDomainRecord(request)
173173

174174
if err != nil {
175-
errRet = err
176175
return
177176
}
178177

@@ -186,7 +185,7 @@ func (me *CdnService) VerifyDomainRecord(ctx context.Context, domain string) (re
186185
return
187186
}
188187

189-
func (me *CdnService) CreateVerifyRecord(ctx context.Context, domain string) (resp *CdnVerifyRecordResponse, errRet error) {
188+
func (me *CdnService) CreateVerifyRecord(ctx context.Context, domain string) (resp *cdn.CreateVerifyRecordResponseParams, errRet error) {
190189
logId := getLogId(ctx)
191190
request := cdn.NewCreateVerifyRecordRequest()
192191
defer func() {
@@ -206,14 +205,7 @@ func (me *CdnService) CreateVerifyRecord(ctx context.Context, domain string) (re
206205
return
207206
}
208207

209-
if r := response.Response; r != nil {
210-
resp = &CdnVerifyRecordResponse{
211-
Record: r.Record,
212-
RecordType: r.RecordType,
213-
SubDomain: r.SubDomain,
214-
RequestId: r.RequestId,
215-
}
216-
}
208+
resp = response.Response
217209

218210
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
219211
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())

0 commit comments

Comments
 (0)