From 22f55ce406cfea7feebb34b469f11e6cf657c51e Mon Sep 17 00:00:00 2001
From: Sascha Grunert <sgrunert@suse.com>
Date: Mon, 19 Aug 2019 12:06:11 +0200
Subject: Fix directory pull image name for OCI images

This is a breaking change and modifies the resulting image name when
pulling from an directory via `oci:...`.

Without this patch, the image names pulled via a local directory got
processed incorrectly, like this:

```
> podman pull oci:alpine
> podman images
REPOSITORY      TAG      IMAGE ID       CREATED       SIZE
localhost/oci   alpine   4fa153a82426   5 weeks ago   5.85 MB
```

We now use the same approach as in the corresponding [buildah fix][1] to
adapt the behavior for correct `localhost/` prefixing.

[1]: https://github.com/containers/buildah/pull/1800

After applying the patch the same OCI image pull looks like this:

```
> ./bin/podman pull oci:alpine
> podman images
REPOSITORY         TAG      IMAGE ID       CREATED       SIZE
localhost/alpine   latest   4fa153a82426   5 weeks ago   5.85 MB
```

End-to-end tests have been adapted as well to cover the added scenario.

Relates to: https://github.com/containers/buildah/issues/1797

Signed-off-by: Sascha Grunert <sgrunert@suse.com>
---
 libpod/image/pull.go | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

(limited to 'libpod')

diff --git a/libpod/image/pull.go b/libpod/image/pull.go
index 78cfe3626..dbf3a4ef5 100644
--- a/libpod/image/pull.go
+++ b/libpod/image/pull.go
@@ -13,6 +13,7 @@ import (
 	dockerarchive "github.com/containers/image/docker/archive"
 	"github.com/containers/image/docker/tarfile"
 	ociarchive "github.com/containers/image/oci/archive"
+	oci "github.com/containers/image/oci/layout"
 	is "github.com/containers/image/storage"
 	"github.com/containers/image/transports"
 	"github.com/containers/image/transports/alltransports"
@@ -37,6 +38,9 @@ var (
 	DirTransport = directory.Transport.Name()
 	// DockerTransport is the transport for docker registries
 	DockerTransport = docker.Transport.Name()
+	// OCIDirTransport is the transport for pushing and pulling
+	// images to and from a directory containing an OCI image
+	OCIDirTransport = oci.Transport.Name()
 	// AtomicTransport is the transport for atomic registries
 	AtomicTransport = "atomic"
 	// DefaultTransport is a prefix that we apply to an image name
@@ -189,12 +193,12 @@ func (ir *Runtime) pullGoalFromImageReference(ctx context.Context, srcRef types.
 		return ir.getSinglePullRefPairGoal(srcRef, dest)
 
 	case DirTransport:
-		path := srcRef.StringWithinTransport()
-		image := path
-		if image[:1] == "/" {
-			// Set localhost as the registry so docker.io isn't prepended, and the path becomes the repository
-			image = DefaultLocalRegistry + image
-		}
+		image := toLocalImageName(srcRef.StringWithinTransport())
+		return ir.getSinglePullRefPairGoal(srcRef, image)
+
+	case OCIDirTransport:
+		split := strings.SplitN(srcRef.StringWithinTransport(), ":", 2)
+		image := toLocalImageName(split[0])
 		return ir.getSinglePullRefPairGoal(srcRef, image)
 
 	default:
@@ -202,6 +206,15 @@ func (ir *Runtime) pullGoalFromImageReference(ctx context.Context, srcRef types.
 	}
 }
 
+// toLocalImageName converts an image name into a 'localhost/' prefixed one
+func toLocalImageName(imageName string) string {
+	return fmt.Sprintf(
+		"%s/%s",
+		DefaultLocalRegistry,
+		strings.TrimLeft(imageName, "/"),
+	)
+}
+
 // pullImageFromHeuristicSource pulls an image based on inputName, which is heuristically parsed and may involve configured registries.
 // Use pullImageFromReference if the source is known precisely.
 func (ir *Runtime) pullImageFromHeuristicSource(ctx context.Context, inputName string, writer io.Writer, authfile, signaturePolicyPath string, signingOptions SigningOptions, dockerOptions *DockerRegistryOptions, label *string) ([]string, error) {
-- 
cgit v1.2.3-54-g00ecf