Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7cedfaa

Browse files
committedMar 20, 2025·
add affinity
1 parent 05cf3e2 commit 7cedfaa

File tree

4 files changed

+85
-6
lines changed

4 files changed

+85
-6
lines changed
 

‎tencentcloud/services/cvm/resource_tc_placement_group.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package cvm
33
import (
44
"context"
55

6+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
7+
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
8+
69
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
710

811
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -34,6 +37,18 @@ func ResourceTencentCloudPlacementGroup() *schema.Resource {
3437
ValidateFunc: tccommon.ValidateAllowedStringValue(CVM_PLACEMENT_GROUP_TYPE),
3538
Description: "Type of the placement group. Valid values: `HOST`, `SW` and `RACK`.",
3639
},
40+
"affinity": {
41+
Type: schema.TypeInt,
42+
Optional: true,
43+
ForceNew: true,
44+
ValidateFunc: tccommon.ValidateIntegerInRange(1, 10),
45+
Description: "Affinity of the placement group.Valid values: 1~10, default is 1.",
46+
},
47+
"tags": {
48+
Type: schema.TypeMap,
49+
Optional: true,
50+
Description: "Tags of the placement group.",
51+
},
3752

3853
// computed
3954
"cvm_quota_total": {
@@ -65,10 +80,26 @@ func resourceTencentCloudPlacementGroupCreate(d *schema.ResourceData, meta inter
6580
}
6681
placementName := d.Get("name").(string)
6782
placementType := d.Get("type").(string)
83+
84+
var affinity int
85+
if v, ok := d.GetOkExists("affinity"); ok {
86+
affinity = v.(int)
87+
}
88+
89+
tags := make([]*cvm.Tag, 0)
90+
if v := helper.GetTags(d, "tags"); len(v) > 0 {
91+
for tagKey, tagValue := range v {
92+
tag := cvm.Tag{
93+
Key: helper.String(tagKey),
94+
Value: helper.String(tagValue),
95+
}
96+
tags = append(tags, &tag)
97+
}
98+
}
6899
var id string
69100
var errRet error
70101
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
71-
id, errRet = cvmService.CreatePlacementGroup(ctx, placementName, placementType)
102+
id, errRet = cvmService.CreatePlacementGroup(ctx, placementName, placementType, affinity, tags)
72103
if errRet != nil {
73104
return tccommon.RetryError(errRet)
74105
}
@@ -116,6 +147,10 @@ func resourceTencentCloudPlacementGroupRead(d *schema.ResourceData, meta interfa
116147
_ = d.Set("current_num", placement.CurrentNum)
117148
_ = d.Set("create_time", placement.CreateTime)
118149

150+
if len(placement.Tags) > 0 {
151+
_ = d.Set("tags", flattenInstanceTagsMapping(placement.Tags))
152+
}
153+
119154
return nil
120155
}
121156

@@ -142,6 +177,20 @@ func resourceTencentCloudPlacementGroupUpdate(d *schema.ResourceData, meta inter
142177
}
143178
}
144179

180+
if d.HasChange("tags") {
181+
oldValue, newValue := d.GetChange("tags")
182+
replaceTags, deleteTags := svctag.DiffTags(oldValue.(map[string]interface{}), newValue.(map[string]interface{}))
183+
184+
client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
185+
tagService := svctag.NewTagService(client)
186+
region := client.Region
187+
resourceName := tccommon.BuildTagResourceName("cvm", "ps", region, d.Id())
188+
err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags)
189+
if err != nil {
190+
return err
191+
}
192+
}
193+
145194
return resourceTencentCloudPlacementGroupRead(d, meta)
146195
}
147196

‎tencentcloud/services/cvm/resource_tc_placement_group.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ Example Usage
44

55
```hcl
66
resource "tencentcloud_placement_group" "foo" {
7-
name = "test"
8-
type = "HOST"
7+
name = "test"
8+
type = "HOST"
9+
affinity = 2
10+
tags = {
11+
createBy = "terraform"
12+
}
913
}
1014
```
1115

‎tencentcloud/services/cvm/service_tencentcloud_cvm.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -759,12 +759,24 @@ func (me *CvmService) BindKeyPair(ctx context.Context, keyIds []*string, instanc
759759
return nil
760760
}
761761

762-
func (me *CvmService) CreatePlacementGroup(ctx context.Context, placementName, placementType string) (placementId string, errRet error) {
762+
func (me *CvmService) CreatePlacementGroup(ctx context.Context, placementName, placementType string, affinity int, tags []*cvm.Tag) (placementId string, errRet error) {
763763
logId := tccommon.GetLogId(ctx)
764764
request := cvm.NewCreateDisasterRecoverGroupRequest()
765765
request.Name = &placementName
766766
request.Type = &placementType
767767

768+
if affinity != 0 {
769+
request.Affinity = helper.IntInt64(affinity)
770+
}
771+
772+
if len(tags) > 0 {
773+
tagSpecification := cvm.TagSpecification{
774+
ResourceType: helper.String("ps"),
775+
Tags: tags,
776+
}
777+
request.TagSpecification = append(request.TagSpecification, &tagSpecification)
778+
}
779+
768780
ratelimit.Check(request.GetAction())
769781
response, err := me.client.UseCvmClient().CreateDisasterRecoverGroup(request)
770782
if err != nil {
@@ -1905,3 +1917,11 @@ func (me *CvmService) DeleteCvmInstanceActionTimerById(ctx context.Context, acti
19051917

19061918
return
19071919
}
1920+
1921+
func flattenInstanceTagsMapping(list []*cvm.Tag) map[string]interface{} {
1922+
result := make(map[string]interface{}, len(list))
1923+
for _, v := range list {
1924+
result[*v.Key] = *v.Value
1925+
}
1926+
return result
1927+
}

‎website/docs/r/placement_group.html.markdown

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ Provide a resource to create a placement group.
1515

1616
```hcl
1717
resource "tencentcloud_placement_group" "foo" {
18-
name = "test"
19-
type = "HOST"
18+
name = "test"
19+
type = "HOST"
20+
affinity = 2
21+
tags = {
22+
createBy = "terraform"
23+
}
2024
}
2125
```
2226

@@ -26,6 +30,8 @@ The following arguments are supported:
2630

2731
* `name` - (Required, String) Name of the placement group, 1-60 characters in length.
2832
* `type` - (Required, String, ForceNew) Type of the placement group. Valid values: `HOST`, `SW` and `RACK`.
33+
* `affinity` - (Optional, Int, ForceNew) Affinity of the placement group.Valid values: 1~10, default is 1.
34+
* `tags` - (Optional, Map) Tags of the placement group.
2935

3036
## Attributes Reference
3137

0 commit comments

Comments
 (0)
Please sign in to comment.