Skip to content

Commit 1f65ddc

Browse files
authored
feat(cvm): [119840232] cvm support action_timer params (#2874)
* add * add * add * add * add * add * add
1 parent ce0f87b commit 1f65ddc

9 files changed

+480
-0
lines changed

.changelog/2874.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
tencentcloud_cvm_action_timer
3+
```

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2001,6 +2001,7 @@ func Provider() *schema.Provider {
20012001
"tencentcloud_cvm_renew_host": cvm.ResourceTencentCloudCvmRenewHost(),
20022002
"tencentcloud_cvm_program_fpga_image": cvm.ResourceTencentCloudCvmProgramFpgaImage(),
20032003
"tencentcloud_cvm_modify_instance_disk_type": cvm.ResourceTencentCloudCvmModifyInstanceDiskType(),
2004+
"tencentcloud_cvm_action_timer": cvm.ResourceTencentCloudCvmActionTimer(),
20042005
"tencentcloud_lighthouse_disk_backup": lighthouse.ResourceTencentCloudLighthouseDiskBackup(),
20052006
"tencentcloud_lighthouse_apply_disk_backup": lighthouse.ResourceTencentCloudLighthouseApplyDiskBackup(),
20062007
"tencentcloud_lighthouse_disk_attachment": lighthouse.ResourceTencentCloudLighthouseDiskAttachment(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ Cloud Virtual Machine(CVM)
476476
tencentcloud_cvm_sync_image
477477
tencentcloud_cvm_export_images
478478
tencentcloud_cvm_image_share_permission
479+
tencentcloud_cvm_action_timer
479480

480481
TDSQL-C MySQL(CynosDB)
481482
Data Source
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package cvm
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
11+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
12+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
13+
)
14+
15+
func ResourceTencentCloudCvmActionTimer() *schema.Resource {
16+
return &schema.Resource{
17+
Create: resourceTencentCloudCvmActionTimerCreate,
18+
Read: resourceTencentCloudCvmActionTimerRead,
19+
//Update: resourceTencentCloudCvmActionTimerUpdate,
20+
Delete: resourceTencentCloudCvmActionTimerDelete,
21+
//Importer: &schema.ResourceImporter{
22+
// State: schema.ImportStatePassthrough,
23+
//},
24+
Schema: map[string]*schema.Schema{
25+
"instance_id": {
26+
Required: true,
27+
ForceNew: true,
28+
Type: schema.TypeString,
29+
Description: "Instance ID.",
30+
},
31+
"action_timer": {
32+
Required: true,
33+
ForceNew: true,
34+
Type: schema.TypeList,
35+
MaxItems: 1,
36+
Description: "Scheduled tasks. This parameter can be used to specify scheduled tasks for instances, and currently only supports scheduled destruction.",
37+
Elem: &schema.Resource{
38+
Schema: map[string]*schema.Schema{
39+
"timer_action": {
40+
Type: schema.TypeString,
41+
Optional: true,
42+
ForceNew: true,
43+
Description: "Timer action, currently only supports destroying one value: TerminateInstances.",
44+
},
45+
"action_time": {
46+
Type: schema.TypeString,
47+
Optional: true,
48+
ForceNew: true,
49+
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.",
50+
},
51+
},
52+
},
53+
},
54+
},
55+
}
56+
}
57+
58+
func resourceTencentCloudCvmActionTimerCreate(d *schema.ResourceData, meta interface{}) error {
59+
defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.create")()
60+
61+
var (
62+
logId = tccommon.GetLogId(tccommon.ContextNil)
63+
request = cvm.NewImportInstancesActionTimerRequest()
64+
response = cvm.NewImportInstancesActionTimerResponse()
65+
actionTimerId string
66+
)
67+
68+
if v, ok := d.GetOk("instance_id"); ok {
69+
request.InstanceIds = []*string{helper.String(v.(string))}
70+
}
71+
72+
if dMap, ok := helper.InterfacesHeadMap(d, "action_timer"); ok {
73+
actionTimer := cvm.ActionTimer{}
74+
if v, ok := dMap["timer_action"]; ok {
75+
actionTimer.TimerAction = helper.String(v.(string))
76+
}
77+
78+
if v, ok := dMap["action_time"]; ok {
79+
actionTimer.ActionTime = helper.String(v.(string))
80+
}
81+
82+
request.ActionTimer = &actionTimer
83+
}
84+
85+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
86+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().ImportInstancesActionTimer(request)
87+
if e != nil {
88+
return resource.RetryableError(e)
89+
} else {
90+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
91+
}
92+
93+
if result == nil || result.Response == nil || len(result.Response.ActionTimerIds) != 1 {
94+
e = fmt.Errorf("create cvm InstanceActionTimer failed")
95+
return resource.NonRetryableError(e)
96+
}
97+
98+
response = result
99+
return nil
100+
})
101+
102+
if err != nil {
103+
log.Printf("[CRITAL]%s create cvm InstanceActionTimer failed, reason:%+v", logId, err)
104+
return err
105+
}
106+
107+
actionTimerId = *response.Response.ActionTimerIds[0]
108+
d.SetId(actionTimerId)
109+
110+
return resourceTencentCloudCvmActionTimerRead(d, meta)
111+
}
112+
113+
func resourceTencentCloudCvmActionTimerRead(d *schema.ResourceData, meta interface{}) error {
114+
defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.read")()
115+
116+
var (
117+
logId = tccommon.GetLogId(tccommon.ContextNil)
118+
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
119+
service = CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
120+
actionTimerId = d.Id()
121+
)
122+
123+
InstanceActionTimer, err := service.DescribeCvmInstanceActionTimerById(ctx, actionTimerId)
124+
if err != nil {
125+
return err
126+
}
127+
128+
if InstanceActionTimer == nil {
129+
d.SetId("")
130+
log.Printf("[WARN]%s resource `CvmInstanceActionTimer` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
131+
return nil
132+
}
133+
134+
actionTimerMap := map[string]interface{}{}
135+
if InstanceActionTimer.TimerAction != nil {
136+
actionTimerMap["timer_action"] = InstanceActionTimer.TimerAction
137+
}
138+
139+
if InstanceActionTimer.ActionTime != nil {
140+
actionTimerMap["action_time"] = InstanceActionTimer.ActionTime
141+
}
142+
143+
_ = d.Set("action_timer", []interface{}{actionTimerMap})
144+
145+
return nil
146+
}
147+
148+
// func resourceTencentCloudCvmActionTimerUpdate(d *schema.ResourceData, meta interface{}) error {
149+
// defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.update")()
150+
// defer tccommon.InconsistentCheck(d, meta)()
151+
152+
// return resourceTencentCloudCvmActionTimerRead(d, meta)
153+
// }
154+
155+
func resourceTencentCloudCvmActionTimerDelete(d *schema.ResourceData, meta interface{}) error {
156+
defer tccommon.LogElapsed("resource.tencentcloud_cvm_action_timer.delete")()
157+
158+
var (
159+
logId = tccommon.GetLogId(tccommon.ContextNil)
160+
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
161+
service = CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
162+
actionTimerId = d.Id()
163+
)
164+
165+
if err := service.DeleteCvmInstanceActionTimerById(ctx, actionTimerId); err != nil {
166+
return err
167+
}
168+
169+
return nil
170+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
Provides a resource to create a CVM instance action timer
2+
3+
Example Usage
4+
5+
```hcl
6+
variable "availability_zone" {
7+
default = "ap-guangzhou-6"
8+
}
9+
10+
data "tencentcloud_images" "images" {
11+
image_type = ["PUBLIC_IMAGE"]
12+
image_name_regex = "TencentOS Server"
13+
}
14+
15+
# create vpc
16+
resource "tencentcloud_vpc" "vpc" {
17+
name = "vpc"
18+
cidr_block = "10.0.0.0/16"
19+
}
20+
21+
# create vpc subnet
22+
resource "tencentcloud_subnet" "subnet" {
23+
name = "subnet"
24+
vpc_id = tencentcloud_vpc.vpc.id
25+
availability_zone = var.availability_zone
26+
cidr_block = "10.0.20.0/28"
27+
is_multicast = false
28+
}
29+
30+
# create cvm
31+
resource "tencentcloud_instance" "example" {
32+
instance_name = "tf_example"
33+
availability_zone = var.availability_zone
34+
image_id = data.tencentcloud_images.images.images.0.image_id
35+
instance_type = "SA3.MEDIUM4"
36+
system_disk_type = "CLOUD_HSSD"
37+
system_disk_size = 100
38+
hostname = "example"
39+
project_id = 0
40+
vpc_id = tencentcloud_vpc.vpc.id
41+
subnet_id = tencentcloud_subnet.subnet.id
42+
43+
data_disks {
44+
data_disk_type = "CLOUD_HSSD"
45+
data_disk_size = 50
46+
encrypt = false
47+
}
48+
49+
tags = {
50+
createBy = "terraform"
51+
}
52+
}
53+
54+
# create cvm action timer
55+
resource "tencentcloud_cvm_action_timer" "example" {
56+
instance_id = tencentcloud_instance.example.id
57+
58+
action_timer {
59+
timer_action = "TerminateInstances"
60+
action_time = "2024-11-11T11:26:40Z"
61+
}
62+
}
63+
```
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package cvm_test
2+
3+
import (
4+
"testing"
5+
6+
tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
)
10+
11+
// go test -i; go test -test.run TestAccTencentCloudNeedFixCvmActionTimerResource_basic -v
12+
func TestAccTencentCloudNeedFixCvmActionTimerResource_basic(t *testing.T) {
13+
t.Parallel()
14+
resource.Test(t, resource.TestCase{
15+
PreCheck: func() {
16+
tcacctest.AccPreCheck(t)
17+
},
18+
Providers: tcacctest.AccProviders,
19+
Steps: []resource.TestStep{
20+
{
21+
Config: testAccCvmActionTimer,
22+
Check: resource.ComposeTestCheckFunc(
23+
resource.TestCheckResourceAttrSet("tencentcloud_cvm_action_timer.example", "id"),
24+
resource.TestCheckResourceAttrSet("tencentcloud_cvm_action_timer.example", "instance_id"),
25+
resource.TestCheckResourceAttr("tencentcloud_cvm_action_timer.example", "action_timer.#", "1"),
26+
),
27+
},
28+
},
29+
})
30+
}
31+
32+
const testAccCvmActionTimer = `
33+
variable "availability_zone" {
34+
default = "ap-guangzhou-6"
35+
}
36+
37+
data "tencentcloud_images" "images" {
38+
image_type = ["PUBLIC_IMAGE"]
39+
image_name_regex = "TencentOS Server"
40+
}
41+
42+
# create vpc
43+
resource "tencentcloud_vpc" "vpc" {
44+
name = "vpc"
45+
cidr_block = "10.0.0.0/16"
46+
}
47+
48+
# create vpc subnet
49+
resource "tencentcloud_subnet" "subnet" {
50+
name = "subnet"
51+
vpc_id = tencentcloud_vpc.vpc.id
52+
availability_zone = var.availability_zone
53+
cidr_block = "10.0.20.0/28"
54+
is_multicast = false
55+
}
56+
57+
# create cvm
58+
resource "tencentcloud_instance" "example" {
59+
instance_name = "tf_example"
60+
availability_zone = var.availability_zone
61+
image_id = data.tencentcloud_images.images.images.0.image_id
62+
instance_type = "SA3.MEDIUM4"
63+
system_disk_type = "CLOUD_HSSD"
64+
system_disk_size = 100
65+
hostname = "example"
66+
project_id = 0
67+
vpc_id = tencentcloud_vpc.vpc.id
68+
subnet_id = tencentcloud_subnet.subnet.id
69+
70+
data_disks {
71+
data_disk_type = "CLOUD_HSSD"
72+
data_disk_size = 50
73+
encrypt = false
74+
}
75+
76+
tags = {
77+
createBy = "terraform"
78+
}
79+
}
80+
81+
# create cvm action timer
82+
resource "tencentcloud_cvm_action_timer" "example" {
83+
instance_id = tencentcloud_instance.example.id
84+
85+
action_timer {
86+
timer_action = "TerminateInstances"
87+
action_time = "2024-11-11T11:26:40Z"
88+
}
89+
}
90+
`

0 commit comments

Comments
 (0)