Skip to content

Commit

Permalink
resource/alicloud_gpdb_instance: Added retry strategy for error code …
Browse files Browse the repository at this point in the history
…OperationDenied.OrderProcessing; Fixed the create error caused by state refresh
  • Loading branch information
MrWolong authored and ChenHanZhang committed Feb 28, 2024
1 parent 55061c3 commit 3450740
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 19 deletions.
53 changes: 45 additions & 8 deletions alicloud/resource_alicloud_gpdb_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,8 +391,8 @@ func resourceAliCloudGpdbDbInstanceCreate(d *schema.ResourceData, meta interface
request["PrivateIpAddress"] = v
}

if v, ok := d.GetOkExists("ssl_enabled"); ok && v.(int) == 1 {
request["EnableSSL"] = true
if v, ok := d.GetOkExists("ssl_enabled"); ok {
request["EnableSSL"] = convertGpdbDbInstanceSSLEnabledRequest(v)
}

runtime := util.RuntimeOptions{}
Expand Down Expand Up @@ -422,6 +422,13 @@ func resourceAliCloudGpdbDbInstanceCreate(d *schema.ResourceData, meta interface
return WrapErrorf(err, IdMsg, d.Id())
}

if v, ok := d.GetOkExists("ssl_enabled"); ok {
sslEnabledStateConf := BuildStateConf([]string{}, []string{fmt.Sprint(v)}, d.Timeout(schema.TimeoutCreate), 5*time.Second, gpdbService.DBInstanceSSLStateRefreshFunc(d, []string{}))
if _, err := sslEnabledStateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}

return resourceAliCloudGpdbDbInstanceUpdate(d, meta)
}

Expand Down Expand Up @@ -502,12 +509,9 @@ func resourceAliCloudGpdbDbInstanceRead(d *schema.ResourceData, meta interface{}
if err != nil {
return WrapError(err)
}

if v, ok := describeDBInstanceSSLObject["SSLEnabled"]; ok && strconv.FormatBool(v.(bool)) != "" {
sslEnabled := 0
if fmt.Sprint(v) == "true" {
sslEnabled = 1
}
d.Set("ssl_enabled", sslEnabled)
d.Set("ssl_enabled", convertGpdbDbInstanceSSLEnabledResponse(v))
}

return nil
Expand Down Expand Up @@ -890,12 +894,14 @@ func resourceAliCloudGpdbDbInstanceUpdate(d *schema.ResourceData, meta interface
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}

if !d.IsNewResource() && d.HasChange("ssl_enabled") {
update = true
}
if v, ok := d.GetOkExists("ssl_enabled"); ok {
request["SSLEnabled"] = v
}

if update {
action := "ModifyDBInstanceSSL"
wait := incrementalWait(3*time.Second, 3*time.Second)
Expand All @@ -911,13 +917,21 @@ func resourceAliCloudGpdbDbInstanceUpdate(d *schema.ResourceData, meta interface
return nil
})
addDebug(action, response, request)

if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}

stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}

sslEnabledStateConf := BuildStateConf([]string{}, []string{fmt.Sprint(request["SSLEnabled"])}, d.Timeout(schema.TimeoutCreate), 5*time.Second, gpdbService.DBInstanceSSLStateRefreshFunc(d, []string{}))
if _, err := sslEnabledStateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}

d.SetPartial("ssl_enabled")
}

Expand Down Expand Up @@ -979,7 +993,7 @@ func resourceAliCloudGpdbDbInstanceUpdate(d *schema.ResourceData, meta interface
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2016-05-03"), StringPointer("AK"), nil, modifyMasterSpec, &runtime)
if err != nil {
if NeedRetry(err) {
if IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing"}) || NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
Expand Down Expand Up @@ -1053,6 +1067,7 @@ func convertGpdbDbInstancePaymentTypeRequest(source interface{}) interface{} {
case "PayAsYouGo":
return "Postpaid"
}

return source
}

Expand All @@ -1066,3 +1081,25 @@ func convertGpdbDbInstancePaymentTypeResponse(source interface{}) interface{} {

return source
}

func convertGpdbDbInstanceSSLEnabledRequest(source interface{}) interface{} {
switch source {
case 0:
return false
case 1:
return true
}

return source
}

func convertGpdbDbInstanceSSLEnabledResponse(source interface{}) interface{} {
switch source {
case false:
return 0
case true:
return 1
}

return source
}
64 changes: 53 additions & 11 deletions alicloud/service_alicloud_gpdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,7 @@ func (s *GpdbService) SetResourceTags(d *schema.ResourceData, resourceType strin
}
return nil
}

func (s *GpdbService) DescribeDBInstanceIPArrayList(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
conn, err := s.client.NewGpdbClient()
Expand Down Expand Up @@ -651,6 +652,28 @@ func (s *GpdbService) DescribeDBInstanceSSL(id string) (object map[string]interf
return object, nil
}

func (s *GpdbService) DBInstanceSSLStateRefreshFunc(d *schema.ResourceData, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeDBInstanceSSL(d.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)
}

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

return object, fmt.Sprint(sslEnabled), nil
}
}

func (s *GpdbService) DescribeGpdbDbInstance(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
conn, err := s.client.NewGpdbClient()
Expand Down Expand Up @@ -718,10 +741,14 @@ func (s *GpdbService) GpdbDbInstanceStateRefreshFunc(id string, field string, fa
}

func (s *GpdbService) DescribeGpdbDbInstancePlan(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeDBInstancePlans"

conn, err := s.client.NewGpdbClient()
if err != nil {
return object, WrapError(err)
}

parts, err := ParseResourceId(id, 2)
if err != nil {
return object, WrapError(err)
Expand All @@ -732,51 +759,66 @@ func (s *GpdbService) DescribeGpdbDbInstancePlan(id string) (object map[string]i
"PlanId": parts[1],
}

var response map[string]interface{}
action := "DescribeDBInstancePlans"
idExist := false
runtime := util.RuntimeOptions{}
runtime.SetAutoretry(true)
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
resp, err := conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2016-05-03"), StringPointer("AK"), nil, request, &runtime)
response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2016-05-03"), StringPointer("AK"), nil, request, &runtime)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
response = resp
addDebug(action, response, request)
return nil
})
addDebug(action, response, request)

if err != nil {
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.Items.PlanList", response)

resp, err := jsonpath.Get("$.Items.PlanList", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.PlanList", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(Error(GetNotFoundMessage("DBInstancePlan", id)), NotFoundWithResponse, response)

if v, ok := resp.([]interface{}); !ok || len(v) < 1 {
return object, WrapErrorf(Error(GetNotFoundMessage("Gpdb:DbInstancePlan", id)), NotFoundWithResponse, response)
}
return v.([]interface{})[0].(map[string]interface{}), nil

for _, v := range resp.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["DBInstanceId"]) == parts[0] && fmt.Sprint(v.(map[string]interface{})["PlanId"]) == parts[1] {
idExist = true
return v.(map[string]interface{}), nil
}
}

if !idExist {
return object, WrapErrorf(Error(GetNotFoundMessage("Gpdb:DbInstancePlan", id)), NotFoundWithResponse, response)
}

return object, nil
}

func (s *GpdbService) GpdbDbInstancePlanStateRefreshFunc(d *schema.ResourceData, failStates []string) resource.StateRefreshFunc {
func (s *GpdbService) GpdbDbInstancePlanStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeGpdbDbInstancePlan(d.Id())
object, err := s.DescribeGpdbDbInstancePlan(id)
if err != nil {
if NotFoundError(err) {
return nil, "", nil
}
return nil, "", WrapError(err)
}

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

return object, fmt.Sprint(object["PlanStatus"]), nil
}
}

0 comments on commit 3450740

Please sign in to comment.