Skip to content

Commit 9aa45a1

Browse files
authored
Change return type of remote.Referrers (#1652)
* Change return type of remote.Referrers Actually using this was cumbersome because it just returns a struct. This is a breaking change, but I don't think it's a huge deal because not too many people should be using this yet (and we're < 1.0.0). * go mod tidy k8schain?
1 parent bc990d6 commit 9aa45a1

File tree

7 files changed

+81
-39
lines changed

7 files changed

+81
-39
lines changed

pkg/authn/k8schain/go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ require (
4242
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.4 // indirect
4343
github.com/aws/aws-sdk-go-v2/service/sts v1.18.5 // indirect
4444
github.com/aws/smithy-go v1.13.5 // indirect
45+
github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect
4546
github.com/davecgh/go-spew v1.1.1 // indirect
4647
github.com/dimchansky/utfbom v1.1.1 // indirect
4748
github.com/docker/cli v23.0.1+incompatible // indirect
@@ -73,6 +74,7 @@ require (
7374
github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
7475
github.com/pkg/errors v0.9.1 // indirect
7576
github.com/sirupsen/logrus v1.9.0 // indirect
77+
github.com/vbatts/tar-split v0.11.2 // indirect
7678
golang.org/x/crypto v0.7.0 // indirect
7779
golang.org/x/net v0.8.0 // indirect
7880
golang.org/x/oauth2 v0.6.0 // indirect

pkg/authn/k8schain/go.sum

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/v1/empty/index.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,6 @@ func base() *v1.IndexManifest {
6060
return &v1.IndexManifest{
6161
SchemaVersion: 2,
6262
MediaType: types.OCIImageIndex,
63+
Manifests: []v1.Descriptor{},
6364
}
6465
}

pkg/v1/mutate/mutate_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ func TestAnnotations(t *testing.T) {
289289
}, {
290290
desc: "index",
291291
in: empty.Index,
292-
want: `{"schemaVersion":2,"mediaType":"application/vnd.oci.image.index.v1+json","manifests":null,"annotations":{"foo":"bar"}}`,
292+
want: `{"schemaVersion":2,"mediaType":"application/vnd.oci.image.index.v1+json","manifests":[],"annotations":{"foo":"bar"}}`,
293293
}, {
294294
desc: "arbitrary",
295295
in: arbitrary{},

pkg/v1/remote/descriptor.go

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package remote
1717
import (
1818
"bytes"
1919
"context"
20-
"encoding/json"
2120
"errors"
2221
"fmt"
2322
"io"
@@ -31,6 +30,8 @@ import (
3130
"github.com/google/go-containerregistry/pkg/logs"
3231
"github.com/google/go-containerregistry/pkg/name"
3332
v1 "github.com/google/go-containerregistry/pkg/v1"
33+
"github.com/google/go-containerregistry/pkg/v1/empty"
34+
"github.com/google/go-containerregistry/pkg/v1/mutate"
3435
"github.com/google/go-containerregistry/pkg/v1/partial"
3536
"github.com/google/go-containerregistry/pkg/v1/remote/transport"
3637
"github.com/google/go-containerregistry/pkg/v1/types"
@@ -301,7 +302,7 @@ func fallbackTag(d name.Digest) name.Tag {
301302
return d.Context().Tag(strings.Replace(d.DigestStr(), ":", "-", 1))
302303
}
303304

304-
func (f *fetcher) fetchReferrers(ctx context.Context, filter map[string]string, d name.Digest) (*v1.IndexManifest, error) {
305+
func (f *fetcher) fetchReferrers(ctx context.Context, filter map[string]string, d name.Digest) (v1.ImageIndex, error) {
305306
// Check the Referrers API endpoint first.
306307
u := f.url("referrers", d.DigestStr())
307308
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil)
@@ -319,32 +320,40 @@ func (f *fetcher) fetchReferrers(ctx context.Context, filter map[string]string,
319320
if err := transport.CheckError(resp, http.StatusOK, http.StatusNotFound, http.StatusBadRequest); err != nil {
320321
return nil, err
321322
}
323+
324+
var b []byte
322325
if resp.StatusCode == http.StatusOK {
323-
var im v1.IndexManifest
324-
if err := json.NewDecoder(resp.Body).Decode(&im); err != nil {
326+
b, err = io.ReadAll(resp.Body)
327+
if err != nil {
325328
return nil, err
326329
}
327-
return filterReferrersResponse(filter, &im), nil
328-
}
329-
330-
// The registry doesn't support the Referrers API endpoint, so we'll use the fallback tag scheme.
331-
b, _, err := f.fetchManifest(ctx, fallbackTag(d), []types.MediaType{types.OCIImageIndex})
332-
if err != nil {
330+
} else {
331+
// The registry doesn't support the Referrers API endpoint, so we'll use the fallback tag scheme.
332+
b, _, err = f.fetchManifest(ctx, fallbackTag(d), []types.MediaType{types.OCIImageIndex})
333333
var terr *transport.Error
334-
if ok := errors.As(err, &terr); ok && terr.StatusCode == http.StatusNotFound {
334+
if errors.As(err, &terr) && terr.StatusCode == http.StatusNotFound {
335335
// Not found just means there are no attachments yet. Start with an empty manifest.
336-
return &v1.IndexManifest{MediaType: types.OCIImageIndex}, nil
336+
return empty.Index, nil
337+
} else if err != nil {
338+
return nil, err
337339
}
338-
339-
return nil, err
340340
}
341341

342-
var im v1.IndexManifest
343-
if err := json.Unmarshal(b, &im); err != nil {
342+
h, sz, err := v1.SHA256(bytes.NewReader(b))
343+
if err != nil {
344344
return nil, err
345345
}
346-
347-
return filterReferrersResponse(filter, &im), nil
346+
idx := &remoteIndex{
347+
fetcher: *f,
348+
manifest: b,
349+
mediaType: types.OCIImageIndex,
350+
descriptor: &v1.Descriptor{
351+
Digest: h,
352+
MediaType: types.OCIImageIndex,
353+
Size: sz,
354+
},
355+
}
356+
return filterReferrersResponse(filter, idx), nil
348357
}
349358

350359
func (f *fetcher) fetchManifest(ctx context.Context, ref name.Reference, acceptable []types.MediaType) ([]byte, *v1.Descriptor, error) {
@@ -551,19 +560,15 @@ func (f *fetcher) blobExists(h v1.Hash) (bool, error) {
551560

552561
// If filter applied, filter out by artifactType.
553562
// See https://github.com/opencontainers/distribution-spec/blob/main/spec.md#listing-referrers
554-
func filterReferrersResponse(filter map[string]string, origIndex *v1.IndexManifest) *v1.IndexManifest {
555-
newIndex := origIndex
563+
func filterReferrersResponse(filter map[string]string, in v1.ImageIndex) v1.ImageIndex {
556564
if filter == nil {
557-
return newIndex
558-
}
559-
if v, ok := filter["artifactType"]; ok {
560-
tmp := []v1.Descriptor{}
561-
for _, desc := range newIndex.Manifests {
562-
if desc.ArtifactType == v {
563-
tmp = append(tmp, desc)
564-
}
565-
}
566-
newIndex.Manifests = tmp
565+
return in
566+
}
567+
v, ok := filter["artifactType"]
568+
if !ok {
569+
return in
567570
}
568-
return newIndex
571+
return mutate.RemoveManifests(in, func(desc v1.Descriptor) bool {
572+
return desc.ArtifactType != v
573+
})
569574
}

pkg/v1/remote/referrers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
// Referrers returns a list of descriptors that refer to the given manifest digest.
2323
//
2424
// The subject manifest doesn't have to exist in the registry for there to be descriptors that refer to it.
25-
func Referrers(d name.Digest, options ...Option) (*v1.IndexManifest, error) {
25+
func Referrers(d name.Digest, options ...Option) (v1.ImageIndex, error) {
2626
o, err := makeOptions(options...)
2727
if err != nil {
2828
return nil, err

pkg/v1/remote/referrers_test.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,11 @@ func TestReferrers(t *testing.T) {
100100
if err != nil {
101101
t.Fatal(err)
102102
}
103-
if numManifests := len(index.Manifests); numManifests != 0 {
103+
m, err := index.IndexManifest()
104+
if err != nil {
105+
t.Fatal(err)
106+
}
107+
if numManifests := len(m.Manifests); numManifests != 0 {
104108
t.Fatalf("expected index to contain 0 manifests, but had %d", numManifests)
105109
}
106110

@@ -126,7 +130,12 @@ func TestReferrers(t *testing.T) {
126130
if err != nil {
127131
t.Fatal(err)
128132
}
129-
if d := cmp.Diff([]v1.Descriptor{leafDesc}, index.Manifests); d != "" {
133+
m2, err := index.IndexManifest()
134+
if err != nil {
135+
t.Fatal(err)
136+
}
137+
if d := cmp.Diff([]v1.Descriptor{leafDesc}, m2.Manifests); d != "" {
138+
t.Logf("m2.Manifests: %v", m2.Manifests)
130139
t.Fatalf("referrers diff (-want,+got): %s", d)
131140
}
132141

@@ -144,7 +153,11 @@ func TestReferrers(t *testing.T) {
144153
if err != nil {
145154
t.Fatal(err)
146155
}
147-
if d := cmp.Diff(index.Manifests, mf.Manifests); d != "" {
156+
m2, err := index.IndexManifest()
157+
if err != nil {
158+
t.Fatal(err)
159+
}
160+
if d := cmp.Diff(m2.Manifests, mf.Manifests); d != "" {
148161
t.Fatalf("fallback tag diff (-want,+got): %s", d)
149162
}
150163
}
@@ -166,7 +179,11 @@ func TestReferrers(t *testing.T) {
166179
if err != nil {
167180
t.Fatal(err)
168181
}
169-
if d := cmp.Diff([]v1.Descriptor{leafDesc}, index.Manifests); d != "" {
182+
m3, err := index.IndexManifest()
183+
if err != nil {
184+
t.Fatal(err)
185+
}
186+
if d := cmp.Diff([]v1.Descriptor{leafDesc}, m3.Manifests); d != "" {
170187
t.Fatalf("referrers diff after second push (-want,+got): %s", d)
171188
}
172189

@@ -176,7 +193,11 @@ func TestReferrers(t *testing.T) {
176193
if err != nil {
177194
t.Fatal(err)
178195
}
179-
if numManifests := len(index.Manifests); numManifests == 0 {
196+
m4, err := index.IndexManifest()
197+
if err != nil {
198+
t.Fatal(err)
199+
}
200+
if numManifests := len(m4.Manifests); numManifests == 0 {
180201
t.Fatal("index contained 0 manifests")
181202
}
182203

@@ -185,7 +206,11 @@ func TestReferrers(t *testing.T) {
185206
if err != nil {
186207
t.Fatal(err)
187208
}
188-
if numManifests := len(index.Manifests); numManifests != 0 {
209+
m5, err := index.IndexManifest()
210+
if err != nil {
211+
t.Fatal(err)
212+
}
213+
if numManifests := len(m5.Manifests); numManifests != 0 {
189214
t.Fatalf("expected index to contain 0 manifests, but had %d", numManifests)
190215
}
191216
}

0 commit comments

Comments
 (0)