Skip to content

Commit 08da56a

Browse files
committed
add
1 parent bec7692 commit 08da56a

File tree

1 file changed

+86
-30
lines changed

1 file changed

+86
-30
lines changed

tencentcloud/services/cvm/resource_tc_instance.go

Lines changed: 86 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ func ResourceTencentCloudInstance() *schema.Resource {
113113
"force_replace_placement_group_id": {
114114
Type: schema.TypeBool,
115115
Optional: true,
116-
Computed: true,
117116
Description: "Whether to force the instance host to be replaced. Value range: true: Allows the instance to change the host and restart the instance. Local disk machines do not support specifying this parameter; false: Does not allow the instance to change the host and only join the placement group on the current host. This may cause the placement group to fail to change. Only useful for change `placement_group_id`, Default is false.",
118117
},
119118
// payment
@@ -581,17 +580,6 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
581580
}
582581
}
583582

584-
if v, ok := d.GetOk("placement_group_id"); ok {
585-
request.DisasterRecoverGroupIds = []*string{helper.String(v.(string))}
586-
}
587-
588-
var PgiFlag bool
589-
if v, ok := d.GetOkExists("force_replace_placement_group_id"); ok {
590-
PgiFlag = v.(bool)
591-
}
592-
593-
_ = d.Set("force_replace_placement_group_id", PgiFlag)
594-
595583
// network
596584
request.InternetAccessible = &cvm.InternetAccessible{}
597585
if v, ok := d.GetOk("internet_charge_type"); ok {
@@ -847,6 +835,58 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
847835
return err
848836
}
849837

838+
// set placement group id
839+
if v, ok := d.GetOk("placement_group_id"); ok && v != "" {
840+
request := cvm.NewModifyInstancesDisasterRecoverGroupRequest()
841+
if v, ok := d.GetOkExists("force_replace_placement_group_id"); ok {
842+
request.Force = helper.Bool(v.(bool))
843+
}
844+
845+
request.InstanceIds = helper.Strings([]string{instanceId})
846+
request.DisasterRecoverGroupId = helper.String(v.(string))
847+
err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
848+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().ModifyInstancesDisasterRecoverGroup(request)
849+
if e != nil {
850+
return tccommon.RetryError(e)
851+
} else {
852+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
853+
}
854+
855+
return nil
856+
})
857+
858+
if err != nil {
859+
return err
860+
}
861+
862+
// wait
863+
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
864+
instance, errRet := cvmService.DescribeInstanceById(ctx, instanceId)
865+
if errRet != nil {
866+
return tccommon.RetryError(errRet, tccommon.InternalError)
867+
}
868+
869+
if instance != nil && *instance.InstanceState == CVM_STATUS_LAUNCH_FAILED {
870+
//LatestOperationCodeMode
871+
if instance.LatestOperationErrorMsg != nil {
872+
return resource.NonRetryableError(fmt.Errorf("cvm instance %s launch failed. Error msg: %s.\n", *instance.InstanceId, *instance.LatestOperationErrorMsg))
873+
}
874+
875+
return resource.NonRetryableError(fmt.Errorf("cvm instance %s launch failed, this resource will not be stored to tfstate and will auto removed\n.", *instance.InstanceId))
876+
}
877+
878+
if instance != nil && *instance.InstanceState == CVM_STATUS_RUNNING {
879+
return nil
880+
}
881+
882+
return resource.RetryableError(fmt.Errorf("cvm instance status is %s, retry...", *instance.InstanceState))
883+
})
884+
885+
if err != nil {
886+
return err
887+
}
888+
}
889+
850890
// Wait for the tags attached to the vm since tags attachment it's async while vm creation.
851891
if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
852892
tcClient := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
@@ -1004,13 +1044,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
10041044
_ = d.Set("placement_group_id", instance.DisasterRecoverGroupId)
10051045
}
10061046

1007-
var PgiFlag bool
1008-
if v, ok := d.GetOkExists("force_replace_placement_group_id"); ok {
1009-
PgiFlag = v.(bool)
1010-
}
1011-
1012-
_ = d.Set("force_replace_placement_group_id", PgiFlag)
1013-
10141047
if *instance.InstanceChargeType == CVM_CHARGE_TYPE_CDHPAID {
10151048
_ = d.Set("cdh_instance_type", instance.InstanceType)
10161049
}
@@ -2065,22 +2098,18 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
20652098
}
20662099
}
20672100

2068-
if d.HasChange("force_replace_placement_group_id") {
2069-
var PgiFlag bool
2070-
if v, ok := d.GetOkExists("force_replace_placement_group_id"); ok {
2071-
PgiFlag = v.(bool)
2072-
}
2073-
2074-
_ = d.Set("force_replace_placement_group_id", PgiFlag)
2075-
}
2076-
2077-
if d.HasChange("placement_group_id") {
2078-
_, newPGI := d.GetChange("placement_group_id")
2101+
if d.HasChange("placement_group_id") || d.HasChange("force_replace_placement_group_id") {
2102+
oldPGI, newPGI := d.GetChange("placement_group_id")
2103+
oldPGIStr := oldPGI.(string)
20792104
newPGIStr := newPGI.(string)
20802105
if newPGIStr == "" {
20812106
// wait cvm support delete DisasterRecoverGroupId
20822107
return fmt.Errorf("Deleting `placement_group_id` is not currently supported.")
20832108
} else {
2109+
if oldPGIStr == newPGIStr {
2110+
return fmt.Errorf("It is not possible to change only `force_replace_placement_group_id`, it needs to be modified together with `placement_group_id`.")
2111+
}
2112+
20842113
request := cvm.NewModifyInstancesDisasterRecoverGroupRequest()
20852114
if v, ok := d.GetOkExists("force_replace_placement_group_id"); ok {
20862115
request.Force = helper.Bool(v.(bool))
@@ -2102,6 +2131,33 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
21022131
if err != nil {
21032132
return err
21042133
}
2134+
2135+
// wait
2136+
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
2137+
instance, errRet := cvmService.DescribeInstanceById(ctx, instanceId)
2138+
if errRet != nil {
2139+
return tccommon.RetryError(errRet, tccommon.InternalError)
2140+
}
2141+
2142+
if instance != nil && *instance.InstanceState == CVM_STATUS_LAUNCH_FAILED {
2143+
//LatestOperationCodeMode
2144+
if instance.LatestOperationErrorMsg != nil {
2145+
return resource.NonRetryableError(fmt.Errorf("cvm instance %s launch failed. Error msg: %s.\n", *instance.InstanceId, *instance.LatestOperationErrorMsg))
2146+
}
2147+
2148+
return resource.NonRetryableError(fmt.Errorf("cvm instance %s launch failed, this resource will not be stored to tfstate and will auto removed\n.", *instance.InstanceId))
2149+
}
2150+
2151+
if instance != nil && *instance.InstanceState == CVM_STATUS_RUNNING {
2152+
return nil
2153+
}
2154+
2155+
return resource.RetryableError(fmt.Errorf("cvm instance status is %s, retry...", *instance.InstanceState))
2156+
})
2157+
2158+
if err != nil {
2159+
return err
2160+
}
21052161
}
21062162
}
21072163

0 commit comments

Comments
 (0)