diff --git a/.changelog/3220.txt b/.changelog/3220.txt new file mode 100644 index 0000000000..6f62183f4d --- /dev/null +++ b/.changelog/3220.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_redis_wan_address +``` \ No newline at end of file diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 21a773ddc2..1ea4424ea0 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1392,6 +1392,7 @@ func Provider() *schema.Provider { "tencentcloud_redis_backup_operation": crs.ResourceTencentCloudRedisBackupOperation(), "tencentcloud_redis_security_group_attachment": crs.ResourceTencentCloudRedisSecurityGroupAttachment(), "tencentcloud_redis_log_delivery": crs.ResourceTencentCloudRedisLogDelivery(), + "tencentcloud_redis_wan_address": crs.ResourceTencentCloudRedisWanAddress(), "tencentcloud_as_load_balancer": as.ResourceTencentCloudAsLoadBalancer(), "tencentcloud_as_scaling_config": as.ResourceTencentCloudAsScalingConfig(), "tencentcloud_as_scaling_group": as.ResourceTencentCloudAsScalingGroup(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index b4f878c549..8f22075437 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -957,6 +957,7 @@ tencentcloud_redis_backup_operation tencentcloud_redis_security_group_attachment tencentcloud_redis_connection_config tencentcloud_redis_log_delivery +tencentcloud_redis_wan_address Serverless Cloud Function(SCF) Data Source diff --git a/tencentcloud/services/crs/resource_tc_redis_wan_address.go b/tencentcloud/services/crs/resource_tc_redis_wan_address.go new file mode 100644 index 0000000000..9cc5cda5cd --- /dev/null +++ b/tencentcloud/services/crs/resource_tc_redis_wan_address.go @@ -0,0 +1,160 @@ +// Code generated by iacg; DO NOT EDIT. +package crs + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + redisv20180412 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis/v20180412" + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudRedisWanAddress() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudRedisWanAddressCreate, + Read: resourceTencentCloudRedisWanAddressRead, + Delete: resourceTencentCloudRedisWanAddressDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "instance_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Instance ID.", + }, + + "wan_address": { + Type: schema.TypeString, + Computed: true, + Description: "Allocate Wan Address.", + }, + }, + } +} + +func resourceTencentCloudRedisWanAddressCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_redis_wan_address.create")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + + var ( + instanceId string + ) + var ( + request = redisv20180412.NewAllocateWanAddressRequest() + response = redisv20180412.NewAllocateWanAddressResponse() + ) + + if v, ok := d.GetOk("instance_id"); ok { + instanceId = v.(string) + } + + request.InstanceId = helper.String(instanceId) + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseRedisClient().AllocateWanAddressWithContext(ctx, 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()) + } + response = result + return nil + }) + if reqErr != nil { + log.Printf("[CRITAL]%s create redis wan address failed, reason:%+v", logId, reqErr) + return reqErr + } + + _ = response + + service := RedisService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + _, _, _, err := service.CheckRedisOnlineOk(ctx, instanceId, 20*tccommon.ReadRetryTimeout) + if err != nil { + log.Printf("[CRITAL]%s redis networkConfig fail, reason:%s\n", logId, err.Error()) + return err + } + d.SetId(instanceId) + + return resourceTencentCloudRedisWanAddressRead(d, meta) +} + +func resourceTencentCloudRedisWanAddressRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_redis_wan_address.read")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + + service := RedisService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + + instanceId := d.Id() + + _ = d.Set("instance_id", instanceId) + + respData, err := service.DescribeRedisWanAddressById(ctx, instanceId) + if err != nil { + return err + } + + if respData == nil { + d.SetId("") + log.Printf("[WARN]%s resource `redis_wan_address` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + if respData.WanAddress != nil { + _ = d.Set("wan_address", respData.WanAddress) + } + + return nil +} + +func resourceTencentCloudRedisWanAddressDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_redis_wan_address.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + + instanceId := d.Id() + + var ( + request = redisv20180412.NewReleaseWanAddressRequest() + response = redisv20180412.NewReleaseWanAddressResponse() + ) + + request.InstanceId = helper.String(instanceId) + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseRedisClient().ReleaseWanAddressWithContext(ctx, 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()) + } + response = result + return nil + }) + if reqErr != nil { + log.Printf("[CRITAL]%s delete redis wan address failed, reason:%+v", logId, reqErr) + return reqErr + } + + _ = response + service := RedisService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + _, _, _, err := service.CheckRedisOnlineOk(ctx, instanceId, 20*tccommon.ReadRetryTimeout) + if err != nil { + log.Printf("[CRITAL]%s redis networkConfig fail, reason:%s\n", logId, err.Error()) + return err + } + return nil +} diff --git a/tencentcloud/services/crs/resource_tc_redis_wan_address.md b/tencentcloud/services/crs/resource_tc_redis_wan_address.md new file mode 100644 index 0000000000..12ea62a5c8 --- /dev/null +++ b/tencentcloud/services/crs/resource_tc_redis_wan_address.md @@ -0,0 +1,17 @@ +Provides a resource to create a redis wan_address + +Example Usage + +```hcl +resource "tencentcloud_redis_wan_address" "wan_address" { + instance_id = "crs-dekqpd8v" +} +``` + +Import + +redis wan_address can be imported using the instanceId, e.g. + +``` +terraform import tencentcloud_redis_wan_address.wan_address crs-dekqpd8v +``` \ No newline at end of file diff --git a/tencentcloud/services/crs/resource_tc_redis_wan_address_extension.go b/tencentcloud/services/crs/resource_tc_redis_wan_address_extension.go new file mode 100644 index 0000000000..01b5efda33 --- /dev/null +++ b/tencentcloud/services/crs/resource_tc_redis_wan_address_extension.go @@ -0,0 +1 @@ +package crs diff --git a/tencentcloud/services/crs/resource_tc_redis_wan_address_test.go b/tencentcloud/services/crs/resource_tc_redis_wan_address_test.go new file mode 100644 index 0000000000..463f253826 --- /dev/null +++ b/tencentcloud/services/crs/resource_tc_redis_wan_address_test.go @@ -0,0 +1,71 @@ +package crs_test + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + svccrs "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/crs" +) + +func TestAccTencentCloudRedisWanAddressResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + CheckDestroy: testAccTencentCloudRedisInstanceWanAddressDestroy, + Steps: []resource.TestStep{ + { + Config: testAccRedisWanAddress, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_redis_wan_address.redis_wan_address", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_redis_wan_address.redis_wan_address", "wan_address"), + ), + }, + { + ResourceName: "tencentcloud_redis_wan_address.redis_wan_address", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccTencentCloudRedisInstanceWanAddressDestroy(s *terraform.State) error { + + logId := tccommon.GetLogId(tccommon.ContextNil) + ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + + service := svccrs.NewRedisService(tcacctest.AccProvider.Meta().(tccommon.ProviderMeta).GetAPIV3Conn()) + for _, rs := range s.RootModule().Resources { + if rs.Type != "tencentcloud_redis_wan_address" { + continue + } + time.Sleep(5 * time.Second) + has, _, instance, err := service.CheckRedisOnlineOk(ctx, rs.Primary.ID, 20*tccommon.ReadRetryTimeout) + if err != nil { + return err + } + if !has { + return fmt.Errorf("failed to get redis") + } + if instance.WanAddress != nil && *instance.WanAddress != "" { + return fmt.Errorf("redis wanAddress close failed: %v", *instance.WanAddress) + } + } + return nil +} + +const testAccRedisWanAddress = ` + +resource "tencentcloud_redis_wan_address" "redis_wan_address" { + instance_id = "crs-dekqpd8v" +} +` diff --git a/tencentcloud/services/crs/service_tencentcloud_redis.go b/tencentcloud/services/crs/service_tencentcloud_redis.go index e8d36f853b..2610400c26 100644 --- a/tencentcloud/services/crs/service_tencentcloud_redis.go +++ b/tencentcloud/services/crs/service_tencentcloud_redis.go @@ -2029,3 +2029,32 @@ func (me *RedisService) DescribeRedisLogDeliveryById(ctx context.Context, instan ret = response.Response.SlowLog return } + +func (me *RedisService) DescribeRedisWanAddressById(ctx context.Context, instanceId string) (ret *redis.InstanceSet, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := redis.NewDescribeInstancesRequest() + request.InstanceId = helper.String(instanceId) + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + ratelimit.Check(request.GetAction()) + + response, err := me.client.UseRedisClient().DescribeInstances(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + if len(response.Response.InstanceSet) < 1 { + return + } + + ret = response.Response.InstanceSet[0] + return +} diff --git a/website/docs/r/redis_wan_address.html.markdown b/website/docs/r/redis_wan_address.html.markdown new file mode 100644 index 0000000000..fd11485cf4 --- /dev/null +++ b/website/docs/r/redis_wan_address.html.markdown @@ -0,0 +1,43 @@ +--- +subcategory: "TencentDB for Redis(crs)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_redis_wan_address" +sidebar_current: "docs-tencentcloud-resource-redis_wan_address" +description: |- + Provides a resource to create a redis wan_address +--- + +# tencentcloud_redis_wan_address + +Provides a resource to create a redis wan_address + +## Example Usage + +```hcl +resource "tencentcloud_redis_wan_address" "wan_address" { + instance_id = "crs-dekqpd8v" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `instance_id` - (Required, String, ForceNew) Instance ID. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `wan_address` - Allocate Wan Address. + + +## Import + +redis wan_address can be imported using the instanceId, e.g. + +``` +terraform import tencentcloud_redis_wan_address.wan_address crs-dekqpd8v +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 30ddfd59c1..47a51eeefa 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -6234,6 +6234,9 @@
  • tencentcloud_redis_upgrade_proxy_version_operation
  • +
  • + tencentcloud_redis_wan_address +