From adf60a02006ff27c6f610451e63f7a74db765c18 Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Fri, 3 Dec 2021 15:32:58 +0300 Subject: [PATCH] fix(cleanup): ignore harbor "unsupported 404 status code" errors These errors may occur when harbor configured to use S3 backend, which may respond with the following error: ``` GET https://domain/harbor/s3/object/name/prefix/docker/registry/v2/blobs/sha256/2d/3d8c68cd9df32f1beb4392298a123eac5 8aba1433a15b3258b2f3728bad4b7d1/data?X-Amz-Algorithm=REDACTED&X-Amz-Credential=REDACTED&X-Amz-Date=REDACTED&X-Amz-Expire s=REDACTED&X-Amz-Signature=REDACTED&X-Amz-SignedHeaders=REDACTED: unsupported status code 404; body: NoSuchKeyThe specified key does not exist./harbor/s3/object/name/pr efix/docker/registry/v2/blobs/sha256/3d/3d8c68cd9df32f1beb4392298a123eac58aba1433a15b3258b2f3728bad4b7d1/data c5bb943c-1e85-5930-b455-c3e8edbbaccd ``` --- pkg/docker_registry/api.go | 2 +- pkg/docker_registry/default.go | 12 ++++++++++++ pkg/docker_registry/generic_api.go | 2 +- pkg/storage/repo_stages_storage.go | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/pkg/docker_registry/api.go b/pkg/docker_registry/api.go index 0fd6c3651e..9144baae20 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) { + if IsBlobUnknownError(err) || IsManifestUnknownError(err) || IsNameUnknownError(err) || IsHarbor404Error(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 629a8ba2a7..f28a03184e 100644 --- a/pkg/docker_registry/default.go +++ b/pkg/docker_registry/default.go @@ -55,3 +55,15 @@ func IsBlobUnknownError(err error) bool { func IsNameUnknownError(err error) bool { return (err != nil) && strings.Contains(err.Error(), "NAME_UNKNOWN") } + +func IsHarbor404Error(err error) bool { + if err == nil { + return false + } + + // Example error: + // GET https://domain/harbor/s3/object/name/prefix/docker/registry/v2/blobs/sha256/2d/3d8c68cd9df32f1beb4392298a123eac58aba1433a15b3258b2f3728bad4b7d1/data?X-Amz-Algorithm=REDACTED&X-Amz-Credential=REDACTED&X-Amz-Date=REDACTED&X-Amz-Expires=REDACTED&X-Amz-Signature=REDACTED&X-Amz-SignedHeaders=REDACTED: unsupported status code 404; body: + // NoSuchKeyThe specified key does not exist./harbor/s3/object/name/prefix/docker/registry/v2/blobs/sha256/3d/3d8c68cd9df32f1beb4392298a123eac58aba1433a15b3258b2f3728bad4b7d1/datac5bb943c-1e85-5930-b455-c3e8edbbaccd + + return strings.Contains(err.Error(), "unsupported status code 404") +} diff --git a/pkg/docker_registry/generic_api.go b/pkg/docker_registry/generic_api.go index 3273042298..91b8fa9599 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) { + if IsBlobUnknownError(err) || IsManifestUnknownError(err) || IsNameUnknownError(err) || IsHarbor404Error(err) { continue } diff --git a/pkg/storage/repo_stages_storage.go b/pkg/storage/repo_stages_storage.go index a1e26f17c5..94999410d8 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) { + if docker_registry.IsBlobUnknownError(err) || docker_registry.IsHarbor404Error(err) { return nil, ErrBrokenImage }