Skip to content

Commit d1e67cf

Browse files
authored
Refactor remote.ImageOption (#432)
1 parent c3ea05f commit d1e67cf

18 files changed

+127
-135
lines changed

pkg/crane/append.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package crane
1616

1717
import (
1818
"log"
19-
"net/http"
2019

2120
"github.com/google/go-containerregistry/pkg/authn"
2221
"github.com/google/go-containerregistry/pkg/name"
@@ -82,12 +81,7 @@ func doAppend(src, dst, tar, output string) {
8281
return
8382
}
8483

85-
dstAuth, err := authn.DefaultKeychain.Resolve(dstTag.Context().Registry)
86-
if err != nil {
87-
log.Fatalf("getting creds for %q: %v", dstTag, err)
88-
}
89-
90-
if err := remote.Write(dstTag, image, dstAuth, http.DefaultTransport); err != nil {
84+
if err := remote.Write(dstTag, image, remote.WithAuthFromKeychain(authn.DefaultKeychain)); err != nil {
9185
log.Fatalf("writing image %q: %v", dstTag, err)
9286
}
9387
}

pkg/crane/copy.go

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package crane
1616

1717
import (
1818
"log"
19-
"net/http"
2019

2120
"github.com/google/go-containerregistry/pkg/authn"
2221
"github.com/google/go-containerregistry/pkg/name"
@@ -46,48 +45,43 @@ func doCopy(_ *cobra.Command, args []string) {
4645
}
4746
log.Printf("Pulling %v", srcRef)
4847

49-
dstRef, err := name.ParseReference(dst)
50-
if err != nil {
51-
log.Fatalf("parsing reference %q: %v", dst, err)
52-
}
53-
log.Printf("Pushing %v", dstRef)
54-
55-
dstAuth, err := authn.DefaultKeychain.Resolve(dstRef.Context().Registry)
48+
desc, err := remote.Get(srcRef, remote.WithAuthFromKeychain(authn.DefaultKeychain))
5649
if err != nil {
57-
log.Fatalf("getting creds for %q: %v", dstRef, err)
50+
log.Fatalf("fetching image %q: %v", srcRef, err)
5851
}
5952

60-
desc, err := remote.Get(srcRef, remote.WithAuthFromKeychain(authn.DefaultKeychain))
53+
dstRef, err := name.ParseReference(dst)
6154
if err != nil {
62-
log.Fatalf("fetching image %q: %v", srcRef, err)
55+
log.Fatalf("parsing reference %q: %v", dst, err)
6356
}
57+
log.Printf("Pushing %v", dstRef)
6458

6559
switch desc.MediaType {
6660
case types.OCIImageIndex, types.DockerManifestList:
6761
// Handle indexes separately.
68-
if err := copyIndex(desc, dstRef, dstAuth); err != nil {
62+
if err := copyIndex(desc, dstRef); err != nil {
6963
log.Fatalf("failed to copy index: %v", err)
7064
}
7165
default:
7266
// Assume anything else is an image, since some registries don't set mediaTypes properly.
73-
if err := copyImage(desc, dstRef, dstAuth); err != nil {
67+
if err := copyImage(desc, dstRef); err != nil {
7468
log.Fatalf("failed to copy image: %v", err)
7569
}
7670
}
7771
}
7872

79-
func copyImage(desc *remote.Descriptor, dstRef name.Reference, dstAuth authn.Authenticator) error {
73+
func copyImage(desc *remote.Descriptor, dstRef name.Reference) error {
8074
img, err := desc.Image()
8175
if err != nil {
8276
return err
8377
}
84-
return remote.Write(dstRef, img, dstAuth, http.DefaultTransport)
78+
return remote.Write(dstRef, img, remote.WithAuthFromKeychain(authn.DefaultKeychain))
8579
}
8680

87-
func copyIndex(desc *remote.Descriptor, dstRef name.Reference, dstAuth authn.Authenticator) error {
81+
func copyIndex(desc *remote.Descriptor, dstRef name.Reference) error {
8882
idx, err := desc.ImageIndex()
8983
if err != nil {
9084
return err
9185
}
92-
return remote.WriteIndex(dstRef, idx, dstAuth, http.DefaultTransport)
86+
return remote.WriteIndex(dstRef, idx, remote.WithAuthFromKeychain(authn.DefaultKeychain))
9387
}

pkg/crane/delete.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package crane
1616

1717
import (
1818
"log"
19-
"net/http"
2019

2120
"github.com/google/go-containerregistry/pkg/authn"
2221
"github.com/google/go-containerregistry/pkg/name"
@@ -43,12 +42,7 @@ func doDelete(_ *cobra.Command, args []string) {
4342
log.Fatalf("parsing reference %q: %v", ref, err)
4443
}
4544

46-
auth, err := authn.DefaultKeychain.Resolve(r.Context().Registry)
47-
if err != nil {
48-
log.Fatalf("getting creds for %q: %v", r, err)
49-
}
50-
51-
if err := remote.Delete(r, auth, http.DefaultTransport); err != nil {
45+
if err := remote.Delete(r, remote.WithAuthFromKeychain(authn.DefaultKeychain)); err != nil {
5246
log.Fatalf("deleting image %q: %v", r, err)
5347
}
5448
}

pkg/crane/list.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package crane
1717
import (
1818
"fmt"
1919
"log"
20-
"net/http"
2120

2221
"github.com/google/go-containerregistry/pkg/authn"
2322
"github.com/google/go-containerregistry/pkg/name"
@@ -44,12 +43,7 @@ func ls(_ *cobra.Command, args []string) {
4443
log.Fatalf("parsing repo %q: %v", r, err)
4544
}
4645

47-
auth, err := authn.DefaultKeychain.Resolve(repo.Registry)
48-
if err != nil {
49-
log.Fatalf("getting creds for %q: %v", repo, err)
50-
}
51-
52-
tags, err := remote.List(repo, auth, http.DefaultTransport)
46+
tags, err := remote.List(repo, remote.WithAuthFromKeychain(authn.DefaultKeychain))
5347
if err != nil {
5448
log.Fatalf("reading tags for %q: %v", repo, err)
5549
}

pkg/crane/push.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package crane
1616

1717
import (
1818
"log"
19-
"net/http"
2019

2120
"github.com/google/go-containerregistry/pkg/authn"
2221
"github.com/google/go-containerregistry/pkg/name"
@@ -45,17 +44,12 @@ func push(_ *cobra.Command, args []string) {
4544
}
4645
log.Printf("Pushing %v", t)
4746

48-
auth, err := authn.DefaultKeychain.Resolve(t.Registry)
49-
if err != nil {
50-
log.Fatalf("getting creds for %q: %v", t, err)
51-
}
52-
5347
i, err := tarball.ImageFromPath(src, nil)
5448
if err != nil {
5549
log.Fatalf("reading image %q: %v", src, err)
5650
}
5751

58-
if err := remote.Write(t, i, auth, http.DefaultTransport); err != nil {
52+
if err := remote.Write(t, i, remote.WithAuthFromKeychain(authn.DefaultKeychain)); err != nil {
5953
log.Fatalf("writing image %q: %v", t, err)
6054
}
6155
}

pkg/crane/rebase.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package crane
1717
import (
1818
"fmt"
1919
"log"
20-
"net/http"
2120

2221
"github.com/google/go-containerregistry/pkg/authn"
2322
"github.com/google/go-containerregistry/pkg/name"
@@ -86,12 +85,7 @@ func rebase(orig, oldBase, newBase, rebased string) {
8685
log.Fatalf("digesting rebased: %v", err)
8786
}
8887

89-
auth, err := authn.DefaultKeychain.Resolve(rebasedTag.Context().Registry)
90-
if err != nil {
91-
log.Fatalf("getting creds for %q: %v", rebasedTag, err)
92-
}
93-
94-
if err := remote.Write(rebasedTag, rebasedImg, auth, http.DefaultTransport); err != nil {
88+
if err := remote.Write(rebasedTag, rebasedImg, remote.WithAuthFromKeychain(authn.DefaultKeychain)); err != nil {
9589
log.Fatalf("writing image %q: %v", rebasedTag, err)
9690
}
9791
fmt.Print(dig.String())

pkg/gcrane/copy.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"context"
1919
"fmt"
2020
"log"
21-
"net/http"
2221
"strings"
2322

2423
"github.com/google/go-containerregistry/pkg/authn"
@@ -126,7 +125,7 @@ func copyImage(src, dst string, srcAuth, dstAuth authn.Authenticator) error {
126125
return fmt.Errorf("reading image %q: %v", src, err)
127126
}
128127

129-
if err := remote.Write(dstRef, img, dstAuth, http.DefaultTransport); err != nil {
128+
if err := remote.Write(dstRef, img, remote.WithAuth(dstAuth)); err != nil {
130129
return fmt.Errorf("writing image %q: %v", dst, err)
131130
}
132131

@@ -149,7 +148,7 @@ func copyIndex(src, dst string, srcAuth, dstAuth authn.Authenticator) error {
149148
return fmt.Errorf("reading image %q: %v", src, err)
150149
}
151150

152-
if err := remote.WriteIndex(dstRef, idx, dstAuth, http.DefaultTransport); err != nil {
151+
if err := remote.WriteIndex(dstRef, idx, remote.WithAuth(dstAuth)); err != nil {
153152
return fmt.Errorf("writing image %q: %v", dst, err)
154153
}
155154

pkg/registry/compatability_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package registry_test
22

33
import (
44
"bytes"
5-
"net/http"
65
"net/http/httptest"
76
"strings"
87
"testing"
@@ -29,7 +28,7 @@ func TestPushAndPullContainer(t *testing.T) {
2928
t.Fatalf("Unable to make random image: %v", err)
3029
}
3130

32-
if err := remote.Write(d, i, nil, http.DefaultTransport); err != nil {
31+
if err := remote.Write(d, i); err != nil {
3332
t.Fatalf("Error writing image : %v", err)
3433
}
3534

pkg/v1/remote/delete.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,18 @@ import (
2020
"net/http"
2121
"net/url"
2222

23-
"github.com/google/go-containerregistry/pkg/authn"
2423
"github.com/google/go-containerregistry/pkg/name"
2524
"github.com/google/go-containerregistry/pkg/v1/remote/transport"
2625
)
2726

2827
// Delete removes the specified image reference from the remote registry.
29-
func Delete(ref name.Reference, auth authn.Authenticator, t http.RoundTripper) error {
28+
func Delete(ref name.Reference, options ...Option) error {
29+
o, err := makeOptions(ref.Context().Registry, options...)
30+
if err != nil {
31+
return err
32+
}
3033
scopes := []string{ref.Scope(transport.DeleteScope)}
31-
tr, err := transport.New(ref.Context().Registry, auth, t, scopes)
34+
tr, err := transport.New(ref.Context().Registry, o.auth, o.transport, scopes)
3235
if err != nil {
3336
return err
3437
}

pkg/v1/remote/delete_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"net/url"
2222
"testing"
2323

24-
"github.com/google/go-containerregistry/pkg/authn"
2524
"github.com/google/go-containerregistry/pkg/name"
2625
)
2726

@@ -52,7 +51,7 @@ func TestDelete(t *testing.T) {
5251
t.Fatalf("NewTag() = %v", err)
5352
}
5453

55-
if err := Delete(tag, authn.Anonymous, http.DefaultTransport); err != nil {
54+
if err := Delete(tag); err != nil {
5655
t.Errorf("Delete() = %v", err)
5756
}
5857
}
@@ -84,7 +83,7 @@ func TestDeleteBadStatus(t *testing.T) {
8483
t.Fatalf("NewTag() = %v", err)
8584
}
8685

87-
if err := Delete(tag, authn.Anonymous, http.DefaultTransport); err == nil {
86+
if err := Delete(tag); err == nil {
8887
t.Error("Delete() = nil; wanted error")
8988
}
9089
}

pkg/v1/remote/descriptor.go

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"net/url"
2424
"strings"
2525

26-
"github.com/google/go-containerregistry/pkg/authn"
2726
"github.com/google/go-containerregistry/pkg/name"
2827
v1 "github.com/google/go-containerregistry/pkg/v1"
2928
"github.com/google/go-containerregistry/pkg/v1/partial"
@@ -52,17 +51,10 @@ type Descriptor struct {
5251
platform v1.Platform
5352
}
5453

55-
type imageOpener struct {
56-
auth authn.Authenticator
57-
transport http.RoundTripper
58-
ref name.Reference
59-
platform v1.Platform
60-
}
61-
6254
// Get returns a remote.Descriptor for the given reference. The response from
6355
// the registry is left un-interpreted, for the most part. This is useful for
6456
// querying what kind of artifact a reference represents.
65-
func Get(ref name.Reference, options ...ImageOption) (*Descriptor, error) {
57+
func Get(ref name.Reference, options ...Option) (*Descriptor, error) {
6658
acceptable := []types.MediaType{
6759
types.DockerManifestSchema2,
6860
types.OCIManifestSchema1,
@@ -77,26 +69,19 @@ func Get(ref name.Reference, options ...ImageOption) (*Descriptor, error) {
7769

7870
// Handle options and fetch the manifest with the acceptable MediaTypes in the
7971
// Accept header.
80-
func get(ref name.Reference, acceptable []types.MediaType, options ...ImageOption) (*Descriptor, error) {
81-
i := &imageOpener{
82-
auth: authn.Anonymous,
83-
transport: http.DefaultTransport,
84-
ref: ref,
85-
platform: defaultPlatform,
72+
func get(ref name.Reference, acceptable []types.MediaType, options ...Option) (*Descriptor, error) {
73+
o, err := makeOptions(ref.Context().Registry, options...)
74+
if err != nil {
75+
return nil, err
8676
}
8777

88-
for _, option := range options {
89-
if err := option(i); err != nil {
90-
return nil, err
91-
}
92-
}
93-
tr, err := transport.New(i.ref.Context().Registry, i.auth, i.transport, []string{i.ref.Scope(transport.PullScope)})
78+
tr, err := transport.New(ref.Context().Registry, o.auth, o.transport, []string{ref.Scope(transport.PullScope)})
9479
if err != nil {
9580
return nil, err
9681
}
9782

9883
f := fetcher{
99-
Ref: i.ref,
84+
Ref: ref,
10085
Client: &http.Client{Transport: tr},
10186
}
10287

@@ -109,7 +94,7 @@ func get(ref name.Reference, acceptable []types.MediaType, options ...ImageOptio
10994
fetcher: f,
11095
Manifest: b,
11196
Descriptor: *desc,
112-
platform: i.platform,
97+
platform: o.platform,
11398
}, nil
11499
}
115100

pkg/v1/remote/image.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ type remoteImage struct {
4141

4242
var _ partial.CompressedImageCore = (*remoteImage)(nil)
4343

44-
// Image provides access to a remote image reference, applying functional options
45-
// to the underlying imageOpener before resolving the reference into a v1.Image.
46-
func Image(ref name.Reference, options ...ImageOption) (v1.Image, error) {
44+
// Image provides access to a remote image reference.
45+
func Image(ref name.Reference, options ...Option) (v1.Image, error) {
4746
acceptable := []types.MediaType{
4847
types.DockerManifestSchema2,
4948
types.OCIManifestSchema1,

pkg/v1/remote/index.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,8 @@ type remoteIndex struct {
3333
mediaType types.MediaType
3434
}
3535

36-
// Index provides access to a remote index reference, applying functional options
37-
// to the underlying imageOpener before resolving the reference into a v1.ImageIndex.
38-
func Index(ref name.Reference, options ...ImageOption) (v1.ImageIndex, error) {
36+
// Index provides access to a remote index reference.
37+
func Index(ref name.Reference, options ...Option) (v1.ImageIndex, error) {
3938
acceptable := []types.MediaType{
4039
types.DockerManifestList,
4140
types.OCIImageIndex,

pkg/v1/remote/list.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"net/http"
2121
"net/url"
2222

23-
"github.com/google/go-containerregistry/pkg/authn"
2423
"github.com/google/go-containerregistry/pkg/name"
2524
"github.com/google/go-containerregistry/pkg/v1/remote/transport"
2625
)
@@ -30,10 +29,15 @@ type tags struct {
3029
Tags []string `json:"tags"`
3130
}
3231

33-
// List calls /tags/list for the given repository.
34-
func List(repo name.Repository, auth authn.Authenticator, t http.RoundTripper) ([]string, error) {
32+
// List calls /tags/list for the given repository, returning the list of tags
33+
// in the "tags" property.
34+
func List(repo name.Repository, options ...Option) ([]string, error) {
35+
o, err := makeOptions(repo.Registry, options...)
36+
if err != nil {
37+
return nil, err
38+
}
3539
scopes := []string{repo.Scope(transport.PullScope)}
36-
tr, err := transport.New(repo.Registry, auth, t, scopes)
40+
tr, err := transport.New(repo.Registry, o.auth, o.transport, scopes)
3741
if err != nil {
3842
return nil, err
3943
}

0 commit comments

Comments
 (0)