diff --git a/.changelog/3367.txt b/.changelog/3367.txt new file mode 100644 index 0000000000..844aeadc5f --- /dev/null +++ b/.changelog/3367.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_vpc_bandwidth_package: support modify `internet_max_bandwidth` +``` \ No newline at end of file diff --git a/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.go b/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.go index a18e3776fa..0cecf46629 100644 --- a/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.go +++ b/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.go @@ -17,8 +17,8 @@ import ( func ResourceTencentCloudVpcBandwidthPackage() *schema.Resource { return &schema.Resource{ - Read: resourceTencentCloudVpcBandwidthPackageRead, Create: resourceTencentCloudVpcBandwidthPackageCreate, + Read: resourceTencentCloudVpcBandwidthPackageRead, Update: resourceTencentCloudVpcBandwidthPackageUpdate, Delete: resourceTencentCloudVpcBandwidthPackageDelete, Importer: &schema.ResourceImporter{ @@ -78,12 +78,13 @@ func ResourceTencentCloudVpcBandwidthPackage() *schema.Resource { } func resourceTencentCloudVpcBandwidthPackageCreate(d *schema.ResourceData, meta interface{}) error { - defer tccommon.LogElapsed("resource.tencentcloud_bwp_bandwidth_package.create")() + defer tccommon.LogElapsed("resource.tencentcloud_vpc_bandwidth_package.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} request = vpc.NewCreateBandwidthPackageRequest() response *vpc.CreateBandwidthPackageResponse ) @@ -100,7 +101,7 @@ func resourceTencentCloudVpcBandwidthPackageCreate(d *schema.ResourceData, meta request.BandwidthPackageName = helper.String(v.(string)) } - if v, ok := d.GetOk("internet_max_bandwidth"); ok { + if v, ok := d.GetOkExists("internet_max_bandwidth"); ok { request.InternetMaxBandwidth = helper.IntInt64(v.(int)) } @@ -110,6 +111,7 @@ func resourceTencentCloudVpcBandwidthPackageCreate(d *schema.ResourceData, meta Key: helper.String(tagKey), Value: helper.String(tagValue), } + request.Tags = append(request.Tags, &tag) } } @@ -127,24 +129,29 @@ func resourceTencentCloudVpcBandwidthPackageCreate(d *schema.ResourceData, meta if e != nil { return tccommon.RetryError(e) } else { - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Create vpc bandwidthPackage failed, Response is nil.")) + } + response = result return nil }) if err != nil { - log.Printf("[CRITAL]%s create bwp bandwidthPackage failed, reason:%+v", logId, err) + log.Printf("[CRITAL]%s create vpc bandwidthPackage failed, reason:%+v", logId, err) return err } - bandwidthPackageId := *response.Response.BandwidthPackageId + if response.Response.BandwidthPackageId == nil { + return fmt.Errorf("BandwidthPackageId is nil.") + } + bandwidthPackageId := *response.Response.BandwidthPackageId d.SetId(bandwidthPackageId) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - if tags := helper.GetTags(d, "tags"); len(tags) > 0 { tagService := svctag.NewTagService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) region := meta.(tccommon.ProviderMeta).GetAPIV3Conn().Region @@ -154,20 +161,24 @@ func resourceTencentCloudVpcBandwidthPackageCreate(d *schema.ResourceData, meta } } - service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + // wait err = resource.Retry(3*tccommon.ReadRetryTimeout, func() *resource.RetryError { instance, errRet := service.DescribeVpcBandwidthPackage(ctx, bandwidthPackageId) if errRet != nil { return tccommon.RetryError(errRet, tccommon.InternalError) } + if instance == nil { return resource.RetryableError(fmt.Errorf("vpc bandwidthPackage instance is being created, retry...")) } + if *instance.Status == "CREATED" { return nil } + return resource.RetryableError(fmt.Errorf("vpc bandwidthPackage instance status is %v, retry...", *instance.Status)) }) + if err != nil { return err } @@ -176,27 +187,25 @@ func resourceTencentCloudVpcBandwidthPackageCreate(d *schema.ResourceData, meta } func resourceTencentCloudVpcBandwidthPackageRead(d *schema.ResourceData, meta interface{}) error { - defer tccommon.LogElapsed("resource.tencentcloud_bwp_bandwidth_package.read")() + defer tccommon.LogElapsed("resource.tencentcloud_vpc_bandwidth_package.read")() + defer tccommon.LogElapsed("resource.tencentcloud_vpc_bandwidth_package.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - bandwidthPackageId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + bandwidthPackageId = d.Id() + ) bandwidthPackage, err := service.DescribeVpcBandwidthPackage(ctx, bandwidthPackageId) - if err != nil { return err } if bandwidthPackage == nil { d.SetId("") - log.Printf("[WARN]%s resource `tencentcloud_vpc_bandwidth_package` [%s] not found, please check if it has been deleted.", - logId, bandwidthPackageId, - ) + log.Printf("[WARN]%s resource `tencentcloud_vpc_bandwidth_package` [%s] not found, please check if it has been deleted.", logId, bandwidthPackageId) return nil } @@ -226,6 +235,7 @@ func resourceTencentCloudVpcBandwidthPackageRead(d *schema.ResourceData, meta in if err != nil { return err } + _ = d.Set("tags", tags) return nil @@ -235,14 +245,14 @@ func resourceTencentCloudVpcBandwidthPackageUpdate(d *schema.ResourceData, meta defer tccommon.LogElapsed("resource.tencentcloud_vpc_bandwidth_package.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - bandwidthPackageId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + bandwidthPackageId = d.Id() + ) immutableArgs := []string{ "network_type", - "internet_max_bandwidth", "egress", } @@ -252,33 +262,56 @@ func resourceTencentCloudVpcBandwidthPackageUpdate(d *schema.ResourceData, meta } } - request := vpc.NewModifyBandwidthPackageAttributeRequest() - request.BandwidthPackageId = &bandwidthPackageId - - if v, ok := d.GetOk("bandwidth_package_name"); ok { - request.BandwidthPackageName = helper.String(v.(string)) - } + if d.HasChange("bandwidth_package_name") || d.HasChange("charge_type") { + request := vpc.NewModifyBandwidthPackageAttributeRequest() + request.BandwidthPackageId = &bandwidthPackageId + if v, ok := d.GetOk("bandwidth_package_name"); ok { + request.BandwidthPackageName = helper.String(v.(string)) + } - if d.HasChange("charge_type") { if v, ok := d.GetOk("charge_type"); ok { request.ChargeType = helper.String(v.(string)) } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyBandwidthPackageAttribute(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s Modify vpc bandwidthPackage attribute failed, reason:%+v", logId, err) + return err + } } - err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyBandwidthPackageAttribute(request) - if e != nil { - return tccommon.RetryError(e) - } else { - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + if d.HasChange("internet_max_bandwidth") { + request := vpc.NewModifyBandwidthPackageBandwidthRequest() + request.BandwidthPackageId = &bandwidthPackageId + if v, ok := d.GetOkExists("internet_max_bandwidth"); ok { + request.InternetMaxBandwidth = helper.IntInt64(v.(int)) } - return nil - }) - if err != nil { - log.Printf("[CRITAL]%s create vpc bandwidthPackage failed, reason:%+v", logId, err) - return err + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyBandwidthPackageBandwidth(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s Modify vpc bandwidthPackage bandWidth failed, reason:%+v", logId, err) + return err + } } if d.HasChange("tags") { @@ -296,15 +329,15 @@ func resourceTencentCloudVpcBandwidthPackageUpdate(d *schema.ResourceData, meta } func resourceTencentCloudVpcBandwidthPackageDelete(d *schema.ResourceData, meta interface{}) error { - defer tccommon.LogElapsed("resource.tencentcloud_bwp_bandwidth_package.delete")() + defer tccommon.LogElapsed("resource.tencentcloud_vpc_bandwidth_package.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - bandwidthPackageId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + bandwidthPackageId = d.Id() + ) if err := service.DeleteVpcBandwidthPackageById(ctx, bandwidthPackageId); err != nil { return err diff --git a/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.md b/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.md index 82b47d8652..314844b9df 100644 --- a/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.md +++ b/tencentcloud/services/vpc/resource_tc_vpc_bandwidth_package.md @@ -1,4 +1,4 @@ -Provides a resource to create a vpc bandwidth_package +Provides a resource to create a VPC bandwidth package Example Usage @@ -7,8 +7,8 @@ resource "tencentcloud_vpc_bandwidth_package" "example" { network_type = "BGP" charge_type = "TOP5_POSTPAID_BY_MONTH" bandwidth_package_name = "tf-example" - tags = { - "createdBy" = "terraform" + tags = { + createdBy = "Terraform" } } ``` @@ -16,14 +16,14 @@ resource "tencentcloud_vpc_bandwidth_package" "example" { PrePaid Bandwidth Package ```hcl -resource "tencentcloud_vpc_bandwidth_package" "bandwidth_package" { +resource "tencentcloud_vpc_bandwidth_package" "example" { network_type = "BGP" charge_type = "FIXED_PREPAID_BY_MONTH" - bandwidth_package_name = "test-001" + bandwidth_package_name = "tf-example" time_span = 3 internet_max_bandwidth = 100 - tags = { - "createdBy" = "terraform" + tags = { + createdBy = "Terraform" } } ```` @@ -38,7 +38,7 @@ resource "tencentcloud_vpc_bandwidth_package" "example" { internet_max_bandwidth = 400 egress = "center_egress2" tags = { - "createdBy" = "terraform" + createdBy = "Terraform" } } ``` @@ -47,5 +47,5 @@ Import vpc bandwidth_package can be imported using the id, e.g. ``` -$ terraform import tencentcloud_vpc_bandwidth_package.bandwidth_package bandwidthPackage_id +$ terraform import tencentcloud_vpc_bandwidth_package.example bwp-hq8h7qpy ``` \ No newline at end of file diff --git a/tencentcloud/services/vpc/service_tencentcloud_vpc.go b/tencentcloud/services/vpc/service_tencentcloud_vpc.go index 28e35f9a8c..0b9d91bdb7 100644 --- a/tencentcloud/services/vpc/service_tencentcloud_vpc.go +++ b/tencentcloud/services/vpc/service_tencentcloud_vpc.go @@ -5553,10 +5553,11 @@ func (me *VpcService) DeleteAssistantCidr(ctx context.Context, request *vpc.Dele return } -func (me *VpcService) DescribeVpcBandwidthPackage(ctx context.Context, bandwidthPackageId string) (resource *vpc.BandwidthPackage, errRet error) { +func (me *VpcService) DescribeVpcBandwidthPackage(ctx context.Context, bandwidthPackageId string) (res *vpc.BandwidthPackage, errRet error) { var ( - logId = tccommon.GetLogId(ctx) - request = vpc.NewDescribeBandwidthPackagesRequest() + logId = tccommon.GetLogId(ctx) + request = vpc.NewDescribeBandwidthPackagesRequest() + response = vpc.NewDescribeBandwidthPackagesResponse() ) defer func() { @@ -5567,26 +5568,30 @@ func (me *VpcService) DescribeVpcBandwidthPackage(ctx context.Context, bandwidth }() request.BandwidthPackageIds = []*string{&bandwidthPackageId} - //request.Filters = append( - // request.Filters, - // &bwp.Filter{ - // Name: helper.String("bandwidth-package_id"), - // Values: []*string{&bandwidthPackageId}, - // }, - //) - ratelimit.Check(request.GetAction()) - response, err := me.client.UseVpcClient().DescribeBandwidthPackages(request) + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseVpcClient().DescribeBandwidthPackages(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Describe bwp bandwidthPackage failed, Response is nil.")) + } + + response = result + return nil + }) + if err != nil { - log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", - logId, request.GetAction(), request.ToJsonString(), err.Error()) errRet = err return } - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - if response != nil && len(response.Response.BandwidthPackageSet) > 0 { - resource = response.Response.BandwidthPackageSet[0] + if len(response.Response.BandwidthPackageSet) > 0 { + res = response.Response.BandwidthPackageSet[0] } return @@ -5596,24 +5601,30 @@ func (me *VpcService) DeleteVpcBandwidthPackageById(ctx context.Context, bandwid logId := tccommon.GetLogId(ctx) request := vpc.NewDeleteBandwidthPackageRequest() - request.BandwidthPackageId = &bandwidthPackageId defer func() { if errRet != nil { - log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", - logId, "delete object", request.ToJsonString(), errRet.Error()) + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "delete object", request.ToJsonString(), errRet.Error()) } }() - ratelimit.Check(request.GetAction()) - response, err := me.client.UseVpcClient().DeleteBandwidthPackage(request) + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseVpcClient().DeleteBandwidthPackage(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + if err != nil { errRet = err return err } - log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", - logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) return } diff --git a/website/docs/r/vpc_bandwidth_package.html.markdown b/website/docs/r/vpc_bandwidth_package.html.markdown index 9dc2e5f2ba..d2dd966a62 100644 --- a/website/docs/r/vpc_bandwidth_package.html.markdown +++ b/website/docs/r/vpc_bandwidth_package.html.markdown @@ -4,12 +4,12 @@ layout: "tencentcloud" page_title: "TencentCloud: tencentcloud_vpc_bandwidth_package" sidebar_current: "docs-tencentcloud-resource-vpc_bandwidth_package" description: |- - Provides a resource to create a vpc bandwidth_package + Provides a resource to create a VPC bandwidth package --- # tencentcloud_vpc_bandwidth_package -Provides a resource to create a vpc bandwidth_package +Provides a resource to create a VPC bandwidth package ## Example Usage @@ -19,7 +19,7 @@ resource "tencentcloud_vpc_bandwidth_package" "example" { charge_type = "TOP5_POSTPAID_BY_MONTH" bandwidth_package_name = "tf-example" tags = { - "createdBy" = "terraform" + createdBy = "Terraform" } } ``` @@ -27,14 +27,14 @@ resource "tencentcloud_vpc_bandwidth_package" "example" { ### PrePaid Bandwidth Package ```hcl -resource "tencentcloud_vpc_bandwidth_package" "bandwidth_package" { +resource "tencentcloud_vpc_bandwidth_package" "example" { network_type = "BGP" charge_type = "FIXED_PREPAID_BY_MONTH" - bandwidth_package_name = "test-001" + bandwidth_package_name = "tf-example" time_span = 3 internet_max_bandwidth = 100 tags = { - "createdBy" = "terraform" + createdBy = "Terraform" } } ``` @@ -49,7 +49,7 @@ resource "tencentcloud_vpc_bandwidth_package" "example" { internet_max_bandwidth = 400 egress = "center_egress2" tags = { - "createdBy" = "terraform" + createdBy = "Terraform" } } ``` @@ -78,6 +78,6 @@ In addition to all arguments above, the following attributes are exported: vpc bandwidth_package can be imported using the id, e.g. ``` -$ terraform import tencentcloud_vpc_bandwidth_package.bandwidth_package bandwidthPackage_id +$ terraform import tencentcloud_vpc_bandwidth_package.example bwp-hq8h7qpy ```