Skip to content

Commit 79bad3d

Browse files
author
hhermanwang
committed
modify tke config and new cos bucket policy file
1 parent b1bdc8e commit 79bad3d

12 files changed

+570
-12
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
## 1.48.1 (Unreleased)
2+
3+
FEATURES:
4+
5+
* **New Resource**: `tencentcloud_cos_bucket_policy`
6+
7+
ENHANCEMENTS:
8+
9+
* Resource: `tencentcloud_kubernetes_as_scaling_group` support `max_size` and `min_size` modification.
10+
211
## 1.48.0 (November 20, 2020)
312

413
FEATURES:

examples/tencentcloud-cos/main.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,8 @@ data "tencentcloud_cos_buckets" "data_bucket" {
5454
bucket_prefix = tencentcloud_cos_bucket.bucket.id
5555
tags = tencentcloud_cos_bucket.bucket.tags
5656
}
57+
58+
resource "tencentcloud_cos_bucket_policy" "cos_policy" {
59+
bucket = "mycos-1258798060"
60+
policy = var.policy
61+
}

examples/tencentcloud-cos/variables.tf

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,28 @@ variable "acl" {
1313
variable "object-content" {
1414
default = "terraform tencent cloud cos object"
1515
}
16+
17+
variable "policy" {
18+
default = <<EOF
19+
{
20+
"version": "2.0",
21+
"Statement": [
22+
{
23+
"Principal": {
24+
"qcs": [
25+
"qcs::cam::uin/100010835595:uin/100014918835"
26+
]
27+
},
28+
"Action": [
29+
"name/cos:DeleteBucket",
30+
"name/cos:PutBucketACL"
31+
],
32+
"Effect": "allow",
33+
"Resource": [
34+
"qcs::cos:ap-nanjing:uid/1259649581:hhermanwang-1259649581/*"
35+
]
36+
}
37+
]
38+
}
39+
EOF
40+
}

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,7 @@ func Provider() terraform.ResourceProvider {
874874
"tencentcloud_api_gateway_api_key_attachment": resourceTencentCloudAPIGatewayAPIKeyAttachment(),
875875
"tencentcloud_api_gateway_service_release": resourceTencentCloudAPIGatewayServiceRelease(),
876876
"tencentcloud_sqlserver_basic_instance": resourceTencentCloudSqlserverBasicInstance(),
877+
"tencentcloud_cos_bucket_policy": resourceTencentCloudCosBucketPolicy(),
877878
},
878879

879880
ConfigureFunc: providerConfigure,

tencentcloud/resource_tc_clb_listener.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ func resourceTencentCloudClbListener() *schema.Resource {
352352
Type: schema.TypeString,
353353
Optional: true,
354354
ForceNew: true,
355+
Computed: true,
355356
ValidateFunc: validateAllowedStringValue([]string{CLB_TARGET_TYPE_NODE, CLB_TARGET_TYPE_TARGETGROUP}),
356357
Description: "Backend target type. Valid values: `NODE`, `TARGETGROUP`. `NODE` means to bind ordinary nodes, `TARGETGROUP` means to bind target group. NOTES: TCP/UDP/TCP_SSL listener must configuration, HTTP/HTTPS listener needs to be configured in tencentcloud_clb_listener_rule.",
357358
},
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
/*
2+
Provides a COS resource to create a COS bucket policy and set its attributes.
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cos_bucket_policy" "cos_policy" {
8+
bucket = "mycos-1258798060"
9+
10+
policy = <<EOF
11+
{
12+
"version": "2.0",
13+
"Statement": [
14+
{
15+
"Principal": {
16+
"qcs": [
17+
"qcs::cam::uin/<your-account-id>:uin/<your-account-id>"
18+
]
19+
},
20+
"Action": [
21+
"name/cos:DeleteBucket",
22+
"name/cos:PutBucketACL"
23+
],
24+
"Effect": "allow",
25+
"Resource": [
26+
"qcs::cos:<bucket region>:uid/<your-account-id>:<bucket name>/*"
27+
]
28+
}
29+
]
30+
}
31+
EOF
32+
}
33+
```
34+
35+
Import
36+
37+
COS bucket policy can be imported, e.g.
38+
39+
```
40+
$ terraform import tencentcloud_cos_bucket_policy.bucket bucket-name
41+
```
42+
*/
43+
package tencentcloud
44+
45+
import (
46+
"context"
47+
"encoding/json"
48+
"log"
49+
"reflect"
50+
"time"
51+
52+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
53+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
54+
)
55+
56+
func resourceTencentCloudCosBucketPolicy() *schema.Resource {
57+
return &schema.Resource{
58+
Create: resourceTencentCloudCosBucketPolicyCreate,
59+
Read: resourceTencentCloudCosBucketPolicyRead,
60+
Update: resourceTencentCloudCosBucketPolicyUpdate,
61+
Delete: resourceTencentCloudCosBucketPolicyDelete,
62+
Importer: &schema.ResourceImporter{
63+
State: schema.ImportStatePassthrough,
64+
},
65+
66+
Schema: map[string]*schema.Schema{
67+
"bucket": {
68+
Type: schema.TypeString,
69+
Required: true,
70+
ForceNew: true,
71+
ValidateFunc: validateCosBucketName,
72+
Description: "The name of a bucket to be created. Bucket format should be [custom name]-[appid], for example `mycos-1258798060`.",
73+
},
74+
"policy": {
75+
Type: schema.TypeString,
76+
Required: true,
77+
DiffSuppressFunc: func(k, olds, news string, d *schema.ResourceData) bool {
78+
var oldJson interface{}
79+
err := json.Unmarshal([]byte(olds), &oldJson)
80+
if err != nil {
81+
return olds == news
82+
}
83+
var newJson interface{}
84+
err = json.Unmarshal([]byte(news), &newJson)
85+
if err != nil {
86+
return olds == news
87+
}
88+
flag := reflect.DeepEqual(oldJson, newJson)
89+
return flag
90+
},
91+
Description: "The text of the policy. this field is required. the syntax refers to https://cloud.tencent.com/document/product/436/18023.",
92+
},
93+
},
94+
}
95+
}
96+
97+
func resourceTencentCloudCosBucketPolicyCreate(d *schema.ResourceData, meta interface{}) error {
98+
defer logElapsed("resource.tencentcloud_cos_bucket_policy.create")()
99+
100+
logId := getLogId(contextNil)
101+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
102+
bucket := d.Get("bucket").(string)
103+
policy := d.Get("policy").(string)
104+
105+
cosService := CosService{client: meta.(*TencentCloudClient).apiV3Conn}
106+
107+
err := cosService.PutBucketPolicy(ctx, bucket, policy)
108+
if err != nil {
109+
return err
110+
}
111+
d.SetId(bucket)
112+
113+
return resourceTencentCloudCosBucketPolicyRead(d, meta)
114+
}
115+
116+
func resourceTencentCloudCosBucketPolicyRead(d *schema.ResourceData, meta interface{}) error {
117+
defer logElapsed("resource.tencentcloud_cos_bucket_policy.read")()
118+
119+
logId := getLogId(contextNil)
120+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
121+
122+
bucket := d.Id()
123+
cosService := CosService{client: meta.(*TencentCloudClient).apiV3Conn}
124+
125+
var result string
126+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
127+
policy, e := cosService.DescribePolicyByBucket(ctx, bucket)
128+
if e != nil {
129+
return retryError(e)
130+
}
131+
result = policy
132+
return nil
133+
})
134+
if err != nil {
135+
log.Printf("[CRITAL]%s read cos bucket policy failed, reason:%s\n", logId, err.Error())
136+
return err
137+
}
138+
result, err = removeSid(result)
139+
if err != nil {
140+
log.Printf("[CRITAL]%s read cos bucket policy failed, reason:%s\n", logId, err.Error())
141+
return err
142+
}
143+
if result == "" {
144+
d.SetId("")
145+
return nil
146+
}
147+
_ = d.Set("policy", result)
148+
_ = d.Set("bucket", bucket)
149+
150+
return nil
151+
}
152+
153+
func resourceTencentCloudCosBucketPolicyUpdate(d *schema.ResourceData, meta interface{}) error {
154+
defer logElapsed("resource.tencentcloud_cos_bucket_policy.update")()
155+
156+
logId := getLogId(contextNil)
157+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
158+
cosService := CosService{client: meta.(*TencentCloudClient).apiV3Conn}
159+
bucket := d.Id()
160+
161+
if d.HasChange("policy") {
162+
policy := d.Get("policy").(string)
163+
err := cosService.PutBucketPolicy(ctx, bucket, policy)
164+
if err != nil {
165+
return err
166+
}
167+
}
168+
169+
// wait for update cache
170+
// if not, the data may be outdated.
171+
time.Sleep(3 * time.Second)
172+
173+
return resourceTencentCloudCosBucketPolicyRead(d, meta)
174+
}
175+
176+
func resourceTencentCloudCosBucketPolicyDelete(d *schema.ResourceData, meta interface{}) error {
177+
defer logElapsed("resource.tencentcloud_cos_bucket_policy.delete")()
178+
179+
logId := getLogId(contextNil)
180+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
181+
182+
bucket := d.Id()
183+
cosService := CosService{
184+
client: meta.(*TencentCloudClient).apiV3Conn,
185+
}
186+
err := cosService.DeleteBucketPolicy(ctx, bucket)
187+
if err != nil {
188+
return err
189+
}
190+
191+
// wait for update cache
192+
// if not, head bucket may be successful
193+
time.Sleep(3 * time.Second)
194+
195+
return nil
196+
}
197+
198+
//In the returned JSON, the SDK automatically adds the Sid, which needs to be removed
199+
func removeSid(v string) (result string, err error) {
200+
m := make(map[string]interface{})
201+
err = json.Unmarshal([]byte(v), &m)
202+
if err != nil {
203+
return
204+
}
205+
var stateMend []interface{}
206+
if v, ok := m["Statement"]; ok {
207+
stateMend = v.([]interface{})
208+
} else if v, ok := m["statement"]; ok {
209+
stateMend = v.([]interface{})
210+
}
211+
for index, v := range stateMend {
212+
mp := v.(map[string]interface{})
213+
delete(mp, "Sid")
214+
stateMend[index] = mp
215+
}
216+
if _, ok := m["Statement"]; ok {
217+
m["Statement"] = stateMend
218+
} else if _, ok := m["statement"]; ok {
219+
m["statement"] = stateMend
220+
}
221+
s, err := json.Marshal(m)
222+
return string(s), err
223+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
10+
)
11+
12+
func TestAccTencentCloudCosBucketPolicy(t *testing.T) {
13+
resource.Test(t, resource.TestCase{
14+
PreCheck: func() { testAccPreCheck(t) },
15+
Providers: testAccProviders,
16+
CheckDestroy: testAccCheckCosBucketPolicyDestroy,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: testAccCosBucketPolicyBasic,
20+
Check: resource.ComposeTestCheckFunc(
21+
testAccCheckCosBucketPolicyExists("tencentcloud_cos_bucket_policy.foo"),
22+
resource.TestCheckResourceAttrSet("tencentcloud_cos_bucket_policy.foo", "bucket"),
23+
resource.TestCheckResourceAttrSet("tencentcloud_cos_bucket_policy.foo", "policy"),
24+
),
25+
}, {
26+
Config: testAccCosBucketPolicyUpdate,
27+
Check: resource.ComposeTestCheckFunc(
28+
testAccCheckCosBucketPolicyExists("tencentcloud_cos_bucket_policy.foo"),
29+
resource.TestCheckResourceAttrSet("tencentcloud_cos_bucket_policy.foo", "bucket"),
30+
resource.TestCheckResourceAttrSet("tencentcloud_cos_bucket_policy.foo", "policy"),
31+
),
32+
},
33+
{
34+
ResourceName: "tencentcloud_cos_bucket_policy.foo",
35+
ImportState: true,
36+
ImportStateVerify: true,
37+
},
38+
},
39+
})
40+
}
41+
42+
func testAccCheckCosBucketPolicyDestroy(s *terraform.State) error {
43+
logId := getLogId(contextNil)
44+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
45+
46+
cosService := CosService{
47+
client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn,
48+
}
49+
for _, rs := range s.RootModule().Resources {
50+
if rs.Type != "tencentcloud_cos_bucket_policy" {
51+
continue
52+
}
53+
54+
policy, err := cosService.DescribePolicyByBucket(ctx, rs.Primary.ID)
55+
if err == nil && policy != "" {
56+
return fmt.Errorf("[TECENT_TERRAFORM_CHECK][cos bucket policy][Desctroy] check: cos bucket policy still exists: %s", rs.Primary.ID)
57+
}
58+
}
59+
return nil
60+
}
61+
62+
func testAccCheckCosBucketPolicyExists(n string) resource.TestCheckFunc {
63+
return func(s *terraform.State) error {
64+
logId := getLogId(contextNil)
65+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
66+
67+
rs, ok := s.RootModule().Resources[n]
68+
if !ok {
69+
return fmt.Errorf("[TECENT_TERRAFORM_CHECK][cos bucket policy][Exists] check: cos bucket policy %s is not found", n)
70+
}
71+
if rs.Primary.ID == "" {
72+
return fmt.Errorf("[TECENT_TERRAFORM_CHECK][cos bucket policy][Exists] check: cos bucket policy id is not set")
73+
}
74+
cosService := CosService{
75+
client: testAccProvider.Meta().(*TencentCloudClient).apiV3Conn,
76+
}
77+
policy, err := cosService.DescribePolicyByBucket(ctx, rs.Primary.ID)
78+
if err != nil {
79+
return err
80+
}
81+
if policy == "" {
82+
return fmt.Errorf("[TECENT_TERRAFORM_CHECK][cos bucket policy][Exists] check: cos bucket policy %s is not exist", rs.Primary.ID)
83+
}
84+
return nil
85+
}
86+
}
87+
88+
const testAccCosBucketPolicyBasic = `
89+
resource "tencentcloud_cos_bucket_policy" "foo" {
90+
bucket = "bucket-for-terraform-state-1259649581"
91+
policy = "{\"version\":\"2.0\",\"Statement\":[{\"Action\":[\"name/cos:DeleteBucket\"],\"Effect\":\"allow\",\"Resource\":[\"qcs::cos:ap-guangzhou:uid/1259649581:bucket-for-terraform-state-1259649581/*\"],\"Principal\":{\"qcs\":[\"qcs::cam::uin/100010835595:uin/100014918835\"]}}]}"
92+
}
93+
`
94+
95+
const testAccCosBucketPolicyUpdate = `
96+
resource "tencentcloud_cos_bucket_policy" "foo" {
97+
bucket = "bucket-for-terraform-state-1259649581"
98+
policy = "{\"version\":\"2.0\",\"Statement\":[{\"Action\":[\"name/cos:PutBucketACL\"],\"Effect\":\"allow\",\"Resource\":[\"qcs::cos:ap-guangzhou:uid/1259649581:bucket-for-terraform-state-1259649581/*\"],\"Principal\":{\"qcs\":[\"qcs::cam::uin/100010835595:uin/100014918835\"]}}]}"
99+
}
100+
`

0 commit comments

Comments
 (0)