@@ -48,6 +48,12 @@ func ResourceTencentCloudInstance() *schema.Resource {
48
48
ForceNew : true ,
49
49
Description : "The available zone for the CVM instance." ,
50
50
},
51
+ "dedicated_cluster_id" : {
52
+ Type : schema .TypeString ,
53
+ Optional : true ,
54
+ ForceNew : true ,
55
+ Description : "Exclusive cluster id." ,
56
+ },
51
57
"instance_count" : {
52
58
Type : schema .TypeInt ,
53
59
Optional : true ,
@@ -435,33 +441,44 @@ func ResourceTencentCloudInstance() *schema.Resource {
435
441
436
442
func resourceTencentCloudInstanceCreate (d * schema.ResourceData , meta interface {}) error {
437
443
defer tccommon .LogElapsed ("resource.tencentcloud_instance.create" )()
438
- logId := tccommon .GetLogId (tccommon .ContextNil )
439
- ctx := context .WithValue (context .TODO (), tccommon .LogIdKey , logId )
440
- cvmService := CvmService {
441
- client : meta .(tccommon.ProviderMeta ).GetAPIV3Conn (),
442
- }
444
+
445
+ var (
446
+ logId = tccommon .GetLogId (tccommon .ContextNil )
447
+ ctx = context .WithValue (context .TODO (), tccommon .LogIdKey , logId )
448
+ cvmService = CvmService {client : meta .(tccommon.ProviderMeta ).GetAPIV3Conn ()}
449
+ )
443
450
444
451
request := cvm .NewRunInstancesRequest ()
445
452
request .ImageId = helper .String (d .Get ("image_id" ).(string ))
446
453
request .Placement = & cvm.Placement {
447
454
Zone : helper .String (d .Get ("availability_zone" ).(string )),
448
455
}
456
+
457
+ if v , ok := d .GetOk ("dedicated_cluster_id" ); ok {
458
+ request .DedicatedClusterId = helper .String (v .(string ))
459
+ }
460
+
449
461
if v , ok := d .GetOk ("project_id" ); ok {
450
462
projectId := int64 (v .(int ))
451
463
request .Placement .ProjectId = & projectId
452
464
}
465
+
453
466
if v , ok := d .GetOk ("instance_name" ); ok {
454
467
request .InstanceName = helper .String (v .(string ))
455
468
}
469
+
456
470
if v , ok := d .GetOk ("instance_count" ); ok {
457
471
request .InstanceCount = helper .Int64 (int64 (v .(int )))
458
472
}
473
+
459
474
if v , ok := d .GetOk ("instance_type" ); ok {
460
475
request .InstanceType = helper .String (v .(string ))
461
476
}
477
+
462
478
if v , ok := d .GetOk ("hostname" ); ok {
463
479
request .HostName = helper .String (v .(string ))
464
480
}
481
+
465
482
if v , ok := d .GetOk ("cam_role_name" ); ok {
466
483
request .CamRoleName = helper .String (v .(string ))
467
484
}
@@ -475,10 +492,12 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
475
492
periodInt64 := int64 (period .(int ))
476
493
request .InstanceChargePrepaid .Period = & periodInt64
477
494
}
495
+
478
496
if renewFlag , ok := d .GetOk ("instance_charge_type_prepaid_renew_flag" ); ok {
479
497
request .InstanceChargePrepaid .RenewFlag = helper .String (renewFlag .(string ))
480
498
}
481
499
}
500
+
482
501
if instanceChargeType == CVM_CHARGE_TYPE_SPOTPAID {
483
502
spotInstanceType , sitOk := d .GetOk ("spot_instance_type" )
484
503
spotMaxPrice , smpOk := d .GetOk ("spot_max_price" )
@@ -487,26 +506,31 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
487
506
request .InstanceMarketOptions .MarketType = helper .String (CVM_MARKET_TYPE_SPOT )
488
507
request .InstanceMarketOptions .SpotOptions = & cvm.SpotMarketOptions {}
489
508
}
509
+
490
510
if sitOk {
491
511
request .InstanceMarketOptions .SpotOptions .SpotInstanceType = helper .String (strings .ToLower (spotInstanceType .(string )))
492
512
}
513
+
493
514
if smpOk {
494
515
request .InstanceMarketOptions .SpotOptions .MaxPrice = helper .String (spotMaxPrice .(string ))
495
516
}
496
517
}
518
+
497
519
if instanceChargeType == CVM_CHARGE_TYPE_CDHPAID {
498
520
if v , ok := d .GetOk ("cdh_instance_type" ); ok {
499
521
request .InstanceType = helper .String (v .(string ))
500
522
} else {
501
523
return fmt .Errorf ("cdh_instance_type can not be empty when instance_charge_type is %s" , instanceChargeType )
502
524
}
525
+
503
526
if v , ok := d .GetOk ("cdh_host_id" ); ok {
504
527
request .Placement .HostIds = append (request .Placement .HostIds , helper .String (v .(string )))
505
528
} else {
506
529
return fmt .Errorf ("cdh_host_id can not be empty when instance_charge_type is %s" , instanceChargeType )
507
530
}
508
531
}
509
532
}
533
+
510
534
if v , ok := d .GetOk ("placement_group_id" ); ok {
511
535
request .DisasterRecoverGroupIds = []* string {helper .String (v .(string ))}
512
536
}
@@ -516,13 +540,16 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
516
540
if v , ok := d .GetOk ("internet_charge_type" ); ok {
517
541
request .InternetAccessible .InternetChargeType = helper .String (v .(string ))
518
542
}
543
+
519
544
if v , ok := d .GetOk ("internet_max_bandwidth_out" ); ok {
520
545
maxBandwidthOut := int64 (v .(int ))
521
546
request .InternetAccessible .InternetMaxBandwidthOut = & maxBandwidthOut
522
547
}
548
+
523
549
if v , ok := d .GetOk ("bandwidth_package_id" ); ok {
524
550
request .InternetAccessible .BandwidthPackageId = helper .String (v .(string ))
525
551
}
552
+
526
553
if v , ok := d .GetOkExists ("allocate_public_ip" ); ok {
527
554
allocatePublicIp := v .(bool )
528
555
request .InternetAccessible .PublicIpAssigned = & allocatePublicIp
@@ -563,13 +590,16 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
563
590
if v , ok := d .GetOk ("system_disk_type" ); ok {
564
591
request .SystemDisk .DiskType = helper .String (v .(string ))
565
592
}
593
+
566
594
if v , ok := d .GetOk ("system_disk_size" ); ok {
567
595
diskSize := int64 (v .(int ))
568
596
request .SystemDisk .DiskSize = & diskSize
569
597
}
598
+
570
599
if v , ok := d .GetOk ("system_disk_id" ); ok {
571
600
request .SystemDisk .DiskId = helper .String (v .(string ))
572
601
}
602
+
573
603
if v , ok := d .GetOk ("data_disks" ); ok {
574
604
dataDisks := v .([]interface {})
575
605
request .DataDisks = make ([]* cvm.DataDisk , 0 , len (dataDisks ))
@@ -583,15 +613,18 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
583
613
DiskSize : & diskSize ,
584
614
ThroughputPerformance : & throughputPerformance ,
585
615
}
616
+
586
617
if v , ok := value ["data_disk_snapshot_id" ]; ok && v != nil {
587
618
snapshotId := v .(string )
588
619
if snapshotId != "" {
589
620
dataDisk .SnapshotId = helper .String (snapshotId )
590
621
}
591
622
}
623
+
592
624
if value ["data_disk_id" ] != "" {
593
625
dataDisk .DiskId = helper .String (value ["data_disk_id" ].(string ))
594
626
}
627
+
595
628
if deleteWithInstance , ok := value ["delete_with_instance" ]; ok {
596
629
deleteWithInstanceBool := deleteWithInstance .(bool )
597
630
dataDisk .DeleteWithInstance = & deleteWithInstanceBool
@@ -601,6 +634,7 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
601
634
encryptBool := encrypt .(bool )
602
635
dataDisk .Encrypt = & encryptBool
603
636
}
637
+
604
638
request .DataDisks = append (request .DataDisks , & dataDisk )
605
639
}
606
640
}
@@ -613,6 +647,7 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
613
647
Enabled : & securityService ,
614
648
}
615
649
}
650
+
616
651
if v , ok := d .GetOkExists ("disable_monitor_service" ); ok {
617
652
monitorService := ! (v .(bool ))
618
653
request .EnhancedService .MonitorService = & cvm.RunMonitorServiceEnabled {
@@ -628,9 +663,11 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
628
663
} else if v , ok := d .GetOk ("key_name" ); ok {
629
664
request .LoginSettings .KeyIds = []* string {helper .String (v .(string ))}
630
665
}
666
+
631
667
if v , ok := d .GetOk ("password" ); ok {
632
668
request .LoginSettings .Password = helper .String (v .(string ))
633
669
}
670
+
634
671
v := d .Get ("keep_image_login" ).(bool )
635
672
if v {
636
673
request .LoginSettings .KeepImageLogin = helper .String (CVM_IMAGE_LOGIN )
@@ -641,6 +678,7 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
641
678
if v , ok := d .GetOk ("user_data" ); ok {
642
679
request .UserData = helper .String (v .(string ))
643
680
}
681
+
644
682
if v , ok := d .GetOk ("user_data_raw" ); ok {
645
683
userData := base64 .StdEncoding .EncodeToString ([]byte (v .(string )))
646
684
request .UserData = & userData
@@ -657,17 +695,19 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
657
695
Key : helper .String (tagKey ),
658
696
Value : helper .String (tagValue ),
659
697
}
698
+
660
699
tags = append (tags , & tag )
661
700
}
701
+
662
702
tagSpecification := cvm.TagSpecification {
663
703
ResourceType : helper .String ("instance" ),
664
704
Tags : tags ,
665
705
}
706
+
666
707
request .TagSpecification = append (request .TagSpecification , & tagSpecification )
667
708
}
668
709
669
710
instanceId := ""
670
-
671
711
err := resource .Retry (tccommon .WriteRetryTimeout , func () * resource.RetryError {
672
712
ratelimit .Check ("create" )
673
713
response , err := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseCvmClient ().RunInstances (request )
@@ -678,38 +718,46 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
678
718
if ok && tccommon .IsContains (CVM_RETRYABLE_ERROR , e .Code ) {
679
719
return resource .RetryableError (fmt .Errorf ("cvm create error: %s, retrying" , e .Error ()))
680
720
}
721
+
681
722
return resource .NonRetryableError (err )
682
723
}
724
+
683
725
log .Printf ("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n " ,
684
726
logId , request .GetAction (), request .ToJsonString (), response .ToJsonString ())
685
727
if len (response .Response .InstanceIdSet ) < 1 {
686
728
err = fmt .Errorf ("instance id is nil" )
687
729
return resource .NonRetryableError (err )
688
730
}
689
- instanceId = * response .Response .InstanceIdSet [0 ]
690
731
732
+ instanceId = * response .Response .InstanceIdSet [0 ]
691
733
return nil
692
734
})
735
+
693
736
if err != nil {
694
737
return err
695
738
}
739
+
696
740
d .SetId (instanceId )
697
741
698
742
err = resource .Retry (d .Timeout (schema .TimeoutCreate ), func () * resource.RetryError {
699
743
instance , errRet := cvmService .DescribeInstanceById (ctx , instanceId )
700
744
if errRet != nil {
701
745
return tccommon .RetryError (errRet , tccommon .InternalError )
702
746
}
747
+
703
748
if instance != nil && * instance .InstanceState == CVM_STATUS_LAUNCH_FAILED {
704
749
//LatestOperationCodeMode
705
750
if instance .LatestOperationErrorMsg != nil {
706
751
return resource .NonRetryableError (fmt .Errorf ("cvm instance %s launch failed. Error msg: %s.\n " , * instance .InstanceId , * instance .LatestOperationErrorMsg ))
707
752
}
753
+
708
754
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 ))
709
755
}
756
+
710
757
if instance != nil && * instance .InstanceState == CVM_STATUS_RUNNING {
711
758
return nil
712
759
}
760
+
713
761
return resource .RetryableError (fmt .Errorf ("cvm instance status is %s, retry..." , * instance .InstanceState ))
714
762
})
715
763
@@ -726,13 +774,16 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
726
774
if e != nil {
727
775
return resource .RetryableError (e )
728
776
}
777
+
729
778
for tagKey , tagValue := range tags {
730
779
if v , ok := actualTags [tagKey ]; ! ok || v != tagValue {
731
780
return resource .RetryableError (fmt .Errorf ("tag(%s, %s) modification is not completed" , tagKey , tagValue ))
732
781
}
733
782
}
783
+
734
784
return nil
735
785
})
786
+
736
787
if err != nil {
737
788
return err
738
789
}
@@ -750,11 +801,14 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
750
801
if errRet != nil {
751
802
return tccommon .RetryError (errRet , tccommon .InternalError )
752
803
}
804
+
753
805
if instance != nil && * instance .InstanceState == CVM_STATUS_STOPPED {
754
806
return nil
755
807
}
808
+
756
809
return resource .RetryableError (fmt .Errorf ("cvm instance status is %s, retry..." , * instance .InstanceState ))
757
810
})
811
+
758
812
if err != nil {
759
813
return err
760
814
}
0 commit comments