alicloud/resource_alicloud_dns_record.go (188 lines of code) (raw):
package alicloud
import (
"strconv"
"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/alidns"
"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 resourceAlicloudDnsRecord() *schema.Resource {
return &schema.Resource{
Create: resourceAlicloudDnsRecordCreate,
Read: resourceAlicloudDnsRecordRead,
Update: resourceAlicloudDnsRecordUpdate,
Delete: resourceAlicloudDnsRecordDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"host_record": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validateRR,
},
"type": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"A", "NS", "MX", "TXT", "CNAME", "SRV", "AAAA", "CAA", "REDIRECT_URL", "FORWORD_URL"}, false),
},
"value": {
Type: schema.TypeString,
Required: true,
DiffSuppressFunc: dnsValueDiffSuppressFunc,
},
"ttl": {
Type: schema.TypeInt,
Optional: true,
Default: 600,
},
"priority": {
Type: schema.TypeInt,
Optional: true,
DiffSuppressFunc: dnsPriorityDiffSuppressFunc,
},
"routing": {
Type: schema.TypeString,
Optional: true,
Default: "default",
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"locked": {
Type: schema.TypeBool,
Computed: true,
},
},
}
}
func resourceAlicloudDnsRecordCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
request := alidns.CreateAddDomainRecordRequest()
request.RegionId = client.RegionId
request.DomainName = d.Get("name").(string)
request.RR = d.Get("host_record").(string)
request.Type = d.Get("type").(string)
request.Value = d.Get("value").(string)
request.TTL = requests.NewInteger(d.Get("ttl").(int))
if v, ok := d.GetOk("priority"); !ok && request.Type == "MX" {
return WrapError(Error("'priority': required field when 'type' is MX."))
} else if ok {
request.Priority = requests.Integer(strconv.Itoa(v.(int)))
}
if v, ok := d.GetOk("routing"); ok {
routing := v.(string)
if routing != "default" && request.Type == "FORWORD_URL" {
return WrapError(Error("The ForwordURLRecord only support default line."))
}
request.Line = routing
}
if err := resource.Retry(3*time.Minute, func() *resource.RetryError {
raw, err := client.WithDnsClient(func(dnsClient *alidns.Client) (interface{}, error) {
return dnsClient.AddDomainRecord(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"InternalError", "LastOperationNotFinished"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*alidns.AddDomainRecordResponse)
d.SetId(response.RecordId)
return nil
}); err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_dns_record", request.GetActionName(), AlibabaCloudSdkGoERROR)
}
return resourceAlicloudDnsRecordRead(d, meta)
}
func resourceAlicloudDnsRecordUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
request := alidns.CreateUpdateDomainRecordRequest()
request.RegionId = client.RegionId
request.RecordId = d.Id()
request.RR = d.Get("host_record").(string)
request.Type = d.Get("type").(string)
if request.Type == "MX" {
request.Priority = requests.NewInteger(d.Get("priority").(int))
}
request.TTL = requests.NewInteger(d.Get("ttl").(int))
request.Line = d.Get("routing").(string)
request.Value = d.Get("value").(string)
if err := resource.Retry(3*time.Minute, func() *resource.RetryError {
raw, err := client.WithDnsClient(func(dnsClient *alidns.Client) (interface{}, error) {
return dnsClient.UpdateDomainRecord(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"LastOperationNotFinished"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
}); err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR)
}
return resourceAlicloudDnsRecordRead(d, meta)
}
func resourceAlicloudDnsRecordRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
dnsService := &DnsService{client: client}
object, err := dnsService.DescribeDnsRecord(d.Id())
if err != nil {
if NotFoundError(err) {
d.SetId("")
return nil
}
return WrapError(err)
}
d.Set("ttl", object.TTL)
d.Set("priority", object.Priority)
d.Set("name", object.DomainName)
d.Set("host_record", object.RR)
d.Set("type", object.Type)
d.Set("value", object.Value)
d.Set("routing", object.Line)
d.Set("status", object.Status)
d.Set("locked", object.Locked)
return nil
}
func resourceAlicloudDnsRecordDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
dnsService := &DnsService{client: client}
request := alidns.CreateDeleteDomainRecordRequest()
request.RegionId = client.RegionId
request.RecordId = d.Id()
return resource.Retry(5*time.Minute, func() *resource.RetryError {
raw, err := client.WithDnsClient(func(dnsClient *alidns.Client) (interface{}, error) {
return dnsClient.DeleteDomainRecord(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"DomainRecordNotBelongToUser"}) {
return nil
}
if IsExpectedErrors(err, []string{"RecordForbidden.DNSChange", "InternalError", "LastOperationNotFinished"}) {
return resource.RetryableError(WrapErrorf(err, DefaultTimeoutMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR))
}
return resource.NonRetryableError(WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR))
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
_, err = dnsService.DescribeDnsRecord(d.Id())
if err != nil {
if NotFoundError(err) {
return nil
}
return resource.NonRetryableError(WrapError(err))
}
return resource.RetryableError(WrapErrorf(err, DefaultTimeoutMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR))
})
}