alibabacloudstack/service_apsarastack_dns.go (270 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"reflect"
"strings"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
"github.com/aliyun/alibaba-cloud-sdk-go/services/alidns"
"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"
)
type DnsService struct {
client *connectivity.AlibabacloudStackClient
}
func (s *DnsService) DescribeDnsRecord(id string) (response *DnsRecord, err error) {
var zoneId, recordId string
if v := strings.SplitN(id, ":", 2); len(v) > 1 {
zoneId = v[0]
recordId = v[1]
} else {
zoneId = v[0]
recordId = ""
}
request := s.client.NewCommonRequest("POST", "CloudDns", "2021-06-24", "DescribeGlobalZoneRecords", "")
request.Scheme = "HTTP" // CloudDns不支持HTTPS
request.QueryParams["ZoneId"] = zoneId
var resp = &DnsRecord{}
bresponse, err := s.client.ProcessCommonRequest(request)
addDebug("DescribeGlobalZoneRecords", bresponse, request, request.QueryParams)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"ErrorRecordNotFound"}) {
return resp, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
if response == nil {
return resp, errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return resp, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, "DescribeGlobalZoneRecords", errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), resp)
if err != nil {
return resp, errmsgs.WrapError(err)
}
if len(resp.Data) < 1 || resp.AsapiSuccess == true {
return resp, errmsgs.WrapError(err)
} else if recordId == "" && len(resp.Data) > 1 {
return resp, errmsgs.WrapErrorf(err, "record id is Empty, and mutple records found")
}
filtered := resp.Data[:0] // 复用底层数组
for _, data := range resp.Data {
if data.Id == recordId {
filtered = append(filtered, data)
break
}
}
resp.Data = filtered
if len(resp.Data) < 1 {
return resp, fmt.Errorf("not found dnsrecord")
}
return resp, nil
}
func (s *DnsService) DescribeDnsGroup(id string) (alidns.DomainGroup, error) {
var group alidns.DomainGroup
request := alidns.CreateDescribeDomainGroupsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.PageSize = requests.NewInteger(PageSizeLarge)
request.PageNumber = requests.NewInteger(2)
for {
raw, err := s.client.WithDnsClient(func(dnsClient *alidns.Client) (interface{}, error) {
return dnsClient.DescribeDomainGroups(request)
})
bresponse, ok := raw.(*alidns.DescribeDomainGroupsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return group, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
groups := bresponse.DomainGroups.DomainGroup
for _, domainGroup := range groups {
if domainGroup.GroupId == id {
return domainGroup, nil
}
}
if len(groups) < PageSizeLarge {
break
}
if page, err := getNextpageNumber(request.PageNumber); err != nil {
return group, errmsgs.WrapError(err)
} else {
request.PageNumber = page
}
}
return group, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DnsGroup", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
func (s *DnsService) ListTagResources(id string) (object alidns.ListTagResourcesResponse, err error) {
request := alidns.CreateListTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceType = "DOMAIN"
request.ResourceId = &[]string{id}
raw, err := s.client.WithDnsClient(func(alidnsClient *alidns.Client) (interface{}, error) {
return alidnsClient.ListTagResources(request)
})
bresponse, ok := raw.(*alidns.ListTagResourcesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return *bresponse, nil
}
func (s *DnsService) DescribeDnsDomainAttachment(id string) (object alidns.DescribeInstanceDomainsResponse, err error) {
request := alidns.CreateDescribeInstanceDomainsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
raw, err := s.client.WithDnsClient(func(alidnsClient *alidns.Client) (interface{}, error) {
return alidnsClient.DescribeInstanceDomains(request)
})
bresponse, ok := raw.(*alidns.DescribeInstanceDomainsResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDnsProduct"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DnsDomainAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.InstanceDomains) < 1 {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DnsDomainAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return
}
return *bresponse, nil
}
func (s *DnsService) WaitForAlidnsDomainAttachment(id string, expected map[string]interface{}, isDelete bool, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeDnsDomainAttachment(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if isDelete {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
domainNames := make(map[string]interface{}, 0)
for _, v := range object.InstanceDomains {
domainNames[v.DomainName] = v.DomainName
}
exceptDomainNames := make(map[string]interface{}, 0)
for _, v := range expected {
for _, vv := range v.([]interface{}) {
exceptDomainNames[vv.(string)] = vv.(string)
}
}
if reflect.DeepEqual(domainNames, exceptDomainNames) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, "", expected, errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *DnsService) SetResourceTags(d *schema.ResourceData, resourceType string) error {
oldItems, newItems := d.GetChange("tags")
added := make([]alidns.TagResourcesTag, 0)
for key, value := range newItems.(map[string]interface{}) {
added = append(added, alidns.TagResourcesTag{
Key: key,
Value: value.(string),
})
}
removed := make([]string, 0)
for key, _ := range oldItems.(map[string]interface{}) {
removed = append(removed, key)
}
if len(removed) > 0 {
request := alidns.CreateUntagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.ResourceType = resourceType
request.TagKey = &removed
raw, err := s.client.WithDnsClient(func(alidnsClient *alidns.Client) (interface{}, error) {
return alidnsClient.UntagResources(request)
})
bresponse, ok := raw.(*responses.CommonResponse)
addDebug(request.GetActionName(), raw)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
}
if len(added) > 0 {
request := alidns.CreateTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.ResourceType = resourceType
request.Tag = &added
raw, err := s.client.WithDnsClient(func(alidnsClient *alidns.Client) (interface{}, error) {
return alidnsClient.TagResources(request)
})
bresponse, ok := raw.(*responses.CommonResponse)
addDebug(request.GetActionName(), raw)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
}
return nil
}
func (s *DnsService) DescribeDnsDomain(id string) (response *DnsDomains, err error) {
did := strings.Split(id, COLON_SEPARATED)
request := s.client.NewCommonRequest("POST", "CloudDns", "2021-06-24", "DescribeGlobalZones", "")
request.Scheme = "HTTP" // CloudDns不支持HTTPS
request.QueryParams["Name"] = did[0]
request.QueryParams["Forwardedregionid"] = s.client.RegionId
request.QueryParams["SignatureVersion"] = "2.1"
request.QueryParams["PageNumber"] = fmt.Sprint(1)
request.QueryParams["PageSize"] = fmt.Sprint(PageSizeLarge)
resp := &DnsDomains{}
bresponse, err := s.client.ProcessCommonRequest(request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"ErrorDomainNotFound"}) {
return resp, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
if response == nil {
return resp, errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return resp, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, "DescribeGlobalZones", errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug("DescribeGlobalZones", response, nil, request)
err = json.Unmarshal(bresponse.GetHttpContentBytes(), resp)
if err != nil {
return resp, errmsgs.WrapError(err)
}
if len(resp.Data) < 1 || resp.AsapiSuccess == true {
return resp, errmsgs.WrapError(err)
}
return resp, nil
}
func SplitDnsZone(zone_id string) string {
did := strings.Split(zone_id, COLON_SEPARATED)
if len(did) >= 2 {
return did[1]
}
return zone_id
}