diff --git a/.changelog/2899.txt b/.changelog/2899.txt new file mode 100644 index 0000000000..b96a8edfea --- /dev/null +++ b/.changelog/2899.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_clb_listener_default_domain +``` \ No newline at end of file diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 8c980b3769..1d31018f44 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -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(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index ed722f1138..05d31e84da 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -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 diff --git a/tencentcloud/services/clb/resource_tc_clb_listener_default_domain.go b/tencentcloud/services/clb/resource_tc_clb_listener_default_domain.go new file mode 100644 index 0000000000..5a6389b880 --- /dev/null +++ b/tencentcloud/services/clb/resource_tc_clb_listener_default_domain.go @@ -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 +} diff --git a/tencentcloud/services/clb/resource_tc_clb_listener_default_domain.md b/tencentcloud/services/clb/resource_tc_clb_listener_default_domain.md new file mode 100644 index 0000000000..945039b7a7 --- /dev/null +++ b/tencentcloud/services/clb/resource_tc_clb_listener_default_domain.md @@ -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 +``` diff --git a/tencentcloud/services/clb/service_tencentcloud_clb.go b/tencentcloud/services/clb/service_tencentcloud_clb.go index 86034ecf7e..7233efa3e7 100644 --- a/tencentcloud/services/clb/service_tencentcloud_clb.go +++ b/tencentcloud/services/clb/service_tencentcloud_clb.go @@ -2429,3 +2429,34 @@ func (me *ClbService) DescribeClbTargetGroupAttachmentsById(ctx context.Context, 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)) + } + }) + if err != nil { + log.Printf("[CRITAL]%s task failed, reason: %v", logId, err) + return err + } + return nil +} diff --git a/website/docs/r/clb_listener_default_domain.html.markdown b/website/docs/r/clb_listener_default_domain.html.markdown new file mode 100644 index 0000000000..e487d218fa --- /dev/null +++ b/website/docs/r/clb_listener_default_domain.html.markdown @@ -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 +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index a1da1f6708..6cf27635a9 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -1422,6 +1422,9 @@
  • tencentcloud_clb_listener
  • +
  • + tencentcloud_clb_listener_default_domain +
  • tencentcloud_clb_listener_rule