alicloud/data_source_alicloud_dns_resolution_lines.go (152 lines of code) (raw):

package alicloud import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/alidns" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) // https://help.aliyun.com/document_detail/69017.html func dataSourceAlicloudDnsResolutionLines() *schema.Resource { return &schema.Resource{ Read: dataSourceAlicloudDnsResolutionLinesRead, Schema: map[string]*schema.Schema{ "line_codes": { Optional: true, Type: schema.TypeList, ForceNew: true, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "line_display_names": { Type: schema.TypeList, Optional: true, ForceNew: true, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "line_names": { Type: schema.TypeList, Optional: true, ForceNew: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "domain_name": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "user_client_ip": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "lang": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "output_file": { Type: schema.TypeString, Optional: true, }, // computed values "lines": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "line_code": { Type: schema.TypeString, Computed: true, }, "line_display_name": { Type: schema.TypeString, Computed: true, }, "line_name": { Type: schema.TypeString, Computed: true, }, }, }, }, }, } } func dataSourceAlicloudDnsResolutionLinesRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) request := alidns.CreateDescribeSupportLinesRequest() request.RegionId = client.RegionId request.Lang = d.Get("lang").(string) request.UserClientIp = d.Get("user_client_ip").(string) request.DomainName = d.Get("domain_name").(string) raw, err := client.WithDnsClient(func(dnsClient *alidns.Client) (interface{}, error) { return dnsClient.DescribeSupportLines(request) }) if err != nil { return WrapErrorf(err, DataDefaultErrorMsg, "alicloud_dns_support_lines", request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*alidns.DescribeSupportLinesResponse) allLines := response.RecordLines.RecordLine var filteredLines []alidns.RecordLine for _, line := range allLines { if v, ok := d.GetOk("line_codes"); ok { lineCodes, _ := v.([]interface{}) if !hasEqualString(lineCodes, line.LineCode) { continue } } if v, ok := d.GetOk("line_display_names"); ok { lineDisplayNames, _ := v.([]interface{}) if !hasEqualString(lineDisplayNames, line.LineDisplayName) { continue } } if v, ok := d.GetOk("line_names"); ok { lineNames, _ := v.([]interface{}) if !hasEqualString(lineNames, line.LineName) { continue } } filteredLines = append(filteredLines, line) } return resolutionLinesDecriptionAttributes(d, filteredLines, meta) } func resolutionLinesDecriptionAttributes(d *schema.ResourceData, Lines []alidns.RecordLine, meta interface{}) error { var s []map[string]interface{} var lineCodes []string var lineDisplayNames []string for _, line := range Lines { mapping := map[string]interface{}{ "line_code": line.LineCode, "line_display_name": line.LineDisplayName, "line_name": line.LineName, } lineCodes = append(lineCodes, line.LineCode) lineDisplayNames = append(lineDisplayNames, line.LineDisplayName) s = append(s, mapping) } d.SetId(dataResourceIdHash(lineCodes)) if err := d.Set("lines", s); err != nil { return WrapError(err) } if err := d.Set("line_codes", lineCodes); err != nil { return WrapError(err) } if err := d.Set("line_display_names", lineDisplayNames); err != nil { return WrapError(err) } // create a json file in current directory and write data source to it. if output, ok := d.GetOk("output_file"); ok && output.(string) != "" { writeToFile(output.(string), s) } return nil } // to check if a slice has a specific string func hasEqualString(s []interface{}, a string) bool { var isEqual bool for _, code := range s { fatherCode, _ := code.(string) if fatherCode == a { isEqual = true return isEqual } } return isEqual }