Skip to content

Commit ca086dc

Browse files
Added support for custom retry for database and db_home resource
1 parent e461f44 commit ca086dc

File tree

2 files changed

+42
-9
lines changed

2 files changed

+42
-9
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
- Support for Response Caching to API Gateway
77

88
### Fixed
9-
- Fixed update and destroy operations for management resources for external databases.
9+
- Fixed update and destroy operations for management resources for external databases
10+
- Fixed retry behavior for database and db_home resources to honor user timeouts
1011

1112
## 4.24.0 (April 29, 2021)
1213

oci/database_database_resource.go

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import (
88
"errors"
99
"fmt"
1010
"strings"
11+
"time"
12+
13+
oci_common "github.com/oracle/oci-go-sdk/v40/common"
1114

1215
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
1316
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
@@ -24,11 +27,15 @@ func DatabaseDatabaseResource() *schema.Resource {
2427
Importer: &schema.ResourceImporter{
2528
State: schema.ImportStatePassthrough,
2629
},
27-
Timeouts: DefaultTimeout,
28-
Create: createDatabaseDatabase,
29-
Read: readDatabaseDatabase,
30-
Update: updateDatabaseDatabase,
31-
Delete: deleteDatabaseDatabase,
30+
Timeouts: &schema.ResourceTimeout{
31+
Create: getTimeoutDuration("12h"),
32+
Update: getTimeoutDuration("2h"),
33+
Delete: getTimeoutDuration("2h"),
34+
},
35+
Create: createDatabaseDatabase,
36+
Read: readDatabaseDatabase,
37+
Update: updateDatabaseDatabase,
38+
Delete: deleteDatabaseDatabase,
3239
Schema: map[string]*schema.Schema{
3340
// Required
3441
"database": {
@@ -454,7 +461,8 @@ func (s *DatabaseDatabaseResourceCrud) Create() error {
454461
return err
455462
}
456463

457-
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database")
464+
createDatabaseRetryDurationFn := getdatabaseRetryDurationFunction(s.D.Timeout(schema.TimeoutCreate))
465+
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database", createDatabaseRetryDurationFn)
458466

459467
response, err := s.Client.CreateDatabase(context.Background(), request)
460468
if err != nil {
@@ -493,7 +501,8 @@ func (s *DatabaseDatabaseResourceCrud) Delete() error {
493501
request.PerformFinalBackup = &tmp
494502
}
495503

496-
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database")
504+
deleteDatabaseRetryDurationFn := getdatabaseRetryDurationFunction(s.D.Timeout(schema.TimeoutDelete))
505+
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database", deleteDatabaseRetryDurationFn)
497506

498507
_, err := s.Client.DeleteDatabase(context.Background(), request)
499508
return err
@@ -901,7 +910,8 @@ func (s *DatabaseDatabaseResourceCrud) Update() error {
901910
}
902911
}
903912

904-
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database")
913+
updateDatabaseRetryDurationFn := getdatabaseRetryDurationFunction(s.D.Timeout(schema.TimeoutUpdate))
914+
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database", updateDatabaseRetryDurationFn)
905915

906916
response, err := s.Client.UpdateDatabase(context.Background(), request)
907917
if err != nil {
@@ -1078,3 +1088,25 @@ func (s *DatabaseDatabaseResourceCrud) kmsMigration(databaseId string) error {
10781088
}
10791089
return nil
10801090
}
1091+
1092+
func getdatabaseRetryDurationFunction(retryTimeout time.Duration) expectedRetryDurationFn {
1093+
return func(response oci_common.OCIOperationResponse, disableNotFoundRetries bool, service string, optionals ...interface{}) time.Duration {
1094+
defaultRetryTime := getDefaultExpectedRetryDuration(response, disableNotFoundRetries)
1095+
if response.Response == nil || response.Response.HTTPResponse() == nil {
1096+
return defaultRetryTime
1097+
}
1098+
switch statusCode := response.Response.HTTPResponse().StatusCode; statusCode {
1099+
case 409:
1100+
if e := response.Error; e != nil {
1101+
if strings.Contains(e.Error(), "IncorrectState") {
1102+
defaultRetryTime = retryTimeout
1103+
} else if strings.Contains(e.Error(), "InvalidatedRetryToken") {
1104+
defaultRetryTime = 0
1105+
} else {
1106+
defaultRetryTime = longRetryTime
1107+
}
1108+
}
1109+
}
1110+
return defaultRetryTime
1111+
}
1112+
}

0 commit comments

Comments
 (0)