Skip to content

feat(cdc): [123481772] image cache #3338

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Apr 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1154
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
Expand Down Expand Up @@ -107,7 +107,7 @@ require (

require (
github.com/hashicorp/go-uuid v1.0.3
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.970
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.1149
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwdoris v1.0.993
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwpg v1.0.1126
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.944 h1:+PGoNHl
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.944/go.mod h1:+VHcZ4Cnzpt6vtCvNROz8xWfNWUkoAZ9UPSonbA3NWM=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.970 h1:0A6PwOaUeLtm4U5TR1uD91ETBgDcnfqFnsG9mwCNvlY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.970/go.mod h1:H4k8QCKds731GA9pmSOfHJ99ZOZhy+gKvX1/N2DOsQQ=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.1149 h1:lW1auC8TdFa4NkE6ORzslUrP3lcGigdd0X8/4T+pY40=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.1149/go.mod h1:LDcZtoh9sKi/2/Tze53H64C4G3CzzHN22AWsflf3Cn4=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1010 h1:sO0vW6E09xFQ5+I8mfvAyIlRZvWBWPf6ilZU5LI4lmE=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1010/go.mod h1:/UDEkf2UhUud19VVMGMTpyiI7HoE3U/c23uoAqDgIWA=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwch v1.0.843 h1:3Xr3UPscUfi5jAzCtwQjDfDf4TPsbUxsCrDdHo6xIRI=
Expand Down Expand Up @@ -969,6 +971,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKB
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860/go.mod h1:NZo1WplQcC314kMlCRUoy8NQju2BnolIJj7NAWgsuhY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128 h1:qoSzTKnmGdXlfphMoEwqgaGjs5gwOy/PqzMu7dlLHNM=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128/go.mod h1:hVNSxeomc/AQsJphdbPnPINsO0cMLcVAA6kituTD2g0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153 h1:ENSIHfoHuFw4IQrkPvUyBFEvE++QVdIxY3lSFo9jho0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153/go.mod h1:lBiTrRc+WW71B71du+uodZRhpa+QlnsqwT4sVSEaPac=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 h1:2egy69SP/wPsmnfozcQVZ6tUY6F6N/TpEe/7xtXrc/8=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762/go.mod h1:1XylIfNUbAzmNqi4XMhwcM3VhmUHdu1OYybOeaJ4sOw=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111 h1:Y7LLIZEQh8OAbnBWppUopu2PjPaQOO9Jzhp8LZO7adI=
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -2323,6 +2323,7 @@ func Provider() *schema.Provider {
"tencentcloud_kubernetes_native_node_pool": tke.ResourceTencentCloudKubernetesNativeNodePool(),
"tencentcloud_cdc_site": cdc.ResourceTencentCloudCdcSite(),
"tencentcloud_cdc_dedicated_cluster": cdc.ResourceTencentCloudCdcDedicatedCluster(),
"tencentcloud_cdc_dedicated_cluster_image_cache": cdc.ResourceTencentCloudDedicatedClusterImageCache(),
"tencentcloud_cdwdoris_instance": cdwdoris.ResourceTencentCloudCdwdorisInstance(),
"tencentcloud_cdwdoris_workload_group": cdwdoris.ResourceTencentCloudCdwdorisWorkloadGroup(),
//"tencentcloud_cdwdoris_user": cdwdoris.ResourceTencentCloudCdwdorisUser(),
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.md
Original file line number Diff line number Diff line change
Expand Up @@ -2289,6 +2289,7 @@ tencentcloud_cdc_dedicated_clusters
Resource
tencentcloud_cdc_site
tencentcloud_cdc_dedicated_cluster
tencentcloud_cdc_dedicated_cluster_image_cache

CdwDoris
Data Source
Expand Down
8 changes: 8 additions & 0 deletions tencentcloud/services/cdc/extension_cdc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package cdc

const (
CDC_CACHE_STATUS_CACHED = "CACHED"
CDC_CACHE_STATUS_CACHE_FAILED = "CACHE_FAILED"
CDC_CACHE_STATUS_CACHED_ALL = "CACHED_ALL"
CDC_CACHE_STATUS_NO_CACHE = "NO_CACHE"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
package cdc

import (
"context"
"fmt"
"log"
"strings"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cdc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc/v20201214"
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)

func ResourceTencentCloudDedicatedClusterImageCache() *schema.Resource {
return &schema.Resource{
Create: ResourceTencentCloudCdcDedicatedClusterImageCacheCreate,
Read: ResourceTencentCloudCdcDedicatedClusterImageCacheRead,
Delete: ResourceTencentCloudCdcDedicatedClusterImageCacheDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"dedicated_cluster_id": {
Required: true,
ForceNew: true,
Type: schema.TypeString,
Description: "Cluster ID.",
},
"image_id": {
Required: true,
ForceNew: true,
Type: schema.TypeString,
Description: "Image ID.",
},
},
}
}

func ResourceTencentCloudCdcDedicatedClusterImageCacheCreate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_cdc_dedicated_cluster_image_cache.create")()

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
request = cdc.NewCreateDedicatedClusterImageCacheRequest()
dedicatedClusterId string
image string
)

if v, ok := d.GetOk("dedicated_cluster_id"); ok {
dedicatedClusterId = v.(string)
request.DedicatedClusterId = helper.String(dedicatedClusterId)
}

if v, ok := d.GetOk("image_id"); ok {
image = v.(string)
request.ImageId = helper.String(image)
}

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCdcClient().CreateDedicatedClusterImageCache(request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}

return nil
})

if err != nil {
log.Printf("[CRITAL]%s create cdc dedicatedClusterImageCache failed, reason:%+v", logId, err)
return err
}

d.SetId(strings.Join([]string{dedicatedClusterId, image}, tccommon.FILED_SP))

service := CdcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
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{}))
if object, e := conf.WaitForState(); e != nil {
return e
} else {
imageCacheState := object.(*cvm.Image)
if imageCacheState.CdcCacheStatus != nil && *imageCacheState.CdcCacheStatus == CDC_CACHE_STATUS_CACHE_FAILED {
return fmt.Errorf("cache failed")
}
}

return ResourceTencentCloudCdcDedicatedClusterImageCacheRead(d, meta)
}

func ResourceTencentCloudCdcDedicatedClusterImageCacheRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_cdc_dedicated_cluster_image_cache.read")()

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
service = CdcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
)

idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
}
images, err := service.DescribeImages(ctx, idSplit[0], idSplit[1], CDC_CACHE_STATUS_CACHED_ALL)
if err != nil {
return err
}

if len(images) == 0 {
d.SetId("")
log.Printf("[WARN]%s resource `CdcDedicatedClusterImageCache` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
return nil
}

if images[0].CdcCacheStatus != nil && *images[0].CdcCacheStatus == CDC_CACHE_STATUS_CACHED {
_ = d.Set("dedicated_cluster_id", idSplit[0])
_ = d.Set("image_id", idSplit[1])
} else {
d.SetId("")
log.Printf("[WARN]%s resource `CdcDedicatedClusterImageCache` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
return nil
}

return nil
}

func ResourceTencentCloudCdcDedicatedClusterImageCacheDelete(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_cdc_dedicated_cluster_image_cache.delete")()

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
request = cdc.NewDeleteDedicatedClusterImageCacheRequest()
)

idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
}

request.DedicatedClusterId = helper.String(idSplit[0])
request.ImageId = helper.String(idSplit[1])

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCdcClient().DeleteDedicatedClusterImageCache(request)
if e != nil {
if sdkerr, ok := e.(*sdkErrors.TencentCloudSDKError); ok {
if sdkerr.Code == "InvalidParameter.ImageNotCacheInCdc" {
return nil
}
}
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}

return nil
})

if err != nil {
log.Printf("[CRITAL]%s delete cdc dedicatedClusterImageCache failed, reason:%+v", logId, err)
return err
}

service := CdcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
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{}))
if _, e := conf.WaitForState(); e != nil {
return e
}

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Provides a resource to create a CDC dedicated cluster image cache

Example Usage

```hcl
resource "tencentcloud_cdc_dedicated_cluster_image_cache" "cdc_dedicated_cluster_image_cache" {
dedicated_cluster_id = "cluster-262n63e8"
image_id = "img-eb30mz89"
}
```

Import

CDC dedicated cluster image cache can be imported using the id, e.g.

```
terraform import tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache ${dedicated_cluster_id}#${image_id}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package cdc_test

import (
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest"
)

func TestAccTencentCloudCdcDedicatedClusterImageCacheResource_basic(t *testing.T) {
t.Parallel()
resource.Test(t, resource.TestCase{
PreCheck: func() {
tcacctest.AccPreCheck(t)
},
Providers: tcacctest.AccProviders,
Steps: []resource.TestStep{
{
Config: testAccCdcDedicatedClusterImageCache,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache", "id"),
resource.TestCheckResourceAttr("tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache", "dedicated_cluster_id", "cluster-262n63e8"),
resource.TestCheckResourceAttr("tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache", "image_id", "img-eb30mz89"),
),
},
{
ResourceName: "tencentcloud_cdc_dedicated_cluster_image_cache.cdc_dedicated_cluster_image_cache",
ImportState: true,
ImportStateVerify: true,
},
},
})
}

const testAccCdcDedicatedClusterImageCache = `
resource "tencentcloud_cdc_dedicated_cluster_image_cache" "cdc_dedicated_cluster_image_cache" {
dedicated_cluster_id = "cluster-262n63e8"
image_id = "img-eb30mz89"
}
`
66 changes: 66 additions & 0 deletions tencentcloud/services/cdc/service_tencentcloud_cdc.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package cdc

import (
"context"
"fmt"
"log"

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

return
}

func (me *CdcService) DescribeImages(ctx context.Context, dedicatedClusterId string, imageId string, cdcCacheStatus string) (images []*cvm.Image, errRet error) {
logId := tccommon.GetLogId(ctx)
request := cvm.NewDescribeImagesRequest()
request.Filters = []*cvm.Filter{
{
Name: helper.String("image-id"),
Values: helper.Strings([]string{imageId}),
},
{
Name: helper.String("image-state"),
Values: helper.Strings([]string{"NORMAL", "SYNCING", "EXPORTING"}),
},
{
Name: helper.String("dedicated-cluster-id"),
Values: helper.Strings([]string{dedicatedClusterId}),
},
{
Name: helper.String("cdc-cache-status"),
Values: helper.Strings([]string{cdcCacheStatus}),
},
}

err := resource.Retry(20*tccommon.ReadRetryTimeout, func() *resource.RetryError {
ratelimit.Check(request.GetAction())
response, err := me.client.UseCvmClient().DescribeImages(request)
if err != nil {
return resource.RetryableError(err)
}
if response != nil && response.Response != nil {
if len(response.Response.ImageSet) > 0 {
images = response.Response.ImageSet
}
return nil
}
return resource.NonRetryableError(fmt.Errorf("response is null"))
})

if err != nil {
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]",
logId, request.GetAction(), request.ToJsonString(), err.Error())
errRet = err
return
}
return
}

func (me *CdcService) DedicatedClusterImageCacheStateRefreshFunc(dedicatedClusterId string, imageId string, cdcCacheStatus string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
ctx := tccommon.ContextNil
images, err := me.DescribeImages(ctx, dedicatedClusterId, imageId, cdcCacheStatus)

if err != nil {
return nil, "", err
}

if len(images) < 1 {
return nil, "", fmt.Errorf("Not found image.")
}

return images[0], helper.PString(images[0].CdcCacheStatus), nil
}
}
Loading
Loading