Proposed fix for image content store

Signed-off-by: Daniel Nephin <dnephin@gmail.com>
This commit is contained in:
Daniel Nephin 2017-11-22 17:36:24 -05:00
parent a21a19a658
commit f6e877e8be
4 changed files with 10 additions and 10 deletions

View File

@ -32,6 +32,8 @@ type Image interface {
Config(ctx context.Context) (ocispec.Descriptor, error) Config(ctx context.Context) (ocispec.Descriptor, error)
// IsUnpacked returns whether or not an image is unpacked. // IsUnpacked returns whether or not an image is unpacked.
IsUnpacked(context.Context, string) (bool, error) IsUnpacked(context.Context, string) (bool, error)
// ContentStore provides a content store which contains image blob data
ContentStore() content.Store
} }
var _ = (Image)(&image{}) var _ = (Image)(&image{})
@ -166,3 +168,7 @@ func (i *image) getLayers(ctx context.Context, platform string) ([]rootfs.Layer,
} }
return layers, nil return layers, nil
} }
func (i *image) ContentStore() content.Store {
return i.client.ContentStore()
}

View File

@ -11,11 +11,12 @@ import (
// Client interface used by SpecOpt // Client interface used by SpecOpt
type Client interface { type Client interface {
SnapshotService(snapshotterName string) snapshot.Snapshotter SnapshotService(snapshotterName string) snapshot.Snapshotter
ContentStore() content.Store
} }
// Image interface used by some SpecOpt to query image configuration // Image interface used by some SpecOpt to query image configuration
type Image interface { type Image interface {
// Config descriptor for the image. // Config descriptor for the image.
Config(ctx context.Context) (ocispec.Descriptor, error) Config(ctx context.Context) (ocispec.Descriptor, error)
// ContentStore provides a content store which contains image blob data
ContentStore() content.Store
} }

View File

@ -67,12 +67,6 @@ func WithLinuxNamespace(ns specs.LinuxNamespace) SpecOpts {
// WithImageConfig configures the spec to from the configuration of an Image // WithImageConfig configures the spec to from the configuration of an Image
func WithImageConfig(image Image) SpecOpts { func WithImageConfig(image Image) SpecOpts {
return func(ctx context.Context, client Client, c *containers.Container, s *specs.Spec) error { return func(ctx context.Context, client Client, c *containers.Container, s *specs.Spec) error {
store := client.ContentStore()
// TODO: needs review. Previous this passed in a store, now it's using
// a store that is part of the client. This makes the assumption that
// the client store is the same as the one wrapped by `image`.
// Is this assumption safe? Should the interface be changed to accept
// a store instead of wrapping one?
ic, err := image.Config(ctx) ic, err := image.Config(ctx)
if err != nil { if err != nil {
return err return err
@ -83,7 +77,7 @@ func WithImageConfig(image Image) SpecOpts {
) )
switch ic.MediaType { switch ic.MediaType {
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config: case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
p, err := content.ReadBlob(ctx, store, ic.Digest) p, err := content.ReadBlob(ctx, image.ContentStore(), ic.Digest)
if err != nil { if err != nil {
return err return err
} }

View File

@ -17,7 +17,6 @@ import (
// WithImageConfig configures the spec to from the configuration of an Image // WithImageConfig configures the spec to from the configuration of an Image
func WithImageConfig(image Image) SpecOpts { func WithImageConfig(image Image) SpecOpts {
return func(ctx context.Context, client Client, _ *containers.Container, s *specs.Spec) error { return func(ctx context.Context, client Client, _ *containers.Container, s *specs.Spec) error {
store := client.ContentStore()
ic, err := image.Config(ctx) ic, err := image.Config(ctx)
if err != nil { if err != nil {
return err return err
@ -28,7 +27,7 @@ func WithImageConfig(image Image) SpecOpts {
) )
switch ic.MediaType { switch ic.MediaType {
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config: case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
p, err := content.ReadBlob(ctx, store, ic.Digest) p, err := content.ReadBlob(ctx, image.ContentStore(), ic.Digest)
if err != nil { if err != nil {
return err return err
} }