Skip to content

Commit 904e59b

Browse files
tongyimingmikatong
andauthored
add cos operation (#1941)
* add cos operation * add changelog --------- Co-authored-by: mikatong <mikatong@tencent.com>
1 parent d2b4250 commit 904e59b

14 files changed

+1155
-479
lines changed

.changelog/1941.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
```release-note:new-resource
2+
tencentcloud_cos_object_abort_multipart_upload_operation
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_cos_object_copy_operation
7+
```
8+
9+
```release-note:new-resource
10+
tencentcloud_cos_object_restore_operation
11+
```
12+
13+
```release-note:new-resource
14+
tencentcloud_cos_bucket_generate_inventory_immediately_operation
15+
```

tencentcloud/provider.go

Lines changed: 487 additions & 479 deletions
Large diffs are not rendered by default.
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
Provides a resource to generate a cos bucket inventory immediately
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cos_bucket_generate_inventory_immediately_operation" "generate_inventory_immediately" {
8+
inventory_id = "test"
9+
bucket = "keep-test-xxxxxx"
10+
}
11+
```
12+
*/
13+
package tencentcloud
14+
15+
import (
16+
"context"
17+
"fmt"
18+
"log"
19+
"strings"
20+
"time"
21+
22+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
23+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
24+
"github.com/tencentyun/cos-go-sdk-v5"
25+
)
26+
27+
func resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperation() *schema.Resource {
28+
return &schema.Resource{
29+
Create: resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperationCreate,
30+
Read: resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperationRead,
31+
Delete: resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperationDelete,
32+
33+
Schema: map[string]*schema.Schema{
34+
"inventory_id": {
35+
Required: true,
36+
ForceNew: true,
37+
Type: schema.TypeString,
38+
Description: "The id of inventory.",
39+
},
40+
"bucket": {
41+
Required: true,
42+
ForceNew: true,
43+
Type: schema.TypeString,
44+
Description: "Bucket.",
45+
},
46+
},
47+
}
48+
}
49+
50+
func resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperationCreate(d *schema.ResourceData, meta interface{}) error {
51+
defer logElapsed("resource.tencentcloud_cos_bucket_generate_inventory_immediately_operation.create")()
52+
defer inconsistentCheck(d, meta)()
53+
54+
logId := getLogId(contextNil)
55+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
56+
inventoryId := d.Get("inventory_id").(string)
57+
bucket := d.Get("bucket").(string)
58+
result, _, err := meta.(*TencentCloudClient).apiV3Conn.UseTencentCosClient(bucket).Bucket.GetInventory(ctx, inventoryId)
59+
if err != nil {
60+
log.Printf("[CRITAL]%s get cos bucketInventory failed, reason:%+v", logId, err)
61+
return err
62+
}
63+
id := fmt.Sprintf("%s_instant_%s", result.ID, time.Now().Format("20060102150405"))
64+
inventoryOpt := &cos.BucketPostInventoryOptions{
65+
ID: id,
66+
IncludedObjectVersions: result.IncludedObjectVersions,
67+
Filter: result.Filter,
68+
OptionalFields: result.OptionalFields,
69+
Destination: result.Destination,
70+
}
71+
_, err = meta.(*TencentCloudClient).apiV3Conn.UseTencentCosClient(bucket).Bucket.PostInventory(ctx, id, inventoryOpt)
72+
if err != nil {
73+
return err
74+
}
75+
items := strings.Split(result.Destination.Bucket, "::")
76+
targetBucket := items[len(items)-1]
77+
targetBucketItems := strings.Split(targetBucket, "-")
78+
objectId := fmt.Sprintf("%s/%s/%s/%s/%s/manifest.json", result.Destination.Prefix, targetBucketItems[len(targetBucketItems)-1], strings.Join(targetBucketItems[:len(targetBucketItems)-1], "-"), id, time.Now().Format("20060102"))
79+
err = resource.Retry(10*readRetryTimeout, func() *resource.RetryError {
80+
resp, e := meta.(*TencentCloudClient).apiV3Conn.UseTencentCosClient(targetBucket).Object.Head(ctx, objectId, nil)
81+
if resp.StatusCode == 404 {
82+
return resource.RetryableError(fmt.Errorf("Inventory still creating!"))
83+
}
84+
if e != nil {
85+
return retryError(e)
86+
}
87+
88+
return nil
89+
})
90+
if err != nil {
91+
log.Printf("[CRITAL]%s PostInventory: object not exist, reason:%+v", logId, err)
92+
return err
93+
}
94+
d.SetId(id)
95+
96+
return resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperationRead(d, meta)
97+
}
98+
99+
func resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperationRead(d *schema.ResourceData, meta interface{}) error {
100+
defer logElapsed("resource.tencentcloud_cos_bucket_generate_inventory_immediately_operation.read")()
101+
defer inconsistentCheck(d, meta)()
102+
103+
return nil
104+
}
105+
106+
func resourceTencentCloudCosBucketGenerateInventoryImmediatelyOperationDelete(d *schema.ResourceData, meta interface{}) error {
107+
defer logElapsed("resource.tencentcloud_cos_bucket_generate_inventory_immediately_operation.delete")()
108+
defer inconsistentCheck(d, meta)()
109+
110+
return nil
111+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudCosBucketGenerateInventoryImmediatelyOperationResource(t *testing.T) {
10+
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() { testAccPreCheck(t) },
13+
Providers: testAccProviders,
14+
Steps: []resource.TestStep{
15+
{
16+
Config: testAccCosBucketGenerateInventoryImmediatelyOperation,
17+
Check: resource.ComposeAggregateTestCheckFunc(
18+
resource.TestCheckResourceAttrSet("tencentcloud_cos_bucket_generate_inventory_immediately_operation.generate_inventory_immediately", "id"),
19+
),
20+
},
21+
},
22+
})
23+
}
24+
25+
const testAccCosBucketGenerateInventoryImmediatelyOperation = `
26+
resource "tencentcloud_cos_bucket_generate_inventory_immediately_operation" "generate_inventory_immediately" {
27+
inventory_id = "test"
28+
bucket = "keep-test-1308919341"
29+
}
30+
`
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
Provides a resource to abort multipart upload
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cos_object_abort_multipart_upload_operation" "abort_multipart_upload" {
8+
bucket = "keep-test-xxxxxx"
9+
key = "object"
10+
upload_id = "xxxxxx"
11+
}
12+
```
13+
*/
14+
package tencentcloud
15+
16+
import (
17+
"context"
18+
"log"
19+
20+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
21+
)
22+
23+
func resourceTencentCloudCosObjectAbortMultipartUploadOperation() *schema.Resource {
24+
return &schema.Resource{
25+
Create: resourceTencentCloudCosObjectAbortMultipartUploadOperationCreate,
26+
Read: resourceTencentCloudCosObjectAbortMultipartUploadOperationRead,
27+
Delete: resourceTencentCloudCosObjectAbortMultipartUploadOperationDelete,
28+
29+
Schema: map[string]*schema.Schema{
30+
"bucket": {
31+
Required: true,
32+
ForceNew: true,
33+
Type: schema.TypeString,
34+
Description: "Bucket.",
35+
},
36+
"key": {
37+
Required: true,
38+
ForceNew: true,
39+
Type: schema.TypeString,
40+
Description: "Object key.",
41+
},
42+
"upload_id": {
43+
Required: true,
44+
ForceNew: true,
45+
Type: schema.TypeString,
46+
Description: "Multipart uploaded id.",
47+
},
48+
},
49+
}
50+
}
51+
52+
func resourceTencentCloudCosObjectAbortMultipartUploadOperationCreate(d *schema.ResourceData, meta interface{}) error {
53+
defer logElapsed("resource.tencentcloud_cos_object_abort_multipart_upload_operation.create")()
54+
defer inconsistentCheck(d, meta)()
55+
56+
logId := getLogId(contextNil)
57+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
58+
bucket := d.Get("bucket").(string)
59+
key := d.Get("key").(string)
60+
uploadId := d.Get("upload_id").(string)
61+
_, err := meta.(*TencentCloudClient).apiV3Conn.UseTencentCosClient(bucket).Object.AbortMultipartUpload(ctx, key, uploadId)
62+
if err != nil {
63+
log.Printf("[CRITAL]%s AbortMultipartUpload failed, reason:%+v", logId, err)
64+
return err
65+
}
66+
67+
d.SetId(uploadId)
68+
69+
return resourceTencentCloudCosObjectAbortMultipartUploadOperationRead(d, meta)
70+
}
71+
72+
func resourceTencentCloudCosObjectAbortMultipartUploadOperationRead(d *schema.ResourceData, meta interface{}) error {
73+
defer logElapsed("resource.tencentcloud_cos_object_abort_multipart_upload_operation.read")()
74+
defer inconsistentCheck(d, meta)()
75+
76+
return nil
77+
}
78+
79+
func resourceTencentCloudCosObjectAbortMultipartUploadOperationDelete(d *schema.ResourceData, meta interface{}) error {
80+
defer logElapsed("resource.tencentcloud_cos_object_abort_multipart_upload_operation.delete")()
81+
defer inconsistentCheck(d, meta)()
82+
83+
return nil
84+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
Provides a resource to copy object
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cos_object_copy_operation" "object_copy" {
8+
bucket = "keep-copy-xxxxxxx"
9+
key = "copy-acl.txt"
10+
source_url = "keep-test-xxxxxx.cos.ap-guangzhou.myqcloud.com/acl.txt"
11+
}
12+
```
13+
*/
14+
package tencentcloud
15+
16+
import (
17+
"context"
18+
"log"
19+
20+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
21+
)
22+
23+
func resourceTencentCloudCosObjectCopyOperation() *schema.Resource {
24+
return &schema.Resource{
25+
Create: resourceTencentCloudCosObjectCopyOperationCreate,
26+
Read: resourceTencentCloudCosObjectCopyOperationRead,
27+
Delete: resourceTencentCloudCosObjectCopyOperationDelete,
28+
29+
Schema: map[string]*schema.Schema{
30+
"bucket": {
31+
Required: true,
32+
ForceNew: true,
33+
Type: schema.TypeString,
34+
Description: "Bucket.",
35+
},
36+
"key": {
37+
Required: true,
38+
ForceNew: true,
39+
Type: schema.TypeString,
40+
Description: "Object key.",
41+
},
42+
"source_url": {
43+
Required: true,
44+
ForceNew: true,
45+
Type: schema.TypeString,
46+
Description: "Object key.",
47+
},
48+
},
49+
}
50+
}
51+
52+
func resourceTencentCloudCosObjectCopyOperationCreate(d *schema.ResourceData, meta interface{}) error {
53+
defer logElapsed("resource.tencentcloud_cos_object_copy_operation.create")()
54+
defer inconsistentCheck(d, meta)()
55+
56+
logId := getLogId(contextNil)
57+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
58+
bucket := d.Get("bucket").(string)
59+
key := d.Get("key").(string)
60+
sourceURL := d.Get("source_url").(string)
61+
_, _, err := meta.(*TencentCloudClient).apiV3Conn.UseTencentCosClient(bucket).Object.Copy(ctx, key, sourceURL, nil)
62+
if err != nil {
63+
log.Printf("[CRITAL]%s Restore failed, reason:%+v", logId, err)
64+
return err
65+
}
66+
67+
d.SetId(bucket + FILED_SP + key)
68+
69+
return resourceTencentCloudCosObjectCopyOperationRead(d, meta)
70+
}
71+
72+
func resourceTencentCloudCosObjectCopyOperationRead(d *schema.ResourceData, meta interface{}) error {
73+
defer logElapsed("resource.tencentcloud_cos_object_copy_operation.read")()
74+
defer inconsistentCheck(d, meta)()
75+
76+
return nil
77+
}
78+
79+
func resourceTencentCloudCosObjectCopyOperationDelete(d *schema.ResourceData, meta interface{}) error {
80+
defer logElapsed("resource.tencentcloud_cos_object_copy_operation.delete")()
81+
defer inconsistentCheck(d, meta)()
82+
83+
return nil
84+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudCosObjectCopyOperationResource(t *testing.T) {
10+
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() { testAccPreCheck(t) },
13+
Providers: testAccProviders,
14+
Steps: []resource.TestStep{
15+
{
16+
Config: testAccCosObjectCopyOperation,
17+
Check: resource.ComposeAggregateTestCheckFunc(
18+
resource.TestCheckResourceAttrSet("tencentcloud_cos_object_copy_operation.object_copy", "id"),
19+
),
20+
},
21+
},
22+
})
23+
}
24+
25+
const testAccCosObjectCopyOperation = `
26+
resource "tencentcloud_cos_object_copy_operation" "object_copy" {
27+
bucket = "keep-copy-1308919341"
28+
key = "copy-acl.txt"
29+
source_url = "keep-test-1308919341.cos.ap-guangzhou.myqcloud.com/acl.txt"
30+
}
31+
`

0 commit comments

Comments
 (0)