alibabacloudstack/resource_apsarastack_dns_record.go (256 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"log"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceAlibabacloudStackDnsRecord() *schema.Resource {
resource := &schema.Resource{
Schema: map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeString,
Required: true,
},
"record_id": {
Type: schema.TypeString,
Computed: true,
},
"name": {
Type: schema.TypeString,
Required: true,
},
"type": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"A", "AAAA", "CNAME", "MX", "TXT", "PTR", "SRV", "NAPRT", "CAA", "NS"}, false),
},
"lba_strategy": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"ALL_RR", "RATIO"}, false),
},
"rr_set": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
MinItems: 1,
},
"ttl": {
Type: schema.TypeInt,
Optional: true,
Default: 300,
},
"line_ids": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"remark": {
Type: schema.TypeString,
Optional: true,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackDnsRecordCreate, resourceAlibabacloudStackDnsRecordRead, resourceAlibabacloudStackDnsRecordUpdate, resourceAlibabacloudStackDnsRecordDelete)
return resource
}
func resourceAlibabacloudStackDnsRecordCreate(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*connectivity.AlibabacloudStackClient)
ZoneId := SplitDnsZone(d.Get("zone_id").(string))
LbaStrategy := d.Get("lba_strategy").(string)
Type := d.Get("type").(string)
Name := d.Get("name").(string)
TTL := d.Get("ttl").(int)
line_ids := expandStringList(d.Get("line_ids").(*schema.Set).List())
if len(line_ids) <= 0 {
line_ids = []string{"default"}
}
line_ids_json, _ := json.Marshal(line_ids)
line_ids_str := string(line_ids_json)
request := client.NewCommonRequest("POST", "CloudDns", "2021-06-24", "AddGlobalZoneRecord", "")
request.Scheme = "HTTP" // CloudDns不支持HTTPS
request.QueryParams["LineIds"] = line_ids_str
request.QueryParams["Type"] = Type
request.QueryParams["Ttl"] = fmt.Sprintf("%d", TTL)
request.QueryParams["ZoneId"] = ZoneId
request.QueryParams["LbaStrategy"] = LbaStrategy
request.QueryParams["Name"] = Name
var rrsets []string
if v, ok := d.GetOk("rr_set"); ok {
rrsets = expandStringList(v.(*schema.Set).List())
for i, key := range rrsets {
request.QueryParams[fmt.Sprintf("RDatas.%d.Value", i+1)] = key
}
}
bresponse, err := client.ProcessCommonRequest(request)
addDebug(request.GetActionName(), bresponse, request, request.QueryParams)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_dns_record", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
response := make(map[string]interface{})
if err := json.Unmarshal(bresponse.GetHttpContentBytes(), &response); err != nil {
return errmsgs.WrapErrorf(err, "Unmarshal Response Failed")
}
if recordId, err := jsonpath.Get("$.Id", response); err != nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
} else {
d.Set("record_id", recordId)
d.SetId(fmt.Sprintf("%s:%s", ZoneId, recordId))
}
return nil
}
func resourceAlibabacloudStackDnsRecordRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
dnsService := &DnsService{client: client}
object, err := dnsService.DescribeDnsRecord(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
// 强制重新设置id,为了实现后续主键的迁移
if d.Get("record_id").(string) == "" {
d.SetId(fmt.Sprintf("%s:%s", object.Data[0].ZoneId, d.Get("record_id").(string)))
}
d.SetId(fmt.Sprintf("%s:%s", object.Data[0].ZoneId, object.Data[0].Id))
d.Set("ttl", object.Data[0].TTL)
d.Set("record_id", object.Data[0].Id)
d.Set("name", object.Data[0].Name)
d.Set("type", object.Data[0].Type)
d.Set("remark", object.Data[0].Remark)
d.Set("lba_strategy", object.Data[0].LbaStrategy)
d.Set("line_ids", object.Data[0].LineIds)
rr_set := make([]string, 0)
for _, v := range object.Data[0].RDatas {
rr_set = append(rr_set, v.Value)
}
d.Set("rr_set", rr_set)
d.Set("zone_id", object.Data[0].ZoneId)
return nil
}
func resourceAlibabacloudStackDnsRecordUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
dnsService := DnsService{client}
ID := d.Get("record_id").(string)
ZoneId := SplitDnsZone(d.Get("zone_id").(string))
Name := d.Get("name").(string)
LbaStrategy := d.Get("lba_strategy").(string)
check, err := dnsService.DescribeDnsRecord(d.Id())
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsRecordExist", errmsgs.AlibabacloudStackSdkGoERROR)
}
attributeUpdate := false
var desc string
if d.HasChange("remark") {
if v, ok := d.GetOk("remark"); ok {
desc = v.(string)
}
check.Data[0].Remark = desc
request := client.NewCommonRequest("POST", "CloudDns", "2021-06-24", "UpdateGlobalZoneRecordRemark", "")
request.Scheme = "HTTP" // CloudDns不支持HTTPS
request.QueryParams["Id"] = ID
request.QueryParams["Remark"] = desc
response, err := client.ProcessCommonRequest(request)
log.Printf(" response of raw UpdateGlobalZoneRecordRemark : %s", response)
if err != nil {
if response == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_dns_record", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), response, request)
} else {
if v, ok := d.GetOk("remark"); ok {
desc = v.(string)
}
check.Data[0].Remark = desc
}
var Type string
var Ttl int
if d.HasChange("type") {
if v, ok := d.GetOk("type"); ok {
Type = v.(string)
}
check.Data[0].Type = Type
attributeUpdate = true
} else {
if v, ok := d.GetOk("type"); ok {
Type = v.(string)
}
check.Data[0].Type = Type
}
if d.HasChange("ttl") {
if v, ok := d.GetOk("ttl"); ok {
Ttl = v.(int)
}
check.Data[0].TTL = Ttl
attributeUpdate = true
} else {
if v, ok := d.GetOk("ttl"); ok {
Ttl = v.(int)
}
check.Data[0].TTL = Ttl
}
if d.HasChange("rr_set") {
attributeUpdate = true
}
if !d.IsNewResource() && attributeUpdate {
request := make(map[string]interface{})
var rrsets []string
if v, ok := d.GetOk("rr_set"); ok {
rrsets = expandStringList(v.(*schema.Set).List())
for i, key := range rrsets {
request[fmt.Sprintf("RDatas.%d.Value", i+1)] = key
}
}
action := "UpdateGlobalZoneRecord"
request["Type"] = Type
request["Ttl"] = Ttl
request["Id"] = ID
request["ZoneId"] = ZoneId
request["LbaStrategy"] = LbaStrategy
request["Name"] = Name
request["Remark"] = check.Data[0].Remark
request["ClientToken"] = buildClientToken(action)
_, err := client.DoTeaRequest("POST", "CloudDns", "2021-06-24", action, "", nil, nil, request)
if err != nil {
return err
}
}
return nil
}
func resourceAlibabacloudStackDnsRecordDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ID := d.Get("record_id").(string)
ZoneId := SplitDnsZone(d.Get("zone_id").(string))
request := client.NewCommonRequest("POST", "CloudDns", "2021-06-24", "DeleteGlobalZoneRecord", "")
request.Scheme = "HTTP" // CloudDns不支持HTTPS
request.QueryParams["Id"] = ID
request.QueryParams["ZoneId"] = ZoneId
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"DomainRecordNotBelongToUser"}) {
return nil
}
if errmsgs.IsExpectedErrors(err, []string{"RecordForbidden.DNSChange", "InternalError"}) {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
}
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
return nil
}