alibabacloudstack/data_source_apsarastack_oss_buckets.go (176 lines of code) (raw):
package alibabacloudstack
import (
"encoding/xml"
"regexp"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"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 dataSourceAlibabacloudStackOssBuckets() *schema.Resource {
return &schema.Resource{
Read: dataSourceAlibabacloudStackOssBucketsRead,
Schema: map[string]*schema.Schema{
"ids": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
ForceNew: true,
MinItems: 1,
},
"name_regex": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringIsValidRegExp,
ForceNew: true,
},
"output_file": {
Type: schema.TypeString,
Optional: true,
},
// Computed values
"names": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"buckets": {
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,
},
"acl": {
Type: schema.TypeString,
Computed: true,
},
"extranet_endpoint": {
Type: schema.TypeString,
Computed: true,
},
"intranet_endpoint": {
Type: schema.TypeString,
Computed: true,
},
"location": {
Type: schema.TypeString,
Computed: true,
},
"owner": {
Type: schema.TypeString,
Computed: true,
},
"storage_class": {
Type: schema.TypeString,
Computed: true,
},
"creation_date": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
},
}
}
func dataSourceAlibabacloudStackOssBucketsRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
var requestInfo *oss.Client
var allBuckets []oss.BucketProperties
nextMarker := ""
for {
var options []oss.Option
if nextMarker != "" {
options = append(options, oss.Marker(nextMarker))
}
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "GetService"
request.QueryParams["ProductName"] = "oss"
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
if ossNotFoundError(err) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "GetBucketInfo", errmsgs.AlibabacloudStackLogGoSdkERROR, errmsg)
}
addDebug("GetBucketInfo", bresponse, requestInfo, request)
buckets, err := getBucketListResponseBuckets(bresponse)
if err != nil {
return errmsgs.WrapError(err)
}
for _, k := range buckets {
allBuckets = append(allBuckets, oss.BucketProperties{
XMLName: xml.Name{},
Name: k.Name,
Location: k.Location,
StorageClass: k.StorageClass,
CreationDate: k.CreationDate,
Extranetendpoint: k.ExtranetEndpoint,
Intranetendpoint: k.IntranetEndpoint,
})
}
break
}
var filteredBucketsTemp []oss.BucketProperties
nameRegex, ok := d.GetOk("name_regex")
if ok && nameRegex.(string) != "" {
var r *regexp.Regexp
if nameRegex != "" {
r = regexp.MustCompile(nameRegex.(string))
}
for _, bucket := range allBuckets {
if r != nil && !r.MatchString(bucket.Name) {
continue
}
filteredBucketsTemp = append(filteredBucketsTemp, bucket)
}
} else {
filteredBucketsTemp = allBuckets
}
return bucketsDescriptionAttributes(d, filteredBucketsTemp, meta)
}
func bucketsDescriptionAttributes(d *schema.ResourceData, buckets []oss.BucketProperties, meta interface{}) error {
var ids []string
var s []map[string]interface{}
var names []string
for _, bucket := range buckets {
mapping := map[string]interface{}{
"id": bucket.Name,
"name": bucket.Name,
"location": bucket.Location,
"storage_class": bucket.StorageClass,
"creation_date": bucket.CreationDate,
"extranet_endpoint": bucket.Extranetendpoint,
"intranet_endpoint": bucket.Intranetendpoint,
}
ids = append(ids, bucket.Name)
s = append(s, mapping)
names = append(names, bucket.Name)
}
d.SetId(dataResourceIdHash(ids))
if err := d.Set("buckets", s); err != nil {
return errmsgs.WrapError(err)
}
if err := d.Set("names", names); 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
}