diff --git a/pkg/docker_registry/api.go b/pkg/docker_registry/api.go index 9144baae20..eb893dfd51 100644 --- a/pkg/docker_registry/api.go +++ b/pkg/docker_registry/api.go @@ -81,7 +81,7 @@ func (api *api) IsRepoImageExists(ctx context.Context, reference string) (bool, func (api *api) TryGetRepoImage(ctx context.Context, reference string) (*image.Info, error) { if imgInfo, err := api.GetRepoImage(ctx, reference); err != nil { - if IsBlobUnknownError(err) || IsManifestUnknownError(err) || IsNameUnknownError(err) || IsHarbor404Error(err) { + if IsBlobUnknownError(err) || IsManifestUnknownError(err) || IsNameUnknownError(err) || IsHarbor404Error(err) || IsQuayTagExpiredErr(err) { // TODO: 1. auto reject images with manifest-unknown or blob-unknown errors // TODO: 2. why TryGetRepoImage for rejected image records gives manifest-unknown errors? // TODO: 3. make sure werf never ever creates rejected image records for name-unknown errors. diff --git a/pkg/docker_registry/default.go b/pkg/docker_registry/default.go index 8b5abc2ac5..98e0c88363 100644 --- a/pkg/docker_registry/default.go +++ b/pkg/docker_registry/default.go @@ -40,6 +40,12 @@ func (r *defaultImplementation) Tags(ctx context.Context, reference string) ([]s logboek.Context(ctx).Error().LogF("WARNING: to instruct werf to use harbor driver.\n") } + if IsQuayTagExpiredErr(err) && r.Implementation != QuayImplementationName { + logboek.Context(ctx).Error().LogF("WARNING: Detected error specific for quay container registry implementation!\n") + logboek.Context(ctx).Error().LogF("WARNING: Use --repo-container-registry=quay option (or WERF_CONTAINER_REGISTRY env var)\n") + logboek.Context(ctx).Error().LogF("WARNING: to instruct werf to use quay driver.\n") + } + return tags, err } @@ -60,6 +66,12 @@ func (r *defaultImplementation) TryGetRepoImage(ctx context.Context, reference s logboek.Context(ctx).Error().LogF("WARNING: to instruct werf to use harbor driver.\n") } + if IsQuayTagExpiredErr(err) && r.Implementation != QuayImplementationName { + logboek.Context(ctx).Error().LogF("WARNING: Detected error specific for quay container registry implementation!\n") + logboek.Context(ctx).Error().LogF("WARNING: Use --repo-container-registry=quay option (or WERF_CONTAINER_REGISTRY env var)\n") + logboek.Context(ctx).Error().LogF("WARNING: to instruct werf to use quay driver.\n") + } + return info, err } diff --git a/pkg/docker_registry/generic_api.go b/pkg/docker_registry/generic_api.go index 91b8fa9599..5f8e660e7b 100644 --- a/pkg/docker_registry/generic_api.go +++ b/pkg/docker_registry/generic_api.go @@ -49,7 +49,7 @@ func (api *genericApi) GetRepoImageConfigFile(ctx context.Context, reference str for _, mirrorReference := range mirrorReferenceList { config, err := api.getRepoImageConfigFile(ctx, mirrorReference) if err != nil { - if IsBlobUnknownError(err) || IsManifestUnknownError(err) || IsNameUnknownError(err) || IsHarbor404Error(err) { + if IsBlobUnknownError(err) || IsManifestUnknownError(err) || IsNameUnknownError(err) || IsHarbor404Error(err) || IsQuayTagExpiredErr(err) { continue } diff --git a/pkg/docker_registry/quay.go b/pkg/docker_registry/quay.go index dec0302f60..a8cea6332e 100644 --- a/pkg/docker_registry/quay.go +++ b/pkg/docker_registry/quay.go @@ -25,7 +25,11 @@ func NewQuayRepositoryNotFoundErr(err error) QuayRepositoryNotFoundErr { } func IsQuayRepositoryNotFoundErr(err error) bool { - return strings.Contains(err.Error(), quayRepositoryNotFoundErrPrefix) + return err != nil && strings.Contains(err.Error(), quayRepositoryNotFoundErrPrefix) +} + +func IsQuayTagExpiredErr(err error) bool { + return err != nil && strings.Contains(err.Error(), "TAG_EXPIRED: ") } var quayPatterns = []string{"^quay\\.io", "^quay\\..*\\.com"} diff --git a/pkg/storage/repo_stages_storage.go b/pkg/storage/repo_stages_storage.go index 94999410d8..6eae75aa1e 100644 --- a/pkg/storage/repo_stages_storage.go +++ b/pkg/storage/repo_stages_storage.go @@ -273,7 +273,7 @@ func (storage *RepoStagesStorage) GetStageDescription(ctx context.Context, proje return nil, nil } - if docker_registry.IsBlobUnknownError(err) || docker_registry.IsHarbor404Error(err) { + if docker_registry.IsBlobUnknownError(err) || docker_registry.IsHarbor404Error(err) || docker_registry.IsQuayTagExpiredErr(err) { return nil, ErrBrokenImage }