alibabacloudstack/data_source_apsarastack_hbase_clusters.go (255 lines of code) (raw):
package alibabacloudstack
import (
"regexp"
"strings"
"github.com/aliyun/alibaba-cloud-sdk-go/services/hbase"
"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 dataSourceAlibabacloudStackHBaseInstances() *schema.Resource {
return &schema.Resource{
Read: dataSourceAlibabacloudStackHBaseInstancesRead,
Schema: map[string]*schema.Schema{
"name_regex": {
Type: schema.TypeString,
Optional: true,
},
"ids": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"availability_zone": {
Type: schema.TypeString,
Optional: true,
},
"output_file": {
Type: schema.TypeString,
Optional: true,
},
"tags": tagsSchema(),
"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,
},
"region_id": {
Type: schema.TypeString,
Computed: true,
},
"zone_id": {
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,
},
"master_instance_type": {
Type: schema.TypeString,
Computed: true,
},
"master_node_count": {
Type: schema.TypeInt,
Computed: true,
},
"core_instance_type": {
Type: schema.TypeString,
Computed: true,
},
"core_node_count": {
Type: schema.TypeInt,
Computed: true,
},
"core_disk_type": {
Type: schema.TypeString,
Computed: true,
},
"core_disk_size": {
Type: schema.TypeInt,
Computed: true,
},
"vpc_id": {
Type: schema.TypeString,
Computed: true,
},
"vswitch_id": {
Type: schema.TypeString,
Computed: true,
},
"pay_type": {
Type: schema.TypeString,
Computed: true,
},
"created_time": {
Type: schema.TypeString,
Computed: true,
},
"expire_time": {
Type: schema.TypeString,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"backup_status": {
Type: schema.TypeString,
Computed: true,
},
"deletion_protection": {
Type: schema.TypeBool,
Computed: true,
},
"tags": tagsSchema(),
},
},
},
},
}
}
func dataSourceAlibabacloudStackHBaseInstancesRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
hbaseService := HBaseService{client}
request := hbase.CreateDescribeInstancesRequest()
client.InitRpcRequest(*request.RpcRequest)
var nameRegex *regexp.Regexp
if v, ok := d.GetOk("name_regex"); ok {
nameRegex = regexp.MustCompile(v.(string))
}
var az string
if v, ok := d.GetOk("availability_zone"); ok {
az = strings.ToLower(v.(string))
}
var dbi []hbase.Instance
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)
}
}
if v, ok := d.GetOk("tags"); ok {
var reqTags []hbase.DescribeInstancesTag
for key, value := range v.(map[string]interface{}) {
reqTags = append(reqTags, hbase.DescribeInstancesTag{
Key: key,
Value: value.(string),
})
}
request.Tag = &reqTags
}
for {
raw, err := client.WithHbaseClient(func(hbaseClient *hbase.Client) (interface{}, error) {
return hbaseClient.DescribeInstances(request)
})
response, ok := raw.(*hbase.DescribeInstancesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_hbase_instances", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.Instances.Instance) < 1 {
break
}
for _, item := range response.Instances.Instance {
if nameRegex != nil && !nameRegex.MatchString(item.InstanceName) {
continue
}
if len(az) > 0 && az != strings.ToLower(item.ZoneId) {
continue
}
if len(idsMap) > 0 {
if _, ok := idsMap[item.InstanceId]; !ok {
continue
}
}
dbi = append(dbi, item)
}
if len(response.Instances.Instance) < 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.InstanceId,
"name": item.InstanceName,
"region_id": item.RegionId,
"zone_id": item.ZoneId,
"engine": item.Engine,
"engine_version": item.MajorVersion,
"network_type": item.NetworkType,
"master_instance_type": item.MasterInstanceType,
"master_node_count": item.MasterNodeCount,
"core_instance_type": item.CoreInstanceType,
"core_node_count": item.CoreNodeCount,
"core_disk_type": item.CoreDiskType,
"core_disk_size": item.CoreDiskSize,
"vpc_id": item.VpcId,
"vswitch_id": item.VswitchId,
"pay_type": item.PayType,
"status": item.Status,
"backup_status": item.BackupStatus,
"created_time": item.CreatedTimeUTC,
"expire_time": item.ExpireTimeUTC,
"deletion_protection": item.IsDeletionProtection,
"tags": hbaseService.tagsToMap(item.Tags.Tag),
}
ids = append(ids, item.InstanceId)
names = append(names, item.InstanceName)
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
}