Skip to content

feat(clb): [120069939] support set default domain #2899

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/2899.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:new-resource
tencentcloud_clb_listener_default_domain
```
1 change: 1 addition & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -1236,6 +1236,7 @@ func Provider() *schema.Provider {
"tencentcloud_clb_instance": clb.ResourceTencentCloudClbInstance(),
"tencentcloud_clb_listener": clb.ResourceTencentCloudClbListener(),
"tencentcloud_clb_listener_rule": clb.ResourceTencentCloudClbListenerRule(),
"tencentcloud_clb_listener_default_domain": clb.ResourceTencentCloudClbListenerDefaultDomain(),
"tencentcloud_clb_attachment": clb.ResourceTencentCloudClbServerAttachment(),
"tencentcloud_clb_redirection": clb.ResourceTencentCloudClbRedirection(),
"tencentcloud_clb_target_group": clb.ResourceTencentCloudClbTargetGroup(),
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.md
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ Cloud Load Balancer(CLB)
tencentcloud_clb_instance
tencentcloud_clb_listener
tencentcloud_clb_listener_rule
tencentcloud_clb_listener_default_domain
tencentcloud_clb_attachment
tencentcloud_clb_redirection
tencentcloud_lb
Expand Down
249 changes: 249 additions & 0 deletions tencentcloud/services/clb/resource_tc_clb_listener_default_domain.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
package clb

import (
"context"
"fmt"
"log"
"strings"

tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
clb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317"

"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)

func ResourceTencentCloudClbListenerDefaultDomain() *schema.Resource {
return &schema.Resource{
Create: resourceTencentCloudClbListenerDefaultDomainCreate,
Read: resourceTencentCloudClbListenerDefaultDomainRead,
Update: resourceTencentCloudClbListenerDefaultDomainUpdate,
Delete: resourceTencentCloudClbListenerDefaultDomainDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"clb_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "ID of CLB instance.",
},
"listener_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "ID of CLB listener.",
},
"domain": {
Type: schema.TypeString,
Required: true,
Description: "Domain name of the listener rule. Single domain rules are passed to `domain`, and multi domain rules are passed to `domains`.",
},

"rule_id": {
Type: schema.TypeString,
Computed: true,
Description: "ID of this CLB listener rule.",
},
},
}
}

func resourceTencentCloudClbListenerDefaultDomainCreate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_default_domain.create")()
defer tccommon.InconsistentCheck(d, meta)()

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
request = clb.NewModifyDomainAttributesRequest()
response *clb.ModifyDomainAttributesResponse
clbId string
listenerId string
)

if v, ok := d.GetOk("clb_id"); ok {
clbId = v.(string)
request.LoadBalancerId = helper.String(clbId)
}

if v, ok := d.GetOk("listener_id"); ok {
listenerId = v.(string)
request.ListenerId = helper.String(listenerId)
}

if v, ok := d.GetOk("domain"); ok {
request.Domain = helper.String(v.(string))
}

request.DefaultServer = helper.Bool(true)

client := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseClbClient()

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := client.ModifyDomainAttributes(request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}

if result == nil {
e = fmt.Errorf("modify domain failed")
return resource.NonRetryableError(e)
}

response = result
return nil
})

if err != nil {
log.Printf("[CRITAL]%s create cls topic failed, reason:%+v", logId, err)
return err
}

taskId := *response.Response.RequestId

ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
_ = waitTaskReady(ctx, client, taskId)

d.SetId(clbId + tccommon.FILED_SP + listenerId)
return resourceTencentCloudClbListenerDefaultDomainRead(d, meta)
}

func resourceTencentCloudClbListenerDefaultDomainRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_default_domain.read")()
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)

resourceId := d.Id()

items := strings.Split(resourceId, tccommon.FILED_SP)
if len(items) != 2 {
return fmt.Errorf("id is broken,%s", resourceId)
}
clbId := items[0]
listenerId := items[1]

clbService := ClbService{
client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
}

filter := map[string]string{"listener_id": listenerId, "clb_id": clbId}
var instances []*clb.RuleOutput
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
results, e := clbService.DescribeRulesByFilter(ctx, filter)
if e != nil {
return tccommon.RetryError(e)
}
instances = results
return nil
})
if err != nil {
log.Printf("[CRITAL]%s read CLB listener rule failed, reason:%+v", logId, err)
return err
}

if len(instances) == 0 {
d.SetId("")
return nil
}

var (
domain string
ruleId string
)

for _, rule := range instances {
if *rule.DefaultServer {
domain = *rule.Domain
ruleId = *rule.LocationId
break
}
}

_ = d.Set("clb_id", clbId)
_ = d.Set("listener_id", listenerId)
_ = d.Set("domain", domain)
_ = d.Set("rule_id", ruleId)

return nil
}

func resourceTencentCloudClbListenerDefaultDomainUpdate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_default_domain.update")()
defer tccommon.InconsistentCheck(d, meta)()

if d.HasChange("domain") {

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
request = clb.NewModifyDomainAttributesRequest()
response *clb.ModifyDomainAttributesResponse
clbId string
listenerId string
)

if v, ok := d.GetOk("clb_id"); ok {
clbId = v.(string)
request.LoadBalancerId = helper.String(clbId)
}

if v, ok := d.GetOk("listener_id"); ok {
listenerId = v.(string)
request.ListenerId = helper.String(listenerId)
}

if v, ok := d.GetOk("domain"); ok {
request.Domain = helper.String(v.(string))
}

request.DefaultServer = helper.Bool(true)

client := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseClbClient()

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := client.ModifyDomainAttributes(request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}

if result == nil {
e = fmt.Errorf("modify domain failed")
return resource.NonRetryableError(e)
}

response = result
return nil
})

if err != nil {
log.Printf("[CRITAL]%s create cls topic failed, reason:%+v", logId, err)
return err
}

taskId := *response.Response.RequestId

ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
_ = waitTaskReady(ctx, client, taskId)

}

return resourceTencentCloudClbListenerDefaultDomainRead(d, meta)
}

func resourceTencentCloudClbListenerDefaultDomainDelete(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_clb_listener_domain_default.delete")()
defer tccommon.InconsistentCheck(d, meta)()

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Provides a resource to set clb listener default domain

Example Usage

Set default domain

```hcl
resource "tencentcloud_clb_listener_default_domain" "example" {
clb_id = "lb-g1miv1ok"
listener_id = "lbl-duilx5qm"
domain = "3.com"
}
```

Import

CLB listener default domain can be imported using the id (version >= 1.47.0), e.g.

```
$ terraform import tencentcloud_clb_listener_default_domain.example lb-k2zjp9lv#lbl-hh141sn9
```
31 changes: 31 additions & 0 deletions tencentcloud/services/clb/service_tencentcloud_clb.go
Original file line number Diff line number Diff line change
Expand Up @@ -2429,3 +2429,34 @@
func IsHealthCheckEnable(healthSwitch int64) bool {
return healthSwitch == int64(1)
}

func waitTaskReady(ctx context.Context, client *clb.Client, reqeustId string) error {
logId := tccommon.GetLogId(ctx)

describeRequest := clb.NewDescribeTaskStatusRequest()
describeRequest.TaskId = helper.String(reqeustId)

err := resource.Retry(2*tccommon.WriteRetryTimeout, func() *resource.RetryError {
ratelimit.Check(describeRequest.GetAction())
response, err := client.DescribeTaskStatus(describeRequest)
if err != nil {
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]",
logId, describeRequest.GetAction(), describeRequest.ToJsonString(), err)
return tccommon.RetryError(err)
}
// 任务状态:RUNNING,FAIL,SUCCESS
status := *response.Response.Status
if status == 0 {
return nil
} else if status == 1 {
return resource.NonRetryableError(fmt.Errorf("Task[%s] failed", reqeustId))
} else {
return resource.RetryableError(fmt.Errorf("Task[%s] status: %s", reqeustId, status))

Check failure on line 2454 in tencentcloud/services/clb/service_tencentcloud_clb.go

View workflow job for this annotation

GitHub Actions / golangci-lint

printf: fmt.Errorf format %s has arg status of wrong type int64 (govet)
}
})
if err != nil {
log.Printf("[CRITAL]%s task failed, reason: %v", logId, err)
return err
}
return nil
}
49 changes: 49 additions & 0 deletions website/docs/r/clb_listener_default_domain.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
subcategory: "Cloud Load Balancer(CLB)"
layout: "tencentcloud"
page_title: "TencentCloud: tencentcloud_clb_listener_default_domain"
sidebar_current: "docs-tencentcloud-resource-clb_listener_default_domain"
description: |-
Provides a resource to set clb listener default domain
---

# tencentcloud_clb_listener_default_domain

Provides a resource to set clb listener default domain

## Example Usage

### Set default domain

```hcl
resource "tencentcloud_clb_listener_default_domain" "example" {
clb_id = "lb-g1miv1ok"
listener_id = "lbl-duilx5qm"
domain = "3.com"
}
```

## Argument Reference

The following arguments are supported:

* `clb_id` - (Required, String, ForceNew) ID of CLB instance.
* `domain` - (Required, String) Domain name of the listener rule. Single domain rules are passed to `domain`, and multi domain rules are passed to `domains`.
* `listener_id` - (Required, String, ForceNew) ID of CLB listener.

## Attributes Reference

In addition to all arguments above, the following attributes are exported:

* `id` - ID of the resource.
* `rule_id` - ID of this CLB listener rule.


## Import

CLB listener default domain can be imported using the id (version >= 1.47.0), e.g.

```
$ terraform import tencentcloud_clb_listener_default_domain.example lb-k2zjp9lv#lbl-hh141sn9
```

3 changes: 3 additions & 0 deletions website/tencentcloud.erb
Original file line number Diff line number Diff line change
Expand Up @@ -1422,6 +1422,9 @@
<li>
<a href="/docs/providers/tencentcloud/r/clb_listener.html">tencentcloud_clb_listener</a>
</li>
<li>
<a href="/docs/providers/tencentcloud/r/clb_listener_default_domain.html">tencentcloud_clb_listener_default_domain</a>
</li>
<li>
<a href="/docs/providers/tencentcloud/r/clb_listener_rule.html">tencentcloud_clb_listener_rule</a>
</li>
Expand Down
Loading