alibabacloudstack/data_source_apsarastack_mongodb_instances.go (319 lines of code) (raw):

package alibabacloudstack import ( "regexp" "strings" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "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" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) func dataSourceAlibabacloudStackMongoDBInstances() *schema.Resource { return &schema.Resource{ Read: dataSourceAlibabacloudStackMongoDBInstancesRead, Schema: map[string]*schema.Schema{ "name_regex": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringIsValidRegExp, }, "ids": { Type: schema.TypeList, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Computed: true, }, "instance_type": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringInSlice([]string{"sharding", "replicate"}, false), }, "instance_class": { Type: schema.TypeString, Optional: true, }, "availability_zone": { Type: schema.TypeString, Optional: true, }, "tags": tagsSchema(), "output_file": { Type: schema.TypeString, Optional: true, }, // Computed values "names": { Type: schema.TypeList, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "instances": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "id": { Type: schema.TypeString, Computed: true, }, "name": { Type: schema.TypeString, Computed: true, }, "charge_type": { Type: schema.TypeString, Computed: true, }, "instance_type": { Type: schema.TypeString, Computed: true, }, "region_id": { Type: schema.TypeString, Computed: true, }, "creation_time": { Type: schema.TypeString, Computed: true, }, "expiration_time": { Type: schema.TypeString, Computed: true, }, "status": { Type: schema.TypeString, Computed: true, }, "replication": { Type: schema.TypeString, Computed: true, }, "engine": { Type: schema.TypeString, Computed: true, }, "engine_version": { Type: schema.TypeString, Computed: true, }, "network_type": { Type: schema.TypeString, Computed: true, }, "lock_mode": { Type: schema.TypeString, Computed: true, }, "instance_class": { Type: schema.TypeString, Computed: true, }, "storage": { Type: schema.TypeInt, Computed: true, }, "mongos": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "node_id": { Type: schema.TypeString, Computed: true, }, "description": { Type: schema.TypeString, Computed: true, }, "class": { Type: schema.TypeString, Computed: true, }, }, }, }, "shards": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "node_id": { Type: schema.TypeString, Computed: true, }, "description": { Type: schema.TypeString, Computed: true, }, "class": { Type: schema.TypeString, Computed: true, }, "storage": { Type: schema.TypeInt, Computed: true, }, }, }, }, "availability_zone": { Type: schema.TypeString, Computed: true, }, "tags": { Type: schema.TypeMap, Computed: true, }, }, }, }, }, } } func dataSourceAlibabacloudStackMongoDBInstancesRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) ddsService := MongoDBService{client} request := dds.CreateDescribeDBInstancesRequest() client.InitRpcRequest(*request.RpcRequest) request.PageSize = requests.NewInteger(PageSizeLarge) request.PageNumber = requests.NewInteger(1) if v, ok := d.GetOk("instance_type"); ok { request.DBInstanceType = v.(string) } if v, ok := d.GetOk("tags"); ok { var reqTags []dds.DescribeDBInstancesTag for key, value := range v.(map[string]interface{}) { reqTags = append(reqTags, dds.DescribeDBInstancesTag{ Key: key, Value: value.(string), }) } request.Tag = &reqTags } var nameRegex *regexp.Regexp if v, ok := d.GetOk("name_regex"); ok { nameRegex = regexp.MustCompile(v.(string)) } var instClass string if v, ok := d.GetOk("instance_class"); ok { instClass = strings.ToLower(v.(string)) } var az string if v, ok := d.GetOk("availability_zone"); ok { az = strings.ToLower(v.(string)) } var dbi []dds.DBInstance idsMap := make(map[string]string) if v, ok := d.GetOk("ids"); ok { for _, vv := range v.([]interface{}) { idsMap[vv.(string)] = vv.(string) } } for { raw, err := client.WithDdsClient(func(ddsClient *dds.Client) (interface{}, error) { return ddsClient.DescribeDBInstances(request) }) response, ok := raw.(*dds.DescribeDBInstancesResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_mongodb_instances", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if len(response.DBInstances.DBInstance) < 1 { break } for _, item := range response.DBInstances.DBInstance { if nameRegex != nil && !nameRegex.MatchString(item.DBInstanceDescription) { continue } if len(instClass) > 0 && instClass != strings.ToLower(string(item.DBInstanceClass)) { continue } if len(az) > 0 && az != strings.ToLower(string(item.ZoneId)) { continue } if len(idsMap) > 0 { if _, ok := idsMap[item.DBInstanceId]; !ok { continue } } dbi = append(dbi, item) } if len(response.DBInstances.DBInstance) < PageSizeLarge { break } page, err := getNextpageNumber(request.PageNumber) if err != nil { return errmsgs.WrapError(err) } request.PageNumber = page } var ids []string var names []string var s []map[string]interface{} for _, item := range dbi { mapping := map[string]interface{}{ "id": item.DBInstanceId, "name": item.DBInstanceDescription, "charge_type": item.ChargeType, "instance_type": item.DBInstanceType, "region_id": item.RegionId, "creation_time": item.CreationTime, "expiration_time": item.ExpireTime, "status": item.DBInstanceStatus, "engine": item.Engine, "engine_version": item.EngineVersion, "network_type": item.NetworkType, "lock_mode": item.LockMode, "availability_zone": item.ZoneId, "instance_class": item.DBInstanceClass, "storage": item.DBInstanceStorage, "replication": item.ReplicationFactor, "tags": ddsService.tagsToMap(item.Tags.Tag), } mongoList := []map[string]interface{}{} for _, v := range item.MongosList.MongosAttribute { mongo := map[string]interface{}{ "description": v.NodeDescription, "node_id": v.NodeId, "class": v.NodeClass, } mongoList = append(mongoList, mongo) } shardList := []map[string]interface{}{} for _, v := range item.ShardList.ShardAttribute { shard := map[string]interface{}{ "description": v.NodeDescription, "node_id": v.NodeId, "class": v.NodeClass, "storage": v.NodeStorage, } shardList = append(shardList, shard) } mapping["mongos"] = mongoList mapping["shards"] = shardList ids = append(ids, item.DBInstanceId) names = append(names, item.DBInstanceDescription) s = append(s, mapping) } d.SetId(dataResourceIdHash(ids)) if err := d.Set("instances", s); err != nil { return errmsgs.WrapError(err) } if err := d.Set("ids", ids); err != nil { return errmsgs.WrapError(err) } if err := d.Set("names", names); err != nil { return errmsgs.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) != "" { err := writeToFile(output.(string), s) if err != nil { return errmsgs.WrapError(err) } } return nil }