mirror of https://github.com/containers/image.git
types: change LayerInfosForCopy to return an error
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
parent
8435227ff2
commit
3b84e21f38
|
|
@ -368,7 +368,10 @@ func (ic *imageCopier) copyLayers() error {
|
|||
srcInfos := ic.src.LayerInfos()
|
||||
destInfos := []types.BlobInfo{}
|
||||
diffIDs := []digest.Digest{}
|
||||
updatedSrcInfos := ic.src.LayerInfosForCopy()
|
||||
updatedSrcInfos, err := ic.src.LayerInfosForCopy()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
srcInfosUpdated := false
|
||||
if updatedSrcInfos != nil && !reflect.DeepEqual(srcInfos, updatedSrcInfos) {
|
||||
if !ic.canModifyManifest {
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ func (f fakeImageSource) OCIConfig() (*v1.Image, error) {
|
|||
func (f fakeImageSource) LayerInfos() []types.BlobInfo {
|
||||
panic("Unexpected call to a mock function")
|
||||
}
|
||||
func (f fakeImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
func (f fakeImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
panic("Unexpected call to a mock function")
|
||||
}
|
||||
func (f fakeImageSource) EmbeddedDockerReferenceConflicts(ref reference.Named) bool {
|
||||
|
|
|
|||
|
|
@ -84,6 +84,6 @@ func (s *dirImageSource) GetSignatures(ctx context.Context, instanceDigest *dige
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when copying, in preference to values in the manifest, if specified.
|
||||
func (s *dirImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (s *dirImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,6 @@ func (s *archiveImageSource) Close() error {
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when reading, in preference to values in the manifest, if specified.
|
||||
func (s *archiveImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (s *archiveImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,6 +83,6 @@ func (s *daemonImageSource) Close() error {
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when reading, in preference to values in the manifest, if specified.
|
||||
func (s *daemonImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (s *daemonImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,8 +53,8 @@ func (s *dockerImageSource) Close() error {
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when reading, in preference to values in the manifest, if specified.
|
||||
func (s *dockerImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (s *dockerImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// simplifyContentType drops parameters from a HTTP media type (see https://tools.ietf.org/html/rfc7231#section-3.1.1.1)
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ func (f unusedImageSource) GetBlob(info types.BlobInfo) (io.ReadCloser, int64, e
|
|||
func (f unusedImageSource) GetSignatures(context.Context, *digest.Digest) ([][]byte, error) {
|
||||
panic("Unexpected call to a mock function")
|
||||
}
|
||||
func (f unusedImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
func (f unusedImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
panic("Unexpected call to a mock function")
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,6 @@ func (i *memoryImage) Inspect() (*types.ImageInspectInfo, error) {
|
|||
// LayerInfosForCopy returns an updated set of layer blob information which may not match the manifest.
|
||||
// The Digest field is guaranteed to be provided; Size may be -1.
|
||||
// WARNING: The list may contain duplicates, and they are semantically relevant.
|
||||
func (i *memoryImage) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (i *memoryImage) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -101,6 +101,6 @@ func (i *sourcedImage) Inspect() (*types.ImageInspectInfo, error) {
|
|||
return inspectManifest(i.genericManifest)
|
||||
}
|
||||
|
||||
func (i *sourcedImage) LayerInfosForCopy() []types.BlobInfo {
|
||||
func (i *sourcedImage) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return i.UnparsedImage.LayerInfosForCopy()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,6 +97,6 @@ func (i *UnparsedImage) Signatures(ctx context.Context) ([][]byte, error) {
|
|||
// LayerInfosForCopy returns an updated set of layer blob information which may not match the manifest.
|
||||
// The Digest field is guaranteed to be provided; Size may be -1.
|
||||
// WARNING: The list may contain duplicates, and they are semantically relevant.
|
||||
func (i *UnparsedImage) LayerInfosForCopy() []types.BlobInfo {
|
||||
func (i *UnparsedImage) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return i.src.LayerInfosForCopy()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,6 +90,6 @@ func (s *ociArchiveImageSource) GetSignatures(ctx context.Context, instanceDiges
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when reading, in preference to values in the manifest, if specified.
|
||||
func (s *ociArchiveImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (s *ociArchiveImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ func (s *ociImageSource) getExternalBlob(urls []string) (io.ReadCloser, int64, e
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when reading, in preference to values in the manifest, if specified.
|
||||
func (s *ociImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (s *ociImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func getBlobSize(resp *http.Response) int64 {
|
||||
|
|
|
|||
|
|
@ -247,8 +247,8 @@ func (s *openshiftImageSource) GetSignatures(ctx context.Context, instanceDigest
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when reading, in preference to values in the manifest, if specified.
|
||||
func (s *openshiftImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (s *openshiftImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// ensureImageIsResolved sets up s.docker and s.imageStreamImageName
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ func (ref refImageMock) Manifest() ([]byte, string, error) {
|
|||
func (ref refImageMock) Signatures(context.Context) ([][]byte, error) {
|
||||
panic("unexpected call to a mock function")
|
||||
}
|
||||
func (ref refImageMock) LayerInfosForCopy() []types.BlobInfo {
|
||||
func (ref refImageMock) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
panic("unexpected call to a mock function")
|
||||
}
|
||||
|
||||
|
|
@ -335,7 +335,7 @@ func (ref forbiddenImageMock) Manifest() ([]byte, string, error) {
|
|||
func (ref forbiddenImageMock) Signatures(context.Context) ([][]byte, error) {
|
||||
panic("unexpected call to a mock function")
|
||||
}
|
||||
func (ref forbiddenImageMock) LayerInfosForCopy() []types.BlobInfo {
|
||||
func (ref forbiddenImageMock) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
panic("unexpected call to a mock function")
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -177,18 +177,18 @@ func (s *storageImageSource) GetManifest(instanceDigest *digest.Digest) (manifes
|
|||
|
||||
// LayerInfosForCopy() returns the list of layer blobs that make up the root filesystem of
|
||||
// the image, after they've been decompressed.
|
||||
func (s *storageImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
func (s *storageImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
simg, err := s.imageRef.transport.store.Image(s.ID)
|
||||
if err != nil {
|
||||
logrus.Errorf("error reading image %q: %v", s.ID, err)
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
updatedBlobInfos := []types.BlobInfo{}
|
||||
layerID := simg.TopLayer
|
||||
_, manifestType, err := s.GetManifest(nil)
|
||||
if err != nil {
|
||||
logrus.Errorf("error reading image manifest for %q: %v", s.ID, err)
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
uncompressedLayerType := ""
|
||||
switch manifestType {
|
||||
|
|
@ -202,15 +202,15 @@ func (s *storageImageSource) LayerInfosForCopy() []types.BlobInfo {
|
|||
layer, err := s.imageRef.transport.store.Layer(layerID)
|
||||
if err != nil {
|
||||
logrus.Errorf("error reading layer %q in image %q: %v", layerID, s.ID, err)
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
if layer.UncompressedDigest == "" {
|
||||
logrus.Errorf("uncompressed digest for layer %q is unknown", layerID)
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
if layer.UncompressedSize < 0 {
|
||||
logrus.Errorf("uncompressed size for layer %q is unknown", layerID)
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
blobInfo := types.BlobInfo{
|
||||
Digest: layer.UncompressedDigest,
|
||||
|
|
@ -220,7 +220,7 @@ func (s *storageImageSource) LayerInfosForCopy() []types.BlobInfo {
|
|||
updatedBlobInfos = append([]types.BlobInfo{blobInfo}, updatedBlobInfos...)
|
||||
layerID = layer.Parent
|
||||
}
|
||||
return updatedBlobInfos
|
||||
return updatedBlobInfos, nil
|
||||
}
|
||||
|
||||
// GetSignatures() parses the image's signatures blob into a slice of byte slices.
|
||||
|
|
|
|||
|
|
@ -1012,7 +1012,11 @@ func TestDuplicateBlob(t *testing.T) {
|
|||
t.Fatalf("ImageSource is not a storage image")
|
||||
}
|
||||
layers := []string{}
|
||||
for _, layerInfo := range img.LayerInfosForCopy() {
|
||||
layersInfo, err := img.LayerInfosForCopy()
|
||||
if err != nil {
|
||||
t.Fatalf("LayerInfosForCopy() returned error %v", err)
|
||||
}
|
||||
for _, layerInfo := range layersInfo {
|
||||
rc, _, layerID, err := source.getBlobAndLayerID(layerInfo)
|
||||
if err != nil {
|
||||
t.Fatalf("getBlobAndLayerID(%q) returned error %v", layerInfo.Digest, err)
|
||||
|
|
|
|||
|
|
@ -255,6 +255,6 @@ func (is *tarballImageSource) Reference() types.ImageReference {
|
|||
}
|
||||
|
||||
// LayerInfosForCopy() returns updated layer info that should be used when reading, in preference to values in the manifest, if specified.
|
||||
func (*tarballImageSource) LayerInfosForCopy() []types.BlobInfo {
|
||||
return nil
|
||||
func (*tarballImageSource) LayerInfosForCopy() ([]types.BlobInfo, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ type ImageSource interface {
|
|||
// LayerInfosForCopy returns either nil (meaning the values in the manifest are fine), or updated values for the layer blobsums that are listed in the image's manifest.
|
||||
// The Digest field is guaranteed to be provided; Size may be -1.
|
||||
// WARNING: The list may contain duplicates, and they are semantically relevant.
|
||||
LayerInfosForCopy() []BlobInfo
|
||||
LayerInfosForCopy() ([]BlobInfo, error)
|
||||
}
|
||||
|
||||
// ImageDestination is a service, possibly remote (= slow), to store components of a single image.
|
||||
|
|
@ -218,7 +218,7 @@ type UnparsedImage interface {
|
|||
// LayerInfosForCopy returns either nil (meaning the values in the manifest are fine), or updated values for the layer blobsums that are listed in the image's manifest.
|
||||
// The Digest field is guaranteed to be provided, Size may be -1 and MediaType may be optionally provided.
|
||||
// WARNING: The list may contain duplicates, and they are semantically relevant.
|
||||
LayerInfosForCopy() []BlobInfo
|
||||
LayerInfosForCopy() ([]BlobInfo, error)
|
||||
}
|
||||
|
||||
// Image is the primary API for inspecting properties of images.
|
||||
|
|
|
|||
Loading…
Reference in New Issue