mirror of
https://github.com/project-zot/zot.git
synced 2026-06-17 04:48:26 +08:00
feat(referrers): added index support for referrers queries (#1560)
Signed-off-by: Laurentiu Niculae <niculae.laurentiu1@gmail.com>
This commit is contained in:
@@ -581,14 +581,14 @@ func GetReferrers(imgStore storageTypes.ImageStore, repo string, gdigest godiges
|
||||
|
||||
result := []ispec.Descriptor{}
|
||||
|
||||
for _, manifest := range index.Manifests {
|
||||
if manifest.Digest == gdigest {
|
||||
for _, descriptor := range index.Manifests {
|
||||
if descriptor.Digest == gdigest {
|
||||
continue
|
||||
}
|
||||
|
||||
buf, err := imgStore.GetBlobContent(repo, manifest.Digest)
|
||||
buf, err := imgStore.GetBlobContent(repo, descriptor.Digest)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("blob", imgStore.BlobPath(repo, manifest.Digest)).Msg("failed to read manifest")
|
||||
log.Error().Err(err).Str("blob", imgStore.BlobPath(repo, descriptor.Digest)).Msg("failed to read manifest")
|
||||
|
||||
if errors.Is(err, zerr.ErrBlobNotFound) {
|
||||
return nilIndex, zerr.ErrManifestNotFound
|
||||
@@ -597,31 +597,59 @@ func GetReferrers(imgStore storageTypes.ImageStore, repo string, gdigest godiges
|
||||
return nilIndex, err
|
||||
}
|
||||
|
||||
if manifest.MediaType == ispec.MediaTypeImageManifest {
|
||||
var mfst ispec.Manifest
|
||||
if err := json.Unmarshal(buf, &mfst); err != nil {
|
||||
log.Error().Err(err).Str("manifest digest", manifest.Digest.String()).Msg("invalid JSON")
|
||||
switch descriptor.MediaType {
|
||||
case ispec.MediaTypeImageManifest:
|
||||
var manifestContent ispec.Manifest
|
||||
|
||||
if err := json.Unmarshal(buf, &manifestContent); err != nil {
|
||||
log.Error().Err(err).Str("manifest digest", descriptor.Digest.String()).Msg("invalid JSON")
|
||||
|
||||
return nilIndex, err
|
||||
}
|
||||
|
||||
if mfst.Subject == nil || mfst.Subject.Digest != gdigest {
|
||||
if manifestContent.Subject == nil || manifestContent.Subject.Digest != gdigest {
|
||||
continue
|
||||
}
|
||||
|
||||
// filter by artifact type
|
||||
manifestArtifactType := zcommon.GetManifestArtifactType(mfst)
|
||||
manifestArtifactType := zcommon.GetManifestArtifactType(manifestContent)
|
||||
|
||||
if len(artifactTypes) > 0 && !zcommon.Contains(artifactTypes, manifestArtifactType) {
|
||||
continue
|
||||
}
|
||||
|
||||
result = append(result, ispec.Descriptor{
|
||||
MediaType: manifest.MediaType,
|
||||
MediaType: descriptor.MediaType,
|
||||
ArtifactType: manifestArtifactType,
|
||||
Size: manifest.Size,
|
||||
Digest: manifest.Digest,
|
||||
Annotations: mfst.Annotations,
|
||||
Size: descriptor.Size,
|
||||
Digest: descriptor.Digest,
|
||||
Annotations: manifestContent.Annotations,
|
||||
})
|
||||
case ispec.MediaTypeImageIndex:
|
||||
var indexContent ispec.Index
|
||||
|
||||
if err := json.Unmarshal(buf, &indexContent); err != nil {
|
||||
log.Error().Err(err).Str("manifest digest", descriptor.Digest.String()).Msg("invalid JSON")
|
||||
|
||||
return nilIndex, err
|
||||
}
|
||||
|
||||
if indexContent.Subject == nil || indexContent.Subject.Digest != gdigest {
|
||||
continue
|
||||
}
|
||||
|
||||
indexArtifactType := zcommon.GetIndexArtifactType(indexContent)
|
||||
|
||||
if len(artifactTypes) > 0 && !zcommon.Contains(artifactTypes, indexArtifactType) {
|
||||
continue
|
||||
}
|
||||
|
||||
result = append(result, ispec.Descriptor{
|
||||
MediaType: descriptor.MediaType,
|
||||
ArtifactType: indexArtifactType,
|
||||
Size: descriptor.Size,
|
||||
Digest: descriptor.Digest,
|
||||
Annotations: indexContent.Annotations,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -334,6 +334,49 @@ func TestGetReferrersErrors(t *testing.T) {
|
||||
[]string{artifactType}, log.With().Caller().Logger())
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("Index bad blob", func() {
|
||||
imgStore = &mocks.MockedImageStore{
|
||||
GetIndexContentFn: func(repo string) ([]byte, error) {
|
||||
return []byte(`{
|
||||
"manifests": [{
|
||||
"digest": "digest",
|
||||
"mediaType": "application/vnd.oci.image.index.v1+json"
|
||||
}]
|
||||
}`), nil
|
||||
},
|
||||
GetBlobContentFn: func(repo string, digest godigest.Digest) ([]byte, error) {
|
||||
return []byte("bad blob"), nil
|
||||
},
|
||||
}
|
||||
|
||||
_, err = common.GetReferrers(imgStore, "zot-test", validDigest,
|
||||
[]string{}, log.With().Caller().Logger())
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Index bad artifac type", func() {
|
||||
imgStore = &mocks.MockedImageStore{
|
||||
GetIndexContentFn: func(repo string) ([]byte, error) {
|
||||
return []byte(`{
|
||||
"manifests": [{
|
||||
"digest": "digest",
|
||||
"mediaType": "application/vnd.oci.image.index.v1+json"
|
||||
}]
|
||||
}`), nil
|
||||
},
|
||||
GetBlobContentFn: func(repo string, digest godigest.Digest) ([]byte, error) {
|
||||
return []byte(`{
|
||||
"subject": {"digest": "` + validDigest.String() + `"}
|
||||
}`), nil
|
||||
},
|
||||
}
|
||||
|
||||
ref, err := common.GetReferrers(imgStore, "zot-test", validDigest,
|
||||
[]string{"art.type"}, log.With().Caller().Logger())
|
||||
So(err, ShouldBeNil)
|
||||
So(len(ref.Manifests), ShouldEqual, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user