@@ -435,6 +435,7 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
435435 if v , ok := d .GetOk ("hostname" ); ok {
436436 request .HostName = helper .String (v .(string ))
437437 }
438+
438439 if v , ok := d .GetOk ("instance_charge_type" ); ok {
439440 instanceChargeType := v .(string )
440441 request .InstanceChargeType = & instanceChargeType
@@ -617,13 +618,27 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
617618 d .SetId (instanceId )
618619
619620 // wait for status
621+ //get system disk ID and data disk ID
622+ var systemDiskId string
623+ var dataDiskIds []string
620624 err = resource .Retry (5 * readRetryTimeout , func () * resource.RetryError {
621625 instance , errRet := cvmService .DescribeInstanceById (ctx , instanceId )
622626 if errRet != nil {
623627 return retryError (errRet , InternalError )
624628 }
625629 if instance != nil && (* instance .InstanceState == CVM_STATUS_RUNNING ||
626630 * instance .InstanceState == CVM_STATUS_LAUNCH_FAILED ) {
631+ //get system disk ID
632+ if instance .SystemDisk != nil && instance .SystemDisk .DiskId != nil {
633+ systemDiskId = * instance .SystemDisk .DiskId
634+ }
635+ if instance .DataDisks != nil {
636+ for _ , dataDisk := range instance .DataDisks {
637+ if dataDisk != nil && dataDisk .DiskId != nil {
638+ dataDiskIds = append (dataDiskIds , * dataDisk .DiskId )
639+ }
640+ }
641+ }
627642 return nil
628643 }
629644 return resource .RetryableError (fmt .Errorf ("cvm instance status is %s, retry..." , * instance .InstanceState ))
@@ -642,6 +657,27 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
642657 // If tags attachment failed, the user will be notified, then plan/apply/update with terraform.
643658 return err
644659 }
660+
661+ //except instance ,system disk and data disk will be tagged
662+ //keep logical consistence with the console
663+ //tag system disk
664+ if systemDiskId != "" {
665+ resourceName = BuildTagResourceName ("cvm" , "volume" , tcClient .Region , systemDiskId )
666+ if err := tagService .ModifyTags (ctx , resourceName , tags , nil ); err != nil {
667+ // If tags attachment failed, the user will be notified, then plan/apply/update with terraform.
668+ return err
669+ }
670+ }
671+ //tag disk ids
672+ for _ , diskId := range dataDiskIds {
673+ if diskId != "" {
674+ resourceName = BuildTagResourceName ("cvm" , "volume" , tcClient .Region , diskId )
675+ if err := tagService .ModifyTags (ctx , resourceName , tags , nil ); err != nil {
676+ // If tags attachment failed, the user will be notified, then plan/apply/update with terraform.
677+ return err
678+ }
679+ }
680+ }
645681 }
646682
647683 if ! (d .Get ("running_flag" ).(bool )) {
@@ -1014,9 +1050,11 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
10141050 old , new := d .GetChange ("key_name" )
10151051 oldKeyId := old .(string )
10161052 keyId := new .(string )
1017- err := cvmService .UnbindKeyPair (ctx , oldKeyId , []* string {& instanceId })
1018- if err != nil {
1019- return err
1053+ if oldKeyId != "" {
1054+ err := cvmService .UnbindKeyPair (ctx , oldKeyId , []* string {& instanceId })
1055+ if err != nil {
1056+ return err
1057+ }
10201058 }
10211059 err = resource .Retry (2 * readRetryTimeout , func () * resource.RetryError {
10221060 instance , errRet := cvmService .DescribeInstanceById (ctx , instanceId )
@@ -1086,6 +1124,28 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
10861124 if err != nil {
10871125 return err
10881126 }
1127+ //except instance ,system disk and data disk will be tagged
1128+ //keep logical consistence with the console
1129+ //tag system disk
1130+ if systemDiskId , ok := d .GetOk ("system_disk_id" ); ok {
1131+ if systemDiskId .(string ) != "" {
1132+ resourceName = BuildTagResourceName ("cvm" , "volume" , region , systemDiskId .(string ))
1133+ if err := tagService .ModifyTags (ctx , resourceName , replaceTags , deleteTags ); err != nil {
1134+ return err
1135+ }
1136+ }
1137+ }
1138+ //tag disk ids
1139+ if dataDisks , ok := d .GetOk ("date_disk" ); ok {
1140+ dataDiskList := dataDisks .([]map [string ]interface {})
1141+ for _ , disk := range dataDiskList {
1142+ dataDiskId := disk ["data_disk_id" ].(string )
1143+ resourceName = BuildTagResourceName ("cvm" , "volume" , region , dataDiskId )
1144+ if err := tagService .ModifyTags (ctx , resourceName , replaceTags , deleteTags ); err != nil {
1145+ return err
1146+ }
1147+ }
1148+ }
10891149 d .SetPartial ("tags" )
10901150 }
10911151
0 commit comments