@@ -113,7 +113,6 @@ func ResourceTencentCloudInstance() *schema.Resource {
113
113
"force_replace_placement_group_id" : {
114
114
Type : schema .TypeBool ,
115
115
Optional : true ,
116
- Computed : true ,
117
116
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." ,
118
117
},
119
118
// payment
@@ -581,17 +580,6 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
581
580
}
582
581
}
583
582
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
-
595
583
// network
596
584
request .InternetAccessible = & cvm.InternetAccessible {}
597
585
if v , ok := d .GetOk ("internet_charge_type" ); ok {
@@ -847,6 +835,58 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
847
835
return err
848
836
}
849
837
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
+
850
890
// Wait for the tags attached to the vm since tags attachment it's async while vm creation.
851
891
if tags := helper .GetTags (d , "tags" ); len (tags ) > 0 {
852
892
tcClient := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ()
@@ -1004,13 +1044,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1004
1044
_ = d .Set ("placement_group_id" , instance .DisasterRecoverGroupId )
1005
1045
}
1006
1046
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
-
1014
1047
if * instance .InstanceChargeType == CVM_CHARGE_TYPE_CDHPAID {
1015
1048
_ = d .Set ("cdh_instance_type" , instance .InstanceType )
1016
1049
}
@@ -2065,22 +2098,18 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
2065
2098
}
2066
2099
}
2067
2100
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 )
2079
2104
newPGIStr := newPGI .(string )
2080
2105
if newPGIStr == "" {
2081
2106
// wait cvm support delete DisasterRecoverGroupId
2082
2107
return fmt .Errorf ("Deleting `placement_group_id` is not currently supported." )
2083
2108
} 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
+
2084
2113
request := cvm .NewModifyInstancesDisasterRecoverGroupRequest ()
2085
2114
if v , ok := d .GetOkExists ("force_replace_placement_group_id" ); ok {
2086
2115
request .Force = helper .Bool (v .(bool ))
@@ -2102,6 +2131,33 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
2102
2131
if err != nil {
2103
2132
return err
2104
2133
}
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
+ }
2105
2161
}
2106
2162
}
2107
2163
0 commit comments