Skip to content

Commit 3c345ed

Browse files
tongyimingmikatong
and
mikatong
authored
feat(cdc): [123481772] image cache (#3338)
* support image cache * update * update * update * update * update test --------- Co-authored-by: mikatong <[email protected]>
1 parent c8f8e7b commit 3c345ed

19 files changed

+1001
-322
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ require (
4747
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
4848
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148
4949
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1154
50-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128
50+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153
5151
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
5252
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111
5353
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
@@ -107,7 +107,7 @@ require (
107107

108108
require (
109109
github.com/hashicorp/go-uuid v1.0.3
110-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.970
110+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.1149
111111
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwdoris v1.0.993
112112
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwpg v1.0.1126
113113
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.944 h1:+PGoNHl
845845
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.944/go.mod h1:+VHcZ4Cnzpt6vtCvNROz8xWfNWUkoAZ9UPSonbA3NWM=
846846
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.970 h1:0A6PwOaUeLtm4U5TR1uD91ETBgDcnfqFnsG9mwCNvlY=
847847
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.970/go.mod h1:H4k8QCKds731GA9pmSOfHJ99ZOZhy+gKvX1/N2DOsQQ=
848+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.1149 h1:lW1auC8TdFa4NkE6ORzslUrP3lcGigdd0X8/4T+pY40=
849+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.1149/go.mod h1:LDcZtoh9sKi/2/Tze53H64C4G3CzzHN22AWsflf3Cn4=
848850
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1010 h1:sO0vW6E09xFQ5+I8mfvAyIlRZvWBWPf6ilZU5LI4lmE=
849851
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1010/go.mod h1:/UDEkf2UhUud19VVMGMTpyiI7HoE3U/c23uoAqDgIWA=
850852
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwch v1.0.843 h1:3Xr3UPscUfi5jAzCtwQjDfDf4TPsbUxsCrDdHo6xIRI=
@@ -969,6 +971,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKB
969971
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860/go.mod h1:NZo1WplQcC314kMlCRUoy8NQju2BnolIJj7NAWgsuhY=
970972
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128 h1:qoSzTKnmGdXlfphMoEwqgaGjs5gwOy/PqzMu7dlLHNM=
971973
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128/go.mod h1:hVNSxeomc/AQsJphdbPnPINsO0cMLcVAA6kituTD2g0=
974+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153 h1:ENSIHfoHuFw4IQrkPvUyBFEvE++QVdIxY3lSFo9jho0=
975+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153/go.mod h1:lBiTrRc+WW71B71du+uodZRhpa+QlnsqwT4sVSEaPac=
972976
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 h1:2egy69SP/wPsmnfozcQVZ6tUY6F6N/TpEe/7xtXrc/8=
973977
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762/go.mod h1:1XylIfNUbAzmNqi4XMhwcM3VhmUHdu1OYybOeaJ4sOw=
974978
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111 h1:Y7LLIZEQh8OAbnBWppUopu2PjPaQOO9Jzhp8LZO7adI=

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2323,6 +2323,7 @@ func Provider() *schema.Provider {
23232323
"tencentcloud_kubernetes_native_node_pool": tke.ResourceTencentCloudKubernetesNativeNodePool(),
23242324
"tencentcloud_cdc_site": cdc.ResourceTencentCloudCdcSite(),
23252325
"tencentcloud_cdc_dedicated_cluster": cdc.ResourceTencentCloudCdcDedicatedCluster(),
2326+
"tencentcloud_cdc_dedicated_cluster_image_cache": cdc.ResourceTencentCloudDedicatedClusterImageCache(),
23262327
"tencentcloud_cdwdoris_instance": cdwdoris.ResourceTencentCloudCdwdorisInstance(),
23272328
"tencentcloud_cdwdoris_workload_group": cdwdoris.ResourceTencentCloudCdwdorisWorkloadGroup(),
23282329
//"tencentcloud_cdwdoris_user": cdwdoris.ResourceTencentCloudCdwdorisUser(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2289,6 +2289,7 @@ tencentcloud_cdc_dedicated_clusters
22892289
Resource
22902290
tencentcloud_cdc_site
22912291
tencentcloud_cdc_dedicated_cluster
2292+
tencentcloud_cdc_dedicated_cluster_image_cache
22922293

22932294
CdwDoris
22942295
Data Source
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package cdc
2+
3+
const (
4+
CDC_CACHE_STATUS_CACHED = "CACHED"
5+
CDC_CACHE_STATUS_CACHE_FAILED = "CACHE_FAILED"
6+
CDC_CACHE_STATUS_CACHED_ALL = "CACHED_ALL"
7+
CDC_CACHE_STATUS_NO_CACHE = "NO_CACHE"
8+
)
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
package cdc
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"strings"
8+
"time"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
cdc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc/v20201214"
13+
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
14+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
15+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
16+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
17+
)
18+
19+
func ResourceTencentCloudDedicatedClusterImageCache() *schema.Resource {
20+
return &schema.Resource{
21+
Create: ResourceTencentCloudCdcDedicatedClusterImageCacheCreate,
22+
Read: ResourceTencentCloudCdcDedicatedClusterImageCacheRead,
23+
Delete: ResourceTencentCloudCdcDedicatedClusterImageCacheDelete,
24+
Importer: &schema.ResourceImporter{
25+
State: schema.ImportStatePassthrough,
26+
},
27+
Schema: map[string]*schema.Schema{
28+
"dedicated_cluster_id": {
29+
Required: true,
30+
ForceNew: true,
31+
Type: schema.TypeString,
32+
Description: "Cluster ID.",
33+
},
34+
"image_id": {
35+
Required: true,
36+
ForceNew: true,
37+
Type: schema.TypeString,
38+
Description: "Image ID.",
39+
},
40+
},
41+
}
42+
}
43+
44+
func ResourceTencentCloudCdcDedicatedClusterImageCacheCreate(d *schema.ResourceData, meta interface{}) error {
45+
defer tccommon.LogElapsed("resource.tencentcloud_cdc_dedicated_cluster_image_cache.create")()
46+
47+
var (
48+
logId = tccommon.GetLogId(tccommon.ContextNil)
49+
request = cdc.NewCreateDedicatedClusterImageCacheRequest()
50+
dedicatedClusterId string
51+
image string
52+
)
53+
54+
if v, ok := d.GetOk("dedicated_cluster_id"); ok {
55+
dedicatedClusterId = v.(string)
56+
request.DedicatedClusterId = helper.String(dedicatedClusterId)
57+
}
58+
59+
if v, ok := d.GetOk("image_id"); ok {
60+
image = v.(string)
61+
request.ImageId = helper.String(image)
62+
}
63+
64+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
65+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCdcClient().CreateDedicatedClusterImageCache(request)
66+
if e != nil {
67+
return tccommon.RetryError(e)
68+
} else {
69+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
70+
}
71+
72+
return nil
73+
})
74+
75+
if err != nil {
76+
log.Printf("[CRITAL]%s create cdc dedicatedClusterImageCache failed, reason:%+v", logId, err)
77+
return err
78+
}
79+
80+
d.SetId(strings.Join([]string{dedicatedClusterId, image}, tccommon.FILED_SP))
81+
82+
service := CdcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
83+
conf := tccommon.BuildStateChangeConf([]string{}, []string{CDC_CACHE_STATUS_CACHED, CDC_CACHE_STATUS_CACHE_FAILED}, 20*tccommon.ReadRetryTimeout, time.Second, service.DedicatedClusterImageCacheStateRefreshFunc(dedicatedClusterId, image, CDC_CACHE_STATUS_CACHED_ALL, []string{}))
84+
if object, e := conf.WaitForState(); e != nil {
85+
return e
86+
} else {
87+
imageCacheState := object.(*cvm.Image)
88+
if imageCacheState.CdcCacheStatus != nil && *imageCacheState.CdcCacheStatus == CDC_CACHE_STATUS_CACHE_FAILED {
89+
return fmt.Errorf("cache failed")
90+
}
91+
}
92+
93+
return ResourceTencentCloudCdcDedicatedClusterImageCacheRead(d, meta)
94+
}
95+
96+
func ResourceTencentCloudCdcDedicatedClusterImageCacheRead(d *schema.ResourceData, meta interface{}) error {
97+
defer tccommon.LogElapsed("resource.tencentcloud_cdc_dedicated_cluster_image_cache.read")()
98+
99+
var (
100+
logId = tccommon.GetLogId(tccommon.ContextNil)
101+
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
102+
service = CdcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
103+
)
104+
105+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
106+
if len(idSplit) != 2 {
107+
return fmt.Errorf("id is broken,%s", d.Id())
108+
}
109+
images, err := service.DescribeImages(ctx, idSplit[0], idSplit[1], CDC_CACHE_STATUS_CACHED_ALL)
110+
if err != nil {
111+
return err
112+
}
113+
114+
if len(images) == 0 {
115+
d.SetId("")
116+
log.Printf("[WARN]%s resource `CdcDedicatedClusterImageCache` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
117+
return nil
118+
}
119+
120+
if images[0].CdcCacheStatus != nil && *images[0].CdcCacheStatus == CDC_CACHE_STATUS_CACHED {
121+
_ = d.Set("dedicated_cluster_id", idSplit[0])
122+
_ = d.Set("image_id", idSplit[1])
123+
} else {
124+
d.SetId("")
125+
log.Printf("[WARN]%s resource `CdcDedicatedClusterImageCache` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
126+
return nil
127+
}
128+
129+
return nil
130+
}
131+
132+
func ResourceTencentCloudCdcDedicatedClusterImageCacheDelete(d *schema.ResourceData, meta interface{}) error {
133+
defer tccommon.LogElapsed("resource.tencentcloud_cdc_dedicated_cluster_image_cache.delete")()
134+
135+
var (
136+
logId = tccommon.GetLogId(tccommon.ContextNil)
137+
request = cdc.NewDeleteDedicatedClusterImageCacheRequest()
138+
)
139+
140+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
141+
if len(idSplit) != 2 {
142+
return fmt.Errorf("id is broken,%s", d.Id())
143+
}
144+
145+
request.DedicatedClusterId = helper.String(idSplit[0])
146+
request.ImageId = helper.String(idSplit[1])
147+
148+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
149+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCdcClient().DeleteDedicatedClusterImageCache(request)
150+
if e != nil {
151+
if sdkerr, ok := e.(*sdkErrors.TencentCloudSDKError); ok {
152+
if sdkerr.Code == "InvalidParameter.ImageNotCacheInCdc" {
153+
return nil
154+
}
155+
}
156+
return tccommon.RetryError(e)
157+
} else {
158+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
159+
}
160+
161+
return nil
162+
})
163+
164+
if err != nil {
165+
log.Printf("[CRITAL]%s delete cdc dedicatedClusterImageCache failed, reason:%+v", logId, err)
166+
return err
167+
}
168+
169+
service := CdcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
170+
conf := tccommon.BuildStateChangeConf([]string{}, []string{CDC_CACHE_STATUS_NO_CACHE}, 20*tccommon.ReadRetryTimeout, time.Second, service.DedicatedClusterImageCacheStateRefreshFunc(idSplit[0], idSplit[1], CDC_CACHE_STATUS_NO_CACHE, []string{}))
171+
if _, e := conf.WaitForState(); e != nil {
172+
return e
173+
}
174+
175+
return nil
176+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Provides a resource to create a CDC dedicated cluster image cache
2+
3+
Example Usage
4+
5+
```hcl
6+
resource "tencentcloud_cdc_dedicated_cluster_image_cache" "cdc_dedicated_cluster_image_cache" {
7+
dedicated_cluster_id = "cluster-262n63e8"
8+
image_id = "img-eb30mz89"
9+
}
10+
```
11+
12+
Import
13+
14+
CDC dedicated cluster image cache can be imported using the id, e.g.
15+
16+
```
17+
terraform import tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache ${dedicated_cluster_id}#${image_id}
18+
```
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cdc_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest"
8+
)
9+
10+
func TestAccTencentCloudCdcDedicatedClusterImageCacheResource_basic(t *testing.T) {
11+
t.Parallel()
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() {
14+
tcacctest.AccPreCheck(t)
15+
},
16+
Providers: tcacctest.AccProviders,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: testAccCdcDedicatedClusterImageCache,
20+
Check: resource.ComposeTestCheckFunc(
21+
resource.TestCheckResourceAttrSet("tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache", "id"),
22+
resource.TestCheckResourceAttr("tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache", "dedicated_cluster_id", "cluster-262n63e8"),
23+
resource.TestCheckResourceAttr("tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache", "image_id", "img-eb30mz89"),
24+
),
25+
},
26+
{
27+
ResourceName: "tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache",
28+
ImportState: true,
29+
ImportStateVerify: true,
30+
},
31+
},
32+
})
33+
}
34+
35+
const testAccCdcDedicatedClusterImageCache = `
36+
resource "tencentcloud_cdc_dedicated_cluster_image_cache" "cdc_dedicated_cluster_image_cache" {
37+
dedicated_cluster_id = "cluster-262n63e8"
38+
image_id = "img-eb30mz89"
39+
}
40+
`

tencentcloud/services/cdc/service_tencentcloud_cdc.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package cdc
22

33
import (
44
"context"
5+
"fmt"
56
"log"
67

8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
79
cdc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc/v20201214"
10+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
811
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
912
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/connectivity"
1013
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
@@ -312,3 +315,66 @@ func (me *CdcService) DescribeCdcDedicatedClustersByFilter(ctx context.Context,
312315

313316
return
314317
}
318+
319+
func (me *CdcService) DescribeImages(ctx context.Context, dedicatedClusterId string, imageId string, cdcCacheStatus string) (images []*cvm.Image, errRet error) {
320+
logId := tccommon.GetLogId(ctx)
321+
request := cvm.NewDescribeImagesRequest()
322+
request.Filters = []*cvm.Filter{
323+
{
324+
Name: helper.String("image-id"),
325+
Values: helper.Strings([]string{imageId}),
326+
},
327+
{
328+
Name: helper.String("image-state"),
329+
Values: helper.Strings([]string{"NORMAL", "SYNCING", "EXPORTING"}),
330+
},
331+
{
332+
Name: helper.String("dedicated-cluster-id"),
333+
Values: helper.Strings([]string{dedicatedClusterId}),
334+
},
335+
{
336+
Name: helper.String("cdc-cache-status"),
337+
Values: helper.Strings([]string{cdcCacheStatus}),
338+
},
339+
}
340+
341+
err := resource.Retry(20*tccommon.ReadRetryTimeout, func() *resource.RetryError {
342+
ratelimit.Check(request.GetAction())
343+
response, err := me.client.UseCvmClient().DescribeImages(request)
344+
if err != nil {
345+
return resource.RetryableError(err)
346+
}
347+
if response != nil && response.Response != nil {
348+
if len(response.Response.ImageSet) > 0 {
349+
images = response.Response.ImageSet
350+
}
351+
return nil
352+
}
353+
return resource.NonRetryableError(fmt.Errorf("response is null"))
354+
})
355+
356+
if err != nil {
357+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]",
358+
logId, request.GetAction(), request.ToJsonString(), err.Error())
359+
errRet = err
360+
return
361+
}
362+
return
363+
}
364+
365+
func (me *CdcService) DedicatedClusterImageCacheStateRefreshFunc(dedicatedClusterId string, imageId string, cdcCacheStatus string, failStates []string) resource.StateRefreshFunc {
366+
return func() (interface{}, string, error) {
367+
ctx := tccommon.ContextNil
368+
images, err := me.DescribeImages(ctx, dedicatedClusterId, imageId, cdcCacheStatus)
369+
370+
if err != nil {
371+
return nil, "", err
372+
}
373+
374+
if len(images) < 1 {
375+
return nil, "", fmt.Errorf("Not found image.")
376+
}
377+
378+
return images[0], helper.PString(images[0].CdcCacheStatus), nil
379+
}
380+
}

0 commit comments

Comments
 (0)