Skip to content

Commit 7f04b5b

Browse files
authored
optimize (#1123)
* optimize * add resource
1 parent e159a8f commit 7f04b5b

File tree

10 files changed

+412
-5
lines changed

10 files changed

+412
-5
lines changed

tencentcloud/connectivity/client.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"net/http"
66
"net/url"
7+
"os"
8+
"strconv"
79
"time"
810

911
"github.com/tencentyun/cos-go-sdk-v5"
@@ -59,6 +61,11 @@ import (
5961
ssl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss/v20180426"
6062
)
6163

64+
const (
65+
PROVIDER_CVM_REQUEST_TIMEOUT = "TENCENTCLOUD_CVM_REQUEST_TIMEOUT"
66+
PROVIDER_CBS_REQUEST_TIMEOUT = "TENCENTCLOUD_CBS_REQUEST_TIMEOUT"
67+
)
68+
6269
// TencentCloudClient is client for all TencentCloud service
6370
type TencentCloudClient struct {
6471
Credential *common.Credential
@@ -238,7 +245,8 @@ func (me *TencentCloudClient) UseCbsClient() *cbs.Client {
238245
return me.cbsConn
239246
}
240247

241-
cpf := me.NewClientProfile(300)
248+
var reqTimeout = getEnvDefault(PROVIDER_CBS_REQUEST_TIMEOUT, 300)
249+
cpf := me.NewClientProfile(reqTimeout)
242250
me.cbsConn, _ = cbs.NewClient(me.Credential, me.Region, cpf)
243251
me.cbsConn.WithHttpTransport(&LogRoundTripper{})
244252

@@ -290,7 +298,8 @@ func (me *TencentCloudClient) UseCvmClient() *cvm.Client {
290298
return me.cvmConn
291299
}
292300

293-
cpf := me.NewClientProfile(300)
301+
var reqTimeout = getEnvDefault(PROVIDER_CVM_REQUEST_TIMEOUT, 300)
302+
cpf := me.NewClientProfile(reqTimeout)
294303
me.cvmConn, _ = cvm.NewClient(me.Credential, me.Region, cpf)
295304
me.cvmConn.WithHttpTransport(&LogRoundTripper{})
296305

@@ -721,3 +730,15 @@ func (me *TencentCloudClient) UseAntiddosClient() *antiddos.Client {
721730

722731
return me.antiddosConn
723732
}
733+
734+
func getEnvDefault(key string, defVal int) int {
735+
val, ex := os.LookupEnv(key)
736+
if !ex {
737+
return defVal
738+
}
739+
int, err := strconv.Atoi(val)
740+
if err != nil {
741+
panic("TENCENTCLOUD_XXX_REQUEST_TIMEOUT must be int.")
742+
}
743+
return int
744+
}

tencentcloud/extension_cvm.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const (
6565
// Only client error can cvm retry, others will directly returns
6666
var CVM_RETRYABLE_ERROR = []string{
6767
// client
68-
"ClientError.NetworkError",
68+
//"ClientError.NetworkError",
6969
"ClientError.HttpStatusCodeError",
7070
}
7171

tencentcloud/internal/helper/transform.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,16 @@ func InterfacesStringsPoint(configured []interface{}) []*string {
8181
return vs
8282
}
8383

84+
func StringsStringsPoint(configured []string) []*string {
85+
vs := make([]*string, 0, len(configured))
86+
for _, v := range configured {
87+
vv := v
88+
vvv := &vv
89+
vs = append(vs, vvv)
90+
}
91+
return vs
92+
}
93+
8494
func InterfacesIntegers(configured []interface{}) []int {
8595
vs := make([]int, 0, len(configured))
8696
for _, v := range configured {

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ Cloud Block Storage(CBS)
179179
180180
Resource
181181
tencentcloud_cbs_storage
182+
tencentcloud_cbs_storage_set
182183
tencentcloud_cbs_storage_attachment
183184
tencentcloud_cbs_snapshot
184185
tencentcloud_cbs_snapshot_policy
@@ -923,6 +924,7 @@ func Provider() terraform.ResourceProvider {
923924
"tencentcloud_cbs_snapshot": resourceTencentCloudCbsSnapshot(),
924925
"tencentcloud_cbs_snapshot_policy": resourceTencentCloudCbsSnapshotPolicy(),
925926
"tencentcloud_cbs_storage": resourceTencentCloudCbsStorage(),
927+
"tencentcloud_cbs_storage_set": resourceTencentCloudCbsStorageSet(),
926928
"tencentcloud_cbs_storage_attachment": resourceTencentCloudCbsStorageAttachment(),
927929
"tencentcloud_cbs_snapshot_policy_attachment": resourceTencentCloudCbsSnapshotPolicyAttachment(),
928930
"tencentcloud_vpc": resourceTencentCloudVpcInstance(),
Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
/*
2+
Provides a resource to create CBS set.
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cbs_storage_set" "storage" {
8+
disk_count = 10
9+
storage_name = "mystorage"
10+
storage_type = "CLOUD_SSD"
11+
storage_size = 100
12+
availability_zone = "ap-guangzhou-3"
13+
project_id = 0
14+
encrypt = false
15+
}
16+
```
17+
18+
*/
19+
package tencentcloud
20+
21+
import (
22+
"context"
23+
"fmt"
24+
"log"
25+
"strconv"
26+
"time"
27+
28+
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
29+
30+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
31+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
32+
cbs "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs/v20170312"
33+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
34+
)
35+
36+
func resourceTencentCloudCbsStorageSet() *schema.Resource {
37+
return &schema.Resource{
38+
Create: resourceTencentCloudCbsStorageSetCreate,
39+
Read: resourceTencentCloudCbsStorageSetRead,
40+
Update: resourceTencentCloudCbsStorageSetUpdate,
41+
Delete: resourceTencentCloudCbsStorageSetDelete,
42+
43+
Schema: map[string]*schema.Schema{
44+
"storage_type": {
45+
Type: schema.TypeString,
46+
Required: true,
47+
ForceNew: true,
48+
Description: "Type of CBS medium. Valid values: CLOUD_PREMIUM, CLOUD_SSD, CLOUD_TSSD and CLOUD_HSSD.",
49+
},
50+
"storage_size": {
51+
Type: schema.TypeInt,
52+
Required: true,
53+
ValidateFunc: validateIntegerInRange(10, 16000),
54+
Description: "Volume of CBS, and unit is GB. If storage type is `CLOUD_SSD`, the size range is [100, 16000], and the others are [10-16000].",
55+
},
56+
"disk_count": {
57+
Type: schema.TypeInt,
58+
Optional: true,
59+
Description: "The number of disks to be purchased. Default 1.",
60+
},
61+
"charge_type": {
62+
Type: schema.TypeString,
63+
Optional: true,
64+
Default: CBS_CHARGE_TYPE_POSTPAID,
65+
ValidateFunc: validateAllowedStringValue(CBS_CHARGE_TYPE),
66+
Description: "The charge type of CBS instance. Only support `POSTPAID_BY_HOUR`.",
67+
},
68+
"availability_zone": {
69+
Type: schema.TypeString,
70+
Required: true,
71+
ForceNew: true,
72+
Description: "The available zone that the CBS instance locates at.",
73+
},
74+
"storage_name": {
75+
Type: schema.TypeString,
76+
Required: true,
77+
ValidateFunc: validateStringLengthInRange(2, 60),
78+
Description: "Name of CBS. The maximum length can not exceed 60 bytes.",
79+
},
80+
"snapshot_id": {
81+
Type: schema.TypeString,
82+
Optional: true,
83+
Computed: true,
84+
Description: "ID of the snapshot. If specified, created the CBS by this snapshot.",
85+
},
86+
"project_id": {
87+
Type: schema.TypeInt,
88+
Optional: true,
89+
Default: 0,
90+
Description: "ID of the project to which the instance belongs.",
91+
},
92+
"encrypt": {
93+
Type: schema.TypeBool,
94+
Optional: true,
95+
ForceNew: true,
96+
Description: "Indicates whether CBS is encrypted.",
97+
},
98+
"throughput_performance": {
99+
Type: schema.TypeInt,
100+
Optional: true,
101+
Default: 0,
102+
Description: "Add extra performance to the data disk. Only works when disk type is `CLOUD_TSSD` or `CLOUD_HSSD`.",
103+
},
104+
// computed
105+
"storage_status": {
106+
Type: schema.TypeString,
107+
Computed: true,
108+
Description: "Status of CBS. Valid values: UNATTACHED, ATTACHING, ATTACHED, DETACHING, EXPANDING, ROLLBACKING, TORECYCLE and DUMPING.",
109+
},
110+
"attached": {
111+
Type: schema.TypeBool,
112+
Computed: true,
113+
Description: "Indicates whether the CBS is mounted the CVM.",
114+
},
115+
"disk_ids": {
116+
Type: schema.TypeList,
117+
Computed: true,
118+
Elem: &schema.Schema{
119+
Type: schema.TypeString,
120+
},
121+
Description: "disk id list.",
122+
},
123+
},
124+
}
125+
}
126+
127+
func resourceTencentCloudCbsStorageSetCreate(d *schema.ResourceData, meta interface{}) error {
128+
defer logElapsed("resource.tencentcloud_cbs_storage_set.create")()
129+
130+
logId := getLogId(contextNil)
131+
132+
var diskCount int
133+
134+
request := cbs.NewCreateDisksRequest()
135+
request.DiskName = helper.String(d.Get("storage_name").(string))
136+
request.DiskType = helper.String(d.Get("storage_type").(string))
137+
request.DiskSize = helper.IntUint64(d.Get("storage_size").(int))
138+
if v, ok := d.GetOk("disk_count"); ok {
139+
diskCount = v.(int)
140+
request.DiskCount = helper.Uint64(uint64(diskCount))
141+
}
142+
request.Placement = &cbs.Placement{
143+
Zone: helper.String(d.Get("availability_zone").(string)),
144+
}
145+
if v, ok := d.GetOk("project_id"); ok {
146+
request.Placement.ProjectId = helper.IntUint64(v.(int))
147+
}
148+
if v, ok := d.GetOk("snapshot_id"); ok {
149+
request.SnapshotId = helper.String(v.(string))
150+
}
151+
if _, ok := d.GetOk("encrypt"); ok {
152+
request.Encrypt = helper.String("ENCRYPT")
153+
}
154+
155+
if v, ok := d.GetOk("throughput_performance"); ok {
156+
request.ThroughputPerformance = helper.IntUint64(v.(int))
157+
}
158+
159+
chargeType := d.Get("charge_type").(string)
160+
161+
request.DiskChargeType = &chargeType
162+
163+
storageIds := make([]*string, 0)
164+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
165+
response, e := meta.(*TencentCloudClient).apiV3Conn.UseCbsClient().CreateDisks(request)
166+
if e != nil {
167+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
168+
logId, request.GetAction(), request.ToJsonString(), e.Error())
169+
170+
ee, ok := e.(*sdkErrors.TencentCloudSDKError)
171+
if ok && IsContains(CVM_RETRYABLE_ERROR, ee.Code) {
172+
time.Sleep(1 * time.Second) // 需要重试的话,等待1s进行重试
173+
return resource.RetryableError(fmt.Errorf("cbs create error: %s, retrying", e.Error()))
174+
}
175+
return resource.NonRetryableError(e)
176+
}
177+
178+
if len(response.Response.DiskIdSet) < diskCount {
179+
err := fmt.Errorf("number of instances is less than %s", strconv.Itoa(diskCount))
180+
return resource.NonRetryableError(err)
181+
}
182+
183+
storageIds = response.Response.DiskIdSet
184+
return nil
185+
})
186+
if err != nil {
187+
log.Printf("[CRITAL]%s create cbs failed, reason:%s\n ", logId, err.Error())
188+
return err
189+
}
190+
191+
d.Set("disk_ids", storageIds)
192+
d.SetId(helper.StrListToStr(storageIds))
193+
194+
return nil
195+
}
196+
197+
func resourceTencentCloudCbsStorageSetRead(d *schema.ResourceData, meta interface{}) error {
198+
defer logElapsed("resource.tencentcloud_cbs_storage_set.read")()
199+
defer inconsistentCheck(d, meta)()
200+
201+
logId := getLogId(contextNil)
202+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
203+
204+
storageId := d.Id()
205+
cbsService := CbsService{
206+
client: meta.(*TencentCloudClient).apiV3Conn,
207+
}
208+
209+
var storageSet []*cbs.Disk
210+
var errRet error
211+
212+
storageSet, errRet = cbsService.DescribeDiskSetByIds(ctx, storageId)
213+
if errRet != nil {
214+
return errRet
215+
}
216+
if storageSet == nil {
217+
d.SetId("")
218+
return nil
219+
}
220+
221+
storage := storageSet[0]
222+
223+
_ = d.Set("storage_type", storage.DiskType)
224+
_ = d.Set("storage_size", storage.DiskSize)
225+
_ = d.Set("availability_zone", storage.Placement.Zone)
226+
_ = d.Set("storage_name", d.Get("storage_name"))
227+
_ = d.Set("project_id", storage.Placement.ProjectId)
228+
_ = d.Set("encrypt", storage.Encrypt)
229+
_ = d.Set("storage_status", storage.DiskState)
230+
_ = d.Set("attached", storage.Attached)
231+
_ = d.Set("charge_type", storage.DiskChargeType)
232+
_ = d.Set("throughput_performance", storage.ThroughputPerformance)
233+
234+
return nil
235+
}
236+
237+
func resourceTencentCloudCbsStorageSetUpdate(d *schema.ResourceData, meta interface{}) error {
238+
defer logElapsed("resource.tencentcloud_cbs_storage_set.update")()
239+
240+
return fmt.Errorf("`tencentcloud_cbs_storage_set` do not support change now.")
241+
}
242+
243+
func resourceTencentCloudCbsStorageSetDelete(d *schema.ResourceData, meta interface{}) error {
244+
defer logElapsed("resource.tencentcloud_cbs_storage_set.delete")()
245+
246+
logId := getLogId(contextNil)
247+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
248+
249+
storageId := d.Id()
250+
251+
cbsService := CbsService{
252+
client: meta.(*TencentCloudClient).apiV3Conn,
253+
}
254+
255+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
256+
e := cbsService.DeleteDiskSetByIds(ctx, storageId)
257+
if e != nil {
258+
log.Printf("[CRITAL][first delete]%s api[%s] fail, reason[%s]\n",
259+
logId, "delete", e.Error())
260+
ee, ok := e.(*sdkErrors.TencentCloudSDKError)
261+
if ok && IsContains(CVM_RETRYABLE_ERROR, ee.Code) {
262+
time.Sleep(1 * time.Second) // 需要重试的话,等待1s进行重试
263+
return resource.RetryableError(fmt.Errorf("[first delete]cvm delete error: %s, retrying", ee.Error()))
264+
}
265+
return resource.NonRetryableError(e)
266+
}
267+
return nil
268+
})
269+
270+
if err != nil {
271+
log.Printf("[CRITAL]%s delete cbs failed, reason:%s\n ", logId, err.Error())
272+
return err
273+
}
274+
275+
return nil
276+
}

tencentcloud/resource_tc_instance_set.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ func resourceTencentCloudInstanceSetCreate(d *schema.ResourceData, meta interfac
462462
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
463463
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
464464
if len(response.Response.InstanceIdSet) < instanceCount {
465-
err = fmt.Errorf("instance id is less than %s", strconv.Itoa(instanceCount))
465+
err = fmt.Errorf("number of instances is less than %s", strconv.Itoa(instanceCount))
466466
return resource.NonRetryableError(err)
467467
}
468468
instanceIds = response.Response.InstanceIdSet

0 commit comments

Comments
 (0)