alicloud/resource_alicloud_slb_domain_extension.go (160 lines of code) (raw):
package alicloud
import (
"fmt"
"time"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/services/slb"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)
func resourceAlicloudSlbDomainExtension() *schema.Resource {
return &schema.Resource{
Create: resourceAliyunSlbDomainExtensionCreate,
Read: resourceAliyunSlbDomainExtensionRead,
Update: resourceAliyunSlbDomainExtensionUpdate,
Delete: resourceAliyunSlbDomainExtensionDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"load_balancer_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"frontend_port": {
Type: schema.TypeInt,
ValidateFunc: validation.IntBetween(1, 65535),
Required: true,
ForceNew: true,
},
"domain": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"server_certificate_id": {
Type: schema.TypeString,
Required: true,
},
"delete_protection_validation": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
},
}
}
func resourceAliyunSlbDomainExtensionCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
request := slb.CreateCreateDomainExtensionRequest()
request.LoadBalancerId = d.Get("load_balancer_id").(string)
request.ListenerPort = requests.NewInteger(d.Get("frontend_port").(int))
request.Domain = d.Get("domain").(string)
request.ServerCertificateId = d.Get("server_certificate_id").(string)
var response *slb.CreateDomainExtensionResponse
err := resource.Retry(3*time.Minute, func() *resource.RetryError {
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.CreateDomainExtension(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"DomainExtensionProcessing"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response = raw.(*slb.CreateDomainExtensionResponse)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_slb_domain_extension", request.GetActionName(), AlibabaCloudSdkGoERROR)
}
d.SetId(response.DomainExtensionId)
return resourceAliyunSlbDomainExtensionRead(d, meta)
}
func resourceAliyunSlbDomainExtensionRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
slbService := SlbService{client}
domainExtension, err := slbService.DescribeDomainExtensionAttribute(d.Id())
if err != nil {
if NotFoundError(err) {
d.SetId("")
return nil
}
return WrapError(err)
}
d.Set("id", domainExtension.DomainExtensionId)
d.Set("load_balancer_id", domainExtension.LoadBalancerId)
d.Set("domain", domainExtension.Domain)
d.Set("server_certificate_id", domainExtension.ServerCertificateId)
d.Set("frontend_port", domainExtension.ListenerPort)
return nil
}
func resourceAliyunSlbDomainExtensionUpdate(d *schema.ResourceData, meta interface{}) error {
if d.HasChange("server_certificate_id") {
request := slb.CreateSetDomainExtensionAttributeRequest()
request.DomainExtensionId = d.Id()
request.ServerCertificateId = d.Get("server_certificate_id").(string)
client := meta.(*connectivity.AliyunClient)
err := resource.Retry(3*time.Minute, func() *resource.RetryError {
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.SetDomainExtensionAttribute(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"BackendServer.configuring", "DomainExtensionProcessing"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_slb_domain_extension", request.GetActionName(), AlibabaCloudSdkGoERROR)
}
d.SetPartial("server_certificate_id")
}
return resourceAliyunSlbDomainExtensionRead(d, meta)
}
func resourceAliyunSlbDomainExtensionDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
slbService := SlbService{client}
if d.Get("delete_protection_validation").(bool) {
lbId := d.Get("load_balancer_id").(string)
lbInstance, err := slbService.DescribeSlb(lbId)
if err != nil {
if NotFoundError(err) {
return nil
}
return WrapError(err)
}
if lbInstance.DeleteProtection == "on" {
return WrapError(fmt.Errorf("Current domain extension's SLB Instance %s has enabled DeleteProtection. Please set delete_protection_validation to false to delete the resource.", lbId))
}
}
request := slb.CreateDeleteDomainExtensionRequest()
request.DomainExtensionId = d.Id()
err := resource.Retry(5*time.Minute, func() *resource.RetryError {
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.DeleteDomainExtension(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"DomainExtensionProcessing", "InternalError"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
if IsExpectedErrors(err, []string{"InvalidParameter.DomainExtensionId"}) {
return nil
}
return WrapErrorf(err, DataDefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR)
}
return WrapError(slbService.WaitForSlbDomainExtension(d.Id(), Deleted, DefaultTimeoutMedium))
}