Skip to content

Commit 524ebfa

Browse files
authored
support tcr: tag retention execution (#1896)
* support tcr: tag retention execution * add changelog * update changelog * support tcr: renew instance * fmt
1 parent 86d8546 commit 524ebfa

17 files changed

+568
-171
lines changed

.changelog/1896.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:new-resource
2+
tencentcloud_tcr_tag_retention_execution_config
3+
```
4+
5+
```release-note:enhancement
6+
resource/tencentcloud_tcr_tag_retention_rule: add a computed field `retention_id`.
7+
```
8+
9+
```release-note:enhancement
10+
resource/tencentcloud_tcr_instance: support to update `instance_charge_type_prepaid_period` field.
11+
```

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ require (
3838
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.659
3939
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544
4040
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.663
41-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.677
41+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.680
4242
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624
4343
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589
4444
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.572
@@ -76,7 +76,7 @@ require (
7676
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tat v1.0.634
7777
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcaplusdb v1.0.199
7878
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcm v1.0.547
79-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.593
79+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.680
8080
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdcpg v1.0.533
8181
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.670
8282
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tem v1.0.578

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.674/go.mod
852852
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.676/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
853853
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.677 h1:pDvKzWMXn+uQn2zeEXbwulHAd1illf/rLr5bIuu9A04=
854854
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.677/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
855+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.680 h1:62IlVvNZvqYuZZLGyCCirjdG52Kx3mJ0cbajbG72e5s=
856+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.680/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
855857
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624 h1:nEZqsoqt1pEoaP9JjkHQy3/H00suCfzlHW1qOm2nYD8=
856858
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624/go.mod h1:+TXSVyeKwt1IhZRqKPbTREteBcP+K07Q846/ilNzLWA=
857859
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589 h1:LZihgirMH0vsaGScYexxwY0fTss9vHaSZs/YOQUVESg=
@@ -929,6 +931,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcm v1.0.547 h1:6bukohy
929931
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcm v1.0.547/go.mod h1:C7b++Lr8Xh+2KtTUMBjbb+/BrBhfFhAxDMjXzT2GLhY=
930932
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.593 h1:QCvxPWNBcKjTgUeiN78Waiv/59znPyHradO1nDUYFqw=
931933
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.593/go.mod h1:k8Rnd9/P14yKUCIQH84ScSyi5/bJ5N2WVpL8fC89xrU=
934+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.680 h1:e5xJXZYxSw65xjy259AgsBG1NG3Q0fuyYcPm5dp3lkg=
935+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr v1.0.680/go.mod h1:pwgZJLN5WL93J44Q8HfkUYDvHYgkSFxL9EuqPv28nLs=
932936
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdcpg v1.0.533 h1:r6HQhmHzPp1oSGhwkNzUzIRlpnpb8Jhtcn1yKhg9ml4=
933937
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdcpg v1.0.533/go.mod h1:5sIIchyV9sXIVAqsD3UWts+qQJ0qoc55sL2WuiY8Ugs=
934938
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.670 h1:8HqKhy7wbSsgacBs0iYWh/A0/zvCPzKPS++olMaf9EQ=

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,7 @@ Tencent Container Registry(TCR)
851851
tencentcloud_tcr_immutable_tag_rule
852852
tencentcloud_tcr_delete_image_operation
853853
tencentcloud_tcr_create_image_signature_operation
854+
tencentcloud_tcr_tag_retention_execution_config
854855
855856
Video on Demand(VOD)
856857
Data Source
@@ -2480,6 +2481,7 @@ func Provider() *schema.Provider {
24802481
"tencentcloud_tcr_immutable_tag_rule": resourceTencentCloudTcrImmutableTagRule(),
24812482
"tencentcloud_tcr_delete_image_operation": resourceTencentCloudTcrDeleteImageOperation(),
24822483
"tencentcloud_tcr_create_image_signature_operation": resourceTencentCloudTcrCreateImageSignatureOperation(),
2484+
"tencentcloud_tcr_tag_retention_execution_config": resourceTencentCloudTcrTagRetentionExecutionConfig(),
24832485
"tencentcloud_tdmq_instance": resourceTencentCloudTdmqInstance(),
24842486
"tencentcloud_tdmq_namespace": resourceTencentCloudTdmqNamespace(),
24852487
"tencentcloud_tdmq_topic": resourceTencentCloudTdmqTopic(),

tencentcloud/resource_tc_tcr_instance.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,61 @@ func resourceTencentCloudTcrInstanceUpdate(d *schema.ResourceData, meta interfac
647647
}
648648
}
649649

650+
if d.HasChange("instance_charge_type_prepaid_period") {
651+
var (
652+
chargeType int
653+
period int
654+
renewFlag int
655+
)
656+
657+
if v, ok := d.GetOk("registry_charge_type"); ok {
658+
chargeType = v.(int)
659+
660+
if v, ok := d.GetOk("instance_charge_type_prepaid_period"); ok {
661+
period = v.(int)
662+
}
663+
if v, ok := d.GetOk("instance_charge_type_prepaid_renew_flag"); ok {
664+
renewFlag = v.(int)
665+
}
666+
667+
if (chargeType - 1) == REGISTRY_CHARGE_TYPE_PREPAID {
668+
request := tcr.NewRenewInstanceRequest()
669+
request.RegistryId = &instanceId
670+
request.RegistryChargePrepaid = &tcr.RegistryChargePrepaid{
671+
Period: helper.IntInt64(period),
672+
RenewFlag: helper.IntInt64(renewFlag - 1),
673+
}
674+
request.Flag = helper.IntInt64(0)
675+
676+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
677+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseTCRClient().RenewInstance(request)
678+
if e != nil {
679+
return retryError(e)
680+
} else {
681+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
682+
}
683+
return nil
684+
})
685+
if err != nil {
686+
log.Printf("[CRITAL]%s operate tcr renewInstanceOperation failed, reason:%+v", logId, err)
687+
return err
688+
}
689+
690+
conf := BuildStateChangeConf([]string{}, []string{"Running"}, 3*readRetryTimeout, time.Second, tcrService.TcrStateRefreshFunc(instanceId, []string{}))
691+
692+
if _, e := conf.WaitForState(); e != nil {
693+
return e
694+
}
695+
696+
} else {
697+
return fmt.Errorf("Only the postpaid user allows changing the `instance_charge_type_prepaid_period`! The current charge type is: [%v].", chargeType)
698+
}
699+
700+
} else {
701+
return fmt.Errorf("`registry_charge_type` must be set when trying to change the `instance_charge_type_prepaid_period`!")
702+
}
703+
}
704+
650705
return resourceTencentCloudTcrInstanceRead(d, meta)
651706
}
652707

tencentcloud/resource_tc_tcr_instance_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,23 @@ func TestAccTencentCloudNeedFixTcrInstanceResource_paypaid(t *testing.T) {
174174
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "instance_type", "basic"),
175175
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "tags.test", "test"),
176176
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "registry_charge_type", "2"),
177+
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "instance_charge_type_prepaid_period", "1"),
178+
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "instance_charge_type_prepaid_renew_flag", "1"),
179+
resource.TestCheckResourceAttrSet("tencentcloud_tcr_instance.mytcr_instance_paypaid", "expired_at"),
180+
),
181+
},
182+
{
183+
Config: testAccTCRInstance_update_paypaid_period,
184+
PreConfig: func() {
185+
testAccStepSetRegion(t, "ap-shanghai")
186+
testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY)
187+
},
188+
Check: resource.ComposeAggregateTestCheckFunc(
189+
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "name", "paypaidtcrinstance"),
190+
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "instance_type", "basic"),
191+
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "tags.test", "test"),
192+
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "registry_charge_type", "2"),
193+
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "instance_charge_type_prepaid_period", "2"),
177194
resource.TestCheckResourceAttr("tencentcloud_tcr_instance.mytcr_instance_paypaid", "instance_charge_type_prepaid_renew_flag", "1"),
178195
resource.TestCheckResourceAttrSet("tencentcloud_tcr_instance.mytcr_instance_paypaid", "expired_at"),
179196
),
@@ -392,6 +409,19 @@ resource "tencentcloud_tcr_instance" "mytcr_instance_paypaid" {
392409
}
393410
}`
394411

412+
const testAccTCRInstance_update_paypaid_period = `
413+
resource "tencentcloud_tcr_instance" "mytcr_instance_paypaid" {
414+
name = "paypaidtcrinstance"
415+
instance_type = "basic"
416+
delete_bucket = true
417+
registry_charge_type = 2
418+
instance_charge_type_prepaid_period = 2
419+
instance_charge_type_prepaid_renew_flag = 1
420+
tags ={
421+
test = "test"
422+
}
423+
}`
424+
395425
const testAccTCRInstance_replica = `
396426
resource "tencentcloud_tcr_instance" "mytcr_instance" {
397427
name = "tfreplicas"
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
/*
2+
Provides a resource to create a tcr tag_retention_execution_config
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_tcr_namespace" "my_ns" {
8+
instance_id = tencentcloud_tcr_instance.mytcr_retention.id
9+
name = "tf_test_ns_retention"
10+
is_public = true
11+
is_auto_scan = true
12+
is_prevent_vul = true
13+
severity = "medium"
14+
cve_whitelist_items {
15+
cve_id = "cve-xxxxx"
16+
}
17+
}
18+
19+
resource "tencentcloud_tcr_tag_retention_rule" "my_rule" {
20+
registry_id = tencentcloud_tcr_instance.mytcr_retention.id
21+
namespace_name = tencentcloud_tcr_namespace.my_ns.name
22+
retention_rule {
23+
key = "nDaysSinceLastPush"
24+
value = 2
25+
}
26+
cron_setting = "manual"
27+
disabled = true
28+
}
29+
30+
resource "tencentcloud_tcr_tag_retention_execution_config" "tag_retention_execution_config" {
31+
registry_id = tencentcloud_tcr_tag_retention_rule.my_rule.registry_id
32+
retention_id = tencentcloud_tcr_tag_retention_rule.my_rule.retention_id
33+
dry_run = false
34+
}
35+
```
36+
*/
37+
package tencentcloud
38+
39+
import (
40+
"context"
41+
"fmt"
42+
"log"
43+
"strings"
44+
"time"
45+
46+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
47+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
48+
tcr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr/v20190924"
49+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
50+
)
51+
52+
func resourceTencentCloudTcrTagRetentionExecutionConfig() *schema.Resource {
53+
return &schema.Resource{
54+
Create: resourceTencentCloudTcrTagRetentionExecutionConfigCreate,
55+
Read: resourceTencentCloudTcrTagRetentionExecutionConfigRead,
56+
Update: resourceTencentCloudTcrTagRetentionExecutionConfigUpdate,
57+
Delete: resourceTencentCloudTcrTagRetentionExecutionConfigDelete,
58+
Schema: map[string]*schema.Schema{
59+
"registry_id": {
60+
Required: true,
61+
Type: schema.TypeString,
62+
Description: "instance id.",
63+
},
64+
65+
"retention_id": {
66+
Required: true,
67+
Type: schema.TypeInt,
68+
Description: "retention id.",
69+
},
70+
71+
"execution_id": {
72+
Computed: true,
73+
Type: schema.TypeInt,
74+
Description: "execution id.",
75+
},
76+
77+
"dry_run": {
78+
Optional: true,
79+
Type: schema.TypeBool,
80+
Description: "Whether to simulate execution, the default value is false, that is, non-simulation execution.",
81+
},
82+
},
83+
}
84+
}
85+
86+
func resourceTencentCloudTcrTagRetentionExecutionConfigCreate(d *schema.ResourceData, meta interface{}) error {
87+
defer logElapsed("resource.tencentcloud_tcr_tag_retention_execution_config.create")()
88+
defer inconsistentCheck(d, meta)()
89+
90+
var (
91+
registryId string
92+
retentionId string
93+
)
94+
95+
if v, ok := d.GetOk("registry_id"); ok {
96+
registryId = v.(string)
97+
}
98+
99+
if v, ok := d.GetOk("retention_id"); ok {
100+
retentionId = helper.IntToStr(v.(int))
101+
}
102+
103+
d.SetId(strings.Join([]string{registryId, retentionId}, FILED_SP))
104+
105+
return resourceTencentCloudTcrTagRetentionExecutionConfigUpdate(d, meta)
106+
}
107+
108+
func resourceTencentCloudTcrTagRetentionExecutionConfigRead(d *schema.ResourceData, meta interface{}) error {
109+
defer logElapsed("resource.tencentcloud_tcr_tag_retention_execution_config.read")()
110+
defer inconsistentCheck(d, meta)()
111+
112+
logId := getLogId(contextNil)
113+
114+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
115+
116+
service := TCRService{client: meta.(*TencentCloudClient).apiV3Conn}
117+
118+
idSplit := strings.Split(d.Id(), FILED_SP)
119+
if len(idSplit) != 2 {
120+
return fmt.Errorf("id is broken,%s", d.Id())
121+
}
122+
registryId := idSplit[0]
123+
retentionId := idSplit[1]
124+
125+
TagRetentionExecutionConfig, err := service.DescribeTcrTagRetentionExecutionConfigById(ctx, registryId, retentionId)
126+
if err != nil {
127+
return err
128+
}
129+
130+
if TagRetentionExecutionConfig == nil {
131+
d.SetId("")
132+
log.Printf("[WARN]%s resource `TcrTagRetentionExecutionConfig` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
133+
return nil
134+
}
135+
136+
_ = d.Set("registry_id", registryId)
137+
138+
if TagRetentionExecutionConfig.RetentionId != nil {
139+
_ = d.Set("retention_id", TagRetentionExecutionConfig.RetentionId)
140+
}
141+
142+
if TagRetentionExecutionConfig.ExecutionId != nil {
143+
_ = d.Set("execution_id", TagRetentionExecutionConfig.ExecutionId)
144+
}
145+
146+
return nil
147+
}
148+
149+
func resourceTencentCloudTcrTagRetentionExecutionConfigUpdate(d *schema.ResourceData, meta interface{}) error {
150+
defer logElapsed("resource.tencentcloud_tcr_tag_retention_execution_config.update")()
151+
defer inconsistentCheck(d, meta)()
152+
153+
logId := getLogId(contextNil)
154+
155+
request := tcr.NewCreateTagRetentionExecutionRequest()
156+
157+
idSplit := strings.Split(d.Id(), FILED_SP)
158+
if len(idSplit) != 2 {
159+
return fmt.Errorf("id is broken,%s", d.Id())
160+
}
161+
registryId := idSplit[0]
162+
retentionId := idSplit[1]
163+
164+
request.RegistryId = &registryId
165+
request.RetentionId = helper.StrToInt64Point(retentionId)
166+
167+
if d.HasChange("dry_run") {
168+
if v, ok := d.GetOkExists("dry_run"); ok {
169+
request.DryRun = helper.Bool(v.(bool))
170+
}
171+
}
172+
173+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
174+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseTCRClient().CreateTagRetentionExecution(request)
175+
if e != nil {
176+
return retryError(e)
177+
} else {
178+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
179+
}
180+
return nil
181+
})
182+
if err != nil {
183+
log.Printf("[CRITAL]%s update tcr TagRetentionExecutionConfig failed, reason:%+v", logId, err)
184+
return err
185+
}
186+
187+
service := TCRService{client: meta.(*TencentCloudClient).apiV3Conn}
188+
189+
conf := BuildStateChangeConf([]string{}, []string{"Succeed"}, 3*readRetryTimeout, time.Second, service.TcrTagRetentionExecutionConfigStateRefreshFunc(registryId, retentionId, []string{}))
190+
191+
if _, e := conf.WaitForState(); e != nil {
192+
return e
193+
}
194+
195+
return resourceTencentCloudTcrTagRetentionExecutionConfigRead(d, meta)
196+
}
197+
198+
func resourceTencentCloudTcrTagRetentionExecutionConfigDelete(d *schema.ResourceData, meta interface{}) error {
199+
defer logElapsed("resource.tencentcloud_tcr_tag_retention_execution_config.delete")()
200+
defer inconsistentCheck(d, meta)()
201+
202+
return nil
203+
}

0 commit comments

Comments
 (0)