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