alibabacloudstack/resource_apsarastack_oss_bucket.go (729 lines of code) (raw):
package alibabacloudstack
import (
"bytes"
"context"
"encoding/json"
"fmt"
"log"
"strconv"
"time"
"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/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/helper/hashcode"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceAlibabacloudStackOssBucket() *schema.Resource {
resource := &schema.Resource{
Schema: map[string]*schema.Schema{
"bucket": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ValidateFunc: validation.StringLenBetween(3, 63),
Default: resource.PrefixedUniqueId("tf-oss-bucket-"),
},
"acl": {
Type: schema.TypeString,
Default: oss.ACLPrivate,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"private", "public-read", "public-read-write"}, false),
},
"logging": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"target_bucket": {
Type: schema.TypeString,
Required: true,
},
"target_prefix": {
Type: schema.TypeString,
Optional: true,
},
},
},
MaxItems: 1,
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
if k == "logging.#" && old == "1" && new == "0" {
loggings := d.Get("logging").([]interface{})
logging := loggings[0].(map[string]interface{})
if logging["target_bucket"] == "" && logging["target_prefix"] == "" {
return true
}
}
return false
},
},
"creation_date": {
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,
Default: oss.StorageStandard,
Optional: true,
ForceNew: true,
},
"vpclist": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"bucket_sync": {
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"storage_capacity": {
Type: schema.TypeInt,
Optional: true,
Default: -1,
},
"sse_algorithm": {
Type: schema.TypeString,
Default: "",
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"", "AES256", "SM4", "KMS"}, false),
},
"kms_key_id": {
Type: schema.TypeString,
Optional: true,
},
},
// 使用 CustomizeDiff 来添加条件验证
CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, v interface{}) error {
sseAlgorithm := diff.Get("sse_algorithm").(string)
kmsID := diff.Get("kms_key_id").(string)
if sseAlgorithm == "KMS" && kmsID == "" {
return fmt.Errorf("kms_key_id must be set when sse_algorithm is KMS")
}
return nil
},
}
setResourceFunc(resource, resourceAlibabacloudStackOssBucketCreate, resourceAlibabacloudStackOssBucketRead, resourceAlibabacloudStackOssBucketUpdate, resourceAlibabacloudStackOssBucketDelete)
return resource
}
func resourceAlibabacloudStackOssBucketCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ossService := OssService{client}
bucketName := d.Get("bucket").(string)
det, err := ossService.DescribeOssBucket(bucketName)
log.Printf("======================== det:%#v", det)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_oss_bucket", "IsBucketExist", errmsgs.AlibabacloudStackOssGoSdk)
}
acl := d.Get("acl").(string)
storageClass := d.Get("storage_class").(string)
if storageClass == "" {
storageClass = "Standard"
}
// If not present, Create Bucket
if det.BucketInfo.Name == "" {
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "PutBucket"
request.QueryParams["ProductName"] = "oss"
queryParams := map[string]interface{}{
"Department": client.Department,
"ResourceGroup": client.ResourceGroup,
"RegionId": client.RegionId,
"asVersion": "enterprise",
"asArchitechture": "x86",
"haAlibabacloudStack": "true",
"Language": "en",
"BucketName": bucketName,
"StorageClass": storageClass,
"x-oss-acl": acl,
"SSEAlgorithm": storageClass,
}
if querybytes, err := json.Marshal(queryParams); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "json Marshal", "CreateBucket", errmsgs.AlibabacloudStackOssGoSdk)
} else {
request.QueryParams["Params"] = string(querybytes)
}
bresponse, err := client.ProcessCommonRequest(request)
log.Printf("Response of Create Bucket: %s", bresponse)
log.Printf("Bresponse ossbucket before error")
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
if ossNotFoundError(err) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "CreateBucketInfo", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
log.Printf("Bresponse ossbucket after error")
addDebug("CreateBucketInfo", bresponse, request)
log.Printf("Bresponse ossbucket check")
log.Printf("Bresponse ossbucket %s", bresponse)
if bresponse.GetHttpStatus() != 200 {
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_oss_bucket", "CreateBucket", errmsgs.AlibabacloudStackOssGoSdk)
}
//logging:= make(map[string]interface{})
log.Printf("Enter for logging")
//addDebug("CreateBucket", raw, requestInfo, bresponse.GetHttpContentString())
err = resource.Retry(3*time.Minute, func() *resource.RetryError {
det, err := ossService.DescribeOssBucket(bucketName)
if err != nil {
return resource.NonRetryableError(err)
}
if det.BucketInfo.Name == "" {
return resource.RetryableError(errmsgs.Error("Trying to ensure new OSS bucket %#v has been created successfully.", bucketName))
}
return nil
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_oss_bucket", "Bucket Not Found", errmsgs.AlibabacloudStackOssGoSdk)
}
}
// Assign the bucket name as the resource ID
d.SetId(bucketName)
return nil
}
func resourceAlibabacloudStackOssBucketRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ossService := OssService{client}
object, err := ossService.DescribeOssBucket(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
logging, err := resourceAlibabacloudStackOssBucketLoggingDescribe(client, d)
log.Printf("read describe logging %v", logging)
d.Set("bucket", d.Id())
if object.BucketInfo.Name == "" {
log.Print("read: BucketInfo fail!!!!!!")
}
d.Set("creation_date", object.BucketInfo.CreationDate.Format("2006-01-02"))
d.Set("extranet_endpoint", object.BucketInfo.ExtranetEndpoint)
d.Set("intranet_endpoint", object.BucketInfo.IntranetEndpoint)
d.Set("location", object.BucketInfo.Location)
d.Set("owner", object.BucketInfo.Owner.ID)
d.Set("storage_class", object.BucketInfo.StorageClass)
var list []map[string]interface{}
desclog := logging.Data.BucketLoggingStatus.LoggingEnabled
list = append(list, map[string]interface{}{"target_bucket": desclog.TargetBucket, "target_prefix": desclog.TargetPrefix})
if err = d.Set("logging", list); err != nil {
return errmsgs.WrapError(err)
}
bvclient := meta.(*connectivity.AlibabacloudStackClient)
bvserver := BucketVpcService{bvclient}
vpclist, binderr := bvserver.BucketVpcList(d.Get("bucket").(string))
if binderr != nil {
return errmsgs.WrapError(binderr)
}
var vlist []string
if len(vpclist.VpcList) > 0 {
for _, v := range vpclist.VpcList {
vpc := v.(map[string]interface{})
vlist = append(vlist, vpc["vpcId"].(string))
}
}
d.Set("vpclist", vlist)
bucketName := d.Get("bucket").(string)
// 获取同城容灾信息
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "GetBucketSync"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\"}", bucketName)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "GetBucketSync", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
bucketSync := BucketSyncResponse{}
json.Unmarshal([]byte(bresponse.GetHttpContentString()), &bucketSync)
d.Set("bucket_sync", true)
for _, rule := range bucketSync.Data.ReplicationConfiguration.Rule {
if rule.Status == "closing" {
// 容灾关系是成对出现的
d.Set("bucket_sync", false)
break
}
}
// 获取acl信息
request = client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "GetBucketAcl"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\", \"acl\":\"acl\"}", bucketName)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "CreateBucketInfo", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
bucketAcl := BucketAclResponse{}
json.Unmarshal([]byte(bresponse.GetHttpContentString()), &bucketAcl)
d.Set("acl", bucketAcl.Data.AccessControlPolicy.AccessControlList.Grant)
// 获取容量限制信息
request = client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "GetBucketStorageCapacity"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\"}", bucketName)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "GetBucketStorageCapacity", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
storageCapacity := BucketStorageCapacityResponse{}
json.Unmarshal([]byte(bresponse.GetHttpContentString()), &storageCapacity)
if v, err := strconv.Atoi(storageCapacity.Data.BucketUserQos.StorageCapacity); err == nil {
d.Set("storage_capacity", v)
} else {
return errmsgs.WrapErrorf(err, "Get storage capacity failed")
}
// 获取加密信息
request = client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "GetBucketEncryption"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\"}", bucketName)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "GetBucketEncryption", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
storageEncryption := BucketEncryptionResponse{}
json.Unmarshal([]byte(bresponse.GetHttpContentString()), &storageEncryption)
if storageEncryption.Code == "NoSuchServerSideEncryptionRule" {
d.Set("sse_algorithm", "")
} else {
d.Set("sse_algorithm", storageEncryption.Data.ServerSideEncryptionRule.ApplyServerSideEncryptionByDefault.SSEAlgorithm)
if storageEncryption.Data.ServerSideEncryptionRule.ApplyServerSideEncryptionByDefault.SSEAlgorithm == "KMS" {
d.Set("kms_key_id", storageEncryption.Data.ServerSideEncryptionRule.ApplyServerSideEncryptionByDefault.KMSMasterKeyID)
}
}
return nil
}
func resourceAlibabacloudStackOssBucketUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
bucketName := d.Get("bucket").(string)
if (d.IsNewResource() && !d.Get("bucket_sync").(bool)) || (!d.IsNewResource() && d.HasChange("bucket_sync")) {
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
if v := d.Get("bucket_sync").(bool); v {
request.QueryParams["OpenApiAction"] = "PutBucketSync"
} else {
request.QueryParams["OpenApiAction"] = "DeleteBucketSync"
}
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\"}", bucketName)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "CreateBucketInfo", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
}
if (d.IsNewResource() && d.Get("storage_capacity").(int) != -1) || (!d.IsNewResource() && d.HasChange("storage_capacity")) {
storageCapacity := d.Get("storage_capacity").(int)
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "SetBucketStorageCapacity"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\", \"StorageCapacity\":%d}", bucketName, storageCapacity)
request.QueryParams["Content"] = fmt.Sprintf("<BucketUserQos><StorageCapacity>%d</StorageCapacity></BucketUserQos>", storageCapacity)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "PutBucketACL", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
}
if d.HasChange("acl") {
acl := d.Get("acl").(string)
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "PutBucketACL"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\", \"x-oss-acl\":\"%s\"}", bucketName, acl)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "PutBucketACL", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
}
if d.HasChanges("sse_algorithm", "kms_key_id") {
if d.Get("sse_algorithm").(string) == "" {
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "DeleteBucketEncryption"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\"}", bucketName)
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "DeleteBucketEncryption", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
} else {
sse_algorithm := d.Get("sse_algorithm").(string)
kms_key_id := d.Get("kms_key_id").(string)
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "PutBucketEncryption"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"BucketName\":\"%s\"}", bucketName)
if sse_algorithm == "KMS" {
request.QueryParams["Content"] = fmt.Sprintf("<ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>KMS</SSEAlgorithm><KMSMasterKeyID>%s</KMSMasterKeyID></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>", kms_key_id)
} else {
request.QueryParams["Content"] = fmt.Sprintf("<ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>%s</SSEAlgorithm></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>", sse_algorithm)
}
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.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, bucketName, "PutBucketEncryption", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
}
}
if d.HasChange("logging") {
log.Print("changes in logging")
err := resourceAlibabacloudStackOssBucketLoggingCreate(client, d)
if err != nil {
return errmsgs.WrapError(err)
}
}
if d.HasChange("vpclist") {
// FIXME: 调用该接口会,会添加一条所有权限拒绝的规则
o, n := d.GetChange("vpclist")
oldlist := o.([]interface{})
newlist := n.([]interface{})
vpc_err := checkVpcListChange(oldlist, newlist, d, meta)
if vpc_err != nil {
return errmsgs.WrapError(vpc_err)
}
}
return nil
}
func resourceAlibabacloudStackOssBucketDelete(d *schema.ResourceData, meta interface{}) error {
bvclient := meta.(*connectivity.AlibabacloudStackClient)
bvserver := BucketVpcService{bvclient}
vpclist, binderr := bvserver.BucketVpcList(d.Id())
if binderr != nil {
return errmsgs.WrapError(binderr)
}
var vlist []string
if len(vpclist.VpcList) > 0 {
for _, v := range vpclist.VpcList {
vpc := v.(map[string]interface{})
client2 := meta.(*connectivity.AlibabacloudStackClient)
bvserver := BucketVpcService{client2}
binderr := bvserver.UnBindBucket(vpc["vpcId"].(string), d.Id())
if binderr != nil {
return errmsgs.WrapError(binderr)
}
}
}
d.Set("vpclist", vlist)
client := meta.(*connectivity.AlibabacloudStackClient)
ossService := OssService{client}
var requestInfo *oss.Client
det, err := ossService.DescribeOssBucket(d.Id())
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsBucketExist", errmsgs.AlibabacloudStackOssGoSdk)
}
addDebug("IsBucketExist", det.BucketInfo, requestInfo, map[string]string{"bucketName": d.Id()})
if det.BucketInfo.Name == "" {
return nil
}
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
request := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
request.QueryParams["OpenApiAction"] = "DeleteBucket"
request.QueryParams["ProductName"] = "oss"
request.QueryParams["Params"] = fmt.Sprintf("{\"%s\":%s,\"%s\":%s,\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\"}", "Department", client.Department, "ResourceGroup", client.ResourceGroup, "RegionId", client.RegionId, "asVersion", "enterprise", "asArchitechture", "x86", "haAlibabacloudStack", "true", "Language", "en", "BucketName", d.Id(), "StorageClass", "Standard")
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return resource.RetryableError(errmsgs.WrapErrorf(err, "Process Common Request Failed"))
}
if ossNotFoundError(err) {
return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackOssGoSdk))
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return resource.RetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "DeleteBucket", errmsgs.AlibabacloudStackOssGoSdk, errmsg))
}
det, err := ossService.DescribeOssBucket(d.Id())
if err != nil {
return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsBucketExist", errmsgs.AlibabacloudStackOssGoSdk))
}
if det.BucketInfo.Name != "" {
return resource.RetryableError(errmsgs.Error("Trying to delete OSS bucket %#v successfully.", d.Id()))
}
return nil
})
log.Print(err)
return errmsgs.WrapError(ossService.WaitForOssBucket(d.Id(), Deleted, DefaultTimeoutMedium))
}
func checkVpcListChange(oldlist []interface{}, newlist []interface{}, d *schema.ResourceData, meta interface{}) error {
vpclist := []string{}
for _, ovpcid := range oldlist {
isdelete := true
for _, nvpcid := range newlist {
if ovpcid == nvpcid {
isdelete = false
}
}
if isdelete {
client2 := meta.(*connectivity.AlibabacloudStackClient)
bvserver := BucketVpcService{client2}
binderr := bvserver.UnBindBucket(ovpcid.(string), d.Id())
if binderr != nil {
return errmsgs.WrapError(binderr)
}
}
}
for _, nvpcid := range newlist {
iscreate := true
vpclist = append(vpclist, nvpcid.(string))
for _, ovpcid := range oldlist {
if ovpcid == nvpcid {
iscreate = false
}
}
if iscreate {
client := meta.(*connectivity.AlibabacloudStackClient)
vpcServer := VpcService{client}
vpcdata, err := vpcServer.DescribeVpc(nvpcid.(string))
if err != nil {
return errmsgs.WrapError(err)
}
client2 := meta.(*connectivity.AlibabacloudStackClient)
bvserver := BucketVpcService{client2}
binderr := bvserver.BindBucket(vpcdata.VpcId, vpcdata.VpcName, vpcdata.CidrBlock, d.Id())
if binderr != nil {
return errmsgs.WrapError(binderr)
}
}
}
return nil
}
func expirationHash(v interface{}) int {
var buf bytes.Buffer
m := v.(map[string]interface{})
if v, ok := m["date"]; ok {
buf.WriteString(fmt.Sprintf("%s-", v.(string)))
}
if v, ok := m["days"]; ok {
buf.WriteString(fmt.Sprintf("%d-", v.(int)))
}
return hashcode.String(buf.String())
}
func transitionsHash(v interface{}) int {
var buf bytes.Buffer
m := v.(map[string]interface{})
if v, ok := m["created_before_date"]; ok {
buf.WriteString(fmt.Sprintf("%s-", v.(string)))
}
if v, ok := m["storage_class"]; ok {
buf.WriteString(fmt.Sprintf("%s-", v.(string)))
}
if v, ok := m["days"]; ok {
buf.WriteString(fmt.Sprintf("%d-", v.(int)))
}
return hashcode.String(buf.String())
}
func resourceAlibabacloudStackOssBucketLoggingCreate(client *connectivity.AlibabacloudStackClient, d *schema.ResourceData) error {
describelogging, err := resourceAlibabacloudStackOssBucketLoggingDescribe(client, d)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "GetBucketLogging", errmsgs.AlibabacloudStackOssGoSdk)
}
var check Logcheck
if describelogging.Data.BucketLoggingStatus.LoggingEnabled != check {
log.Printf("logging is not null %v", d.Get("logging"))
if _, v := d.GetOk("logging"); v == false {
log.Print("logging is being disabled")
logrequest := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
logrequest.QueryParams["OpenApiAction"] = "PutBucketLogging"
logrequest.QueryParams["ProductName"] = "oss"
logrequest.QueryParams["Content"] = fmt.Sprint("<BucketLoggingStatus></BucketLoggingStatus>")
logrequest.QueryParams["Params"] = fmt.Sprintf("{\"%s\":\"%s\"}", "BucketName", d.Id())
bresponse, err := client.ProcessCommonRequest(logrequest)
log.Printf("Response of Logging Bucket: %s", bresponse)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
if ossNotFoundError(err) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "CreateBucketInfo", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
log.Printf("deleting logs oss done")
} else {
logging := make(map[string]interface{})
log.Print("logging to be updated")
if v := d.Get("logging"); v != nil {
log.Print("logging is being enabled")
all, ok := v.([]interface{})
if ok {
log.Printf("printall %v", all)
for _, a := range all {
logging, _ = a.(map[string]interface{})
log.Printf("check target_bucket %v", logging["target_bucket"])
log.Printf("check target_prefix %v", logging["target_prefix"])
}
bucket := fmt.Sprint(logging["target_bucket"])
log.Printf("checking bucket %v", bucket)
ossService := OssService{client}
_, err := ossService.DescribeOssBucket(bucket)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_oss_bucket", "DescribeBucket")
}
logrequest := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
logrequest.QueryParams["OpenApiAction"] = "PutBucketLogging"
logrequest.QueryParams["ProductName"] = "oss"
logrequest.QueryParams["Content"] = fmt.Sprint("<BucketLoggingStatus><LoggingEnabled><TargetBucket>", logging["target_bucket"], "</TargetBucket><TargetPrefix>", logging["target_prefix"], "</TargetPrefix></LoggingEnabled></BucketLoggingStatus>")
logrequest.QueryParams["Params"] = fmt.Sprintf("{\"%s\":\"%s\"}", "BucketName", d.Id())
bresponse, err := client.ProcessCommonRequest(logrequest)
log.Printf("Response of Logging Bucket: %s", bresponse)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
if ossNotFoundError(err) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "CreateBucketInfo", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
log.Printf("logging oss done")
}
}
}
} else {
logging := make(map[string]interface{})
log.Print("logging is null")
if v := d.Get("logging"); v != nil {
log.Print("logging is being enabled")
all, ok := v.([]interface{})
if ok {
log.Printf("printall %v", all)
for _, a := range all {
logging, _ = a.(map[string]interface{})
log.Printf("check target_bucket %v", logging["target_bucket"])
log.Printf("check target_prefix %v", logging["target_prefix"])
}
bucket := fmt.Sprint(logging["target_bucket"])
log.Printf("checking bucket %v", bucket)
ossService := OssService{client}
_, err := ossService.DescribeOssBucket(bucket)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_oss_bucket", "DescribeBucket")
}
logrequest := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
logrequest.QueryParams["OpenApiAction"] = "PutBucketLogging"
logrequest.QueryParams["ProductName"] = "oss"
logrequest.QueryParams["Content"] = fmt.Sprint("<BucketLoggingStatus><LoggingEnabled><TargetBucket>", logging["target_bucket"], "</TargetBucket><TargetPrefix>", logging["target_prefix"], "</TargetPrefix></LoggingEnabled></BucketLoggingStatus>")
logrequest.QueryParams["Params"] = fmt.Sprintf("{\"%s\":\"%s\"}", "BucketName", d.Id())
bresponse, err := client.ProcessCommonRequest(logrequest)
log.Printf("Response of Logging Bucket: %s", bresponse)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
if ossNotFoundError(err) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackOssGoSdk)
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "CreateBucketInfo", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
log.Printf("logging oss done")
}
}
}
return nil
}
func resourceAlibabacloudStackOssBucketLoggingDescribe(client *connectivity.AlibabacloudStackClient, d *schema.ResourceData) (*Logging, error) {
logdescribe := client.NewCommonRequest("POST", "OneRouter", "2018-12-12", "DoOpenApi", "")
logdescribe.QueryParams["Forwardedregionid"] = client.RegionId
logdescribe.QueryParams["OpenApiAction"] = "GetBucketLogging"
logdescribe.QueryParams["ProductName"] = "oss"
logdescribe.QueryParams["Params"] = fmt.Sprintf("{\"%s\":\"%s\"}", "BucketName", d.Id())
bresponse, err := client.ProcessCommonRequest(logdescribe)
log.Printf("Response of Logging Bucket: %s", bresponse)
if err != nil {
if bresponse == nil {
return &Logging{}, errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return &Logging{}, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "GetBucketLogging", errmsgs.AlibabacloudStackOssGoSdk, errmsg)
}
var describelogging Logging
_ = json.Unmarshal(bresponse.GetHttpContentBytes(), &describelogging)
log.Printf("describerawlogging %v", bresponse)
log.Printf("describelogging %v", describelogging)
return &describelogging, nil
}
type Logcheck struct {
TargetPrefix string `json:"TargetPrefix"`
TargetBucket string `json:"TargetBucket"`
}
type Logging struct {
Data struct {
BucketLoggingStatus struct {
LoggingEnabled struct {
TargetPrefix string `json:"TargetPrefix"`
TargetBucket string `json:"TargetBucket"`
} `json:"LoggingEnabled"`
} `json:"BucketLoggingStatus"`
} `json:"Data"`
API string `json:"api"`
}