Skip to content

feat(cvm): [122162302] support affinity and tags #3229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/3229.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_placement_group: support `affinity` and `tags`
```
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1107
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1078
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1126
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1126
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1128
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
Expand Down
14 changes: 4 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -816,8 +816,6 @@ github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplB
github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk=
github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM=
github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg=
github.com/tencentcloud/tencentcloud-sdk-go-intl-en v3.0.1114+incompatible h1:Qo2u4QpYzsrrTedOFmNyDIghJMsFSa/Dn3HfnTWtTfs=
github.com/tencentcloud/tencentcloud-sdk-go-intl-en v3.0.1114+incompatible/go.mod h1:72Wo6Gt6F8d8V+njrAmduVoT9QjPwCyXktpqCWr7PUc=
github.com/tencentcloud/tencentcloud-sdk-go-intl-en v3.0.1161+incompatible h1:gGfe9oRCYZAWxd/xm0k8NaLmEssVPPl7pEwO022Arb4=
github.com/tencentcloud/tencentcloud-sdk-go-intl-en v3.0.1161+incompatible/go.mod h1:72Wo6Gt6F8d8V+njrAmduVoT9QjPwCyXktpqCWr7PUc=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/antiddos v1.0.799 h1:u49r1bGFDY0CeAF46iotNnLtc5yplPf9XXa7W7zJ4fE=
Expand Down Expand Up @@ -920,7 +918,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1033/go.mod
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1034/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1037/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1038/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1053/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1056/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1066/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1071/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
Expand All @@ -933,18 +930,15 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1107/go.mod
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1108/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1111/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1115/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1122 h1:jffjOBJ1ejT4ldClIIEI+QnfV5K2RubA+xNiz6uuFOU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1122/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1126 h1:HHWE825wxwoEEZVB9CLgPpXOiFy6hZXJMcCjCAOckAU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1126/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1128 h1:NGnqDc8FQL0YdiCHgTO4Wkso6ToD8rE3JW9VOzoPBNA=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1128/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860/go.mod h1:NZo1WplQcC314kMlCRUoy8NQju2BnolIJj7NAWgsuhY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1053 h1:x193cxbzh+bXxxcq9NGzriW0jCxQHJd6mT79kcfUqSs=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1053/go.mod h1:yM5i22uG9HKuUwwz+XvrDW9oBtZdb7avyDrMrS/FBIs=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1126 h1:JdhKLXoTETh13Oe9d4yBXljwfubfCEa6HjX60PtpbRY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1126/go.mod h1:DTeq5O98dERO/YvCPVrmr533PZd8OQhHmaucRe2pjnY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128 h1:qoSzTKnmGdXlfphMoEwqgaGjs5gwOy/PqzMu7dlLHNM=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128/go.mod h1:hVNSxeomc/AQsJphdbPnPINsO0cMLcVAA6kituTD2g0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 h1:2egy69SP/wPsmnfozcQVZ6tUY6F6N/TpEe/7xtXrc/8=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762/go.mod h1:1XylIfNUbAzmNqi4XMhwcM3VhmUHdu1OYybOeaJ4sOw=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111 h1:Y7LLIZEQh8OAbnBWppUopu2PjPaQOO9Jzhp8LZO7adI=
Expand Down
53 changes: 52 additions & 1 deletion tencentcloud/services/cvm/resource_tc_placement_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package cvm
import (
"context"

"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"

tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
Expand Down Expand Up @@ -34,6 +37,19 @@ func ResourceTencentCloudPlacementGroup() *schema.Resource {
ValidateFunc: tccommon.ValidateAllowedStringValue(CVM_PLACEMENT_GROUP_TYPE),
Description: "Type of the placement group. Valid values: `HOST`, `SW` and `RACK`.",
},
"affinity": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ForceNew: true,
ValidateFunc: tccommon.ValidateIntegerInRange(1, 10),
Description: "Affinity of the placement group.Valid values: 1~10, default is 1.",
},
"tags": {
Type: schema.TypeMap,
Optional: true,
Description: "Tags of the placement group.",
},

// computed
"cvm_quota_total": {
Expand Down Expand Up @@ -65,10 +81,26 @@ func resourceTencentCloudPlacementGroupCreate(d *schema.ResourceData, meta inter
}
placementName := d.Get("name").(string)
placementType := d.Get("type").(string)

var affinity int
if v, ok := d.GetOkExists("affinity"); ok {
affinity = v.(int)
}

tags := make([]*cvm.Tag, 0)
if v := helper.GetTags(d, "tags"); len(v) > 0 {
for tagKey, tagValue := range v {
tag := cvm.Tag{
Key: helper.String(tagKey),
Value: helper.String(tagValue),
}
tags = append(tags, &tag)
}
}
var id string
var errRet error
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
id, errRet = cvmService.CreatePlacementGroup(ctx, placementName, placementType)
id, errRet = cvmService.CreatePlacementGroup(ctx, placementName, placementType, affinity, tags)
if errRet != nil {
return tccommon.RetryError(errRet)
}
Expand Down Expand Up @@ -112,10 +144,15 @@ func resourceTencentCloudPlacementGroupRead(d *schema.ResourceData, meta interfa

_ = d.Set("name", placement.Name)
_ = d.Set("type", placement.Type)
_ = d.Set("affinity", placement.Affinity)
_ = d.Set("cvm_quota_total", placement.CvmQuotaTotal)
_ = d.Set("current_num", placement.CurrentNum)
_ = d.Set("create_time", placement.CreateTime)

if len(placement.Tags) > 0 {
_ = d.Set("tags", flattenInstanceTagsMapping(placement.Tags))
}

return nil
}

Expand All @@ -142,6 +179,20 @@ func resourceTencentCloudPlacementGroupUpdate(d *schema.ResourceData, meta inter
}
}

if d.HasChange("tags") {
oldValue, newValue := d.GetChange("tags")
replaceTags, deleteTags := svctag.DiffTags(oldValue.(map[string]interface{}), newValue.(map[string]interface{}))

client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
tagService := svctag.NewTagService(client)
region := client.Region
resourceName := tccommon.BuildTagResourceName("cvm", "ps", region, d.Id())
err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags)
if err != nil {
return err
}
}

return resourceTencentCloudPlacementGroupRead(d, meta)
}

Expand Down
8 changes: 6 additions & 2 deletions tencentcloud/services/cvm/resource_tc_placement_group.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@ Example Usage

```hcl
resource "tencentcloud_placement_group" "foo" {
name = "test"
type = "HOST"
name = "test"
type = "HOST"
affinity = 2
tags = {
createBy = "terraform"
}
}
```

Expand Down
22 changes: 21 additions & 1 deletion tencentcloud/services/cvm/service_tencentcloud_cvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -759,12 +759,24 @@ func (me *CvmService) BindKeyPair(ctx context.Context, keyIds []*string, instanc
return nil
}

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

if affinity != 0 {
request.Affinity = helper.IntInt64(affinity)
}

if len(tags) > 0 {
tagSpecification := cvm.TagSpecification{
ResourceType: helper.String("ps"),
Tags: tags,
}
request.TagSpecification = append(request.TagSpecification, &tagSpecification)
}

ratelimit.Check(request.GetAction())
response, err := me.client.UseCvmClient().CreateDisasterRecoverGroup(request)
if err != nil {
Expand Down Expand Up @@ -1905,3 +1917,11 @@ func (me *CvmService) DeleteCvmInstanceActionTimerById(ctx context.Context, acti

return
}

func flattenInstanceTagsMapping(list []*cvm.Tag) map[string]interface{} {
result := make(map[string]interface{}, len(list))
for _, v := range list {
result[*v.Key] = *v.Value
}
return result
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions vendor/modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1166,7 +1166,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit/v20190319
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1078
## explicit; go 1.14
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls/v20201016
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1126
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1128
## explicit; go 1.11
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors
Expand All @@ -1180,7 +1180,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter/v20230110
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860
## explicit; go 1.14
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip/v20221121
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1126
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1128
## explicit; go 1.14
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
Expand Down
10 changes: 8 additions & 2 deletions website/docs/r/placement_group.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ Provide a resource to create a placement group.

```hcl
resource "tencentcloud_placement_group" "foo" {
name = "test"
type = "HOST"
name = "test"
type = "HOST"
affinity = 2
tags = {
createBy = "terraform"
}
}
```

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

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

## Attributes Reference

Expand Down
Loading