Skip to content

Commit 4cc2158

Browse files
authored
feat(clb): [120069939] support set default domain (#2899)
* support default domain * support default doamin * add changelog
1 parent c93284b commit 4cc2158

8 files changed

+358
-0
lines changed

.changelog/2899.txt

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

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,7 @@ func Provider() *schema.Provider {
12431243
"tencentcloud_clb_instance": clb.ResourceTencentCloudClbInstance(),
12441244
"tencentcloud_clb_listener": clb.ResourceTencentCloudClbListener(),
12451245
"tencentcloud_clb_listener_rule": clb.ResourceTencentCloudClbListenerRule(),
1246+
"tencentcloud_clb_listener_default_domain": clb.ResourceTencentCloudClbListenerDefaultDomain(),
12461247
"tencentcloud_clb_attachment": clb.ResourceTencentCloudClbServerAttachment(),
12471248
"tencentcloud_clb_redirection": clb.ResourceTencentCloudClbRedirection(),
12481249
"tencentcloud_clb_target_group": clb.ResourceTencentCloudClbTargetGroup(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ Cloud Load Balancer(CLB)
385385
tencentcloud_clb_instance
386386
tencentcloud_clb_listener
387387
tencentcloud_clb_listener_rule
388+
tencentcloud_clb_listener_default_domain
388389
tencentcloud_clb_attachment
389390
tencentcloud_clb_redirection
390391
tencentcloud_lb
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
package clb
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"strings"
8+
9+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
10+
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
clb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317"
14+
15+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
16+
)
17+
18+
func ResourceTencentCloudClbListenerDefaultDomain() *schema.Resource {
19+
return &schema.Resource{
20+
Create: resourceTencentCloudClbListenerDefaultDomainCreate,
21+
Read: resourceTencentCloudClbListenerDefaultDomainRead,
22+
Update: resourceTencentCloudClbListenerDefaultDomainUpdate,
23+
Delete: resourceTencentCloudClbListenerDefaultDomainDelete,
24+
Importer: &schema.ResourceImporter{
25+
State: schema.ImportStatePassthrough,
26+
},
27+
28+
Schema: map[string]*schema.Schema{
29+
"clb_id": {
30+
Type: schema.TypeString,
31+
Required: true,
32+
ForceNew: true,
33+
Description: "ID of CLB instance.",
34+
},
35+
"listener_id": {
36+
Type: schema.TypeString,
37+
Required: true,
38+
ForceNew: true,
39+
Description: "ID of CLB listener.",
40+
},
41+
"domain": {
42+
Type: schema.TypeString,
43+
Required: true,
44+
Description: "Domain name of the listener rule. Single domain rules are passed to `domain`, and multi domain rules are passed to `domains`.",
45+
},
46+
47+
"rule_id": {
48+
Type: schema.TypeString,
49+
Computed: true,
50+
Description: "ID of this CLB listener rule.",
51+
},
52+
},
53+
}
54+
}
55+
56+
func resourceTencentCloudClbListenerDefaultDomainCreate(d *schema.ResourceData, meta interface{}) error {
57+
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_default_domain.create")()
58+
defer tccommon.InconsistentCheck(d, meta)()
59+
60+
var (
61+
logId = tccommon.GetLogId(tccommon.ContextNil)
62+
request = clb.NewModifyDomainAttributesRequest()
63+
response *clb.ModifyDomainAttributesResponse
64+
clbId string
65+
listenerId string
66+
)
67+
68+
if v, ok := d.GetOk("clb_id"); ok {
69+
clbId = v.(string)
70+
request.LoadBalancerId = helper.String(clbId)
71+
}
72+
73+
if v, ok := d.GetOk("listener_id"); ok {
74+
listenerId = v.(string)
75+
request.ListenerId = helper.String(listenerId)
76+
}
77+
78+
if v, ok := d.GetOk("domain"); ok {
79+
request.Domain = helper.String(v.(string))
80+
}
81+
82+
request.DefaultServer = helper.Bool(true)
83+
84+
client := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseClbClient()
85+
86+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
87+
result, e := client.ModifyDomainAttributes(request)
88+
if e != nil {
89+
return tccommon.RetryError(e)
90+
} else {
91+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
92+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
93+
}
94+
95+
if result == nil {
96+
e = fmt.Errorf("modify domain failed")
97+
return resource.NonRetryableError(e)
98+
}
99+
100+
response = result
101+
return nil
102+
})
103+
104+
if err != nil {
105+
log.Printf("[CRITAL]%s create cls topic failed, reason:%+v", logId, err)
106+
return err
107+
}
108+
109+
taskId := *response.Response.RequestId
110+
111+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
112+
_ = waitTaskReady(ctx, client, taskId)
113+
114+
d.SetId(clbId + tccommon.FILED_SP + listenerId)
115+
return resourceTencentCloudClbListenerDefaultDomainRead(d, meta)
116+
}
117+
118+
func resourceTencentCloudClbListenerDefaultDomainRead(d *schema.ResourceData, meta interface{}) error {
119+
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_default_domain.read")()
120+
defer tccommon.InconsistentCheck(d, meta)()
121+
122+
logId := tccommon.GetLogId(tccommon.ContextNil)
123+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
124+
125+
resourceId := d.Id()
126+
127+
items := strings.Split(resourceId, tccommon.FILED_SP)
128+
if len(items) != 2 {
129+
return fmt.Errorf("id is broken,%s", resourceId)
130+
}
131+
clbId := items[0]
132+
listenerId := items[1]
133+
134+
clbService := ClbService{
135+
client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
136+
}
137+
138+
filter := map[string]string{"listener_id": listenerId, "clb_id": clbId}
139+
var instances []*clb.RuleOutput
140+
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
141+
results, e := clbService.DescribeRulesByFilter(ctx, filter)
142+
if e != nil {
143+
return tccommon.RetryError(e)
144+
}
145+
instances = results
146+
return nil
147+
})
148+
if err != nil {
149+
log.Printf("[CRITAL]%s read CLB listener rule failed, reason:%+v", logId, err)
150+
return err
151+
}
152+
153+
if len(instances) == 0 {
154+
d.SetId("")
155+
return nil
156+
}
157+
158+
var (
159+
domain string
160+
ruleId string
161+
)
162+
163+
for _, rule := range instances {
164+
if *rule.DefaultServer {
165+
domain = *rule.Domain
166+
ruleId = *rule.LocationId
167+
break
168+
}
169+
}
170+
171+
_ = d.Set("clb_id", clbId)
172+
_ = d.Set("listener_id", listenerId)
173+
_ = d.Set("domain", domain)
174+
_ = d.Set("rule_id", ruleId)
175+
176+
return nil
177+
}
178+
179+
func resourceTencentCloudClbListenerDefaultDomainUpdate(d *schema.ResourceData, meta interface{}) error {
180+
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_default_domain.update")()
181+
defer tccommon.InconsistentCheck(d, meta)()
182+
183+
if d.HasChange("domain") {
184+
185+
var (
186+
logId = tccommon.GetLogId(tccommon.ContextNil)
187+
request = clb.NewModifyDomainAttributesRequest()
188+
response *clb.ModifyDomainAttributesResponse
189+
clbId string
190+
listenerId string
191+
)
192+
193+
if v, ok := d.GetOk("clb_id"); ok {
194+
clbId = v.(string)
195+
request.LoadBalancerId = helper.String(clbId)
196+
}
197+
198+
if v, ok := d.GetOk("listener_id"); ok {
199+
listenerId = v.(string)
200+
request.ListenerId = helper.String(listenerId)
201+
}
202+
203+
if v, ok := d.GetOk("domain"); ok {
204+
request.Domain = helper.String(v.(string))
205+
}
206+
207+
request.DefaultServer = helper.Bool(true)
208+
209+
client := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseClbClient()
210+
211+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
212+
result, e := client.ModifyDomainAttributes(request)
213+
if e != nil {
214+
return tccommon.RetryError(e)
215+
} else {
216+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
217+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
218+
}
219+
220+
if result == nil {
221+
e = fmt.Errorf("modify domain failed")
222+
return resource.NonRetryableError(e)
223+
}
224+
225+
response = result
226+
return nil
227+
})
228+
229+
if err != nil {
230+
log.Printf("[CRITAL]%s create cls topic failed, reason:%+v", logId, err)
231+
return err
232+
}
233+
234+
taskId := *response.Response.RequestId
235+
236+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
237+
_ = waitTaskReady(ctx, client, taskId)
238+
239+
}
240+
241+
return resourceTencentCloudClbListenerDefaultDomainRead(d, meta)
242+
}
243+
244+
func resourceTencentCloudClbListenerDefaultDomainDelete(d *schema.ResourceData, meta interface{}) error {
245+
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_domain_default.delete")()
246+
defer tccommon.InconsistentCheck(d, meta)()
247+
248+
return nil
249+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
Provides a resource to set clb listener default domain
2+
3+
Example Usage
4+
5+
Set default domain
6+
7+
```hcl
8+
resource "tencentcloud_clb_listener_default_domain" "example" {
9+
clb_id = "lb-g1miv1ok"
10+
listener_id = "lbl-duilx5qm"
11+
domain = "3.com"
12+
}
13+
```
14+
15+
Import
16+
17+
CLB listener default domain can be imported using the id (version >= 1.47.0), e.g.
18+
19+
```
20+
$ terraform import tencentcloud_clb_listener_default_domain.example lb-k2zjp9lv#lbl-hh141sn9
21+
```

tencentcloud/services/clb/service_tencentcloud_clb.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2429,3 +2429,34 @@ func (me *ClbService) DescribeClbTargetGroupAttachmentsById(ctx context.Context,
24292429
func IsHealthCheckEnable(healthSwitch int64) bool {
24302430
return healthSwitch == int64(1)
24312431
}
2432+
2433+
func waitTaskReady(ctx context.Context, client *clb.Client, reqeustId string) error {
2434+
logId := tccommon.GetLogId(ctx)
2435+
2436+
describeRequest := clb.NewDescribeTaskStatusRequest()
2437+
describeRequest.TaskId = helper.String(reqeustId)
2438+
2439+
err := resource.Retry(2*tccommon.WriteRetryTimeout, func() *resource.RetryError {
2440+
ratelimit.Check(describeRequest.GetAction())
2441+
response, err := client.DescribeTaskStatus(describeRequest)
2442+
if err != nil {
2443+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]",
2444+
logId, describeRequest.GetAction(), describeRequest.ToJsonString(), err)
2445+
return tccommon.RetryError(err)
2446+
}
2447+
// 任务状态:RUNNING,FAIL,SUCCESS
2448+
status := *response.Response.Status
2449+
if status == 0 {
2450+
return nil
2451+
} else if status == 1 {
2452+
return resource.NonRetryableError(fmt.Errorf("Task[%s] failed", reqeustId))
2453+
} else {
2454+
return resource.RetryableError(fmt.Errorf("Task[%s] status: %s", reqeustId, status))
2455+
}
2456+
})
2457+
if err != nil {
2458+
log.Printf("[CRITAL]%s task failed, reason: %v", logId, err)
2459+
return err
2460+
}
2461+
return nil
2462+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
subcategory: "Cloud Load Balancer(CLB)"
3+
layout: "tencentcloud"
4+
page_title: "TencentCloud: tencentcloud_clb_listener_default_domain"
5+
sidebar_current: "docs-tencentcloud-resource-clb_listener_default_domain"
6+
description: |-
7+
Provides a resource to set clb listener default domain
8+
---
9+
10+
# tencentcloud_clb_listener_default_domain
11+
12+
Provides a resource to set clb listener default domain
13+
14+
## Example Usage
15+
16+
### Set default domain
17+
18+
```hcl
19+
resource "tencentcloud_clb_listener_default_domain" "example" {
20+
clb_id = "lb-g1miv1ok"
21+
listener_id = "lbl-duilx5qm"
22+
domain = "3.com"
23+
}
24+
```
25+
26+
## Argument Reference
27+
28+
The following arguments are supported:
29+
30+
* `clb_id` - (Required, String, ForceNew) ID of CLB instance.
31+
* `domain` - (Required, String) Domain name of the listener rule. Single domain rules are passed to `domain`, and multi domain rules are passed to `domains`.
32+
* `listener_id` - (Required, String, ForceNew) ID of CLB listener.
33+
34+
## Attributes Reference
35+
36+
In addition to all arguments above, the following attributes are exported:
37+
38+
* `id` - ID of the resource.
39+
* `rule_id` - ID of this CLB listener rule.
40+
41+
42+
## Import
43+
44+
CLB listener default domain can be imported using the id (version >= 1.47.0), e.g.
45+
46+
```
47+
$ terraform import tencentcloud_clb_listener_default_domain.example lb-k2zjp9lv#lbl-hh141sn9
48+
```
49+

website/tencentcloud.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,6 +1425,9 @@
14251425
<li>
14261426
<a href="/docs/providers/tencentcloud/r/clb_listener.html">tencentcloud_clb_listener</a>
14271427
</li>
1428+
<li>
1429+
<a href="/docs/providers/tencentcloud/r/clb_listener_default_domain.html">tencentcloud_clb_listener_default_domain</a>
1430+
</li>
14281431
<li>
14291432
<a href="/docs/providers/tencentcloud/r/clb_listener_rule.html">tencentcloud_clb_listener_rule</a>
14301433
</li>

0 commit comments

Comments
 (0)