fix: client errors for DNS service creation errors (#10584)

This commit is contained in:
Ritesh H Shukla 2020-09-30 14:09:41 -07:00 committed by GitHub
parent 0d45c38782
commit 5a7f92481e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 5 deletions

View file

@ -1956,6 +1956,8 @@ func toAPIErrorCode(ctx context.Context, err error) (apiErr APIErrorCode) {
apiErr = ErrBackendDown apiErr = ErrBackendDown
case ObjectNameTooLong: case ObjectNameTooLong:
apiErr = ErrKeyTooLongError apiErr = ErrKeyTooLongError
case dns.ErrInvalidBucketName:
apiErr = ErrInvalidBucketName
default: default:
var ie, iw int var ie, iw int
// This work-around is to handle the issue golang/go#30648 // This work-around is to handle the issue golang/go#30648
@ -1992,6 +1994,12 @@ func toAPIError(ctx context.Context, err error) APIError {
} }
var apiErr = errorCodes.ToAPIErr(toAPIErrorCode(ctx, err)) var apiErr = errorCodes.ToAPIErr(toAPIErrorCode(ctx, err))
e, ok := err.(dns.ErrInvalidBucketName)
if ok {
code := toAPIErrorCode(ctx, e)
apiErr = errorCodes.ToAPIErrWithErr(code, e)
}
if apiErr.Code == "InternalError" { if apiErr.Code == "InternalError" {
// If we see an internal error try to interpret // If we see an internal error try to interpret
// any underlying errors if possible depending on // any underlying errors if possible depending on

View file

@ -22,10 +22,12 @@ import (
"crypto/x509" "crypto/x509"
"errors" "errors"
"fmt" "fmt"
"io"
"net" "net"
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
"strings"
"time" "time"
"github.com/dgrijalva/jwt-go" "github.com/dgrijalva/jwt-go"
@ -78,28 +80,39 @@ func (c *OperatorDNS) Put(bucket string) error {
defer cancel() defer cancel()
e, err := c.endpoint(bucket, false) e, err := c.endpoint(bucket, false)
if err != nil { if err != nil {
return err return newError(bucket, err)
} }
req, err := http.NewRequestWithContext(ctx, http.MethodPost, e, nil) req, err := http.NewRequestWithContext(ctx, http.MethodPost, e, nil)
if err != nil { if err != nil {
return err return newError(bucket, err)
} }
if err = c.addAuthHeader(req); err != nil { if err = c.addAuthHeader(req); err != nil {
return err return newError(bucket, err)
} }
resp, err := c.httpClient.Do(req) resp, err := c.httpClient.Do(req)
if err != nil { if err != nil {
if derr := c.Delete(bucket); derr != nil { if derr := c.Delete(bucket); derr != nil {
return derr return newError(bucket, derr)
} }
} }
var errorStringBuilder strings.Builder
io.Copy(&errorStringBuilder, io.LimitReader(resp.Body, resp.ContentLength))
xhttp.DrainBody(resp.Body) xhttp.DrainBody(resp.Body)
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return fmt.Errorf("request to create the service for bucket %s, failed with status %s", bucket, resp.Status) errorString := errorStringBuilder.String()
return newError(bucket, fmt.Errorf("service create for bucket %s, failed with status %s, error %s", bucket, resp.Status, errorString))
} }
return nil return nil
} }
func newError(bucket string, err error) error {
e := Error{bucket, err}
if strings.Contains(err.Error(), "invalid bucket name") {
return ErrInvalidBucketName(e)
}
return e
}
// Delete - Removes DNS entries added in Put(). // Delete - Removes DNS entries added in Put().
func (c *OperatorDNS) Delete(bucket string) error { func (c *OperatorDNS) Delete(bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), defaultOperatorContextTimeout) ctx, cancel := context.WithTimeout(context.Background(), defaultOperatorContextTimeout)

View file

@ -16,6 +16,22 @@
package dns package dns
// Error - DNS related errors error.
type Error struct {
Bucket string
Err error
}
// ErrInvalidBucketName for buckets with invalid name
type ErrInvalidBucketName Error
func (e ErrInvalidBucketName) Error() string {
return "invalid bucket name error: " + e.Err.Error()
}
func (e Error) Error() string {
return "dns related error: " + e.Err.Error()
}
// Store dns record store // Store dns record store
type Store interface { type Store interface {
Put(bucket string) error Put(bucket string) error