Proposed fix for image content store
Signed-off-by: Daniel Nephin <dnephin@gmail.com>
This commit is contained in:
		
							
								
								
									
										6
									
								
								image.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								image.go
									
									
									
									
									
								
							| @@ -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() | ||||||
|  | } | ||||||
|   | |||||||
| @@ -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 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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 | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -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 | ||||||
| 			} | 			} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Daniel Nephin
					Daniel Nephin