diff --git a/.changelog/3229.txt b/.changelog/3229.txt new file mode 100644 index 0000000000..0ba5db14df --- /dev/null +++ b/.changelog/3229.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_placement_group: support `affinity` and `tags` +``` \ No newline at end of file diff --git a/go.mod b/go.mod index da7b6bdf45..25d6416844 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index d7c7e2d1b2..64986ffdbf 100644 --- a/go.sum +++ b/go.sum @@ -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= @@ -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= @@ -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= diff --git a/tencentcloud/services/cvm/resource_tc_placement_group.go b/tencentcloud/services/cvm/resource_tc_placement_group.go index 25fac68fbf..967f83d183 100644 --- a/tencentcloud/services/cvm/resource_tc_placement_group.go +++ b/tencentcloud/services/cvm/resource_tc_placement_group.go @@ -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" @@ -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": { @@ -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) } @@ -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 } @@ -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) } diff --git a/tencentcloud/services/cvm/resource_tc_placement_group.md b/tencentcloud/services/cvm/resource_tc_placement_group.md index cfc4f0c6c9..8faaf9b84e 100644 --- a/tencentcloud/services/cvm/resource_tc_placement_group.md +++ b/tencentcloud/services/cvm/resource_tc_placement_group.md @@ -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" + } } ``` diff --git a/tencentcloud/services/cvm/service_tencentcloud_cvm.go b/tencentcloud/services/cvm/service_tencentcloud_cvm.go index 6f1778c329..184a5a85e0 100644 --- a/tencentcloud/services/cvm/service_tencentcloud_cvm.go +++ b/tencentcloud/services/cvm/service_tencentcloud_cvm.go @@ -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 { @@ -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 +} diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go index 99c98aa5fc..fccc640040 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go @@ -265,7 +265,7 @@ func CompleteCommonParams(request Request, region string, requestClient string) params["Action"] = request.GetAction() params["Timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) params["Nonce"] = strconv.Itoa(rand.Int()) - params["RequestClient"] = "SDK_GO_1.0.1126" + params["RequestClient"] = "SDK_GO_1.0.1128" if requestClient != "" { params["RequestClient"] += ": " + requestClient } diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go index fc45997089..efdd98d38e 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go @@ -4849,6 +4849,9 @@ type DisasterRecoverGroup struct { // 分散置放群组创建时间。 CreateTime *string `json:"CreateTime,omitnil,omitempty" name:"CreateTime"` + // 置放群组亲和度 + Affinity *int64 `json:"Affinity,omitnil,omitempty" name:"Affinity"` + // 置放群组关联的标签列表。 Tags []*Tag `json:"Tags,omitnil,omitempty" name:"Tags"` } diff --git a/vendor/modules.txt b/vendor/modules.txt index 0c5e6ff8fe..d45fdd4073 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -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 @@ -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 diff --git a/website/docs/r/placement_group.html.markdown b/website/docs/r/placement_group.html.markdown index 894eb5524c..50bdd80ac1 100644 --- a/website/docs/r/placement_group.html.markdown +++ b/website/docs/r/placement_group.html.markdown @@ -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" + } } ``` @@ -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