Skip to content

Commit ddcf7cc

Browse files
tongyimingmikatong
andauthored
support tencentcloud_cvm_launch_template_default_version (#1626)
* support tencentcloud_cvm_launch_template_default_version * add changelog * update --------- Co-authored-by: mikatong <mikatong@tencent.com>
1 parent 50871bf commit ddcf7cc

File tree

7 files changed

+298
-0
lines changed

7 files changed

+298
-0
lines changed

.changelog/1626.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_launch_template_default_version
3+
```

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ Cloud Virtual Machine(CVM)
312312
tencentcloud_cvm_hpc_cluster
313313
tencentcloud_cvm_launch_template
314314
tencentcloud_cvm_launch_template_version
315+
tencentcloud_cvm_launch_template_default_version
315316
316317
TDSQL-C MySQL(CynosDB)
317318
Data Source
@@ -1776,6 +1777,7 @@ func Provider() terraform.ResourceProvider {
17761777
"tencentcloud_lighthouse_blueprint": resourceTencentCloudLighthouseBlueprint(),
17771778
"tencentcloud_cvm_launch_template_version": resourceTencentCloudCvmLaunchTemplateVersion(),
17781779
"tencentcloud_apm_instance": resourceTencentCloudApmInstance(),
1780+
"tencentcloud_cvm_launch_template_default_version": resourceTencentCloudCvmLaunchTemplateDefaultVersion(),
17791781
},
17801782

17811783
ConfigureFunc: providerConfigure,
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
/*
2+
Provides a resource to create a cvm launch_template_default_version
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cvm_launch_template_default_version" "launch_template_default_version" {
8+
launch_template_id = "lt-34vaef8fe"
9+
default_version = 2
10+
}
11+
```
12+
13+
Import
14+
15+
cvm launch_template_default_version can be imported using the id, e.g.
16+
17+
```
18+
terraform import tencentcloud_cvm_launch_template_default_version.launch_template_default_version launch_template_id
19+
```
20+
*/
21+
package tencentcloud
22+
23+
import (
24+
"context"
25+
"log"
26+
27+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
28+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
29+
)
30+
31+
func resourceTencentCloudCvmLaunchTemplateDefaultVersion() *schema.Resource {
32+
return &schema.Resource{
33+
Create: resourceTencentCloudCvmLaunchTemplateDefaultVersionCreate,
34+
Read: resourceTencentCloudCvmLaunchTemplateDefaultVersionRead,
35+
Update: resourceTencentCloudCvmLaunchTemplateDefaultVersionUpdate,
36+
Delete: resourceTencentCloudCvmLaunchTemplateDefaultVersionDelete,
37+
Importer: &schema.ResourceImporter{
38+
State: schema.ImportStatePassthrough,
39+
},
40+
Schema: map[string]*schema.Schema{
41+
"launch_template_id": {
42+
Required: true,
43+
ForceNew: true,
44+
Type: schema.TypeString,
45+
Description: "Instance launch template ID.",
46+
},
47+
48+
"default_version": {
49+
Required: true,
50+
Type: schema.TypeInt,
51+
Description: "The number of the version that you want to set as the default version.",
52+
},
53+
},
54+
}
55+
}
56+
57+
func resourceTencentCloudCvmLaunchTemplateDefaultVersionCreate(d *schema.ResourceData, meta interface{}) error {
58+
defer logElapsed("resource.tencentcloud_cvm_launch_template_default_version.create")()
59+
defer inconsistentCheck(d, meta)()
60+
61+
logId := getLogId(contextNil)
62+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
63+
service := CvmService{client: meta.(*TencentCloudClient).apiV3Conn}
64+
launchTemplateId := d.Get("launch_template_id").(string)
65+
defaultVersion := d.Get("default_version").(int)
66+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
67+
e := service.ModifyLaunchTemplateDefaultVersion(ctx, launchTemplateId, defaultVersion)
68+
if e != nil {
69+
return retryError(e)
70+
}
71+
return nil
72+
})
73+
if err != nil {
74+
return err
75+
}
76+
77+
d.SetId(launchTemplateId)
78+
79+
return resourceTencentCloudCvmLaunchTemplateDefaultVersionRead(d, meta)
80+
}
81+
82+
func resourceTencentCloudCvmLaunchTemplateDefaultVersionRead(d *schema.ResourceData, meta interface{}) error {
83+
defer logElapsed("resource.tencentcloud_cvm_launch_template_default_version.read")()
84+
defer inconsistentCheck(d, meta)()
85+
86+
logId := getLogId(contextNil)
87+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
88+
89+
service := CvmService{client: meta.(*TencentCloudClient).apiV3Conn}
90+
91+
launchTemplateId := d.Id()
92+
launchTemplateVersions, err := service.DescribeLaunchTemplateVersions(ctx, launchTemplateId)
93+
if err != nil {
94+
return err
95+
}
96+
97+
if len(launchTemplateVersions) == 0 {
98+
d.SetId("")
99+
log.Printf("[WARN]%s resource `CvmLaunchTemplateDefaultVersion` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
100+
return nil
101+
}
102+
103+
for _, launchTemplateVersion := range launchTemplateVersions {
104+
if *launchTemplateVersion.IsDefaultVersion {
105+
_ = d.Set("default_version", launchTemplateVersion.LaunchTemplateVersion)
106+
break
107+
}
108+
}
109+
_ = d.Set("launch_template_id", d.Id())
110+
111+
return nil
112+
}
113+
114+
func resourceTencentCloudCvmLaunchTemplateDefaultVersionUpdate(d *schema.ResourceData, meta interface{}) error {
115+
defer logElapsed("resource.tencentcloud_cvm_launch_template_default_version.update")()
116+
defer inconsistentCheck(d, meta)()
117+
118+
logId := getLogId(contextNil)
119+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
120+
121+
service := CvmService{client: meta.(*TencentCloudClient).apiV3Conn}
122+
if d.HasChange("default_version") {
123+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
124+
e := service.ModifyLaunchTemplateDefaultVersion(ctx, d.Id(), d.Get("default_version").(int))
125+
if e != nil {
126+
return retryError(e)
127+
}
128+
return nil
129+
})
130+
if err != nil {
131+
return err
132+
}
133+
}
134+
135+
return resourceTencentCloudCvmLaunchTemplateDefaultVersionRead(d, meta)
136+
}
137+
138+
func resourceTencentCloudCvmLaunchTemplateDefaultVersionDelete(d *schema.ResourceData, meta interface{}) error {
139+
defer logElapsed("resource.tencentcloud_cvm_launch_template_default_version.delete")()
140+
defer inconsistentCheck(d, meta)()
141+
142+
return nil
143+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudCvmLaunchTemplateDefaultVersionResource_basic(t *testing.T) {
10+
t.Parallel()
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() {
13+
testAccPreCheck(t)
14+
},
15+
Providers: testAccProviders,
16+
Steps: []resource.TestStep{
17+
{
18+
Config: testAccCvmLaunchTemplateDefaultVersion,
19+
Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_cvm_launch_template_default_version.launch_template_default_version", "id")),
20+
},
21+
{
22+
ResourceName: "tencentcloud_cvm_launch_template_default_version.launch_template_default_version",
23+
ImportState: true,
24+
ImportStateVerify: true,
25+
},
26+
},
27+
})
28+
}
29+
30+
const testAccCvmLaunchTemplateDefaultVersion = `
31+
32+
resource "tencentcloud_cvm_launch_template_default_version" "launch_template_default_version" {
33+
launch_template_id = "lt-9e1znnsa"
34+
default_version = 4
35+
}
36+
37+
`

tencentcloud/service_tencentcloud_cvm.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import (
55
"fmt"
66
"log"
77
"sort"
8+
"strings"
89
"sync"
910
"time"
1011

1112
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
13+
sdkError "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
1214
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
1315
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
1416
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/connectivity"
@@ -1383,6 +1385,45 @@ func (me *CvmService) DescribeLaunchTemplateVersionsById(ctx context.Context, la
13831385
return
13841386
}
13851387

1388+
func (me *CvmService) DescribeLaunchTemplateVersions(ctx context.Context, launchTemplateId string) (launchTemplates []*cvm.LaunchTemplateVersionInfo, errRet error) {
1389+
logId := getLogId(ctx)
1390+
1391+
request := cvm.NewDescribeLaunchTemplateVersionsRequest()
1392+
request.LaunchTemplateId = &launchTemplateId
1393+
1394+
defer func() {
1395+
if errRet != nil {
1396+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1397+
}
1398+
}()
1399+
1400+
offect := 0
1401+
limit := 50
1402+
for {
1403+
ratelimit.Check(request.GetAction())
1404+
request.Offset = helper.IntUint64(offect)
1405+
request.Limit = helper.IntUint64(limit)
1406+
response, err := me.client.UseCvmClient().DescribeLaunchTemplateVersions(request)
1407+
if err != nil {
1408+
errRet = err
1409+
return
1410+
}
1411+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1412+
if response == nil || response.Response == nil || len(response.Response.LaunchTemplateVersionSet) == 0 {
1413+
errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction())
1414+
return
1415+
}
1416+
1417+
launchTemplates = append(launchTemplates, response.Response.LaunchTemplateVersionSet...)
1418+
1419+
if len(response.Response.LaunchTemplateVersionSet) < limit {
1420+
break
1421+
}
1422+
}
1423+
1424+
return
1425+
}
1426+
13861427
func (me *CvmService) DeleteCvmLaunchTemplateById(ctx context.Context, launchTemplateId string) (errRet error) {
13871428
logId := getLogId(ctx)
13881429

@@ -1461,3 +1502,27 @@ func (me *CvmService) DeleteCvmLaunchTemplateVersionById(ctx context.Context, la
14611502

14621503
return
14631504
}
1505+
1506+
func (me *CvmService) ModifyLaunchTemplateDefaultVersion(ctx context.Context, launchTemplateId string, defaultVersion int) error {
1507+
logId := getLogId(ctx)
1508+
request := cvm.NewModifyLaunchTemplateDefaultVersionRequest()
1509+
request.LaunchTemplateId = helper.String(launchTemplateId)
1510+
request.DefaultVersion = helper.IntInt64(defaultVersion)
1511+
1512+
ratelimit.Check(request.GetAction())
1513+
response, err := me.client.UseCvmClient().ModifyLaunchTemplateDefaultVersion(request)
1514+
if err != nil {
1515+
if sdkErr, ok := err.(*sdkError.TencentCloudSDKError); ok {
1516+
if sdkErr.Code == "InvalidParameterValue.LaunchTemplateIdVerSetAlready" && strings.Contains(sdkErr.Message, "The specified launch template version had been set to default") {
1517+
return nil
1518+
}
1519+
}
1520+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
1521+
logId, request.GetAction(), request.ToJsonString(), err.Error())
1522+
return err
1523+
}
1524+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
1525+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1526+
1527+
return nil
1528+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
subcategory: "Cloud Virtual Machine(CVM)"
3+
layout: "tencentcloud"
4+
page_title: "TencentCloud: tencentcloud_cvm_launch_template_default_version"
5+
sidebar_current: "docs-tencentcloud-resource-cvm_launch_template_default_version"
6+
description: |-
7+
Provides a resource to create a cvm launch_template_default_version
8+
---
9+
10+
# tencentcloud_cvm_launch_template_default_version
11+
12+
Provides a resource to create a cvm launch_template_default_version
13+
14+
## Example Usage
15+
16+
```hcl
17+
resource "tencentcloud_cvm_launch_template_default_version" "launch_template_default_version" {
18+
launch_template_id = "lt-34vaef8fe"
19+
default_version = 2
20+
}
21+
```
22+
23+
## Argument Reference
24+
25+
The following arguments are supported:
26+
27+
* `default_version` - (Required, Int) The number of the version that you want to set as the default version.
28+
* `launch_template_id` - (Required, String, ForceNew) Instance launch template ID.
29+
30+
## Attributes Reference
31+
32+
In addition to all arguments above, the following attributes are exported:
33+
34+
* `id` - ID of the resource.
35+
36+
37+
38+
## Import
39+
40+
cvm launch_template_default_version can be imported using the id, e.g.
41+
42+
```
43+
terraform import tencentcloud_cvm_launch_template_default_version.launch_template_default_version launch_template_id
44+
```
45+

website/tencentcloud.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,9 @@
10401040
<li>
10411041
<a href="/docs/providers/tencentcloud/r/cvm_launch_template.html">tencentcloud_cvm_launch_template</a>
10421042
</li>
1043+
<li>
1044+
<a href="/docs/providers/tencentcloud/r/cvm_launch_template_default_version.html">tencentcloud_cvm_launch_template_default_version</a>
1045+
</li>
10431046
<li>
10441047
<a href="/docs/providers/tencentcloud/r/cvm_launch_template_version.html">tencentcloud_cvm_launch_template_version</a>
10451048
</li>

0 commit comments

Comments
 (0)