mirror of https://github.com/containers/common.git
Merge pull request #1630 from vrothberg/oci-ref
libimage: preserve optional name when pulling from OCI transport
This commit is contained in:
commit
12405381ff
|
@ -230,8 +230,18 @@ func (r *Runtime) copyFromDefault(ctx context.Context, ref types.ImageReference,
|
||||||
|
|
||||||
case ociTransport.Transport.Name():
|
case ociTransport.Transport.Name():
|
||||||
split := strings.SplitN(ref.StringWithinTransport(), ":", 2)
|
split := strings.SplitN(ref.StringWithinTransport(), ":", 2)
|
||||||
storageName = toLocalImageName(split[0])
|
if len(split) == 1 || split[1] == "" {
|
||||||
imageName = storageName
|
// Same trick as for the dir transport: we cannot use
|
||||||
|
// the path to a directory as the name.
|
||||||
|
storageName, err = getImageID(ctx, ref, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
imageName = "sha256:" + storageName[1:]
|
||||||
|
} else { // If the OCI-reference includes an image reference, use it
|
||||||
|
storageName = split[1]
|
||||||
|
imageName = storageName
|
||||||
|
}
|
||||||
|
|
||||||
case ociArchiveTransport.Transport.Name():
|
case ociArchiveTransport.Transport.Name():
|
||||||
manifestDescriptor, err := ociArchiveTransport.LoadManifestDescriptorWithContext(r.SystemContext(), ref)
|
manifestDescriptor, err := ociArchiveTransport.LoadManifestDescriptorWithContext(r.SystemContext(), ref)
|
||||||
|
|
|
@ -220,3 +220,52 @@ func TestShortNameAndIDconflict(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, busybox[0].ID(), img.ID())
|
require.Equal(t, busybox[0].ID(), img.ID())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPullOCINoReference(t *testing.T) {
|
||||||
|
// Exercise pulling from the OCI transport and make sure that a
|
||||||
|
// specified reference is preserved in the image name.
|
||||||
|
|
||||||
|
busybox := "docker.io/library/busybox:latest"
|
||||||
|
runtime, cleanup := testNewRuntime(t)
|
||||||
|
defer cleanup()
|
||||||
|
ctx := context.Background()
|
||||||
|
pullOptions := &PullOptions{}
|
||||||
|
pullOptions.Writer = os.Stdout
|
||||||
|
|
||||||
|
images, err := runtime.Pull(ctx, busybox, config.PullPolicyAlways, pullOptions)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, images, 1)
|
||||||
|
|
||||||
|
// Push one image without the optional reference
|
||||||
|
ociPathNoRef := "oci:" + t.TempDir() + "noRef"
|
||||||
|
_, err = runtime.Push(ctx, busybox, ociPathNoRef, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Push another image _with_ the optional reference which allows for
|
||||||
|
// preserving the name.
|
||||||
|
ociPathWithRef := "oci:" + t.TempDir() + "withRef:" + busybox
|
||||||
|
_, err = runtime.Push(ctx, busybox, ociPathWithRef, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, errors := runtime.RemoveImages(ctx, []string{busybox}, nil)
|
||||||
|
require.Nil(t, errors)
|
||||||
|
|
||||||
|
images, err = runtime.Pull(ctx, ociPathNoRef, config.PullPolicyAlways, pullOptions)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, images, 1)
|
||||||
|
|
||||||
|
exists, err := runtime.Exists(busybox) // busybox does not exist
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.False(t, exists)
|
||||||
|
|
||||||
|
names := images[0].Names() // The image has no names (i.e., <none>)
|
||||||
|
require.Nil(t, names)
|
||||||
|
|
||||||
|
images, err = runtime.Pull(ctx, ociPathWithRef, config.PullPolicyAlways, pullOptions)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, images, 1)
|
||||||
|
|
||||||
|
exists, err = runtime.Exists(busybox) // busybox does exist now
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.True(t, exists)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue