terraform-provider-greenhost/digitalocean/spaces_buckets.go

95 lines
2.3 KiB
Go

package digitalocean
import (
"fmt"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
type bucketMetadataStruct struct {
name string
region string
}
func spacesBucketSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Description: "Bucket name",
},
"urn": {
Type: schema.TypeString,
Description: "the uniform resource name for the bucket",
},
"region": {
Type: schema.TypeString,
Description: "Bucket region",
},
"bucket_domain_name": {
Type: schema.TypeString,
Description: "The FQDN of the bucket",
},
}
}
func getSpacesBucketsInRegion(meta interface{}, region string) ([]*s3.Bucket, error) {
client, err := meta.(*CombinedConfig).spacesClient(region)
if err != nil {
return nil, err
}
svc := s3.New(client)
input := s3.ListBucketsInput{}
output, err := svc.ListBuckets(&input)
if err != nil {
return nil, err
}
return output.Buckets, nil
}
func getDigitalOceanBuckets(meta interface{}) ([]interface{}, error) {
// The DigitalOcean API does not currently return what regions have Spaces available. Thus, this
// function hard-codes the regions in which Spaces operates.
//
// This list is current as of April 20, 2020 and is from:
// https://www.digitalocean.com/docs/platform/availability-matrix/#other-product-availability
spacesRegions := []string{"ams3", "fra1", "nyc3", "sfo2", "sgp1"}
var buckets []interface{}
for _, region := range spacesRegions {
bucketsInRegion, err := getSpacesBucketsInRegion(meta, region)
if err != nil {
return nil, err
}
for _, bucketInRegion := range bucketsInRegion {
metadata := &bucketMetadataStruct{
name: *bucketInRegion.Name,
region: region,
}
buckets = append(buckets, metadata)
}
}
return buckets, nil
}
func flattenSpacesBucket(rawBucketMetadata, meta interface{}) (map[string]interface{}, error) {
bucketMetadata := rawBucketMetadata.(*bucketMetadataStruct)
name := bucketMetadata.name
region := bucketMetadata.region
flattenedBucket := map[string]interface{}{}
flattenedBucket["name"] = name
flattenedBucket["region"] = region
flattenedBucket["bucket_domain_name"] = bucketDomainName(name, region)
flattenedBucket["urn"] = fmt.Sprintf("do:space:%s", name)
return flattenedBucket, nil
}