Skip to content

Commit d7b37b8

Browse files
authored
Merge pull request #1343 from gitmkn/feat/cam-support
feat: support vpc bandwidth
2 parents c0f019e + 31eea17 commit d7b37b8

10 files changed

+947
-2
lines changed

.changelog/1343.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
```release-note:new-resource
2+
tencentcloud_vpc_bandwidth_package
3+
tencentcloud_vpc_bandwidth_package_attachment
4+
```

tencentcloud/provider.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,8 @@ Virtual Private Cloud(VPC)
610610
tencentcloud_nat_gateway_snat
611611
tencentcloud_ha_vip
612612
tencentcloud_ha_vip_eip_attachment
613+
tencentcloud_vpc_bandwidth_package
614+
tencentcloud_vpc_bandwidth_package_attachment
613615
614616
VPN
615617
Data Source
@@ -1262,8 +1264,10 @@ func Provider() terraform.ResourceProvider {
12621264
"tencentcloud_teo_custom_error_page": resourceTencentCloudTeoCustomErrorPage(),
12631265
// "tencentcloud_teo_host_certificate": resourceTencentCloudTeoHostCertificate(),
12641266
// "tencentcloud_teo_default_certificate": resourceTencentCloudTeoDefaultCertificate(),
1265-
"tencentcloud_tcm_mesh": resourceTencentCloudTcmMesh(),
1266-
"tencentcloud_tcm_cluster_attachment": resourceTencentCloudTcmClusterAttachment(),
1267+
"tencentcloud_tcm_mesh": resourceTencentCloudTcmMesh(),
1268+
"tencentcloud_tcm_cluster_attachment": resourceTencentCloudTcmClusterAttachment(),
1269+
"tencentcloud_vpc_bandwidth_package": resourceTencentCloudVpcBandwidthPackage(),
1270+
"tencentcloud_vpc_bandwidth_package_attachment": resourceTencentCloudVpcBandwidthPackageAttachment(),
12671271
},
12681272

12691273
ConfigureFunc: providerConfigure,
Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
/*
2+
Provides a resource to create a vpc bandwidth_package
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_vpc_bandwidth_package" "bandwidth_package" {
8+
network_type = "BGP"
9+
charge_type = "TOP5_POSTPAID_BY_MONTH"
10+
bandwidth_package_name = "test-001"
11+
tags = {
12+
"createdBy" = "terraform"
13+
}
14+
}
15+
16+
```
17+
Import
18+
19+
vpc bandwidth_package can be imported using the id, e.g.
20+
```
21+
$ terraform import tencentcloud_vpc_bandwidth_package.bandwidth_package bandwidthPackage_id
22+
```
23+
*/
24+
package tencentcloud
25+
26+
import (
27+
"context"
28+
"fmt"
29+
"log"
30+
31+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
32+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
33+
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
34+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
35+
)
36+
37+
func resourceTencentCloudVpcBandwidthPackage() *schema.Resource {
38+
return &schema.Resource{
39+
Read: resourceTencentCloudVpcBandwidthPackageRead,
40+
Create: resourceTencentCloudVpcBandwidthPackageCreate,
41+
Update: resourceTencentCloudVpcBandwidthPackageUpdate,
42+
Delete: resourceTencentCloudVpcBandwidthPackageDelete,
43+
Importer: &schema.ResourceImporter{
44+
State: schema.ImportStatePassthrough,
45+
},
46+
Schema: map[string]*schema.Schema{
47+
"network_type": {
48+
Type: schema.TypeString,
49+
Optional: true,
50+
Description: "Bandwidth packet type, default:BGP, optional:- `BGP`: common BGP shared bandwidth package- `HIGH_QUALITY_BGP`: Quality BGP Shared Bandwidth Package.",
51+
},
52+
53+
"charge_type": {
54+
Type: schema.TypeString,
55+
Optional: true,
56+
Description: "Bandwidth package billing type, default: TOP5_POSTPAID_BY_MONTH, optional value:- `TOP5_POSTPAID_BY_MONTH`: TOP5 billed by monthly postpaid- `PERCENT95_POSTPAID_BY_MONTH`: 95 billed monthly postpaid- `FIXED_PREPAID_BY_MONTH`: Monthly prepaid billing.",
57+
},
58+
59+
"bandwidth_package_name": {
60+
Type: schema.TypeString,
61+
Optional: true,
62+
Description: "Bandwidth package name.",
63+
},
64+
65+
"tags": {
66+
Type: schema.TypeMap,
67+
Optional: true,
68+
Description: "Tag description list.",
69+
},
70+
},
71+
}
72+
}
73+
74+
func resourceTencentCloudVpcBandwidthPackageCreate(d *schema.ResourceData, meta interface{}) error {
75+
defer logElapsed("resource.tencentcloud_bwp_bandwidth_package.create")()
76+
defer inconsistentCheck(d, meta)()
77+
78+
logId := getLogId(contextNil)
79+
80+
var (
81+
request = vpc.NewCreateBandwidthPackageRequest()
82+
response *vpc.CreateBandwidthPackageResponse
83+
)
84+
85+
if v, ok := d.GetOk("network_type"); ok {
86+
request.NetworkType = helper.String(v.(string))
87+
}
88+
89+
if v, ok := d.GetOk("charge_type"); ok {
90+
request.ChargeType = helper.String(v.(string))
91+
}
92+
93+
if v, ok := d.GetOk("bandwidth_package_name"); ok {
94+
request.BandwidthPackageName = helper.String(v.(string))
95+
}
96+
97+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
98+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseVpcClient().CreateBandwidthPackage(request)
99+
if e != nil {
100+
return retryError(e)
101+
} else {
102+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
103+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
104+
}
105+
response = result
106+
return nil
107+
})
108+
109+
if err != nil {
110+
log.Printf("[CRITAL]%s create bwp bandwidthPackage failed, reason:%+v", logId, err)
111+
return err
112+
}
113+
114+
bandwidthPackageId := *response.Response.BandwidthPackageId
115+
116+
d.SetId(bandwidthPackageId)
117+
118+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
119+
service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn}
120+
err = resource.Retry(3*readRetryTimeout, func() *resource.RetryError {
121+
instance, errRet := service.DescribeVpcBandwidthPackage(ctx, bandwidthPackageId)
122+
if errRet != nil {
123+
return retryError(errRet, InternalError)
124+
}
125+
if *instance.Status == "CREATED" {
126+
return nil
127+
}
128+
return resource.RetryableError(fmt.Errorf("tmpInstance status is %v, retry...", *instance.Status))
129+
})
130+
if err != nil {
131+
return err
132+
}
133+
134+
if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
135+
tagService := TagService{client: meta.(*TencentCloudClient).apiV3Conn}
136+
region := meta.(*TencentCloudClient).apiV3Conn.Region
137+
resourceName := fmt.Sprintf("qcs::cam:%s:uin/:bandwidthPackage/%s", region, bandwidthPackageId)
138+
if err := tagService.ModifyTags(ctx, resourceName, tags, nil); err != nil {
139+
return err
140+
}
141+
}
142+
return resourceTencentCloudVpcBandwidthPackageRead(d, meta)
143+
}
144+
145+
func resourceTencentCloudVpcBandwidthPackageRead(d *schema.ResourceData, meta interface{}) error {
146+
defer logElapsed("resource.tencentcloud_bwp_bandwidth_package.read")()
147+
defer inconsistentCheck(d, meta)()
148+
149+
logId := getLogId(contextNil)
150+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
151+
152+
service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn}
153+
154+
bandwidthPackageId := d.Id()
155+
156+
bandwidthPackage, err := service.DescribeVpcBandwidthPackage(ctx, bandwidthPackageId)
157+
158+
if err != nil {
159+
return err
160+
}
161+
162+
if bandwidthPackage == nil {
163+
d.SetId("")
164+
return fmt.Errorf("resource `bandwidthPackage` %s does not exist", bandwidthPackageId)
165+
}
166+
167+
if bandwidthPackage.NetworkType != nil {
168+
_ = d.Set("network_type", bandwidthPackage.NetworkType)
169+
}
170+
171+
if bandwidthPackage.ChargeType != nil {
172+
_ = d.Set("charge_type", bandwidthPackage.ChargeType)
173+
}
174+
175+
if bandwidthPackage.BandwidthPackageName != nil {
176+
_ = d.Set("bandwidth_package_name", bandwidthPackage.BandwidthPackageName)
177+
}
178+
179+
tcClient := meta.(*TencentCloudClient).apiV3Conn
180+
tagService := &TagService{client: tcClient}
181+
tags, err := tagService.DescribeResourceTags(ctx, "cam", "bandwidthPackage", tcClient.Region, d.Id())
182+
if err != nil {
183+
return err
184+
}
185+
_ = d.Set("tags", tags)
186+
187+
return nil
188+
}
189+
190+
func resourceTencentCloudVpcBandwidthPackageUpdate(d *schema.ResourceData, meta interface{}) error {
191+
defer logElapsed("resource.tencentcloud_vpc_bandwidth_package.update")()
192+
defer inconsistentCheck(d, meta)()
193+
194+
logId := getLogId(contextNil)
195+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
196+
197+
request := vpc.NewModifyBandwidthPackageAttributeRequest()
198+
199+
bandwidthPackageId := d.Id()
200+
201+
request.BandwidthPackageId = &bandwidthPackageId
202+
203+
if d.HasChange("network_type") {
204+
205+
return fmt.Errorf("`network_type` do not support change now.")
206+
207+
}
208+
209+
if d.HasChange("bandwidth_package_count") {
210+
211+
return fmt.Errorf("`bandwidth_package_count` do not support change now.")
212+
213+
}
214+
215+
if d.HasChange("internet_max_bandwidth") {
216+
217+
return fmt.Errorf("`internet_max_bandwidth` do not support change now.")
218+
219+
}
220+
221+
if d.HasChange("protocol") {
222+
223+
return fmt.Errorf("`protocol` do not support change now.")
224+
225+
}
226+
227+
if d.HasChange("charge_type") {
228+
if v, ok := d.GetOk("charge_type"); ok {
229+
request.ChargeType = helper.String(v.(string))
230+
}
231+
}
232+
233+
if d.HasChange("bandwidth_package_name") {
234+
if v, ok := d.GetOk("bandwidth_package_name"); ok {
235+
request.BandwidthPackageName = helper.String(v.(string))
236+
}
237+
}
238+
239+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
240+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseVpcClient().ModifyBandwidthPackageAttribute(request)
241+
if e != nil {
242+
return retryError(e)
243+
} else {
244+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
245+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
246+
}
247+
return nil
248+
})
249+
250+
if err != nil {
251+
log.Printf("[CRITAL]%s create vpc bandwidthPackage failed, reason:%+v", logId, err)
252+
return err
253+
}
254+
255+
if d.HasChange("tags") {
256+
tcClient := meta.(*TencentCloudClient).apiV3Conn
257+
tagService := &TagService{client: tcClient}
258+
oldTags, newTags := d.GetChange("tags")
259+
replaceTags, deleteTags := diffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{}))
260+
resourceName := BuildTagResourceName("cam", "bandwidthPackage", tcClient.Region, d.Id())
261+
if err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil {
262+
return err
263+
}
264+
}
265+
266+
return resourceTencentCloudVpcBandwidthPackageRead(d, meta)
267+
}
268+
269+
func resourceTencentCloudVpcBandwidthPackageDelete(d *schema.ResourceData, meta interface{}) error {
270+
defer logElapsed("resource.tencentcloud_bwp_bandwidth_package.delete")()
271+
defer inconsistentCheck(d, meta)()
272+
273+
logId := getLogId(contextNil)
274+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
275+
276+
service := VpcService{client: meta.(*TencentCloudClient).apiV3Conn}
277+
278+
bandwidthPackageId := d.Id()
279+
280+
if err := service.DeleteVpcBandwidthPackageById(ctx, bandwidthPackageId); err != nil {
281+
return err
282+
}
283+
284+
return nil
285+
}

0 commit comments

Comments
 (0)