Skip to content

Commit

Permalink
resource/alicloud_kvstore_instance: add asynchronous query for functi…
Browse files Browse the repository at this point in the history
…on delete
  • Loading branch information
shanye997 committed Apr 9, 2024
1 parent 35a7369 commit ad47380
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 24 deletions.
56 changes: 32 additions & 24 deletions alicloud/resource_alicloud_kvstore_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func resourceAliCloudKvstoreInstance() *schema.Resource {
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(20 * time.Minute),
Update: schema.DefaultTimeout(40 * time.Minute),
Delete: schema.DefaultTimeout(20 * time.Minute),
},
Schema: map[string]*schema.Schema{
"auto_renew": {
Expand Down Expand Up @@ -886,30 +887,6 @@ func resourceAliCloudKvstoreInstanceUpdate(d *schema.ResourceData, meta interfac
d.SetPartial("maintain_end_time")
d.SetPartial("maintain_start_time")
}
update = false
modifyInstanceMajorVersionReq := r_kvstore.CreateModifyInstanceMajorVersionRequest()
modifyInstanceMajorVersionReq.InstanceId = d.Id()
if !d.IsNewResource() && d.HasChange("engine_version") {
update = true
}
modifyInstanceMajorVersionReq.MajorVersion = d.Get("engine_version").(string)
if v, ok := d.GetOk("effective_time"); ok {
modifyInstanceMajorVersionReq.EffectiveTime = v.(string)
}
if update {
raw, err := client.WithRKvstoreClient(func(r_kvstoreClient *r_kvstore.Client) (interface{}, error) {
return r_kvstoreClient.ModifyInstanceMajorVersion(modifyInstanceMajorVersionReq)
})
addDebug(modifyInstanceMajorVersionReq.GetActionName(), raw)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), modifyInstanceMajorVersionReq.GetActionName(), AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 300*time.Second, r_kvstoreService.KvstoreInstanceStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("engine_version")
}
if d.HasChange("ssl_enable") {
request := r_kvstore.CreateModifyInstanceSSLRequest()
request.InstanceId = d.Id()
Expand Down Expand Up @@ -1217,6 +1194,31 @@ func resourceAliCloudKvstoreInstanceUpdate(d *schema.ResourceData, meta interfac
d.SetPartial("engine_version")
d.SetPartial("instance_class")
}
update = false
modifyInstanceMajorVersionReq := r_kvstore.CreateModifyInstanceMajorVersionRequest()
modifyInstanceMajorVersionReq.InstanceId = d.Id()
if !d.IsNewResource() && d.HasChange("engine_version") && !d.HasChange("instance_class") {
update = true
}

modifyInstanceMajorVersionReq.MajorVersion = d.Get("engine_version").(string)
if v, ok := d.GetOk("effective_time"); ok {
modifyInstanceMajorVersionReq.EffectiveTime = v.(string)
}
if update {
raw, err := client.WithRKvstoreClient(func(r_kvstoreClient *r_kvstore.Client) (interface{}, error) {
return r_kvstoreClient.ModifyInstanceMajorVersion(modifyInstanceMajorVersionReq)
})
addDebug(modifyInstanceMajorVersionReq.GetActionName(), raw)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), modifyInstanceMajorVersionReq.GetActionName(), AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 300*time.Second, r_kvstoreService.KvstoreInstanceStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("engine_version")
}
if d.HasChange("parameters") {
request := r_kvstore.CreateModifyInstanceConfigRequest()
request.InstanceId = d.Id()
Expand Down Expand Up @@ -1483,6 +1485,12 @@ func resourceAliCloudKvstoreInstanceDelete(d *schema.ResourceData, meta interfac
}
return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR)
}

stateConf := BuildStateConf([]string{}, []string{"Released"}, d.Timeout(schema.TimeoutDelete), 60*time.Second, r_kvstoreService.KvstoreInstanceDeletedStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}

return nil
}

Expand Down
15 changes: 15 additions & 0 deletions alicloud/resource_alicloud_kvstore_instance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,18 @@ func TestAccAliCloudKVStoreRedisInstance_vpctest(t *testing.T) {
}),
),
},
{
Config: testAccConfig(map[string]interface{}{
"instance_class": "redis.master.large.default",
"engine_version": "5.0",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"instance_class": "redis.master.large.default",
"engine_version": "5.0",
}),
),
},
{
Config: testAccConfig(map[string]interface{}{
"zone_id": "${data.alicloud_kvstore_zones.default.zones[length(data.alicloud_kvstore_zones.default.ids) - 2].id}",
Expand Down Expand Up @@ -2391,6 +2403,7 @@ func KvstoreInstanceVpcTestdependence(name string) string {
}
data "alicloud_vpcs" "default" {
name_regex = "^default-NODELETING$"
cidr_block = "192.168.0.0/16"
}
data "alicloud_vswitches" "default" {
zone_id = data.alicloud_kvstore_zones.default.zones[length(data.alicloud_kvstore_zones.default.ids) - 1].id
Expand Down Expand Up @@ -2419,6 +2432,7 @@ func KvstoreInstancePrePaidDependence(name string) string {
}
data "alicloud_vpcs" "default" {
name_regex = "^default-NODELETING$"
cidr_block = "192.168.0.0/16"
}
data "alicloud_vswitches" "default" {
zone_id = data.alicloud_kvstore_zones.default.zones[0].id
Expand All @@ -2443,6 +2457,7 @@ func KvstoreMemcacheInstanceVpcTestdependence(name string) string {
}
data "alicloud_vpcs" "default" {
name_regex = "^default-NODELETING$"
cidr_block = "192.168.0.0/16"
}
data "alicloud_vswitches" "default" {
zone_id = data.alicloud_kvstore_zones.default.zones[length(data.alicloud_kvstore_zones.default.ids) - 1].id
Expand Down
65 changes: 65 additions & 0 deletions alicloud/service_alicloud_r_kvstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,71 @@ func (s *R_kvstoreService) KvstoreInstanceAttributeRefreshFunc(id, attribute str
}
}

func (s *R_kvstoreService) DescribeKvstoreInstanceDeleted(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
conn, err := s.client.NewRedisaClient()
if err != nil {
return nil, WrapError(err)
}
action := "DescribeInstances"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"InstanceIds": id,
"Expired": true,
}
runtime := util.RuntimeOptions{}
runtime.SetAutoretry(true)
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2015-01-01"), StringPointer("AK"), nil, request, &runtime)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
if IsExpectedErrors(err, []string{"InvalidInstanceId.NotFound"}) {
err = WrapErrorf(Error(GetNotFoundMessage("KvstoreInstance", id)), NotFoundMsg, ProviderERROR)
return object, err
}
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return object, err
}
v, err := jsonpath.Get("$.Instances.KVStoreInstance", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Instances", response)
}
if v == nil || len(v.([]interface{})) < 1 || fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["InstanceId"]) != id {
return object, WrapErrorf(Error(GetNotFoundMessage("Redis", id)), NotFoundWithResponse, response)
}
return v.([]interface{})[0].(map[string]interface{}), nil
}

func (s *R_kvstoreService) KvstoreInstanceDeletedStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeKvstoreInstanceDeleted(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}

for _, failState := range failStates {
if object["InstanceStatus"] == failState {
return object, fmt.Sprint(object["InstanceStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["InstanceStatus"])))
}
}
return object, fmt.Sprint(object["InstanceStatus"]), nil
}
}

func (s *R_kvstoreService) DescribeKvstoreConnection(id string) (object []r_kvstore.InstanceNetInfo, err error) {
request := r_kvstore.CreateDescribeDBInstanceNetInfoRequest()
request.RegionId = s.client.RegionId
Expand Down

0 comments on commit ad47380

Please sign in to comment.