alicloud/data_source_alicloud_scdn_domains.go (296 lines of code) (raw):

package alicloud import ( "fmt" "regexp" "time" "github.com/PaesslerAG/jsonpath" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" ) func dataSourceAlicloudScdnDomains() *schema.Resource { return &schema.Resource{ Read: dataSourceAlicloudScdnDomainsRead, Schema: map[string]*schema.Schema{ "name_regex": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.ValidateRegexp, ForceNew: true, }, "names": { Type: schema.TypeList, Elem: &schema.Schema{Type: schema.TypeString}, Computed: true, }, "ids": { Type: schema.TypeList, Optional: true, ForceNew: true, Elem: &schema.Schema{Type: schema.TypeString}, Computed: true, }, "resource_group_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "status": { Type: schema.TypeString, Optional: true, ForceNew: true, ValidateFunc: validation.StringInSlice([]string{"check_failed", "checking", "configure_failed", "configuring", "offline", "online"}, false), }, "output_file": { Type: schema.TypeString, Optional: true, }, "domains": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "cert_infos": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "cert_name": { Type: schema.TypeString, Computed: true, }, "cert_type": { Type: schema.TypeString, Computed: true, }, "ssl_protocol": { Type: schema.TypeString, Computed: true, }, "ssl_pub": { Type: schema.TypeString, Computed: true, }, }, }, }, "cname": { Type: schema.TypeString, Computed: true, }, "create_time": { Type: schema.TypeString, Computed: true, }, "description": { Type: schema.TypeString, Computed: true, }, "id": { Type: schema.TypeString, Computed: true, }, "domain_name": { Type: schema.TypeString, Computed: true, }, "gmt_modified": { Type: schema.TypeString, Computed: true, }, "resource_group_id": { Type: schema.TypeString, Computed: true, }, "sources": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "content": { Type: schema.TypeString, Computed: true, }, "enabled": { Type: schema.TypeString, Computed: true, }, "port": { Type: schema.TypeInt, Computed: true, }, "priority": { Type: schema.TypeString, Computed: true, }, "type": { Type: schema.TypeString, Computed: true, }, }, }, }, "status": { Type: schema.TypeString, Computed: true, }, }, }, }, "enable_details": { Type: schema.TypeBool, Optional: true, Default: false, }, }, } } func dataSourceAlicloudScdnDomainsRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "DescribeScdnUserDomains" request := make(map[string]interface{}) if v, ok := d.GetOk("resource_group_id"); ok { request["ResourceGroupId"] = v } if v, ok := d.GetOk("status"); ok { request["DomainStatus"] = v } request["PageSize"] = PageSizeXLarge request["PageNumber"] = 1 var objects []map[string]interface{} var domainNameRegex *regexp.Regexp if v, ok := d.GetOk("name_regex"); ok { r, err := regexp.Compile(v.(string)) if err != nil { return WrapError(err) } domainNameRegex = r } idsMap := make(map[string]string) if v, ok := d.GetOk("ids"); ok { for _, vv := range v.([]interface{}) { if vv == nil { continue } idsMap[vv.(string)] = vv.(string) } } var response map[string]interface{} var err error for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("scdn", "2017-11-15", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DataDefaultErrorMsg, "alicloud_scdn_domains", action, AlibabaCloudSdkGoERROR) } resp, err := jsonpath.Get("$.Domains.PageData", response) if err != nil { return WrapErrorf(err, FailedGetAttributeMsg, action, "$.Domains.PageData", response) } result, _ := resp.([]interface{}) for _, v := range result { item := v.(map[string]interface{}) if domainNameRegex != nil && !domainNameRegex.MatchString(fmt.Sprint(item["DomainName"])) { continue } if len(idsMap) > 0 { if _, ok := idsMap[fmt.Sprint(item["DomainName"])]; !ok { continue } } objects = append(objects, item) } if len(result) < PageSizeLarge { break } request["PageNumber"] = request["PageNumber"].(int) + 1 } ids := make([]string, 0) names := make([]interface{}, 0) s := make([]map[string]interface{}, 0) for _, object := range objects { mapping := map[string]interface{}{ "cname": object["Cname"], "create_time": object["GmtCreated"], "description": object["Description"], "id": fmt.Sprint(object["DomainName"]), "domain_name": fmt.Sprint(object["DomainName"]), "gmt_modified": object["GmtModified"], "resource_group_id": object["ResourceGroupId"], "status": object["DomainStatus"], } ids = append(ids, fmt.Sprint(mapping["id"])) names = append(names, object["DomainName"]) if detailedEnabled := d.Get("enable_details"); !detailedEnabled.(bool) { s = append(s, mapping) continue } id := fmt.Sprint(object["DomainName"]) scdnService := ScdnService{client} getResp1, err := scdnService.DescribeScdnDomainCertificateInfo(id) if err != nil { return WrapError(err) } if certInfosMap, ok := getResp1["CertInfos"].(map[string]interface{}); ok && certInfosMap != nil { if certInfoList, ok := certInfosMap["CertInfo"]; ok && certInfoList != nil { certInfosMaps := make([]map[string]interface{}, 0) for _, certInfoListItem := range certInfoList.([]interface{}) { if certInfoListItemMap, ok := certInfoListItem.(map[string]interface{}); ok { certInfoListItemMap["cert_name"] = certInfoListItemMap["CertName"] certInfoListItemMap["cert_type"] = certInfoListItemMap["CertType"] certInfoListItemMap["ssl_protocol"] = certInfoListItemMap["SslProtocol"] certInfoListItemMap["ssl_pub"] = certInfoListItemMap["SslPub"] certInfosMaps = append(certInfosMaps, certInfoListItemMap) } } mapping["cert_infos"] = certInfosMaps } } getResp4, err := scdnService.DescribeScdnDomain(id) if err != nil { return WrapError(err) } if v, ok := getResp4["Sources"].(map[string]interface{})["Source"].([]interface{}); ok { source := make([]map[string]interface{}, 0) for _, val := range v { item := val.(map[string]interface{}) temp := map[string]interface{}{ "content": item["Content"], "enabled": item["Enabled"], "port": item["Port"], "priority": item["Priority"], "type": item["Type"], } source = append(source, temp) } mapping["sources"] = source } s = append(s, mapping) } d.SetId(dataResourceIdHash(ids)) if err := d.Set("ids", ids); err != nil { return WrapError(err) } if err := d.Set("names", names); err != nil { return WrapError(err) } if err := d.Set("domains", s); err != nil { return WrapError(err) } if output, ok := d.GetOk("output_file"); ok && output.(string) != "" { writeToFile(output.(string), s) } return nil }