From d19ea060bb04ea58951fd1b9c7aad327391d9c81 Mon Sep 17 00:00:00 2001 From: nikpivkin Date: Tue, 1 Oct 2024 11:51:05 +0600 Subject: [PATCH] simplify download artifact Signed-off-by: nikpivkin --- pkg/oci/artifact.go | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/pkg/oci/artifact.go b/pkg/oci/artifact.go index 84a9bfc8471d..64b8cd48858a 100644 --- a/pkg/oci/artifact.go +++ b/pkg/oci/artifact.go @@ -224,27 +224,31 @@ func DownloadArtifact(ctx context.Context, artifacts []*Artifact, dst string, op return nil } + if !shouldTryOtherRepo(err, i, len(artifacts)) { + return xerrors.Errorf("failed to download artifact from %s: %w", art.Repository(), err) + } log.Error("Failed to download artifact", log.String("repo", art.Repository()), log.Err(err)) + log.Info("Trying to download artifact from other repository...") + } + + return xerrors.New("failed to download artifact from any source") +} + +func shouldTryOtherRepo(err error, current, total int) bool { + var terr *transport.Error + if !errors.As(err, &terr) { + return false + } - var terr *transport.Error - if errors.As(err, &terr) { - for _, diagnostic := range terr.Errors { - // For better user experience - if diagnostic.Code == transport.DeniedErrorCode || diagnostic.Code == transport.UnauthorizedErrorCode { - // e.g. https://aquasecurity.github.io/trivy/latest/docs/references/troubleshooting/#db - log.Warnf("See %s", doc.URL("/docs/references/troubleshooting/", "db")) - break - } - } - - // try the following artifact only if a temporary error occurs - if terr.Temporary() && i < len(artifacts)-1 { - log.Info("Trying to download artifact from other repository...") - continue - } + for _, diagnostic := range terr.Errors { + // For better user experience + if diagnostic.Code == transport.DeniedErrorCode || diagnostic.Code == transport.UnauthorizedErrorCode { + // e.g. https://aquasecurity.github.io/trivy/latest/docs/references/troubleshooting/#db + log.Warnf("See %s", doc.URL("/docs/references/troubleshooting/", "db")) + break } - return xerrors.Errorf("failed to download artifact from %s", art.Repository()) } - return xerrors.New("failed to download artifact from any source") + // try the following artifact only if a temporary error occurs + return terr.Temporary() && current < total-1 }