Skip to content

Commit 4edbd63

Browse files
authored
Merge pull request #1462 from tencentcloudstack/feat/add_cvm_hpc
Feat/add cvm hpc
2 parents 726ef17 + 9f89638 commit 4edbd63

File tree

14 files changed

+1460
-77
lines changed

14 files changed

+1460
-77
lines changed

.changelog/1462.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_hpc_cluster
3+
```

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ require (
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.445
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.412
38-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.549
39-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445
38+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.553
39+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.553
4040
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488
4141
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
4242
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain v1.0.542

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,8 +527,12 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.547/go.mod
527527
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.548/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
528528
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.549 h1:j/bk6BVbnhiCU9jIbIQlEwWmLn4FUzEbNPZUC/wKnVo=
529529
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.549/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
530+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.553 h1:RB8GWKSifv5QdBQUUWfzCo06FU4mmqH1VG7dTWMm5nQ=
531+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.553/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
530532
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445 h1:Bh7XD0ypNMHYyBOM8hhKsSu+y0VVKUnJVS+YKKhfpGg=
531533
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445/go.mod h1:jMDD351efCFpT1+KVFbcpu6SbmP4TYmp4qkoCfr63nQ=
534+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.553 h1:Pl1kYgFhJp0QSoVFSzRsiGk+HfEAkBTQg7+O60tytNA=
535+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.553/go.mod h1:dnnqPxXYK+kax3e1MKo/PI3iWJtytm6ogWKQHJS7SGE=
532536
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488 h1:A1seXWtMf2atBjSNYvcwxyDoFzCMgqyVnsxnWzhqJEA=
533537
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488/go.mod h1:T8mL4dQLkPTL6VtVMeBYol3asSUS53ycP9PJf5Qp1GE=
534538
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335 h1:D8qrelkK5udv8RzJJIABMzItGIyaZoYnxEVeIsYqiNw=

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ Cloud Virtual Machine(CVM)
292292
tencentcloud_placement_group
293293
tencentcloud_reserved_instance
294294
tencentcloud_image
295+
tencentcloud_cvm_hpc_cluster
295296
296297
TDSQL-C MySQL(CynosDB)
297298
Data Source
@@ -1498,6 +1499,7 @@ func Provider() terraform.ResourceProvider {
14981499
"tencentcloud_tdmq_rocketmq_environment_role": resourceTencentCloudTdmqRocketmqEnvironmentRole(),
14991500
"tencentcloud_dts_migrate_job": resourceTencentCloudDtsMigrateJob(),
15001501
"tencentcloud_dts_compare_task": resourceTencentCloudDtsCompareTask(),
1502+
"tencentcloud_cvm_hpc_cluster": resourceTencentCloudCvmHpcCluster(),
15011503
},
15021504

15031505
ConfigureFunc: providerConfigure,
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
/*
2+
Provides a resource to create a cvm hpc_cluster
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cvm_hpc_cluster" "hpc_cluster" {
8+
zone = "ap-beijing-6"
9+
name = "terraform-test"
10+
remark = "create for test"
11+
}
12+
```
13+
14+
Import
15+
16+
cvm hpc_cluster can be imported using the id, e.g.
17+
18+
```
19+
terraform import tencentcloud_cvm_hpc_cluster.hpc_cluster hpc_cluster_id
20+
```
21+
*/
22+
package tencentcloud
23+
24+
import (
25+
"context"
26+
"fmt"
27+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
28+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
29+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
30+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
31+
"log"
32+
)
33+
34+
func resourceTencentCloudCvmHpcCluster() *schema.Resource {
35+
return &schema.Resource{
36+
Create: resourceTencentCloudCvmHpcClusterCreate,
37+
Read: resourceTencentCloudCvmHpcClusterRead,
38+
Update: resourceTencentCloudCvmHpcClusterUpdate,
39+
Delete: resourceTencentCloudCvmHpcClusterDelete,
40+
Importer: &schema.ResourceImporter{
41+
State: schema.ImportStatePassthrough,
42+
},
43+
Schema: map[string]*schema.Schema{
44+
"zone": {
45+
Required: true,
46+
Type: schema.TypeString,
47+
Description: "Available zone.",
48+
},
49+
50+
"name": {
51+
Required: true,
52+
Type: schema.TypeString,
53+
Description: "Name of Hpc Cluster.",
54+
},
55+
56+
"remark": {
57+
Optional: true,
58+
Type: schema.TypeString,
59+
Description: "Remark of Hpc Cluster.",
60+
},
61+
},
62+
}
63+
}
64+
65+
func resourceTencentCloudCvmHpcClusterCreate(d *schema.ResourceData, meta interface{}) error {
66+
defer logElapsed("resource.tencentcloud_cvm_hpc_cluster.create")()
67+
defer inconsistentCheck(d, meta)()
68+
69+
logId := getLogId(contextNil)
70+
71+
var (
72+
request = cvm.NewCreateHpcClusterRequest()
73+
response = cvm.NewCreateHpcClusterResponse()
74+
hpcClusterId string
75+
)
76+
if v, ok := d.GetOk("zone"); ok {
77+
request.Zone = helper.String(v.(string))
78+
}
79+
80+
if v, ok := d.GetOk("name"); ok {
81+
request.Name = helper.String(v.(string))
82+
}
83+
84+
if v, ok := d.GetOk("remark"); ok {
85+
request.Remark = helper.String(v.(string))
86+
}
87+
88+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
89+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCvmClient().CreateHpcCluster(request)
90+
if e != nil {
91+
return retryError(e)
92+
} else {
93+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
94+
}
95+
response = result
96+
return nil
97+
})
98+
if err != nil {
99+
log.Printf("[CRITAL]%s create cvm hpcCluster failed, reason:%+v", logId, err)
100+
return err
101+
}
102+
103+
if len(response.Response.HpcClusterSet) < 1 {
104+
return fmt.Errorf("resource `tencentcloud_cvm_hpc_cluster` create failed.")
105+
}
106+
107+
hpcClusterId = *response.Response.HpcClusterSet[0].HpcClusterId
108+
d.SetId(hpcClusterId)
109+
110+
return resourceTencentCloudCvmHpcClusterRead(d, meta)
111+
}
112+
113+
func resourceTencentCloudCvmHpcClusterRead(d *schema.ResourceData, meta interface{}) error {
114+
defer logElapsed("resource.tencentcloud_cvm_hpc_cluster.read")()
115+
defer inconsistentCheck(d, meta)()
116+
117+
logId := getLogId(contextNil)
118+
119+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
120+
121+
service := CvmService{client: meta.(*TencentCloudClient).apiV3Conn}
122+
123+
hpcClusterId := d.Id()
124+
125+
hpcCluster, err := service.DescribeCvmHpcClusterById(ctx, hpcClusterId)
126+
if err != nil {
127+
return err
128+
}
129+
130+
if hpcCluster == nil {
131+
d.SetId("")
132+
return fmt.Errorf("resource `tencentcloud_cvm_hpc_cluster` %s does not exist", d.Id())
133+
}
134+
135+
if hpcCluster.Zone != nil {
136+
_ = d.Set("zone", hpcCluster.Zone)
137+
}
138+
139+
if hpcCluster.Name != nil {
140+
_ = d.Set("name", hpcCluster.Name)
141+
}
142+
143+
if hpcCluster.Remark != nil {
144+
_ = d.Set("remark", hpcCluster.Remark)
145+
}
146+
147+
return nil
148+
}
149+
150+
func resourceTencentCloudCvmHpcClusterUpdate(d *schema.ResourceData, meta interface{}) error {
151+
defer logElapsed("resource.tencentcloud_cvm_hpc_cluster.update")()
152+
defer inconsistentCheck(d, meta)()
153+
154+
logId := getLogId(contextNil)
155+
156+
request := cvm.NewModifyHpcClusterAttributeRequest()
157+
158+
hpcClusterId := d.Id()
159+
160+
request.HpcClusterId = &hpcClusterId
161+
162+
if d.HasChange("name") {
163+
if v, ok := d.GetOk("name"); ok {
164+
request.Name = helper.String(v.(string))
165+
}
166+
}
167+
168+
if d.HasChange("remark") {
169+
if v, ok := d.GetOk("remark"); ok {
170+
request.Remark = helper.String(v.(string))
171+
}
172+
}
173+
174+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
175+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCvmClient().ModifyHpcClusterAttribute(request)
176+
if e != nil {
177+
return retryError(e)
178+
} else {
179+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
180+
}
181+
return nil
182+
})
183+
if err != nil {
184+
log.Printf("[CRITAL]%s create cvm hpcCluster failed, reason:%+v", logId, err)
185+
return nil
186+
}
187+
188+
return resourceTencentCloudCvmHpcClusterRead(d, meta)
189+
}
190+
191+
func resourceTencentCloudCvmHpcClusterDelete(d *schema.ResourceData, meta interface{}) error {
192+
defer logElapsed("resource.tencentcloud_cvm_hpc_cluster.delete")()
193+
defer inconsistentCheck(d, meta)()
194+
195+
logId := getLogId(contextNil)
196+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
197+
198+
service := CvmService{client: meta.(*TencentCloudClient).apiV3Conn}
199+
hpcClusterId := d.Id()
200+
201+
if err := service.DeleteCvmHpcClusterById(ctx, hpcClusterId); err != nil {
202+
return nil
203+
}
204+
205+
return nil
206+
}
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+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
5+
"testing"
6+
)
7+
8+
func TestAccTencentCloudNeedFixCvmHpcClusterResource_basic(t *testing.T) {
9+
t.Parallel()
10+
resource.Test(t, resource.TestCase{
11+
PreCheck: func() {
12+
testAccPreCheck(t)
13+
},
14+
Providers: testAccProviders,
15+
Steps: []resource.TestStep{
16+
{
17+
Config: testAccCvmHpcCluster,
18+
Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_cvm_hpc_cluster.hpc_cluster", "id")),
19+
},
20+
{
21+
ResourceName: "tencentcloud_cvm_hpc_cluster.hpc_cluster",
22+
ImportState: true,
23+
ImportStateVerify: true,
24+
},
25+
},
26+
})
27+
}
28+
29+
const testAccCvmHpcCluster = `
30+
31+
resource "tencentcloud_cvm_hpc_cluster" "hpc_cluster" {
32+
zone = "ap-beijing-6"
33+
name = "terraform-test"
34+
remark = "create for test"
35+
}
36+
37+
`

tencentcloud/service_tencentcloud_cvm.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,3 +1253,74 @@ func (me *CvmService) ResizeInstanceDisks(ctx context.Context, request *cvm.Resi
12531253

12541254
return
12551255
}
1256+
1257+
func (me *CvmService) DescribeCvmHpcClusterById(ctx context.Context, hpcClusterId string) (hpcCluster *cvm.HpcClusterInfo, errRet error) {
1258+
logId := getLogId(ctx)
1259+
1260+
request := cvm.NewDescribeHpcClustersRequest()
1261+
request.HpcClusterIds = []*string{&hpcClusterId}
1262+
1263+
defer func() {
1264+
if errRet != nil {
1265+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1266+
}
1267+
}()
1268+
1269+
ratelimit.Check(request.GetAction())
1270+
1271+
var (
1272+
offset uint64 = 0
1273+
limit uint64 = 20
1274+
)
1275+
instances := make([]*cvm.HpcClusterInfo, 0)
1276+
for {
1277+
request.Offset = &offset
1278+
request.Limit = &limit
1279+
response, err := me.client.UseCvmClient().DescribeHpcClusters(request)
1280+
if err != nil {
1281+
errRet = err
1282+
return
1283+
}
1284+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1285+
1286+
if response == nil || len(response.Response.HpcClusterSet) < 1 {
1287+
break
1288+
}
1289+
instances = append(instances, response.Response.HpcClusterSet...)
1290+
if len(response.Response.HpcClusterSet) < int(limit) {
1291+
break
1292+
}
1293+
1294+
offset += limit
1295+
}
1296+
1297+
if len(instances) < 1 {
1298+
return
1299+
}
1300+
hpcCluster = instances[0]
1301+
return
1302+
}
1303+
1304+
func (me *CvmService) DeleteCvmHpcClusterById(ctx context.Context, hpcClusterId string) (errRet error) {
1305+
logId := getLogId(ctx)
1306+
1307+
request := cvm.NewDeleteHpcClustersRequest()
1308+
request.HpcClusterIds = []*string{&hpcClusterId}
1309+
1310+
defer func() {
1311+
if errRet != nil {
1312+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1313+
}
1314+
}()
1315+
1316+
ratelimit.Check(request.GetAction())
1317+
1318+
response, err := me.client.UseCvmClient().DeleteHpcClusters(request)
1319+
if err != nil {
1320+
errRet = err
1321+
return
1322+
}
1323+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1324+
1325+
return
1326+
}

vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)