diff --git a/.changelog/2874.txt b/.changelog/2874.txt new file mode 100644 index 0000000000..572b71e646 --- /dev/null +++ b/.changelog/2874.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_cvm_action_timer +``` \ No newline at end of file diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 7fed5b6261..8c6a7436be 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -2001,6 +2001,7 @@ func Provider() *schema.Provider { "tencentcloud_cvm_renew_host": cvm.ResourceTencentCloudCvmRenewHost(), "tencentcloud_cvm_program_fpga_image": cvm.ResourceTencentCloudCvmProgramFpgaImage(), "tencentcloud_cvm_modify_instance_disk_type": cvm.ResourceTencentCloudCvmModifyInstanceDiskType(), + "tencentcloud_cvm_action_timer": cvm.ResourceTencentCloudCvmActionTimer(), "tencentcloud_lighthouse_disk_backup": lighthouse.ResourceTencentCloudLighthouseDiskBackup(), "tencentcloud_lighthouse_apply_disk_backup": lighthouse.ResourceTencentCloudLighthouseApplyDiskBackup(), "tencentcloud_lighthouse_disk_attachment": lighthouse.ResourceTencentCloudLighthouseDiskAttachment(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index bdcb0f37aa..f0fd62eedc 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -476,6 +476,7 @@ Cloud Virtual Machine(CVM) tencentcloud_cvm_sync_image tencentcloud_cvm_export_images tencentcloud_cvm_image_share_permission + tencentcloud_cvm_action_timer TDSQL-C MySQL(CynosDB) Data Source diff --git a/tencentcloud/services/cvm/resource_tc_cvm_action_timer.go b/tencentcloud/services/cvm/resource_tc_cvm_action_timer.go new file mode 100644 index 0000000000..3cf484de12 --- /dev/null +++ b/tencentcloud/services/cvm/resource_tc_cvm_action_timer.go @@ -0,0 +1,170 @@ +package cvm + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + 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 ResourceTencentCloudCvmActionTimer() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudCvmActionTimerCreate, + Read: resourceTencentCloudCvmActionTimerRead, + //Update: resourceTencentCloudCvmActionTimerUpdate, + Delete: resourceTencentCloudCvmActionTimerDelete, + //Importer: &schema.ResourceImporter{ + // State: schema.ImportStatePassthrough, + //}, + Schema: map[string]*schema.Schema{ + "instance_id": { + Required: true, + ForceNew: true, + Type: schema.TypeString, + Description: "Instance ID.", + }, + "action_timer": { + Required: true, + ForceNew: true, + Type: schema.TypeList, + MaxItems: 1, + Description: "Scheduled tasks. This parameter can be used to specify scheduled tasks for instances, and currently only supports scheduled destruction.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "timer_action": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "Timer action, currently only supports destroying one value: TerminateInstances.", + }, + "action_time": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "Execution time, expressed according to ISO8601 standard and using UTC time. The format is YYYY-MM-DDThh:mm:ssZ. For example, 2018-05-29T11:26:40Z, the execution time must be 5 minutes longer than the current time.", + }, + }, + }, + }, + }, + } +} + +func resourceTencentCloudCvmActionTimerCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.create")() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + request = cvm.NewImportInstancesActionTimerRequest() + response = cvm.NewImportInstancesActionTimerResponse() + actionTimerId string + ) + + if v, ok := d.GetOk("instance_id"); ok { + request.InstanceIds = []*string{helper.String(v.(string))} + } + + if dMap, ok := helper.InterfacesHeadMap(d, "action_timer"); ok { + actionTimer := cvm.ActionTimer{} + if v, ok := dMap["timer_action"]; ok { + actionTimer.TimerAction = helper.String(v.(string)) + } + + if v, ok := dMap["action_time"]; ok { + actionTimer.ActionTime = helper.String(v.(string)) + } + + request.ActionTimer = &actionTimer + } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().ImportInstancesActionTimer(request) + if e != nil { + return resource.RetryableError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || len(result.Response.ActionTimerIds) != 1 { + e = fmt.Errorf("create cvm InstanceActionTimer failed") + return resource.NonRetryableError(e) + } + + response = result + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s create cvm InstanceActionTimer failed, reason:%+v", logId, err) + return err + } + + actionTimerId = *response.Response.ActionTimerIds[0] + d.SetId(actionTimerId) + + return resourceTencentCloudCvmActionTimerRead(d, meta) +} + +func resourceTencentCloudCvmActionTimerRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.read")() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + actionTimerId = d.Id() + ) + + InstanceActionTimer, err := service.DescribeCvmInstanceActionTimerById(ctx, actionTimerId) + if err != nil { + return err + } + + if InstanceActionTimer == nil { + d.SetId("") + log.Printf("[WARN]%s resource `CvmInstanceActionTimer` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + actionTimerMap := map[string]interface{}{} + if InstanceActionTimer.TimerAction != nil { + actionTimerMap["timer_action"] = InstanceActionTimer.TimerAction + } + + if InstanceActionTimer.ActionTime != nil { + actionTimerMap["action_time"] = InstanceActionTimer.ActionTime + } + + _ = d.Set("action_timer", []interface{}{actionTimerMap}) + + return nil +} + +// func resourceTencentCloudCvmActionTimerUpdate(d *schema.ResourceData, meta interface{}) error { +// defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.update")() +// defer tccommon.InconsistentCheck(d, meta)() + +// return resourceTencentCloudCvmActionTimerRead(d, meta) +// } + +func resourceTencentCloudCvmActionTimerDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.delete")() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + actionTimerId = d.Id() + ) + + if err := service.DeleteCvmInstanceActionTimerById(ctx, actionTimerId); err != nil { + return err + } + + return nil +} diff --git a/tencentcloud/services/cvm/resource_tc_cvm_action_timer.md b/tencentcloud/services/cvm/resource_tc_cvm_action_timer.md new file mode 100644 index 0000000000..4570c3824c --- /dev/null +++ b/tencentcloud/services/cvm/resource_tc_cvm_action_timer.md @@ -0,0 +1,63 @@ +Provides a resource to create a CVM instance action timer + +Example Usage + +```hcl +variable "availability_zone" { + default = "ap-guangzhou-6" +} + +data "tencentcloud_images" "images" { + image_type = ["PUBLIC_IMAGE"] + image_name_regex = "TencentOS Server" +} + +# create vpc +resource "tencentcloud_vpc" "vpc" { + name = "vpc" + cidr_block = "10.0.0.0/16" +} + +# create vpc subnet +resource "tencentcloud_subnet" "subnet" { + name = "subnet" + vpc_id = tencentcloud_vpc.vpc.id + availability_zone = var.availability_zone + cidr_block = "10.0.20.0/28" + is_multicast = false +} + +# create cvm +resource "tencentcloud_instance" "example" { + instance_name = "tf_example" + availability_zone = var.availability_zone + image_id = data.tencentcloud_images.images.images.0.image_id + instance_type = "SA3.MEDIUM4" + system_disk_type = "CLOUD_HSSD" + system_disk_size = 100 + hostname = "example" + project_id = 0 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + + data_disks { + data_disk_type = "CLOUD_HSSD" + data_disk_size = 50 + encrypt = false + } + + tags = { + createBy = "terraform" + } +} + +# create cvm action timer +resource "tencentcloud_cvm_action_timer" "example" { + instance_id = tencentcloud_instance.example.id + + action_timer { + timer_action = "TerminateInstances" + action_time = "2024-11-11T11:26:40Z" + } +} +``` \ No newline at end of file diff --git a/tencentcloud/services/cvm/resource_tc_cvm_action_timer_test.go b/tencentcloud/services/cvm/resource_tc_cvm_action_timer_test.go new file mode 100644 index 0000000000..8b121f1dc2 --- /dev/null +++ b/tencentcloud/services/cvm/resource_tc_cvm_action_timer_test.go @@ -0,0 +1,90 @@ +package cvm_test + +import ( + "testing" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +// go test -i; go test -test.run TestAccTencentCloudNeedFixCvmActionTimerResource_basic -v +func TestAccTencentCloudNeedFixCvmActionTimerResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCvmActionTimer, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_cvm_action_timer.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_cvm_action_timer.example", "instance_id"), + resource.TestCheckResourceAttr("tencentcloud_cvm_action_timer.example", "action_timer.#", "1"), + ), + }, + }, + }) +} + +const testAccCvmActionTimer = ` +variable "availability_zone" { + default = "ap-guangzhou-6" +} + +data "tencentcloud_images" "images" { + image_type = ["PUBLIC_IMAGE"] + image_name_regex = "TencentOS Server" +} + +# create vpc +resource "tencentcloud_vpc" "vpc" { + name = "vpc" + cidr_block = "10.0.0.0/16" +} + +# create vpc subnet +resource "tencentcloud_subnet" "subnet" { + name = "subnet" + vpc_id = tencentcloud_vpc.vpc.id + availability_zone = var.availability_zone + cidr_block = "10.0.20.0/28" + is_multicast = false +} + +# create cvm +resource "tencentcloud_instance" "example" { + instance_name = "tf_example" + availability_zone = var.availability_zone + image_id = data.tencentcloud_images.images.images.0.image_id + instance_type = "SA3.MEDIUM4" + system_disk_type = "CLOUD_HSSD" + system_disk_size = 100 + hostname = "example" + project_id = 0 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + + data_disks { + data_disk_type = "CLOUD_HSSD" + data_disk_size = 50 + encrypt = false + } + + tags = { + createBy = "terraform" + } +} + +# create cvm action timer +resource "tencentcloud_cvm_action_timer" "example" { + instance_id = tencentcloud_instance.example.id + + action_timer { + timer_action = "TerminateInstances" + action_time = "2024-11-11T11:26:40Z" + } +} +` diff --git a/tencentcloud/services/cvm/service_tencentcloud_cvm.go b/tencentcloud/services/cvm/service_tencentcloud_cvm.go index 1f48966d62..4957e0e5c1 100644 --- a/tencentcloud/services/cvm/service_tencentcloud_cvm.go +++ b/tencentcloud/services/cvm/service_tencentcloud_cvm.go @@ -1812,3 +1812,57 @@ func (me *CvmService) DescribeImageFromFamilyByFilter(ctx context.Context, param ret = response.Response return } + +func (me *CvmService) DescribeCvmInstanceActionTimerById(ctx context.Context, actionTimerId string) (actionTimer *cvm.ActionTimer, errRet error) { + var ( + logId = tccommon.GetLogId(ctx) + request = cvm.NewDescribeInstancesActionTimerRequest() + ) + + 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()) + request.ActionTimerIds = []*string{&actionTimerId} + response, err := me.client.UseCvmClient().DescribeInstancesActionTimer(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 response == nil || response.Response == nil { + return + } + + actionTimer = response.Response.ActionTimers[0] + return +} + +func (me *CvmService) DeleteCvmInstanceActionTimerById(ctx context.Context, actionTimerId string) (errRet error) { + logId := tccommon.GetLogId(ctx) + + request := cvm.NewDeleteInstancesActionTimerRequest() + request.ActionTimerIds = []*string{&actionTimerId} + + 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.UseCvmClient().DeleteInstancesActionTimer(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()) + + return +} diff --git a/website/docs/r/cvm_action_timer.html.markdown b/website/docs/r/cvm_action_timer.html.markdown new file mode 100644 index 0000000000..ba8c1e5e4f --- /dev/null +++ b/website/docs/r/cvm_action_timer.html.markdown @@ -0,0 +1,95 @@ +--- +subcategory: "Cloud Virtual Machine(CVM)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_cvm_action_timer" +sidebar_current: "docs-tencentcloud-resource-cvm_action_timer" +description: |- + Provides a resource to create a CVM instance action timer +--- + +# tencentcloud_cvm_action_timer + +Provides a resource to create a CVM instance action timer + +## Example Usage + +```hcl +variable "availability_zone" { + default = "ap-guangzhou-6" +} + +data "tencentcloud_images" "images" { + image_type = ["PUBLIC_IMAGE"] + image_name_regex = "TencentOS Server" +} + +# create vpc +resource "tencentcloud_vpc" "vpc" { + name = "vpc" + cidr_block = "10.0.0.0/16" +} + +# create vpc subnet +resource "tencentcloud_subnet" "subnet" { + name = "subnet" + vpc_id = tencentcloud_vpc.vpc.id + availability_zone = var.availability_zone + cidr_block = "10.0.20.0/28" + is_multicast = false +} + +# create cvm +resource "tencentcloud_instance" "example" { + instance_name = "tf_example" + availability_zone = var.availability_zone + image_id = data.tencentcloud_images.images.images.0.image_id + instance_type = "SA3.MEDIUM4" + system_disk_type = "CLOUD_HSSD" + system_disk_size = 100 + hostname = "example" + project_id = 0 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + + data_disks { + data_disk_type = "CLOUD_HSSD" + data_disk_size = 50 + encrypt = false + } + + tags = { + createBy = "terraform" + } +} + +# create cvm action timer +resource "tencentcloud_cvm_action_timer" "example" { + instance_id = tencentcloud_instance.example.id + + action_timer { + timer_action = "TerminateInstances" + action_time = "2024-11-11T11:26:40Z" + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `action_timer` - (Required, List, ForceNew) Scheduled tasks. This parameter can be used to specify scheduled tasks for instances, and currently only supports scheduled destruction. +* `instance_id` - (Required, String, ForceNew) Instance ID. + +The `action_timer` object supports the following: + +* `action_time` - (Optional, String, ForceNew) Execution time, expressed according to ISO8601 standard and using UTC time. The format is YYYY-MM-DDThh:mm:ssZ. For example, 2018-05-29T11:26:40Z, the execution time must be 5 minutes longer than the current time. +* `timer_action` - (Optional, String, ForceNew) Timer action, currently only supports destroying one value: TerminateInstances. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 76ef61e5d5..ccb7f33745 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -1893,6 +1893,9 @@