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

package alibabacloudstack import ( "fmt" "sort" "strings" "github.com/aliyun/alibaba-cloud-sdk-go/services/dds" "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 dataSourceAlibabacloudStackMongoDBZones() *schema.Resource { return &schema.Resource{ Read: dataSourceAlibabacloudStackMongoDBZonesRead, 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 dataSourceAlibabacloudStackMongoDBZonesRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) multi := d.Get("multi").(bool) var zoneIds []string request := dds.CreateDescribeRegionsRequest() client.InitRpcRequest(*request.RpcRequest) raw, err := client.WithDdsClient(func(ddsClient *dds.Client) (interface{}, error) { return ddsClient.DescribeRegions(request) }) response, ok := raw.(*dds.DescribeRegionsResponse) addDebug(request.GetActionName(), raw, request.RpcRequest, request) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_mongodb_zones", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } if len(response.Regions.DdsRegion) <= 0 { return errmsgs.WrapError(fmt.Errorf("[ERROR] There is no available region for MongoDB.")) } for _, r := range response.Regions.DdsRegion { for _, zonid := range r.Zones.Zone { if multi && strings.Contains(zonid.ZoneId, MULTI_IZ_SYMBOL) && r.RegionId == string(client.Region) { zoneIds = append(zoneIds, zonid.ZoneId) continue } if !multi && !strings.Contains(zonid.ZoneId, MULTI_IZ_SYMBOL) && r.RegionId == string(client.Region) { zoneIds = append(zoneIds, zonid.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": splitMultiZoneId(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 }