Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ Cloud Block Storage(CBS)
tencentcloud_cbs_storage
tencentcloud_cbs_storage_set
tencentcloud_cbs_storage_attachment
tencentcloud_cbs_storage_set_attachment
tencentcloud_cbs_snapshot
tencentcloud_cbs_snapshot_policy
tencentcloud_cbs_snapshot_policy_attachment
Expand Down Expand Up @@ -932,6 +933,7 @@ func Provider() terraform.ResourceProvider {
"tencentcloud_cbs_storage": resourceTencentCloudCbsStorage(),
"tencentcloud_cbs_storage_set": resourceTencentCloudCbsStorageSet(),
"tencentcloud_cbs_storage_attachment": resourceTencentCloudCbsStorageAttachment(),
"tencentcloud_cbs_storage_set_attachment": resourceTencentCloudCbsStorageSetAttachment(),
"tencentcloud_cbs_snapshot_policy_attachment": resourceTencentCloudCbsSnapshotPolicyAttachment(),
"tencentcloud_vpc": resourceTencentCloudVpcInstance(),
"tencentcloud_vpc_acl": resourceTencentCloudVpcACL(),
Expand Down
153 changes: 153 additions & 0 deletions tencentcloud/resource_tc_cbs_storage_set_attachment.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
/*
Provides a CBS storage set attachment resource.

Example Usage

```hcl
resource "tencentcloud_cbs_storage_set_attachment" "attachment" {
storage_id = "disk-kdt0sq6m"
instance_id = "ins-jqlegd42"
}
```

*/
package tencentcloud

import (
"context"
"fmt"
"log"
"time"

sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
cbs "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs/v20170312"
)

func resourceTencentCloudCbsStorageSetAttachment() *schema.Resource {
return &schema.Resource{
Create: resourceTencentCloudCbsStorageSetAttachmentCreate,
Read: resourceTencentCloudCbsStorageSetAttachmentRead,
Delete: resourceTencentCloudCbsStorageSetAttachmentDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"storage_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "ID of the mounted CBS.",
},
"instance_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "ID of the CVM instance.",
},
},
}
}

func resourceTencentCloudCbsStorageSetAttachmentCreate(d *schema.ResourceData, meta interface{}) error {
defer logElapsed("resource.tencentcloud_cbs_storage_set_attachment.create")()

logId := getLogId(contextNil)
ctx := context.WithValue(context.TODO(), logIdKey, logId)

storageId := d.Get("storage_id").(string)
instanceId := d.Get("instance_id").(string)

cbsService := CbsService{
client: meta.(*TencentCloudClient).apiV3Conn,
}

err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
e := cbsService.AttachDisk(ctx, storageId, instanceId)
if e != nil {
ee, ok := e.(*sdkErrors.TencentCloudSDKError)
if ok && IsContains(CVM_RETRYABLE_ERROR, ee.Code) {
time.Sleep(1 * time.Second) // 需要重试的话,等待1s进行重试
return resource.RetryableError(fmt.Errorf("cbs attach error: %s, retrying", ee.Error()))
}
return resource.NonRetryableError(ee)
}
return nil
})
if err != nil {
log.Printf("[CRITAL]%s cbs storage attach failed, reason:%s\n ", logId, err.Error())
return err
}

d.SetId(storageId)

return nil
}

func resourceTencentCloudCbsStorageSetAttachmentRead(d *schema.ResourceData, meta interface{}) error {
defer logElapsed("resource.tencentcloud_cbs_storage_set_attachment.read")()
defer inconsistentCheck(d, meta)()

logId := getLogId(contextNil)
ctx := context.WithValue(context.TODO(), logIdKey, logId)

storageId := d.Id()
cbsService := CbsService{
client: meta.(*TencentCloudClient).apiV3Conn,
}

var storage *cbs.Disk
var errRet error
storage, errRet = cbsService.DescribeDiskById(ctx, storageId)
if errRet != nil {
log.Printf("[CRITAL]%s describe cbs storage attach failed, reason:%s\n ", logId, errRet.Error())
return errRet
}

if storage == nil || !*storage.Attached {
d.SetId("")
return nil
}
_ = d.Set("storage_id", storage.DiskId)
_ = d.Set("instance_id", storage.InstanceId)

return nil
}

func resourceTencentCloudCbsStorageSetAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
defer logElapsed("resource.tencentcloud_cbs_storage_set_attachment.delete")()

logId := getLogId(contextNil)
ctx := context.WithValue(context.TODO(), logIdKey, logId)

cbsService := CbsService{
client: meta.(*TencentCloudClient).apiV3Conn,
}

storageId := d.Id()
instanceId := d.Get("instance_id").(string)

err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
errRet := cbsService.DetachDisk(ctx, storageId, instanceId)
if errRet != nil {
log.Printf("[CRITAL][detach disk]%s api[%s] fail, reason[%s]\n",
logId, "detach", errRet.Error())
e, ok := errRet.(*sdkErrors.TencentCloudSDKError)
if ok && IsContains(CVM_RETRYABLE_ERROR, e.Code) {
time.Sleep(1 * time.Second) // 需要重试的话,等待1s进行重试
return resource.RetryableError(fmt.Errorf("[detach]disk detach error: %s, retrying", e.Error()))
}
return resource.NonRetryableError(errRet)
}
return nil
})
if err != nil {
log.Printf("[CRITAL]%s cbs storage detach failed, reason:%s\n ", logId, err.Error())
return err
}

return nil
}
37 changes: 37 additions & 0 deletions website/docs/r/cbs_storage_set_attachment.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
subcategory: "Cloud Block Storage(CBS)"
layout: "tencentcloud"
page_title: "TencentCloud: tencentcloud_cbs_storage_set_attachment"
sidebar_current: "docs-tencentcloud-resource-cbs_storage_set_attachment"
description: |-
Provides a CBS storage set attachment resource.
---

# tencentcloud_cbs_storage_set_attachment

Provides a CBS storage set attachment resource.

## Example Usage

```hcl
resource "tencentcloud_cbs_storage_set_attachment" "attachment" {
storage_id = "disk-kdt0sq6m"
instance_id = "ins-jqlegd42"
}
```

## Argument Reference

The following arguments are supported:

* `instance_id` - (Required, ForceNew) ID of the CVM instance.
* `storage_id` - (Required, ForceNew) ID of the mounted CBS.

## Attributes Reference

In addition to all arguments above, the following attributes are exported:

* `id` - ID of the resource.



3 changes: 3 additions & 0 deletions website/tencentcloud.erb
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,9 @@
<li>
<a href="/docs/providers/tencentcloud/r/cbs_storage_set.html">tencentcloud_cbs_storage_set</a>
</li>
<li>
<a href="/docs/providers/tencentcloud/r/cbs_storage_set_attachment.html">tencentcloud_cbs_storage_set_attachment</a>
</li>
</ul>
</li>
</ul>
Expand Down