Skip to content

Commit f98c188

Browse files
tongyimingmikatongandrew-tx
authored
support customer header (#2378)
* support customer header * add changelog --------- Co-authored-by: mikatong <mikatong@tencent.com> Co-authored-by: andrewjiang <104899514+andrew-tx@users.noreply.github.com>
1 parent a464e1e commit f98c188

15 files changed

+601
-37
lines changed

.changelog/2378.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:new-resource
2+
tencentcloud_gaap_custom_header
3+
```
4+
5+
```release-note:enhancement
6+
resource/tencentcloud_gaap_global_domain: Support param status
7+
```
8+
9+
```release-note:enhancement
10+
resource/tencentcloud_gaap_http_domain: Support update param domain
11+
```

tencentcloud/extension_gaap.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ const (
3636
GAAP_SERVER_NAME_INDICATION_SWITCH_ON = "ON"
3737
GAAP_SERVER_NAME_INDICATION_SWITCH_OFF = "OFF"
3838

39-
NETWORK_TYPE_NORMAL = "normal"
40-
NETWORK_TYPE_CN2 = "cn2"
41-
NETWORK_TYPE_TRIPLE = "triple"
39+
NETWORK_TYPE_NORMAL = "normal"
40+
NETWORK_TYPE_CN2 = "cn2"
41+
NETWORK_TYPE_TRIPLE = "triple"
42+
GLOBAL_DOMAIN_STATUS_OPEN = "open"
43+
GLOBAL_DOMAIN_STATUS_CLOSE = "close"
4244
)
4345

4446
var (
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Provides a resource to create a gaap custom_header
2+
3+
Example Usage
4+
5+
```hcl
6+
resource "tencentcloud_gaap_custom_header" "custom_header" {
7+
rule_id = "rule-xxxxxx"
8+
headers {
9+
header_name = "HeaderName1"
10+
header_value = "HeaderValue1"
11+
}
12+
headers {
13+
header_name = "HeaderName2"
14+
header_value = "HeaderValue2"
15+
}
16+
}
17+
```
18+
19+
Import
20+
21+
gaap custom_header can be imported using the id, e.g.
22+
23+
```
24+
terraform import tencentcloud_gaap_custom_header.custom_header ruleId
25+
```

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,6 +1120,7 @@ func Provider() *schema.Provider {
11201120
"tencentcloud_gaap_domain_error_page": resourceTencentCloudGaapDomainErrorPageInfo(),
11211121
"tencentcloud_gaap_global_domain_dns": resourceTencentCloudGaapGlobalDomainDns(),
11221122
"tencentcloud_gaap_global_domain": resourceTencentCloudGaapGlobalDomain(),
1123+
"tencentcloud_gaap_custom_header": resourceTencentCloudGaapCustomHeader(),
11231124
"tencentcloud_gaap_proxy_group": resourceTencentCloudGaapProxyGroup(),
11241125
"tencentcloud_ssl_certificate": resourceTencentCloudSslCertificate(),
11251126
"tencentcloud_ssl_pay_certificate": resourceTencentCloudSSLInstance(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ Global Application Acceleration(GAAP)
623623
tencentcloud_gaap_domain_error_page
624624
tencentcloud_gaap_global_domain_dns
625625
tencentcloud_gaap_global_domain
626+
tencentcloud_gaap_custom_header
626627

627628
Key Management Service(KMS)
628629
Data Source
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
gaap "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap/v20180529"
11+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
12+
)
13+
14+
func resourceTencentCloudGaapCustomHeader() *schema.Resource {
15+
return &schema.Resource{
16+
Create: resourceTencentCloudGaapCustomHeaderCreate,
17+
Read: resourceTencentCloudGaapCustomHeaderRead,
18+
Update: resourceTencentCloudGaapCustomHeaderUpdate,
19+
Delete: resourceTencentCloudGaapCustomHeaderDelete,
20+
Importer: &schema.ResourceImporter{
21+
State: schema.ImportStatePassthrough,
22+
},
23+
Schema: map[string]*schema.Schema{
24+
"rule_id": {
25+
Required: true,
26+
Type: schema.TypeString,
27+
Description: "Rule id.",
28+
},
29+
30+
"headers": {
31+
Optional: true,
32+
Type: schema.TypeList,
33+
Description: "Headers.",
34+
Elem: &schema.Resource{
35+
Schema: map[string]*schema.Schema{
36+
"header_name": {
37+
Type: schema.TypeString,
38+
Required: true,
39+
Description: "Header name.",
40+
},
41+
"header_value": {
42+
Type: schema.TypeString,
43+
Required: true,
44+
Description: "Header value.",
45+
},
46+
},
47+
},
48+
},
49+
},
50+
}
51+
}
52+
53+
func resourceTencentCloudGaapCustomHeaderCreate(d *schema.ResourceData, meta interface{}) error {
54+
defer logElapsed("resource.tencentcloud_gaap_custom_header.create")()
55+
defer inconsistentCheck(d, meta)()
56+
57+
logId := getLogId(contextNil)
58+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
59+
60+
var ruleId string
61+
if v, ok := d.GetOk("rule_id"); ok {
62+
ruleId = v.(string)
63+
}
64+
headers := make([]*gaap.HttpHeaderParam, 0)
65+
if v, ok := d.GetOk("headers"); ok {
66+
for _, item := range v.([]interface{}) {
67+
dMap := item.(map[string]interface{})
68+
httpHeaderParam := &gaap.HttpHeaderParam{}
69+
if v, ok := dMap["header_name"]; ok {
70+
httpHeaderParam.HeaderName = helper.String(v.(string))
71+
}
72+
if v, ok := dMap["header_value"]; ok {
73+
httpHeaderParam.HeaderValue = helper.String(v.(string))
74+
}
75+
headers = append(headers, httpHeaderParam)
76+
}
77+
}
78+
79+
service := GaapService{client: meta.(*TencentCloudClient).apiV3Conn}
80+
81+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
82+
e := service.CreateCustomHeader(ctx, ruleId, headers)
83+
if e != nil {
84+
return retryError(e)
85+
}
86+
return nil
87+
})
88+
if err != nil {
89+
log.Printf("[CRITAL]%s create gaap customHeader failed, reason:%+v", logId, err)
90+
return err
91+
}
92+
93+
d.SetId(ruleId)
94+
95+
return resourceTencentCloudGaapCustomHeaderRead(d, meta)
96+
}
97+
98+
func resourceTencentCloudGaapCustomHeaderRead(d *schema.ResourceData, meta interface{}) error {
99+
defer logElapsed("resource.tencentcloud_gaap_custom_header.read")()
100+
defer inconsistentCheck(d, meta)()
101+
102+
logId := getLogId(contextNil)
103+
104+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
105+
106+
service := GaapService{client: meta.(*TencentCloudClient).apiV3Conn}
107+
108+
ruleId := d.Id()
109+
headers, err := service.DescribeGaapCustomHeader(ctx, ruleId)
110+
if err != nil {
111+
return err
112+
}
113+
114+
_ = d.Set("rule_id", ruleId)
115+
116+
headersList := []interface{}{}
117+
for _, header := range headers {
118+
headersMap := map[string]interface{}{}
119+
120+
if header.HeaderName != nil {
121+
headersMap["header_name"] = header.HeaderName
122+
}
123+
124+
if header.HeaderValue != nil {
125+
headersMap["header_value"] = header.HeaderValue
126+
}
127+
128+
headersList = append(headersList, headersMap)
129+
}
130+
131+
_ = d.Set("headers", headersList)
132+
133+
return nil
134+
}
135+
136+
func resourceTencentCloudGaapCustomHeaderUpdate(d *schema.ResourceData, meta interface{}) error {
137+
defer logElapsed("resource.tencentcloud_gaap_custom_header.update")()
138+
defer inconsistentCheck(d, meta)()
139+
140+
logId := getLogId(contextNil)
141+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
142+
143+
ruleId := d.Id()
144+
145+
immutableArgs := []string{"rule_id"}
146+
147+
for _, v := range immutableArgs {
148+
if d.HasChange(v) {
149+
return fmt.Errorf("argument `%s` cannot be changed", v)
150+
}
151+
}
152+
153+
if d.HasChange("headers") {
154+
headers := make([]*gaap.HttpHeaderParam, 0)
155+
if v, ok := d.GetOk("headers"); ok {
156+
for _, item := range v.([]interface{}) {
157+
dMap := item.(map[string]interface{})
158+
httpHeaderParam := &gaap.HttpHeaderParam{}
159+
if v, ok := dMap["header_name"]; ok {
160+
httpHeaderParam.HeaderName = helper.String(v.(string))
161+
}
162+
if v, ok := dMap["header_value"]; ok {
163+
httpHeaderParam.HeaderValue = helper.String(v.(string))
164+
}
165+
headers = append(headers, httpHeaderParam)
166+
}
167+
}
168+
service := GaapService{client: meta.(*TencentCloudClient).apiV3Conn}
169+
170+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
171+
e := service.CreateCustomHeader(ctx, ruleId, headers)
172+
if e != nil {
173+
return retryError(e)
174+
}
175+
return nil
176+
})
177+
if err != nil {
178+
log.Printf("[CRITAL]%s create gaap customHeader failed, reason:%+v", logId, err)
179+
return err
180+
}
181+
}
182+
183+
return resourceTencentCloudGaapCustomHeaderRead(d, meta)
184+
}
185+
186+
func resourceTencentCloudGaapCustomHeaderDelete(d *schema.ResourceData, meta interface{}) error {
187+
defer logElapsed("resource.tencentcloud_gaap_custom_header.delete")()
188+
defer inconsistentCheck(d, meta)()
189+
190+
logId := getLogId(contextNil)
191+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
192+
193+
service := GaapService{client: meta.(*TencentCloudClient).apiV3Conn}
194+
ruleId := d.Id()
195+
196+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
197+
headers := make([]*gaap.HttpHeaderParam, 0)
198+
e := service.CreateCustomHeader(ctx, ruleId, headers)
199+
if e != nil {
200+
return retryError(e)
201+
}
202+
return nil
203+
})
204+
if err != nil {
205+
log.Printf("[CRITAL]%s create gaap customHeader failed, reason:%+v", logId, err)
206+
return err
207+
}
208+
209+
return nil
210+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudGaapCustomHeaderResource_basic(t *testing.T) {
10+
t.Parallel()
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY) },
13+
Providers: testAccProviders,
14+
Steps: []resource.TestStep{
15+
{
16+
Config: testAccGaapCustomHeader,
17+
Check: resource.ComposeTestCheckFunc(
18+
resource.TestCheckResourceAttrSet("tencentcloud_gaap_custom_header.custom_header", "id"),
19+
resource.TestCheckResourceAttr("tencentcloud_gaap_custom_header.custom_header", "rule_id", "rule-pgnqsaf3"),
20+
resource.TestCheckResourceAttr("tencentcloud_gaap_custom_header.custom_header", "headers.#", "2"),
21+
),
22+
},
23+
{
24+
Config: testAccGaapCustomHeaderUpdate,
25+
Check: resource.ComposeTestCheckFunc(
26+
resource.TestCheckResourceAttrSet("tencentcloud_gaap_custom_header.custom_header", "id"),
27+
resource.TestCheckResourceAttr("tencentcloud_gaap_custom_header.custom_header", "rule_id", "rule-pgnqsaf3"),
28+
resource.TestCheckResourceAttr("tencentcloud_gaap_custom_header.custom_header", "headers.#", "1"),
29+
),
30+
},
31+
{
32+
ResourceName: "tencentcloud_gaap_custom_header.custom_header",
33+
ImportState: true,
34+
ImportStateVerify: true,
35+
},
36+
},
37+
})
38+
}
39+
40+
const testAccGaapCustomHeader = `
41+
resource "tencentcloud_gaap_custom_header" "custom_header" {
42+
rule_id = "rule-pgnqsaf3"
43+
headers {
44+
header_name = "HeaderName1"
45+
header_value = "HeaderValue1"
46+
}
47+
headers {
48+
header_name = "HeaderName2"
49+
header_value = "HeaderValue2"
50+
}
51+
}
52+
`
53+
54+
const testAccGaapCustomHeaderUpdate = `
55+
resource "tencentcloud_gaap_custom_header" "custom_header" {
56+
rule_id = "rule-pgnqsaf3"
57+
headers {
58+
header_name = "HeaderName1"
59+
header_value = "HeaderValue1"
60+
}
61+
}
62+
`

0 commit comments

Comments
 (0)