From 6d8fac87ed20c7bb3214e28e2ef74d3d8831eadd Mon Sep 17 00:00:00 2001
From: TomSweeneyRedHat <tsweeney@redhat.com>
Date: Fri, 29 Jun 2018 16:35:22 -0400
Subject: Allow multiple mounts

Signed-off-by: TomSweeneyRedHat <tsweeney@redhat.com>

Closes: #1030
Approved by: rhatdan
---
 cmd/podman/mount.go    | 47 ++++++++++++++++++++++++++++++-----------------
 docs/podman-mount.1.md | 18 +++++++++++++++---
 test/e2e/mount_test.go | 25 +++++++++++++++++++++++++
 3 files changed, 70 insertions(+), 20 deletions(-)

diff --git a/cmd/podman/mount.go b/cmd/podman/mount.go
index e913afb75..b053ef1e8 100644
--- a/cmd/podman/mount.go
+++ b/cmd/podman/mount.go
@@ -7,6 +7,7 @@ import (
 	"github.com/pkg/errors"
 	of "github.com/projectatomic/libpod/cmd/podman/formats"
 	"github.com/projectatomic/libpod/cmd/podman/libpodruntime"
+	"github.com/sirupsen/logrus"
 	"github.com/urfave/cli"
 )
 
@@ -34,7 +35,7 @@ var (
 		Usage:       "Mount a working container's root filesystem",
 		Description: mountDescription,
 		Action:      mountCmd,
-		ArgsUsage:   "[CONTAINER-NAME-OR-ID]",
+		ArgsUsage:   "[CONTAINER-NAME-OR-ID [...]]",
 		Flags:       mountFlags,
 	}
 )
@@ -68,23 +69,35 @@ func mountCmd(c *cli.Context) error {
 		return errors.Errorf("%q is not a supported format", c.String("format"))
 	}
 
-	if len(args) > 1 {
-		return errors.Errorf("too many arguments specified")
-	}
-
-	if len(args) == 1 {
-		if json {
-			return errors.Wrapf(err, "json option can not be used with a container id")
-		}
-		ctr, err := runtime.LookupContainer(args[0])
-		if err != nil {
-			return errors.Wrapf(err, "error looking up container %q", args[0])
-		}
-		mountPoint, err := ctr.Mount()
-		if err != nil {
-			return errors.Wrapf(err, "error mounting container %q", ctr.ID())
+	var lastError error
+	if len(args) > 0 {
+		for _, name := range args {
+			if json {
+				if lastError != nil {
+					logrus.Error(lastError)
+				}
+				lastError = errors.Wrapf(err, "json option cannot be used with a container id")
+				continue
+			}
+			ctr, err := runtime.LookupContainer(name)
+			if err != nil {
+				if lastError != nil {
+					logrus.Error(lastError)
+				}
+				lastError = errors.Wrapf(err, "error looking up container %q", name)
+				continue
+			}
+			mountPoint, err := ctr.Mount()
+			if err != nil {
+				if lastError != nil {
+					logrus.Error(lastError)
+				}
+				lastError = errors.Wrapf(err, "error mounting container %q", ctr.ID())
+				continue
+			}
+			fmt.Printf("%s\n", mountPoint)
 		}
-		fmt.Printf("%s\n", mountPoint)
+		return lastError
 	} else {
 		jsonMountPoints := []jsonMountPoint{}
 		containers, err2 := runtime.GetContainers()
diff --git a/docs/podman-mount.1.md b/docs/podman-mount.1.md
index c73caf011..04210f087 100644
--- a/docs/podman-mount.1.md
+++ b/docs/podman-mount.1.md
@@ -1,15 +1,15 @@
 % podman-mount "1"
 
 ## NAME
-podman\-mount - Mount a working container's root filesystem
+podman\-mount - Mount the specifed working containers' root filesystem
 
 ## SYNOPSIS
 **podman** **mount**
 
-**podman** **mount** **containerID**
+**podman** **mount** **containerID [...]**
 
 ## DESCRIPTION
-Mounts the specified container's root file system in a location which can be
+Mounts the specified containers' root file system in a location which can be
 accessed from the host, and returns its location.
 
 If you execute the command without any arguments, the tool will list all of the
@@ -41,7 +41,19 @@ podman mount c831414b10a3
 podman mount
 
 c831414b10a3 /var/lib/containers/storage/overlay/f3ac502d97b5681989dff84dfedc8354239bcecbdc2692f9a639f4e080a02364/merged
+a7060253093b /var/lib/containers/storage/overlay/0ff7d7ca68bed1ace424f9df154d2dd7b5a125c19d887f17653cbcd5b6e30ba1/merged
+```
+```
+podman mount c831414b10a3 a7060253093b
+
+/var/lib/containers/storage/overlay/f3ac502d97b5681989dff84dfedc8354239bcecbdc2692f9a639f4e080a02364/merged
+/var/lib/containers/storage/overlay/0ff7d7ca68bed1ace424f9df154d2dd7b5a125c19d887f17653cbcd5b6e30ba1/merged
+```
 
+```
+podman mount
+
+c831414b10a3 /var/lib/containers/storage/overlay/f3ac502d97b5681989dff84dfedc8354239bcecbdc2692f9a639f4e080a02364/merged
 a7060253093b /var/lib/containers/storage/overlay/0ff7d7ca68bed1ace424f9df154d2dd7b5a125c19d887f17653cbcd5b6e30ba1/merged
 ```
 
diff --git a/test/e2e/mount_test.go b/test/e2e/mount_test.go
index 26eb5a7d2..1c206c597 100644
--- a/test/e2e/mount_test.go
+++ b/test/e2e/mount_test.go
@@ -62,6 +62,31 @@ var _ = Describe("Podman mount", func() {
 		Expect(umount.ExitCode()).To(Equal(0))
 	})
 
+	It("podman mount many", func() {
+		setup1 := podmanTest.Podman([]string{"create", ALPINE, "ls"})
+		setup1.WaitWithDefaultTimeout()
+		Expect(setup1.ExitCode()).To(Equal(0))
+		cid1 := setup1.OutputToString()
+
+		setup2 := podmanTest.Podman([]string{"create", ALPINE, "ls"})
+		setup2.WaitWithDefaultTimeout()
+		Expect(setup2.ExitCode()).To(Equal(0))
+		cid2 := setup2.OutputToString()
+
+		setup3 := podmanTest.Podman([]string{"create", ALPINE, "ls"})
+		setup3.WaitWithDefaultTimeout()
+		Expect(setup3.ExitCode()).To(Equal(0))
+		cid3 := setup3.OutputToString()
+
+		mount1 := podmanTest.Podman([]string{"mount", cid1, cid2, cid3})
+		mount1.WaitWithDefaultTimeout()
+		Expect(mount1.ExitCode()).To(Equal(0))
+
+		umount := podmanTest.Podman([]string{"umount", cid1, cid2, cid3})
+		umount.WaitWithDefaultTimeout()
+		Expect(umount.ExitCode()).To(Equal(0))
+	})
+
 	It("podman umount many", func() {
 		setup1 := podmanTest.Podman([]string{"create", ALPINE, "ls"})
 		setup1.WaitWithDefaultTimeout()
-- 
cgit v1.2.3-54-g00ecf