Skip to content

Commit 877b36e

Browse files
gitmknanonymous
andauthored
feat: support cos referer and version (#1894)
* feat: support cos referer and version * feat: add changelog * feat: add doc --------- Co-authored-by: anonymous <anonymous@mail.org>
1 parent 30cbb61 commit 877b36e

10 files changed

+676
-0
lines changed

.changelog/1894.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:new-resource
2+
tencentcloud_cos_bucket_referer
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_cos_bucket_version
7+
```

tencentcloud/provider.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,8 @@ Cloud Object Storage(COS)
341341
tencentcloud_cos_bucket
342342
tencentcloud_cos_bucket_object
343343
tencentcloud_cos_bucket_policy
344+
tencentcloud_cos_bucket_referer
345+
tencentcloud_cos_bucket_version
344346
tencentcloud_cos_bucket_domain_certificate_attachment
345347
346348
Cloud Virtual Machine(CVM)
@@ -2233,6 +2235,8 @@ func Provider() *schema.Provider {
22332235
"tencentcloud_mysql_switch_master_slave_operation": resourceTencentCloudMysqlSwitchMasterSlaveOperation(),
22342236
"tencentcloud_cos_bucket": resourceTencentCloudCosBucket(),
22352237
"tencentcloud_cos_bucket_object": resourceTencentCloudCosBucketObject(),
2238+
"tencentcloud_cos_bucket_referer": resourceTencentCloudCosBucketReferer(),
2239+
"tencentcloud_cos_bucket_version": resourceTencentCloudCosBucketVersion(),
22362240
"tencentcloud_cfs_file_system": resourceTencentCloudCfsFileSystem(),
22372241
"tencentcloud_cfs_access_group": resourceTencentCloudCfsAccessGroup(),
22382242
"tencentcloud_cfs_access_rule": resourceTencentCloudCfsAccessRule(),
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
/*
2+
Provides a resource to create a cos bucket_referer
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cos_bucket_referer" "bucket_referer" {
8+
bucket = "mycos-1258798060"
9+
status = "Enabled"
10+
referer_type = "Black-List"
11+
domain_list = ["127.0.0.1", "terraform.com"]
12+
empty_refer_configuration = "Allow"
13+
}
14+
```
15+
16+
Import
17+
18+
cos bucket_referer can be imported using the id, e.g.
19+
20+
```
21+
terraform import tencentcloud_cos_bucket_referer.bucket_referer bucket_id
22+
```
23+
*/
24+
package tencentcloud
25+
26+
import (
27+
"context"
28+
"log"
29+
30+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
31+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
32+
cos "github.com/tencentyun/cos-go-sdk-v5"
33+
)
34+
35+
func resourceTencentCloudCosBucketReferer() *schema.Resource {
36+
return &schema.Resource{
37+
Create: resourceTencentCloudCosBucketRefererCreate,
38+
Read: resourceTencentCloudCosBucketRefererRead,
39+
Update: resourceTencentCloudCosBucketRefererUpdate,
40+
Delete: resourceTencentCloudCosBucketRefererDelete,
41+
Importer: &schema.ResourceImporter{
42+
State: schema.ImportStatePassthrough,
43+
},
44+
Schema: map[string]*schema.Schema{
45+
"bucket": {
46+
Required: true,
47+
Type: schema.TypeString,
48+
Description: "Bucket format should be [custom name]-[appid], for example `mycos-1258798060`.",
49+
},
50+
"referer_type": {
51+
Type: schema.TypeString,
52+
Required: true,
53+
Description: "Hotlink protection type. Enumerated values: `Black-List`, `White-List`.",
54+
},
55+
"status": {
56+
Type: schema.TypeString,
57+
Required: true,
58+
Description: "Whether to enable hotlink protection. Enumerated values: `Enabled`, `Disabled`.",
59+
},
60+
"domain_list": {
61+
Type: schema.TypeSet,
62+
Elem: &schema.Schema{
63+
Type: schema.TypeString,
64+
},
65+
Required: true,
66+
Description: "A list of domain names in the blocklist/allowlist.",
67+
},
68+
"empty_refer_configuration": {
69+
Type: schema.TypeString,
70+
Optional: true,
71+
Description: "Whether to allow access with an empty referer. Enumerated values: `Allow`, `Deny` (default).",
72+
},
73+
},
74+
}
75+
}
76+
77+
func resourceTencentCloudCosBucketRefererCreate(d *schema.ResourceData, meta interface{}) error {
78+
defer logElapsed("resource.tencentcloud_cos_bucket_referer.create")()
79+
defer inconsistentCheck(d, meta)()
80+
81+
var bucket string
82+
if v, ok := d.GetOk("bucket"); ok {
83+
bucket = v.(string)
84+
}
85+
86+
d.SetId(bucket)
87+
88+
return resourceTencentCloudCosBucketRefererUpdate(d, meta)
89+
}
90+
91+
func resourceTencentCloudCosBucketRefererRead(d *schema.ResourceData, meta interface{}) error {
92+
defer logElapsed("resource.tencentcloud_cos_bucket_referer.read")()
93+
defer inconsistentCheck(d, meta)()
94+
95+
logId := getLogId(contextNil)
96+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
97+
98+
service := CosService{client: meta.(*TencentCloudClient).apiV3Conn}
99+
100+
bucket := d.Id()
101+
102+
bucketReferer, err := service.DescribeCosBucketRefererById(ctx, bucket)
103+
if err != nil {
104+
return err
105+
}
106+
107+
if bucketReferer == nil {
108+
d.SetId("")
109+
log.Printf("[WARN]%s resource `CosBucketReferer` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
110+
return nil
111+
}
112+
113+
_ = d.Set("bucket", bucket)
114+
115+
if bucketReferer.Status != "" {
116+
_ = d.Set("status", bucketReferer.Status)
117+
}
118+
119+
if bucketReferer.RefererType != "" {
120+
_ = d.Set("referer_type", bucketReferer.RefererType)
121+
}
122+
123+
if len(bucketReferer.DomainList) > 0 {
124+
_ = d.Set("domain_list", bucketReferer.DomainList)
125+
}
126+
127+
if bucketReferer.EmptyReferConfiguration != "" {
128+
_ = d.Set("empty_refer_configuration", bucketReferer.EmptyReferConfiguration)
129+
}
130+
131+
return nil
132+
}
133+
134+
func resourceTencentCloudCosBucketRefererUpdate(d *schema.ResourceData, meta interface{}) error {
135+
defer logElapsed("resource.tencentcloud_cos_bucket_referer.update")()
136+
defer inconsistentCheck(d, meta)()
137+
138+
logId := getLogId(contextNil)
139+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
140+
141+
bucket := d.Id()
142+
143+
request := cos.BucketPutRefererOptions{}
144+
if v, ok := d.GetOk("status"); ok {
145+
request.Status = v.(string)
146+
}
147+
if v, ok := d.GetOk("referer_type"); ok {
148+
request.RefererType = v.(string)
149+
}
150+
if v, ok := d.GetOk("domain_list"); ok {
151+
domainListSet := v.(*schema.Set).List()
152+
for i := range domainListSet {
153+
domainList := domainListSet[i].(string)
154+
request.DomainList = append(request.DomainList, domainList)
155+
}
156+
}
157+
if v, ok := d.GetOk("empty_refer_configuration"); ok {
158+
request.EmptyReferConfiguration = v.(string)
159+
}
160+
161+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
162+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseTencentCosClient(bucket).Bucket.PutReferer(ctx, &request)
163+
if e != nil {
164+
return retryError(e)
165+
} else {
166+
log.Printf("[DEBUG]%s api[%s] success, request body [%+v], response status [%s]\n", logId, "PutReferer", request, result.Status)
167+
}
168+
return nil
169+
})
170+
if err != nil {
171+
log.Printf("[CRITAL]%s cos bucketReferer failed, reason:%+v", logId, err)
172+
return err
173+
}
174+
175+
return resourceTencentCloudCosBucketRefererRead(d, meta)
176+
}
177+
178+
func resourceTencentCloudCosBucketRefererDelete(d *schema.ResourceData, meta interface{}) error {
179+
defer logElapsed("resource.tencentcloud_cos_bucket_referer.delete")()
180+
defer inconsistentCheck(d, meta)()
181+
182+
return nil
183+
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
10+
)
11+
12+
// go test -i; go test -test.run TestAccTencentCloudCosBucketRefererResource_basic -v
13+
func TestAccTencentCloudCosBucketRefererResource_basic(t *testing.T) {
14+
t.Parallel()
15+
16+
resource.Test(t, resource.TestCase{
17+
PreCheck: func() { testAccPreCheck(t) },
18+
Providers: testAccProviders,
19+
CheckDestroy: testAccCheckCosBucketRefererDestroy,
20+
Steps: []resource.TestStep{
21+
{
22+
Config: testAccCosBucketReferer,
23+
Check: resource.ComposeTestCheckFunc(
24+
testAccCheckCosBucketRefererExists("tencentcloud_cos_bucket_referer.bucket_referer"),
25+
resource.TestCheckResourceAttrSet("tencentcloud_cos_bucket_referer.bucket_referer", "id"),
26+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "status", "Enabled"),
27+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "referer_type", "Black-List"),
28+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "empty_refer_configuration", "Allow"),
29+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "domain_list.#", "2"),
30+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "domain_list.0", "127.0.0.1"),
31+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "domain_list.1", "terraform.com"),
32+
),
33+
},
34+
{
35+
ResourceName: "tencentcloud_cos_bucket_referer.bucket_referer",
36+
ImportState: true,
37+
ImportStateVerify: true,
38+
},
39+
{
40+
Config: testAccCosBucketRefererUp,
41+
Check: resource.ComposeTestCheckFunc(
42+
resource.TestCheckResourceAttrSet("tencentcloud_cos_bucket_referer.bucket_referer", "id"),
43+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "status", "Disabled"),
44+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket_referer.bucket_referer", "referer_type", "Black-List"),
45+
),
46+
},
47+
},
48+
})
49+
}
50+
51+
func testAccCheckCosBucketRefererDestroy(s *terraform.State) error {
52+
logId := getLogId(contextNil)
53+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
54+
service := CosService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn}
55+
for _, rs := range s.RootModule().Resources {
56+
if rs.Type != "tencentcloud_cos_bucket_referer" {
57+
continue
58+
}
59+
60+
res, err := service.DescribeCosBucketRefererById(ctx, rs.Primary.ID)
61+
if err != nil {
62+
return err
63+
}
64+
65+
if res != nil && res.Status == "Enabled" {
66+
return fmt.Errorf("cos referer still exist, Id: %v\n", rs.Primary.ID)
67+
}
68+
}
69+
return nil
70+
}
71+
72+
func testAccCheckCosBucketRefererExists(re string) resource.TestCheckFunc {
73+
return func(s *terraform.State) error {
74+
logId := getLogId(contextNil)
75+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
76+
service := CosService{client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn}
77+
78+
rs, ok := s.RootModule().Resources[re]
79+
if !ok {
80+
return fmt.Errorf("cos referer %s is not found", re)
81+
}
82+
if rs.Primary.ID == "" {
83+
return fmt.Errorf(" id is not set")
84+
}
85+
86+
result, err := service.DescribeCosBucketRefererById(ctx, rs.Primary.ID)
87+
if err != nil {
88+
return err
89+
}
90+
91+
if result == nil {
92+
return fmt.Errorf("cos referer not found, Id: %v", rs.Primary.ID)
93+
}
94+
95+
if result != nil && result.Status == "Disabled" {
96+
return fmt.Errorf("cos referer is not enabled, Id: %v", rs.Primary.ID)
97+
}
98+
99+
return nil
100+
}
101+
}
102+
103+
const testAccCosBucketRefererVar = `
104+
variable "bucket" {
105+
default = "` + defaultCiBucket + `"
106+
}
107+
108+
`
109+
110+
const testAccCosBucketReferer = testAccCosBucketRefererVar + `
111+
112+
resource "tencentcloud_cos_bucket_referer" "bucket_referer" {
113+
bucket = var.bucket
114+
status = "Enabled"
115+
referer_type = "Black-List"
116+
domain_list = ["127.0.0.1", "terraform.com"]
117+
empty_refer_configuration = "Allow"
118+
}
119+
`
120+
121+
const testAccCosBucketRefererUp = testAccCosBucketRefererVar + `
122+
123+
resource "tencentcloud_cos_bucket_referer" "bucket_referer" {
124+
bucket = var.bucket
125+
status = "Disabled"
126+
referer_type = "Black-List"
127+
domain_list = ["127.0.0.1", "terraform.com"]
128+
empty_refer_configuration = "Allow"
129+
}
130+
`

0 commit comments

Comments
 (0)