From 835d2cb9a35010c9d1b0e03eb963450e84a313ef Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 8 Apr 2021 08:24:55 -0700 Subject: [PATCH] handle dns.ErrBucketConflict as BucketAlreadyExists (#12013) --- cmd/api-errors.go | 2 ++ cmd/config/dns/operator_dns.go | 4 ++++ cmd/config/dns/store.go | 10 +++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cmd/api-errors.go b/cmd/api-errors.go index 64adcf9ca..f73f6cb36 100644 --- a/cmd/api-errors.go +++ b/cmd/api-errors.go @@ -2004,6 +2004,8 @@ func toAPIErrorCode(ctx context.Context, err error) (apiErr APIErrorCode) { apiErr = ErrKeyTooLongError case dns.ErrInvalidBucketName: apiErr = ErrInvalidBucketName + case dns.ErrBucketConflict: + apiErr = ErrBucketAlreadyExists default: var ie, iw int // This work-around is to handle the issue golang/go#30648 diff --git a/cmd/config/dns/operator_dns.go b/cmd/config/dns/operator_dns.go index cdea1da14..1a0c46854 100644 --- a/cmd/config/dns/operator_dns.go +++ b/cmd/config/dns/operator_dns.go @@ -100,6 +100,10 @@ func (c *OperatorDNS) Put(bucket string) error { xhttp.DrainBody(resp.Body) if resp.StatusCode != http.StatusOK { errorString := errorStringBuilder.String() + switch resp.StatusCode { + case http.StatusConflict: + return ErrBucketConflict(Error{bucket, errors.New(errorString)}) + } return newError(bucket, fmt.Errorf("service create for bucket %s, failed with status %s, error %s", bucket, resp.Status, errorString)) } return nil diff --git a/cmd/config/dns/store.go b/cmd/config/dns/store.go index 1a097d1ae..1195f4f27 100644 --- a/cmd/config/dns/store.go +++ b/cmd/config/dns/store.go @@ -26,12 +26,20 @@ type Error struct { type ErrInvalidBucketName Error func (e ErrInvalidBucketName) Error() string { - return "invalid bucket name error: " + e.Err.Error() + return e.Bucket + " invalid bucket name error: " + e.Err.Error() } + func (e Error) Error() string { return "dns related error: " + e.Err.Error() } +// ErrBucketConflict for buckets that already exist +type ErrBucketConflict Error + +func (e ErrBucketConflict) Error() string { + return e.Bucket + " bucket conflict error: " + e.Err.Error() +} + // Store dns record store type Store interface { Put(bucket string) error