Skip to content

Commit bc990d6

Browse files
authored
Fix fetching referrers error handling (#1648)
* Add a test that tries to get the referrers for the image that does not have a referrer * Fix the error handling when fetching referrers in an OCI registry that does not support for referrers API
1 parent ed5c185 commit bc990d6

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

pkg/v1/remote/descriptor.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -330,13 +330,14 @@ func (f *fetcher) fetchReferrers(ctx context.Context, filter map[string]string,
330330
// The registry doesn't support the Referrers API endpoint, so we'll use the fallback tag scheme.
331331
b, _, err := f.fetchManifest(ctx, fallbackTag(d), []types.MediaType{types.OCIImageIndex})
332332
if err != nil {
333+
var terr *transport.Error
334+
if ok := errors.As(err, &terr); ok && terr.StatusCode == http.StatusNotFound {
335+
// Not found just means there are no attachments yet. Start with an empty manifest.
336+
return &v1.IndexManifest{MediaType: types.OCIImageIndex}, nil
337+
}
338+
333339
return nil, err
334340
}
335-
var terr *transport.Error
336-
if ok := errors.As(err, &terr); ok && terr.StatusCode == http.StatusNotFound {
337-
// Not found just means there are no attachments yet. Start with an empty manifest.
338-
return &v1.IndexManifest{MediaType: types.OCIImageIndex}, nil
339-
}
340341

341342
var im v1.IndexManifest
342343
if err := json.Unmarshal(b, &im); err != nil {

pkg/v1/remote/referrers_test.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ func TestReferrers(t *testing.T) {
9494
rootDesc := descriptor(rootImg)
9595
t.Logf("root image is %s", rootDesc.Digest)
9696

97+
// Before pushing referrers, try to get the referrers of the root image.
98+
rootRefDigest := rootRef.Context().Digest(rootDesc.Digest.String())
99+
index, err := remote.Referrers(rootRefDigest)
100+
if err != nil {
101+
t.Fatal(err)
102+
}
103+
if numManifests := len(index.Manifests); numManifests != 0 {
104+
t.Fatalf("expected index to contain 0 manifests, but had %d", numManifests)
105+
}
106+
97107
// Push an image that refers to the root image as its subject.
98108
leafRef, err := name.ParseReference(fmt.Sprintf("%s/repo:leaf", u.Host))
99109
if err != nil {
@@ -112,8 +122,7 @@ func TestReferrers(t *testing.T) {
112122
t.Logf("leaf image is %s", leafDesc.Digest)
113123

114124
// Get the referrers of the root image, by digest.
115-
rootRefDigest := rootRef.Context().Digest(rootDesc.Digest.String())
116-
index, err := remote.Referrers(rootRefDigest)
125+
index, err = remote.Referrers(rootRefDigest)
117126
if err != nil {
118127
t.Fatal(err)
119128
}

0 commit comments

Comments
 (0)