Skip to content

Commit e4ec76f

Browse files
authored
Merge pull request #516 from oliverpei/master
Fix cvm key_name update error
2 parents 2988cdf + a335c56 commit e4ec76f

5 files changed

+83
-7
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
## 1.42.2 (Unreleased)
2+
3+
BUG FIXES:
4+
* Resource: `tencentcloud_instance` fix `key_name` update error([#515](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/issues/515)).
5+
26
## 1.42.1 (September 10, 2020)
37

48
BUG FIXES:

tencentcloud/resource_tc_instance.go

+47
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,8 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
716716
}
717717
if len(instance.LoginSettings.KeyIds) > 0 {
718718
_ = d.Set("key_name", instance.LoginSettings.KeyIds[0])
719+
} else {
720+
_ = d.Set("key_name", "")
719721
}
720722
if *instance.InstanceState == CVM_STATUS_STOPPED {
721723
_ = d.Set("running_flag", false)
@@ -908,6 +910,51 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
908910
}
909911
}
910912

913+
if d.HasChange("key_name") {
914+
old, new := d.GetChange("key_name")
915+
oldKeyId := old.(string)
916+
keyId := new.(string)
917+
err := cvmService.UnbindKeyPair(ctx, oldKeyId, []*string{&instanceId})
918+
if err != nil {
919+
return err
920+
}
921+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
922+
instance, errRet := cvmService.DescribeInstanceById(ctx, instanceId)
923+
if errRet != nil {
924+
return retryError(errRet, InternalError)
925+
}
926+
if instance != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING {
927+
return resource.RetryableError(fmt.Errorf("cvm instance latest operetion status is %s, retry...", *instance.LatestOperationState))
928+
}
929+
return nil
930+
})
931+
if err != nil {
932+
return err
933+
}
934+
935+
if keyId != "" {
936+
err = cvmService.BindKeyPair(ctx, keyId, instanceId)
937+
if err != nil {
938+
return err
939+
}
940+
time.Sleep(10 * time.Second)
941+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
942+
instance, errRet := cvmService.DescribeInstanceById(ctx, instanceId)
943+
if errRet != nil {
944+
return retryError(errRet, InternalError)
945+
}
946+
if instance != nil && *instance.LatestOperationState == CVM_LATEST_OPERATION_STATE_OPERATING {
947+
return resource.RetryableError(fmt.Errorf("cvm instance latest operetion status is %s, retry...", *instance.LatestOperationState))
948+
}
949+
return nil
950+
})
951+
if err != nil {
952+
return err
953+
}
954+
}
955+
d.SetPartial("key_name")
956+
}
957+
911958
if d.HasChange("vpc_id") || d.HasChange("subnet_id") || d.HasChange("private_ip") {
912959
vpcId := d.Get("vpc_id").(string)
913960
subnetId := d.Get("subnet_id").(string)

tencentcloud/resource_tc_instance_test.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func TestAccTencentCloudInstanceWithKeyPair(t *testing.T) {
186186
CheckDestroy: testAccCheckInstanceDestroy,
187187
Steps: []resource.TestStep{
188188
{
189-
Config: testAccTencentCloudInstanceWithKeyPair("tf_acc_test_key1"),
189+
Config: testAccTencentCloudInstanceWithKeyPair("key_pair_0"),
190190
Check: resource.ComposeTestCheckFunc(
191191
testAccCheckTencentCloudDataSourceID(id),
192192
testAccCheckTencentCloudInstanceExists(id),
@@ -195,7 +195,7 @@ func TestAccTencentCloudInstanceWithKeyPair(t *testing.T) {
195195
),
196196
},
197197
{
198-
Config: testAccTencentCloudInstanceWithKeyPair("tf_acc_test_key2"),
198+
Config: testAccTencentCloudInstanceWithKeyPair("key_pair_1"),
199199
Check: resource.ComposeTestCheckFunc(
200200
testAccCheckTencentCloudDataSourceID(id),
201201
testAccCheckTencentCloudInstanceExists(id),
@@ -614,17 +614,22 @@ resource "tencentcloud_instance" "foo" {
614614
func testAccTencentCloudInstanceWithKeyPair(keyName string) string {
615615
return fmt.Sprintf(
616616
defaultInstanceVariable+`
617-
resource "tencentcloud_key_pair" "foo" {
618-
key_name = "%s"
617+
resource "tencentcloud_key_pair" "key_pair_0" {
618+
key_name = "key_pair_0"
619619
public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDjd8fTnp7Dcuj4mLaQxf9Zs/ORgUL9fQxRCNKkPgP1paTy1I513maMX126i36Lxxl3+FUB52oVbo/FgwlIfX8hyCnv8MCxqnuSDozf1CD0/wRYHcTWAtgHQHBPCC2nJtod6cVC3kB18KeV4U7zsxmwFeBIxojMOOmcOBuh7+trRw=="
620620
}
621621
622+
resource "tencentcloud_key_pair" "key_pair_1" {
623+
key_name = "key_pair_1"
624+
public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzwYE6KI8uULEvSNA2k1tlsLtMDe+x1Saw6yL3V1mk9NFws0K2BshYqsnP/BlYiGZv/Nld5xmGoA9LupOcUpyyGGSHZdBrMx1Dz9ajewe7kGowRWwwMAHTlzh9+iqeg/v6P5vW6EwK4hpGWgv06vGs3a8CzfbHu1YRbZAO/ysp3ymdL+vGvw/vzC0T+YwPMisn9wFD5FTlJ+Em6s9PzxqR/41t4YssmCwUV78ZoYL8CyB0emuB8wALvcXbdUVxMxpBEHd5U6ZP5+HPxU2WFbWqiFCuErLIZRuxFw8L/Ot+JOyNnadN1XU4crYDX5cML1i/ExXKVIDoBaLtgAJOpyeP"
625+
}
626+
622627
resource "tencentcloud_instance" "foo" {
623628
instance_name = var.instance_name
624629
availability_zone = data.tencentcloud_availability_zones.default.zones.0.name
625630
image_id = data.tencentcloud_images.default.images.0.image_id
626631
instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type
627-
key_name = tencentcloud_key_pair.foo.id
632+
key_name = tencentcloud_key_pair.%s.id
628633
system_disk_type = "CLOUD_PREMIUM"
629634
}
630635
`,

tencentcloud/resource_tc_redis_instance.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -538,14 +538,15 @@ func resourceTencentCloudRedisInstanceUpdate(d *schema.ResourceData, meta interf
538538
if newMemSize < 1 {
539539
return fmt.Errorf("redis mem_size value cannot be set to less than 1")
540540
}
541-
redisId, err := redisService.UpgradeInstance(ctx, id, int64(newMemSize))
541+
_, err := redisService.UpgradeInstance(ctx, id, int64(newMemSize))
542542

543543
if err != nil {
544544
log.Printf("[CRITAL]%s redis update mem size error, reason:%s\n", logId, err.Error())
545+
return err
545546
}
546547

547548
err = resource.Retry(4*readRetryTimeout, func() *resource.RetryError {
548-
_, _, info, err := redisService.CheckRedisOnlineOk(ctx, redisId)
549+
_, _, info, err := redisService.CheckRedisOnlineOk(ctx, id)
549550

550551
if info != nil {
551552
status := REDIS_STATUS[*info.Status]

tencentcloud/service_tencentcloud_cvm.go

+19
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ func (me *CvmService) UnbindKeyPair(ctx context.Context, keyId string, instanceI
476476
request := cvm.NewDisassociateInstancesKeyPairsRequest()
477477
request.KeyIds = []*string{&keyId}
478478
request.InstanceIds = instanceIds
479+
request.ForceStop = helper.Bool(true)
479480

480481
ratelimit.Check(request.GetAction())
481482
response, err := me.client.UseCvmClient().DisassociateInstancesKeyPairs(request)
@@ -490,6 +491,24 @@ func (me *CvmService) UnbindKeyPair(ctx context.Context, keyId string, instanceI
490491
return nil
491492
}
492493

494+
func (me *CvmService) BindKeyPair(ctx context.Context, keyId, instanceId string) error {
495+
logId := getLogId(ctx)
496+
request := cvm.NewAssociateInstancesKeyPairsRequest()
497+
request.KeyIds = []*string{&keyId}
498+
request.InstanceIds = []*string{&instanceId}
499+
request.ForceStop = helper.Bool(true)
500+
501+
ratelimit.Check(request.GetAction())
502+
_, err := me.client.UseCvmClient().AssociateInstancesKeyPairs(request)
503+
if err != nil {
504+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
505+
logId, request.GetAction(), request.ToJsonString(), err.Error())
506+
return err
507+
}
508+
509+
return nil
510+
}
511+
493512
func (me *CvmService) CreatePlacementGroup(ctx context.Context, placementName, placementType string) (placementId string, errRet error) {
494513
logId := getLogId(ctx)
495514
request := cvm.NewCreateDisasterRecoverGroupRequest()

0 commit comments

Comments
 (0)