From a3be23ba617797fd34d3e63b27ad92225e2d7fea Mon Sep 17 00:00:00 2001 From: Modular Magician Date: Tue, 28 Apr 2020 17:47:03 +0000 Subject: [PATCH] Add retry for storage bucket 412 (#3434) * add retry for storage bucket 412 * format Signed-off-by: Modular Magician --- .changelog/3434.txt | 3 +++ google-beta/error_retry_predicates.go | 7 +++++++ google-beta/iam_storage_bucket.go | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .changelog/3434.txt diff --git a/.changelog/3434.txt b/.changelog/3434.txt new file mode 100644 index 0000000000..e6980e7d3a --- /dev/null +++ b/.changelog/3434.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +storage: Added retries for `google_storage_bucket_iam_*` on 412 (precondition not met) errors for eventually consistent bucket creation. +``` diff --git a/google-beta/error_retry_predicates.go b/google-beta/error_retry_predicates.go index bc39c8fd4e..d1a4f9b0a4 100644 --- a/google-beta/error_retry_predicates.go +++ b/google-beta/error_retry_predicates.go @@ -215,3 +215,10 @@ func isNotFoundRetryableError(opType string) RetryErrorPredicateFunc { return false, "" } } + +func isStoragePreconditionError(err error) (bool, string) { + if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 412 { + return true, fmt.Sprintf("Retry on storage precondition not met") + } + return false, "" +} diff --git a/google-beta/iam_storage_bucket.go b/google-beta/iam_storage_bucket.go index 2b681e13f9..aa3442f1cd 100644 --- a/google-beta/iam_storage_bucket.go +++ b/google-beta/iam_storage_bucket.go @@ -102,7 +102,7 @@ func (u *StorageBucketIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager. return nil, err } - policy, err := sendRequest(u.Config, "GET", "", url, obj) + policy, err := sendRequest(u.Config, "GET", "", url, obj, isStoragePreconditionError) if err != nil { return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err) } @@ -129,7 +129,7 @@ func (u *StorageBucketIamUpdater) SetResourceIamPolicy(policy *cloudresourcemana return err } - _, err = sendRequestWithTimeout(u.Config, "PUT", "", url, obj, u.d.Timeout(schema.TimeoutCreate)) + _, err = sendRequestWithTimeout(u.Config, "PUT", "", url, obj, u.d.Timeout(schema.TimeoutCreate), isStoragePreconditionError) if err != nil { return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err) }