diff --git a/integration/integration_test.go b/integration/integration_test.go index 81ee83f7a..8a875eddf 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -275,7 +275,7 @@ func numLayers(image string) (int, error) { if err != nil { return 0, err } - img, err := daemon.Image(ref, &daemon.ReadOptions{}) + img, err := daemon.Image(ref) if err != nil { return 0, err } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go index 13a93b6c1..9783ff4af 100644 --- a/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go @@ -30,14 +30,42 @@ import ( // image accesses an image from a docker daemon type image struct { v1.Image -} -type ReadOptions struct { - Buffer bool + opener tarball.Opener + ref name.Reference } var _ v1.Image = (*image)(nil) +type imageOpener struct { + ref name.Reference + buffered bool +} + +type ImageOption func(*imageOpener) error + +func (i *imageOpener) Open() (v1.Image, error) { + var opener tarball.Opener + var err error + if i.buffered { + opener, err = bufferedOpener(i.ref) + } else { + opener, err = unbufferedOpener(i.ref) + } + if err != nil { + return nil, err + } + + tb, err := tarball.Image(opener, nil) + if err != nil { + return nil, err + } + img := &image{ + Image: tb, + } + return img, nil +} + // API interface for testing. type ImageSaver interface { ImageSave(context.Context, []string) (io.ReadCloser, error) @@ -83,25 +111,18 @@ func unbufferedOpener(ref name.Reference) (tarball.Opener, error) { }, nil } -// Image exposes an image reference from within the Docker daemon. -func Image(ref name.Reference, ro *ReadOptions) (v1.Image, error) { - var opener tarball.Opener - var err error - if ro.Buffer { - opener, err = bufferedOpener(ref) - } else { - opener, err = unbufferedOpener(ref) +// Image provides access to an image reference from the Docker daemon, +// applying functional options to the underlying imageOpener before +// resolving the reference into a v1.Image. +func Image(ref name.Reference, options ...ImageOption) (v1.Image, error) { + i := &imageOpener{ + ref: ref, + buffered: true, // buffer by default } - if err != nil { - return nil, err + for _, option := range options { + if err := option(i); err != nil { + return nil, err + } } - - tb, err := tarball.Image(opener, nil) - if err != nil { - return nil, err - } - img := &image{ - Image: tb, - } - return img, nil + return i.Open() } diff --git a/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go new file mode 100644 index 000000000..393507660 --- /dev/null +++ b/vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go @@ -0,0 +1,32 @@ +// Copyright 2018 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package daemon + +func WithBufferedOpener() ImageOption { + return func(i *imageOpener) error { + return i.setBuffered(true) + } +} + +func WithUnbufferedOpener() ImageOption { + return func(i *imageOpener) error { + return i.setBuffered(false) + } +} + +func (i *imageOpener) setBuffered(buffer bool) error { + i.buffered = buffer + return nil +}