alibabacloudstack/data_source_apsarastack_polardb_zones.go (113 lines of code) (raw):

package alibabacloudstack import ( "fmt" "sort" "strings" "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" ) func dataSourceAlibabacloudStackPolardbZones() *schema.Resource { return &schema.Resource{ Read: dataSourceAlibabacloudStackPolardbZonesRead, Schema: map[string]*schema.Schema{ "multi": { Type: schema.TypeBool, Optional: true, Default: false, }, "output_file": { Type: schema.TypeString, Optional: true, }, "ids": { Type: schema.TypeList, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "zones": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "id": { Type: schema.TypeString, Computed: true, }, "multi_zone_ids": { Type: schema.TypeList, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, }, }, }, }, } } func dataSourceAlibabacloudStackPolardbZonesRead(d *schema.ResourceData, meta interface{}) error { multi := d.Get("multi").(bool) var zoneIds []string client := meta.(*connectivity.AlibabacloudStackClient) polardbbackup_policyservice := PolardbService{client} response, err := polardbbackup_policyservice.DoPolardbDescriberegionsRequest(d, client) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_polardb_zones", errmsgs.AlibabacloudStackSdkGoERROR) } if len(response.Regions.RDSRegion) <= 0 { return errmsgs.WrapError(fmt.Errorf("[ERROR] There is no available zone for RDS.")) } for _, r := range response.Regions.RDSRegion { if multi && strings.Contains(r.ZoneId, MULTI_IZ_SYMBOL) && r.RegionId == string(client.Region) { zoneIds = append(zoneIds, r.ZoneId) continue } if !multi && !strings.Contains(r.ZoneId, MULTI_IZ_SYMBOL) && r.RegionId == string(client.Region) { zoneIds = append(zoneIds, r.ZoneId) continue } } if len(zoneIds) > 0 { sort.Strings(zoneIds) } var s []map[string]interface{} if !multi { for _, zoneId := range zoneIds { mapping := map[string]interface{}{"id": zoneId} s = append(s, mapping) } } else { for _, zoneId := range zoneIds { mapping := map[string]interface{}{ "id": zoneId, "multi_zone_ids": PolardbsplitMultiZoneId(zoneId), } s = append(s, mapping) } } d.SetId(dataResourceIdHash(zoneIds)) if err := d.Set("zones", s); err != nil { return errmsgs.WrapError(err) } if err := d.Set("ids", zoneIds); err != nil { return errmsgs.WrapError(err) } if output, ok := d.GetOk("output_file"); ok && output.(string) != "" { if err := writeToFile(output.(string), s); err != nil { return err } } return nil } func PolardbsplitMultiZoneId(id string) (ids []string) { if !(strings.Contains(id, MULTI_IZ_SYMBOL) || strings.Contains(id, "(")) { return } firstIndex := strings.Index(id, MULTI_IZ_SYMBOL) secondIndex := strings.Index(id, "(") for _, p := range strings.Split(id[secondIndex+1:len(id)-1], COMMA_SEPARATED) { ids = append(ids, id[:firstIndex]+string(p)) } return }