mirror of
https://github.com/project-zot/zot.git
synced 2026-06-16 12:28:01 +08:00
refactor(digests): standardise representation of digests to digest.Digest (#898)
- Digests were represented by different ways
- We needed a uniform way to represent the digests and enforce a format
- also replace usage of github.com/google/go-containerregistry/pkg/v1
with github.com/opencontainers/image-spec/specs-go/v1
Signed-off-by: Laurentiu Niculae <niculae.laurentiu1@gmail.com>
(cherry picked from commit 96b2f29d6d57070a913ce419149cd481c0723815)
(cherry picked from commit 3d41b583daea654c98378ce3dcb78937d71538e8)
Co-authored-by: Laurentiu Niculae <niculae.laurentiu1@gmail.com>
This commit is contained in:
@@ -3294,12 +3294,12 @@ func TestCrossRepoMount(t *testing.T) {
|
||||
baseURL, constants.RoutePrefix, constants.Blobs, godigest.SHA256, blob))
|
||||
|
||||
// Check os.SameFile here
|
||||
cachePath := path.Join(ctlr.Config.Storage.RootDirectory, "zot-d-test", "blobs/sha256", dgst.Hex())
|
||||
cachePath := path.Join(ctlr.Config.Storage.RootDirectory, "zot-d-test", "blobs/sha256", dgst.Encoded())
|
||||
|
||||
cacheFi, err := os.Stat(cachePath)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
linkPath := path.Join(ctlr.Config.Storage.RootDirectory, "zot-mount-test", "blobs/sha256", dgst.Hex())
|
||||
linkPath := path.Join(ctlr.Config.Storage.RootDirectory, "zot-mount-test", "blobs/sha256", dgst.Encoded())
|
||||
|
||||
linkFi, err := os.Stat(linkPath)
|
||||
So(err, ShouldBeNil)
|
||||
@@ -3318,7 +3318,7 @@ func TestCrossRepoMount(t *testing.T) {
|
||||
So(test.Location(baseURL, postResponse), ShouldEqual, fmt.Sprintf("%s%s/zot-mount1-test/%s/%s:%s",
|
||||
baseURL, constants.RoutePrefix, constants.Blobs, godigest.SHA256, blob))
|
||||
|
||||
linkPath = path.Join(ctlr.Config.Storage.RootDirectory, "zot-mount1-test", "blobs/sha256", dgst.Hex())
|
||||
linkPath = path.Join(ctlr.Config.Storage.RootDirectory, "zot-mount1-test", "blobs/sha256", dgst.Encoded())
|
||||
|
||||
linkFi, err = os.Stat(linkPath)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
+63
-44
@@ -23,6 +23,7 @@ import (
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
notreg "github.com/notaryproject/notation-go/registry"
|
||||
"github.com/opencontainers/distribution-spec/specs-go/v1/extensions"
|
||||
godigest "github.com/opencontainers/go-digest"
|
||||
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
artifactspec "github.com/oras-project/artifacts-spec/specs-go/v1"
|
||||
|
||||
@@ -326,7 +327,7 @@ func (rh *RouteHandler) CheckManifest(response http.ResponseWriter, request *htt
|
||||
return
|
||||
}
|
||||
|
||||
response.Header().Set(constants.DistContentDigestKey, digest)
|
||||
response.Header().Set(constants.DistContentDigestKey, digest.String())
|
||||
response.Header().Set("Content-Length", fmt.Sprintf("%d", len(content)))
|
||||
response.Header().Set("Content-Type", mediaType)
|
||||
response.WriteHeader(http.StatusOK)
|
||||
@@ -393,7 +394,7 @@ func (rh *RouteHandler) GetManifest(response http.ResponseWriter, request *http.
|
||||
return
|
||||
}
|
||||
|
||||
response.Header().Set(constants.DistContentDigestKey, digest)
|
||||
response.Header().Set(constants.DistContentDigestKey, digest.String())
|
||||
WriteData(response, http.StatusOK, mediaType, content)
|
||||
}
|
||||
|
||||
@@ -463,7 +464,7 @@ func (rh *RouteHandler) UpdateManifest(response http.ResponseWriter, request *ht
|
||||
NewErrorList(NewError(MANIFEST_INVALID, map[string]string{"reference": reference})))
|
||||
} else if errors.Is(err, zerr.ErrBlobNotFound) {
|
||||
WriteJSON(response, http.StatusBadRequest,
|
||||
NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{"blob": digest})))
|
||||
NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{"blob": digest.String()})))
|
||||
} else if errors.Is(err, zerr.ErrRepoBadVersion) {
|
||||
WriteJSON(response, http.StatusInternalServerError,
|
||||
NewErrorList(NewError(INVALID_INDEX, map[string]string{"name": name})))
|
||||
@@ -488,7 +489,7 @@ func (rh *RouteHandler) UpdateManifest(response http.ResponseWriter, request *ht
|
||||
}
|
||||
|
||||
response.Header().Set("Location", fmt.Sprintf("/v2/%s/manifests/%s", name, digest))
|
||||
response.Header().Set(constants.DistContentDigestKey, digest)
|
||||
response.Header().Set(constants.DistContentDigestKey, digest.String())
|
||||
response.WriteHeader(http.StatusCreated)
|
||||
}
|
||||
|
||||
@@ -564,23 +565,27 @@ func (rh *RouteHandler) CheckBlob(response http.ResponseWriter, request *http.Re
|
||||
|
||||
imgStore := rh.getImageStore(name)
|
||||
|
||||
digest, ok := vars["digest"]
|
||||
if !ok || digest == "" {
|
||||
digestStr, ok := vars["digest"]
|
||||
|
||||
if !ok || digestStr == "" {
|
||||
response.WriteHeader(http.StatusNotFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
digest := godigest.Digest(digestStr)
|
||||
|
||||
ok, blen, err := imgStore.CheckBlob(name, digest)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrBadBlobDigest) { //nolint:gocritic // errorslint conflicts with gocritic:IfElseChain
|
||||
WriteJSON(response,
|
||||
http.StatusBadRequest,
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest})))
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest.String()})))
|
||||
} else if errors.Is(err, zerr.ErrRepoNotFound) {
|
||||
WriteJSON(response, http.StatusNotFound, NewErrorList(NewError(NAME_UNKNOWN, map[string]string{"name": name})))
|
||||
} else if errors.Is(err, zerr.ErrBlobNotFound) {
|
||||
WriteJSON(response, http.StatusNotFound, NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{"digest": digest})))
|
||||
WriteJSON(response, http.StatusNotFound, NewErrorList(NewError(BLOB_UNKNOWN,
|
||||
map[string]string{"digest": digest.String()})))
|
||||
} else {
|
||||
rh.c.Log.Error().Err(err).Msg("unexpected error")
|
||||
response.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -590,14 +595,15 @@ func (rh *RouteHandler) CheckBlob(response http.ResponseWriter, request *http.Re
|
||||
}
|
||||
|
||||
if !ok {
|
||||
WriteJSON(response, http.StatusNotFound, NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{"digest": digest})))
|
||||
WriteJSON(response, http.StatusNotFound, NewErrorList(NewError(BLOB_UNKNOWN,
|
||||
map[string]string{"digest": digest.String()})))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
response.Header().Set("Content-Length", fmt.Sprintf("%d", blen))
|
||||
response.Header().Set("Accept-Ranges", "bytes")
|
||||
response.Header().Set(constants.DistContentDigestKey, digest)
|
||||
response.Header().Set(constants.DistContentDigestKey, digest.String())
|
||||
response.WriteHeader(http.StatusOK)
|
||||
}
|
||||
|
||||
@@ -669,22 +675,25 @@ func (rh *RouteHandler) GetBlob(response http.ResponseWriter, request *http.Requ
|
||||
|
||||
imgStore := rh.getImageStore(name)
|
||||
|
||||
digest, ok := vars["digest"]
|
||||
if !ok || digest == "" {
|
||||
digestStr, ok := vars["digest"]
|
||||
|
||||
if !ok || digestStr == "" {
|
||||
response.WriteHeader(http.StatusNotFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
mediaType := request.Header.Get("Accept")
|
||||
digest := godigest.Digest(digestStr)
|
||||
|
||||
var err error
|
||||
mediaType := request.Header.Get("Accept")
|
||||
|
||||
/* content range is supported for resumbale pulls */
|
||||
partial := false
|
||||
|
||||
var from, to int64
|
||||
|
||||
var err error
|
||||
|
||||
contentRange := request.Header.Get("Range")
|
||||
|
||||
_, ok = request.Header["Range"]
|
||||
@@ -719,7 +728,7 @@ func (rh *RouteHandler) GetBlob(response http.ResponseWriter, request *http.Requ
|
||||
if errors.Is(err, zerr.ErrBadBlobDigest) { //nolint:gocritic // errorslint conflicts with gocritic:IfElseChain
|
||||
WriteJSON(response,
|
||||
http.StatusBadRequest,
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest})))
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest.String()})))
|
||||
} else if errors.Is(err, zerr.ErrRepoNotFound) {
|
||||
WriteJSON(response,
|
||||
http.StatusNotFound,
|
||||
@@ -727,7 +736,7 @@ func (rh *RouteHandler) GetBlob(response http.ResponseWriter, request *http.Requ
|
||||
} else if errors.Is(err, zerr.ErrBlobNotFound) {
|
||||
WriteJSON(response,
|
||||
http.StatusNotFound,
|
||||
NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{"digest": digest})))
|
||||
NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{"digest": digest.String()})))
|
||||
} else {
|
||||
rh.c.Log.Error().Err(err).Msg("unexpected error")
|
||||
response.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -746,7 +755,7 @@ func (rh *RouteHandler) GetBlob(response http.ResponseWriter, request *http.Requ
|
||||
|
||||
response.Header().Set("Content-Range", fmt.Sprintf("bytes %d-%d/%d", from, from+blen-1, bsize))
|
||||
} else {
|
||||
response.Header().Set(constants.DistContentDigestKey, digest)
|
||||
response.Header().Set(constants.DistContentDigestKey, digest.String())
|
||||
}
|
||||
|
||||
// return the blob data
|
||||
@@ -772,8 +781,10 @@ func (rh *RouteHandler) DeleteBlob(response http.ResponseWriter, request *http.R
|
||||
return
|
||||
}
|
||||
|
||||
digest, ok := vars["digest"]
|
||||
if !ok || digest == "" {
|
||||
digestStr, ok := vars["digest"]
|
||||
digest, err := godigest.Parse(digestStr)
|
||||
|
||||
if !ok || digestStr == "" || err != nil {
|
||||
response.WriteHeader(http.StatusNotFound)
|
||||
|
||||
return
|
||||
@@ -781,12 +792,12 @@ func (rh *RouteHandler) DeleteBlob(response http.ResponseWriter, request *http.R
|
||||
|
||||
imgStore := rh.getImageStore(name)
|
||||
|
||||
err := imgStore.DeleteBlob(name, digest)
|
||||
err = imgStore.DeleteBlob(name, digest)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrBadBlobDigest) { //nolint:gocritic // errorslint conflicts with gocritic:IfElseChain
|
||||
WriteJSON(response,
|
||||
http.StatusBadRequest,
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest})))
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest.String()})))
|
||||
} else if errors.Is(err, zerr.ErrRepoNotFound) {
|
||||
WriteJSON(response,
|
||||
http.StatusNotFound,
|
||||
@@ -794,7 +805,7 @@ func (rh *RouteHandler) DeleteBlob(response http.ResponseWriter, request *http.R
|
||||
} else if errors.Is(err, zerr.ErrBlobNotFound) {
|
||||
WriteJSON(response,
|
||||
http.StatusNotFound,
|
||||
NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{"digest": digest})))
|
||||
NewErrorList(NewError(BLOB_UNKNOWN, map[string]string{".String()": digest.String()})))
|
||||
} else {
|
||||
rh.c.Log.Error().Err(err).Msg("unexpected error")
|
||||
response.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -838,10 +849,11 @@ func (rh *RouteHandler) CreateBlobUpload(response http.ResponseWriter, request *
|
||||
return
|
||||
}
|
||||
|
||||
mountDigest := godigest.Digest(mountDigests[0])
|
||||
// zot does not support cross mounting directly and do a workaround creating using hard link.
|
||||
// check blob looks for actual path (name+mountDigests[0]) first then look for cache and
|
||||
// if found in cache, will do hard link and if fails we will start new upload.
|
||||
_, _, err := imgStore.CheckBlob(name, mountDigests[0])
|
||||
_, _, err := imgStore.CheckBlob(name, mountDigest)
|
||||
if err != nil {
|
||||
upload, err := imgStore.NewBlobUpload(name)
|
||||
if err != nil {
|
||||
@@ -862,7 +874,7 @@ func (rh *RouteHandler) CreateBlobUpload(response http.ResponseWriter, request *
|
||||
return
|
||||
}
|
||||
|
||||
response.Header().Set("Location", getBlobUploadLocation(request.URL, name, mountDigests[0]))
|
||||
response.Header().Set("Location", getBlobUploadLocation(request.URL, name, mountDigest))
|
||||
response.WriteHeader(http.StatusCreated)
|
||||
|
||||
return
|
||||
@@ -883,8 +895,6 @@ func (rh *RouteHandler) CreateBlobUpload(response http.ResponseWriter, request *
|
||||
return
|
||||
}
|
||||
|
||||
digest := digests[0]
|
||||
|
||||
if contentType := request.Header.Get("Content-Type"); contentType != constants.BinaryMediaType {
|
||||
rh.c.Log.Warn().Str("actual", contentType).Str("expected", constants.BinaryMediaType).Msg("invalid media type")
|
||||
response.WriteHeader(http.StatusUnsupportedMediaType)
|
||||
@@ -894,15 +904,17 @@ func (rh *RouteHandler) CreateBlobUpload(response http.ResponseWriter, request *
|
||||
|
||||
rh.c.Log.Info().Int64("r.ContentLength", request.ContentLength).Msg("DEBUG")
|
||||
|
||||
digestStr := digests[0]
|
||||
|
||||
digest := godigest.Digest(digestStr)
|
||||
|
||||
var contentLength int64
|
||||
|
||||
var err error
|
||||
|
||||
contentLength, err = strconv.ParseInt(request.Header.Get("Content-Length"), 10, 64)
|
||||
contentLength, err := strconv.ParseInt(request.Header.Get("Content-Length"), 10, 64)
|
||||
if err != nil || contentLength <= 0 {
|
||||
rh.c.Log.Warn().Str("actual", request.Header.Get("Content-Length")).Msg("invalid content length")
|
||||
WriteJSON(response, http.StatusBadRequest,
|
||||
NewErrorList(NewError(BLOB_UPLOAD_INVALID, map[string]string{"digest": digest})))
|
||||
NewErrorList(NewError(BLOB_UPLOAD_INVALID, map[string]string{"digest": digest.String()})))
|
||||
|
||||
return
|
||||
}
|
||||
@@ -1139,7 +1151,12 @@ func (rh *RouteHandler) UpdateBlobUpload(response http.ResponseWriter, request *
|
||||
return
|
||||
}
|
||||
|
||||
digest := digests[0]
|
||||
digest, err := godigest.Parse(digests[0])
|
||||
if err != nil {
|
||||
response.WriteHeader(http.StatusBadRequest)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
rh.c.Log.Info().Int64("r.ContentLength", request.ContentLength).Msg("DEBUG")
|
||||
|
||||
@@ -1212,7 +1229,7 @@ finish:
|
||||
if err := imgStore.FinishBlobUpload(name, sessionID, request.Body, digest); err != nil {
|
||||
if errors.Is(err, zerr.ErrBadBlobDigest) { //nolint:gocritic // errorslint conflicts with gocritic:IfElseChain
|
||||
WriteJSON(response, http.StatusBadRequest,
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest})))
|
||||
NewErrorList(NewError(DIGEST_INVALID, map[string]string{"digest": digest.String()})))
|
||||
} else if errors.Is(err, zerr.ErrBadUploadRange) {
|
||||
WriteJSON(response, http.StatusBadRequest,
|
||||
NewErrorList(NewError(BLOB_UPLOAD_INVALID, map[string]string{"session_id": sessionID})))
|
||||
@@ -1237,7 +1254,7 @@ finish:
|
||||
|
||||
response.Header().Set("Location", getBlobUploadLocation(request.URL, name, digest))
|
||||
response.Header().Set("Content-Length", "0")
|
||||
response.Header().Set(constants.DistContentDigestKey, digest)
|
||||
response.Header().Set(constants.DistContentDigestKey, digest.String())
|
||||
response.WriteHeader(http.StatusCreated)
|
||||
}
|
||||
|
||||
@@ -1443,7 +1460,7 @@ func (rh *RouteHandler) getImageStore(name string) storage.ImageStore {
|
||||
// will sync on demand if an image is not found, in case sync extensions is enabled.
|
||||
func getImageManifest(routeHandler *RouteHandler, imgStore storage.ImageStore, name,
|
||||
reference string,
|
||||
) ([]byte, string, string, error) {
|
||||
) ([]byte, godigest.Digest, string, error) {
|
||||
content, digest, mediaType, err := imgStore.GetImageManifest(name, reference)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrRepoNotFound) || errors.Is(err, zerr.ErrManifestNotFound) {
|
||||
@@ -1471,7 +1488,7 @@ func getImageManifest(routeHandler *RouteHandler, imgStore storage.ImageStore, n
|
||||
}
|
||||
|
||||
// will sync referrers on demand if they are not found, in case sync extensions is enabled.
|
||||
func getReferrers(routeHandler *RouteHandler, imgStore storage.ImageStore, name, digest,
|
||||
func getReferrers(routeHandler *RouteHandler, imgStore storage.ImageStore, name string, digest godigest.Digest,
|
||||
artifactType string,
|
||||
) ([]artifactspec.Descriptor, error) {
|
||||
refs, err := imgStore.GetReferrers(name, digest, artifactType)
|
||||
@@ -1480,12 +1497,12 @@ func getReferrers(routeHandler *RouteHandler, imgStore storage.ImageStore, name,
|
||||
routeHandler.c.Config.Extensions.Sync != nil &&
|
||||
*routeHandler.c.Config.Extensions.Sync.Enable {
|
||||
routeHandler.c.Log.Info().Msgf("signature not found, trying to get signature %s:%s by syncing on demand",
|
||||
name, digest)
|
||||
name, digest.String())
|
||||
|
||||
errSync := ext.SyncOneImage(routeHandler.c.Config, routeHandler.c.StoreController,
|
||||
name, digest, true, routeHandler.c.Log)
|
||||
name, digest.String(), true, routeHandler.c.Log)
|
||||
if errSync != nil {
|
||||
routeHandler.c.Log.Error().Err(err).Str("name", name).Str("digest", digest).Msg("unable to get references")
|
||||
routeHandler.c.Log.Error().Err(err).Str("name", name).Str("digest", digest.String()).Msg("unable to get references")
|
||||
|
||||
return []artifactspec.Descriptor{}, err
|
||||
}
|
||||
@@ -1523,8 +1540,10 @@ func (rh *RouteHandler) GetReferrers(response http.ResponseWriter, request *http
|
||||
return
|
||||
}
|
||||
|
||||
digest, ok := vars["digest"]
|
||||
if !ok || digest == "" {
|
||||
digestStr, ok := vars["digest"]
|
||||
digest, err := godigest.Parse(digestStr)
|
||||
|
||||
if !ok || digestStr == "" || err != nil {
|
||||
response.WriteHeader(http.StatusBadRequest)
|
||||
|
||||
return
|
||||
@@ -1549,11 +1568,11 @@ func (rh *RouteHandler) GetReferrers(response http.ResponseWriter, request *http
|
||||
|
||||
imgStore := rh.getImageStore(name)
|
||||
|
||||
rh.c.Log.Info().Str("digest", digest).Str("artifactType", artifactType).Msg("getting manifest")
|
||||
rh.c.Log.Info().Str("digest", digest.String()).Str("artifactType", artifactType).Msg("getting manifest")
|
||||
|
||||
refs, err := getReferrers(rh, imgStore, name, digest, artifactType) //nolint:contextcheck
|
||||
if err != nil {
|
||||
rh.c.Log.Error().Err(err).Str("name", name).Str("digest", digest).Msg("unable to get references")
|
||||
rh.c.Log.Error().Err(err).Str("name", name).Str("digest", digest.String()).Msg("unable to get references")
|
||||
response.WriteHeader(http.StatusBadRequest)
|
||||
|
||||
return
|
||||
@@ -1578,7 +1597,7 @@ func getBlobUploadSessionLocation(url *url.URL, sessionID string) string {
|
||||
|
||||
// GetBlobUploadLocation returns actual blob location on registry
|
||||
// e.g /v2/<name>/blobs/<digest>.
|
||||
func getBlobUploadLocation(url *url.URL, name, digest string) string {
|
||||
func getBlobUploadLocation(url *url.URL, name string, digest godigest.Digest) string {
|
||||
url.RawQuery = ""
|
||||
|
||||
// we are relying on request URL to set location and
|
||||
@@ -1586,7 +1605,7 @@ func getBlobUploadLocation(url *url.URL, name, digest string) string {
|
||||
// getBlobUploadLocation will be called only when blob upload is completed and
|
||||
// location should be set as blob url <v2/<name>/blobs/<digest>>.
|
||||
if strings.Contains(url.Path, "uploads") {
|
||||
url.Path = path.Join(constants.RoutePrefix, name, constants.Blobs, digest)
|
||||
url.Path = path.Join(constants.RoutePrefix, name, constants.Blobs, digest.String())
|
||||
}
|
||||
|
||||
return url.String()
|
||||
|
||||
+31
-30
@@ -13,6 +13,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
godigest "github.com/opencontainers/go-digest"
|
||||
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
@@ -56,7 +57,7 @@ func TestRoutes(t *testing.T) {
|
||||
Convey("Get manifest", func() {
|
||||
// overwrite controller storage
|
||||
ctlr.StoreController.DefaultStore = &mocks.MockedImageStore{
|
||||
GetImageManifestFn: func(repo string, reference string) ([]byte, string, string, error) {
|
||||
GetImageManifestFn: func(repo string, reference string) ([]byte, godigest.Digest, string, error) {
|
||||
return []byte{}, "", "", zerr.ErrRepoBadVersion
|
||||
},
|
||||
}
|
||||
@@ -100,7 +101,7 @@ func TestRoutes(t *testing.T) {
|
||||
"reference": "reference",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (string, error) {
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
|
||||
return "", zerr.ErrRepoNotFound
|
||||
},
|
||||
})
|
||||
@@ -113,7 +114,7 @@ func TestRoutes(t *testing.T) {
|
||||
},
|
||||
|
||||
&mocks.MockedImageStore{
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (string, error) {
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
|
||||
return "", zerr.ErrManifestNotFound
|
||||
},
|
||||
})
|
||||
@@ -125,7 +126,7 @@ func TestRoutes(t *testing.T) {
|
||||
"reference": "reference",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (string, error) {
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
|
||||
return "", zerr.ErrBadManifest
|
||||
},
|
||||
})
|
||||
@@ -137,7 +138,7 @@ func TestRoutes(t *testing.T) {
|
||||
"reference": "reference",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (string, error) {
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
|
||||
return "", zerr.ErrBlobNotFound
|
||||
},
|
||||
})
|
||||
@@ -150,7 +151,7 @@ func TestRoutes(t *testing.T) {
|
||||
"reference": "reference",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (string, error) {
|
||||
PutImageManifestFn: func(repo, reference, mediaType string, body []byte) (godigest.Digest, error) {
|
||||
return "", zerr.ErrRepoBadVersion
|
||||
},
|
||||
})
|
||||
@@ -258,7 +259,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": test.GetTestBlobDigest("zot-cve-test", "layer").String(),
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
DeleteBlobFn: func(repo, digest string) error {
|
||||
DeleteBlobFn: func(repo string, digest godigest.Digest) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
})
|
||||
@@ -270,7 +271,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": "sha256:7b8437f04f83f084b7ed68ad8c4a4947e12fc4e1b006b38129bac89114ec3621",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
DeleteBlobFn: func(repo, digest string) error {
|
||||
DeleteBlobFn: func(repo string, digest godigest.Digest) error {
|
||||
return zerr.ErrBadBlobDigest
|
||||
},
|
||||
})
|
||||
@@ -283,7 +284,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": test.GetTestBlobDigest("zot-cve-test", "layer").String(),
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
DeleteBlobFn: func(repo, digest string) error {
|
||||
DeleteBlobFn: func(repo string, digest godigest.Digest) error {
|
||||
return zerr.ErrBlobNotFound
|
||||
},
|
||||
})
|
||||
@@ -296,7 +297,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": test.GetTestBlobDigest("zot-cve-test", "layer").String(),
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
DeleteBlobFn: func(repo, digest string) error {
|
||||
DeleteBlobFn: func(repo string, digest godigest.Digest) error {
|
||||
return zerr.ErrRepoNotFound
|
||||
},
|
||||
})
|
||||
@@ -326,7 +327,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": "1234",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return true, 0, zerr.ErrBadBlobDigest
|
||||
},
|
||||
})
|
||||
@@ -339,7 +340,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": "1234",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return true, 0, zerr.ErrRepoNotFound
|
||||
},
|
||||
})
|
||||
@@ -352,7 +353,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": "1234",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return true, 0, zerr.ErrBlobNotFound
|
||||
},
|
||||
})
|
||||
@@ -365,7 +366,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": "1234",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return true, 0, ErrUnexpectedError
|
||||
},
|
||||
})
|
||||
@@ -378,7 +379,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": "1234",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return false, 0, nil
|
||||
},
|
||||
})
|
||||
@@ -406,7 +407,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": test.GetTestBlobDigest("zot-cve-test", "layer").String(),
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
GetBlobFn: func(repo, digest, mediaType string) (io.ReadCloser, int64, error) {
|
||||
GetBlobFn: func(repo string, digest godigest.Digest, mediaType string) (io.ReadCloser, int64, error) {
|
||||
return io.NopCloser(bytes.NewBuffer([]byte(""))), 0, zerr.ErrRepoNotFound
|
||||
},
|
||||
})
|
||||
@@ -419,7 +420,7 @@ func TestRoutes(t *testing.T) {
|
||||
"digest": test.GetTestBlobDigest("zot-cve-test", "layer").String(),
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
GetBlobFn: func(repo, digest, mediaType string) (io.ReadCloser, int64, error) {
|
||||
GetBlobFn: func(repo string, digest godigest.Digest, mediaType string) (io.ReadCloser, int64, error) {
|
||||
return io.NopCloser(bytes.NewBuffer([]byte(""))), 0, zerr.ErrBadBlobDigest
|
||||
},
|
||||
})
|
||||
@@ -470,7 +471,7 @@ func TestRoutes(t *testing.T) {
|
||||
NewBlobUploadFn: func(repo string) (string, error) {
|
||||
return "", zerr.ErrRepoNotFound
|
||||
},
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return true, 0, zerr.ErrRepoNotFound
|
||||
},
|
||||
})
|
||||
@@ -487,7 +488,7 @@ func TestRoutes(t *testing.T) {
|
||||
NewBlobUploadFn: func(repo string) (string, error) {
|
||||
return "", zerr.ErrRepoNotFound
|
||||
},
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return true, 0, zerr.ErrRepoNotFound
|
||||
},
|
||||
})
|
||||
@@ -505,7 +506,7 @@ func TestRoutes(t *testing.T) {
|
||||
NewBlobUploadFn: func(repo string) (string, error) {
|
||||
return "", zerr.ErrRepoNotFound
|
||||
},
|
||||
CheckBlobFn: func(repo, digest string) (bool, int64, error) {
|
||||
CheckBlobFn: func(repo string, digest godigest.Digest) (bool, int64, error) {
|
||||
return true, 0, zerr.ErrRepoNotFound
|
||||
},
|
||||
})
|
||||
@@ -521,7 +522,7 @@ func TestRoutes(t *testing.T) {
|
||||
"Content-Length": "100",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FullBlobUploadFn: func(repo string, body io.Reader, digest string) (string, int64, error) {
|
||||
FullBlobUploadFn: func(repo string, body io.Reader, digest godigest.Digest) (string, int64, error) {
|
||||
return "session", 0, zerr.ErrBadBlobDigest
|
||||
},
|
||||
})
|
||||
@@ -537,7 +538,7 @@ func TestRoutes(t *testing.T) {
|
||||
"Content-Length": "100",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FullBlobUploadFn: func(repo string, body io.Reader, digest string) (string, int64, error) {
|
||||
FullBlobUploadFn: func(repo string, body io.Reader, digest godigest.Digest) (string, int64, error) {
|
||||
return "session", 20, nil
|
||||
},
|
||||
})
|
||||
@@ -965,7 +966,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return zerr.ErrBadBlobDigest
|
||||
},
|
||||
},
|
||||
@@ -985,7 +986,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return zerr.ErrBadUploadRange
|
||||
},
|
||||
},
|
||||
@@ -1005,7 +1006,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return zerr.ErrRepoNotFound
|
||||
},
|
||||
},
|
||||
@@ -1025,7 +1026,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return zerr.ErrUploadNotFound
|
||||
},
|
||||
},
|
||||
@@ -1045,7 +1046,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
DeleteBlobUploadFn: func(repo, uuid string) error {
|
||||
@@ -1319,7 +1320,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return zerr.ErrUploadNotFound
|
||||
},
|
||||
},
|
||||
@@ -1339,7 +1340,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return zerr.ErrUploadNotFound
|
||||
},
|
||||
},
|
||||
@@ -1359,7 +1360,7 @@ func TestRoutes(t *testing.T) {
|
||||
"session_id": "test",
|
||||
},
|
||||
&mocks.MockedImageStore{
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest string) error {
|
||||
FinishBlobUploadFn: func(repo, uuid string, body io.Reader, digest godigest.Digest) error {
|
||||
return zerr.ErrUploadNotFound
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user