From 074e41679d53d5d0d48c10839d6904edb7e55834 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sun, 27 Feb 2022 20:46:24 +0100 Subject: [PATCH] distribution: un-export internal errors and error-utilities un-exports errors that were only used internally: - Remove ErrNoSupport as it was not emitted anywhere - ImageConfigPullError -> imageConfigPullError - TranslatePullError() -> translatePullError() Signed-off-by: Sebastiaan van Stijn --- distribution/errors.go | 27 +++++++-------------------- distribution/errors_test.go | 4 +--- distribution/pull.go | 25 +++---------------------- distribution/pull_v2.go | 10 +++++----- 4 files changed, 16 insertions(+), 50 deletions(-) diff --git a/distribution/errors.go b/distribution/errors.go index 6b67d53ff4..fa1e2214eb 100644 --- a/distribution/errors.go +++ b/distribution/errors.go @@ -18,17 +18,6 @@ import ( "github.com/sirupsen/logrus" ) -// ErrNoSupport is an error type used for errors indicating that an operation -// is not supported. It encapsulates a more specific error. -type ErrNoSupport struct{ Err error } - -func (e ErrNoSupport) Error() string { - if e.Err == nil { - return "not supported" - } - return e.Err.Error() -} - // fallbackError wraps an error that can possibly allow fallback to a different // endpoint. type fallbackError struct { @@ -74,18 +63,18 @@ func (e notFoundError) Cause() error { return e.cause } -// TranslatePullError is used to convert an error from a registry pull +// translatePullError is used to convert an error from a registry pull // operation to an error representing the entire pull operation. Any error // information which is not used by the returned error gets output to // log at info level. -func TranslatePullError(err error, ref reference.Named) error { +func translatePullError(err error, ref reference.Named) error { switch v := err.(type) { case errcode.Errors: if len(v) != 0 { for _, extra := range v[1:] { - logrus.Infof("Ignoring extra error returned from registry: %v", extra) + logrus.WithError(extra).Infof("Ignoring extra error returned from registry") } - return TranslatePullError(v[0], ref) + return translatePullError(v[0], ref) } case errcode.Error: switch v.Code { @@ -93,7 +82,7 @@ func TranslatePullError(err error, ref reference.Named) error { return notFoundError{v, ref} } case xfer.DoNotRetry: - return TranslatePullError(v.Err, ref) + return translatePullError(v.Err, ref) } return errdefs.Unknown(err) @@ -125,14 +114,12 @@ func continueOnError(err error, mirrorEndpoint bool) bool { return true } return continueOnError(v[0], mirrorEndpoint) - case ErrNoSupport: - return continueOnError(v.Err, mirrorEndpoint) case errcode.Error: return mirrorEndpoint case *client.UnexpectedHTTPResponseError: return true - case ImageConfigPullError: - // ImageConfigPullError only happens with v2 images, v1 fallback is + case imageConfigPullError: + // imageConfigPullError only happens with v2 images, v1 fallback is // unnecessary. // Failures from a mirror endpoint should result in fallback to the // canonical repo. diff --git a/distribution/errors_test.go b/distribution/errors_test.go index 164c57a650..f1a3a45785 100644 --- a/distribution/errors_test.go +++ b/distribution/errors_test.go @@ -18,15 +18,13 @@ var alwaysContinue = []error{ errUnexpected, // nested errcode.Errors{errUnexpected}, - ErrNoSupport{Err: errUnexpected}, } var continueFromMirrorEndpoint = []error{ - ImageConfigPullError{}, + imageConfigPullError{}, errcode.Error{}, // nested errcode.Errors{errcode.Error{}}, - ErrNoSupport{Err: errcode.Error{}}, } var neverContinue = []error{ diff --git a/distribution/pull.go b/distribution/pull.go index e86205bf70..5e8312d839 100644 --- a/distribution/pull.go +++ b/distribution/pull.go @@ -64,15 +64,6 @@ func Pull(ctx context.Context, ref reference.Named, imagePullConfig *ImagePullCo var ( lastErr error - // discardNoSupportErrors is used to track whether an endpoint encountered an error of type registry.ErrNoSupport - // By default it is false, which means that if an ErrNoSupport error is encountered, it will be saved in lastErr. - // As soon as another kind of error is encountered, discardNoSupportErrors is set to true, avoiding the saving of - // any subsequent ErrNoSupport errors in lastErr. - // It's needed for pull-by-digest on v1 endpoints: if there are only v1 endpoints configured, the error should be - // returned and displayed, but if there was a v2 endpoint which supports pull-by-digest, then the last relevant - // error is the ones from v2 endpoints not v1. - discardNoSupportErrors bool - // confirmedTLSRegistries is a map indicating which registries // are known to be using TLS. There should never be a plaintext // retry for any of these. @@ -110,22 +101,12 @@ func Pull(ctx context.Context, ref reference.Named, imagePullConfig *ImagePullCo } } if fallback { - if _, ok := err.(ErrNoSupport); !ok { - // Because we found an error that's not ErrNoSupport, discard all subsequent ErrNoSupport errors. - discardNoSupportErrors = true - // append subsequent errors - lastErr = err - } else if !discardNoSupportErrors { - // Save the ErrNoSupport error, because it's either the first error or all encountered errors - // were also ErrNoSupport errors. - // append subsequent errors - lastErr = err - } + lastErr = err logrus.Infof("Attempting next endpoint for pull after error: %v", err) continue } logrus.Errorf("Not continuing with pull after error: %v", err) - return TranslatePullError(err, ref) + return translatePullError(err, ref) } imagePullConfig.ImageEventLogger(reference.FamiliarString(ref), reference.FamiliarName(repoInfo.Name), "pull") @@ -136,7 +117,7 @@ func Pull(ctx context.Context, ref reference.Named, imagePullConfig *ImagePullCo lastErr = fmt.Errorf("no endpoints found for %s", reference.FamiliarString(ref)) } - return TranslatePullError(lastErr, ref) + return translatePullError(lastErr, ref) } // writeStatus writes a status message to out. If layersDownloaded is true, the diff --git a/distribution/pull_v2.go b/distribution/pull_v2.go index 8479a961e4..ab5ac9b34e 100644 --- a/distribution/pull_v2.go +++ b/distribution/pull_v2.go @@ -41,14 +41,14 @@ var ( errRootFSInvalid = errors.New("invalid rootfs in image configuration") ) -// ImageConfigPullError is an error pulling the image config blob +// imageConfigPullError is an error pulling the image config blob // (only applies to schema2). -type ImageConfigPullError struct { +type imageConfigPullError struct { Err error } -// Error returns the error string for ImageConfigPullError. -func (e ImageConfigPullError) Error() string { +// Error returns the error string for imageConfigPullError. +func (e imageConfigPullError) Error() string { return "error pulling image configuration: " + e.Err.Error() } @@ -619,7 +619,7 @@ func (p *v2Puller) pullSchema2Layers(ctx context.Context, target distribution.De go func() { configJSON, err := p.pullSchema2Config(ctx, target.Digest) if err != nil { - configErrChan <- ImageConfigPullError{Err: err} + configErrChan <- imageConfigPullError{Err: err} cancel() return }