podman rm/stop --cidfile

Add a --cidfile flag to podman rm/stop to pass a container ID via a
file.  Podman run already provides the functionaly to store the ID
in a specified file which we now complete with rm/stop.  This allows
for a better life-cycle management in systemd services.  Note that
--cdifile can be specified multiple times to rm/stop.

Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
Valentin Rothberg
2019-11-15 14:05:46 -05:00
parent d7ed9fa188
commit 061bf77588
26 changed files with 257 additions and 38 deletions

View File

@ -26,7 +26,7 @@ var (
return checkpointCmd(&checkpointCommand) return checkpointCmd(&checkpointCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman container checkpoint --keep ctrID Example: `podman container checkpoint --keep ctrID
podman container checkpoint --all podman container checkpoint --all

View File

@ -27,7 +27,7 @@ var (
return cleanupCmd(&cleanupCommand) return cleanupCmd(&cleanupCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman container cleanup --latest Example: `podman container cleanup --latest
podman container cleanup ctrID1 ctrID2 ctrID3 podman container cleanup ctrID1 ctrID2 ctrID3

View File

@ -485,6 +485,7 @@ type RmValues struct {
Latest bool Latest bool
Storage bool Storage bool
Volumes bool Volumes bool
CIDFiles []string
} }
type RmiValues struct { type RmiValues struct {
@ -560,6 +561,7 @@ type StopValues struct {
All bool All bool
Latest bool Latest bool
Timeout uint Timeout uint
CIDFiles []string
} }
type TopValues struct { type TopValues struct {

View File

@ -39,24 +39,45 @@ func shortID(id string) string {
return id return id
} }
// checkAllAndLatest checks that --all and --latest are used correctly // checkAllLatestAndCIDFile checks that --all and --latest are used correctly.
func checkAllAndLatest(c *cobra.Command, args []string, ignoreArgLen bool) error { // If cidfile is set, also check for the --cidfile flag.
func checkAllLatestAndCIDFile(c *cobra.Command, args []string, ignoreArgLen bool, cidfile bool) error {
argLen := len(args) argLen := len(args)
if c.Flags().Lookup("all") == nil || c.Flags().Lookup("latest") == nil { if c.Flags().Lookup("all") == nil || c.Flags().Lookup("latest") == nil {
if !cidfile {
return errors.New("unable to lookup values for 'latest' or 'all'") return errors.New("unable to lookup values for 'latest' or 'all'")
} else if c.Flags().Lookup("cidfile") == nil {
return errors.New("unable to lookup values for 'latest', 'all' or 'cidfile'")
} }
all, _ := c.Flags().GetBool("all") }
latest, _ := c.Flags().GetBool("latest")
if all && latest { specifiedAll, _ := c.Flags().GetBool("all")
specifiedLatest, _ := c.Flags().GetBool("latest")
specifiedCIDFile := false
if cid, _ := c.Flags().GetStringArray("cidfile"); len(cid) > 0 {
specifiedCIDFile = true
}
if specifiedCIDFile && (specifiedAll || specifiedLatest) {
return errors.Errorf("--all, --latest and --cidfile cannot be used together")
} else if specifiedAll && specifiedLatest {
return errors.Errorf("--all and --latest cannot be used together") return errors.Errorf("--all and --latest cannot be used together")
} }
if ignoreArgLen { if ignoreArgLen {
return nil return nil
} }
if (all || latest) && argLen > 0 { if (argLen > 0) && (specifiedAll || specifiedLatest) {
return errors.Errorf("no arguments are needed with --all or --latest") return errors.Errorf("no arguments are needed with --all or --latest")
} else if cidfile && (argLen > 0) && (specifiedAll || specifiedLatest || specifiedCIDFile) {
return errors.Errorf("no arguments are needed with --all, --latest or --cidfile")
} }
if argLen < 1 && !all && !latest {
if specifiedCIDFile {
return nil
}
if argLen < 1 && !specifiedAll && !specifiedLatest && !specifiedCIDFile {
return errors.Errorf("you must provide at least one name or id") return errors.Errorf("you must provide at least one name or id")
} }
return nil return nil

View File

@ -23,7 +23,7 @@ var (
return initCmd(&initCommand) return initCmd(&initCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman init --latest Example: `podman init --latest
podman init 3c45ef19d893 podman init 3c45ef19d893

View File

@ -24,7 +24,7 @@ var (
return killCmd(&killCommand) return killCmd(&killCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman kill mywebserver Example: `podman kill mywebserver
podman kill 860a4b23 podman kill 860a4b23

View File

@ -35,7 +35,7 @@ var (
return mountCmd(&mountCommand) return mountCmd(&mountCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, true) return checkAllLatestAndCIDFile(cmd, args, true, false)
}, },
} }
) )

View File

@ -28,7 +28,7 @@ var (
return podKillCmd(&podKillCommand) return podKillCmd(&podKillCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman pod kill podID Example: `podman pod kill podID
podman pod kill --signal TERM mywebserver podman pod kill --signal TERM mywebserver

View File

@ -25,7 +25,7 @@ var (
return podPauseCmd(&podPauseCommand) return podPauseCmd(&podPauseCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman pod pause podID1 podID2 Example: `podman pod pause podID1 podID2
podman pod pause --latest podman pod pause --latest

View File

@ -26,7 +26,7 @@ var (
return podRestartCmd(&podRestartCommand) return podRestartCmd(&podRestartCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman pod restart podID1 podID2 Example: `podman pod restart podID1 podID2
podman pod restart --latest podman pod restart --latest

View File

@ -26,7 +26,7 @@ var (
return podRmCmd(&podRmCommand) return podRmCmd(&podRmCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman pod rm mywebserverpod Example: `podman pod rm mywebserverpod
podman pod rm -f 860a4b23 podman pod rm -f 860a4b23

View File

@ -26,7 +26,7 @@ var (
return podStartCmd(&podStartCommand) return podStartCmd(&podStartCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman pod start podID Example: `podman pod start podID
podman pod start --latest podman pod start --latest

View File

@ -27,7 +27,7 @@ var (
return podStopCmd(&podStopCommand) return podStopCmd(&podStopCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman pod stop mywebserverpod Example: `podman pod stop mywebserverpod
podman pod stop --latest podman pod stop --latest

View File

@ -26,7 +26,7 @@ var (
return podUnpauseCmd(&podUnpauseCommand) return podUnpauseCmd(&podUnpauseCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman pod unpause podID1 podID2 Example: `podman pod unpause podID1 podID2
podman pod unpause --all podman pod unpause --all

View File

@ -26,7 +26,7 @@ var (
return portCmd(&portCommand) return portCmd(&portCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, true) return checkAllLatestAndCIDFile(cmd, args, true, false)
}, },
Example: `podman port --all Example: `podman port --all
podman port ctrID 80/tcp podman port ctrID 80/tcp

View File

@ -23,7 +23,7 @@ var (
return restartCmd(&restartCommand) return restartCmd(&restartCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman restart ctrID Example: `podman restart ctrID
podman restart --latest podman restart --latest

View File

@ -26,7 +26,7 @@ var (
return restoreCmd(&restoreCommand, cmd) return restoreCmd(&restoreCommand, cmd)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, true) return checkAllLatestAndCIDFile(cmd, args, true, false)
}, },
Example: `podman container restore ctrID Example: `podman container restore ctrID
podman container restore --latest podman container restore --latest

View File

@ -25,7 +25,7 @@ var (
return rmCmd(&rmCommand) return rmCmd(&rmCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, true)
}, },
Example: `podman rm imageID Example: `podman rm imageID
podman rm mywebserver myflaskserver 860a4b23 podman rm mywebserver myflaskserver 860a4b23
@ -44,8 +44,10 @@ func init() {
flags.BoolVarP(&rmCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of") flags.BoolVarP(&rmCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
flags.BoolVar(&rmCommand.Storage, "storage", false, "Remove container from storage library") flags.BoolVar(&rmCommand.Storage, "storage", false, "Remove container from storage library")
flags.BoolVarP(&rmCommand.Volumes, "volumes", "v", false, "Remove anonymous volumes associated with the container") flags.BoolVarP(&rmCommand.Volumes, "volumes", "v", false, "Remove anonymous volumes associated with the container")
flags.StringArrayVarP(&rmCommand.CIDFiles, "cidfile", "", nil, "Read the container ID from the file")
markFlagHiddenForRemoteClient("storage", flags) markFlagHiddenForRemoteClient("storage", flags)
markFlagHiddenForRemoteClient("latest", flags) markFlagHiddenForRemoteClient("latest", flags)
markFlagHiddenForRemoteClient("cidfile", flags)
} }
// rmCmd removes one or more containers // rmCmd removes one or more containers
@ -58,8 +60,8 @@ func rmCmd(c *cliconfig.RmValues) error {
// Storage conflicts with --all/--latest/--volumes // Storage conflicts with --all/--latest/--volumes
if c.Storage { if c.Storage {
if c.All || c.Latest || c.Volumes { if c.All || c.Latest || c.Volumes || c.CIDFiles != nil {
return errors.Errorf("--storage conflicts with --volumes, --all, and --latest") return errors.Errorf("--storage conflicts with --volumes, --all, --latest and --cidfile")
} }
} }

View File

@ -25,7 +25,7 @@ var (
return stopCmd(&stopCommand) return stopCmd(&stopCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, true)
}, },
Example: `podman stop ctrID Example: `podman stop ctrID
podman stop --latest podman stop --latest
@ -42,7 +42,9 @@ func init() {
flags.BoolVarP(&stopCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of") flags.BoolVarP(&stopCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
flags.UintVar(&stopCommand.Timeout, "time", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container") flags.UintVar(&stopCommand.Timeout, "time", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container")
flags.UintVarP(&stopCommand.Timeout, "timeout", "t", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container") flags.UintVarP(&stopCommand.Timeout, "timeout", "t", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container")
flags.StringArrayVarP(&stopCommand.CIDFiles, "cidfile", "", nil, "Read the container ID from the file")
markFlagHiddenForRemoteClient("latest", flags) markFlagHiddenForRemoteClient("latest", flags)
markFlagHiddenForRemoteClient("cidfile", flags)
} }
// stopCmd stops a container or containers // stopCmd stops a container or containers

View File

@ -28,7 +28,7 @@ var (
return umountCmd(&umountCommand) return umountCmd(&umountCommand)
}, },
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false) return checkAllLatestAndCIDFile(cmd, args, false, false)
}, },
Example: `podman umount ctrID Example: `podman umount ctrID
podman umount ctrID1 ctrID2 ctrID3 podman umount ctrID1 ctrID2 ctrID3

View File

@ -2150,6 +2150,7 @@ _podman_rm() {
local boolean_options=" local boolean_options="
--all --all
-a -a
--cidfile
--force --force
-f -f
--help --help
@ -2426,6 +2427,7 @@ _podman_stop() {
local boolean_options=" local boolean_options="
--all --all
-a -a
--cidfile
-h -h
--help --help
--latest --latest

View File

@ -18,6 +18,10 @@ Running or unusable containers will not be removed without the `-f` option.
Remove all containers. Can be used in conjunction with -f as well. Remove all containers. Can be used in conjunction with -f as well.
**--cidfile**
Read container ID from the specified file and remove the container. Can be specified multiple times.
**--force**, **-f** **--force**, **-f**
Force the removal of running and paused containers. Forcing a container removal also Force the removal of running and paused containers. Forcing a container removal also
@ -50,11 +54,17 @@ Remove a container by its name *mywebserver*
``` ```
podman rm mywebserver podman rm mywebserver
``` ```
Remove several containers by name and container id. Remove several containers by name and container id.
``` ```
podman rm mywebserver myflaskserver 860a4b23 podman rm mywebserver myflaskserver 860a4b23
``` ```
Remove several containers reading their IDs from files.
```
podman rm --cidfile ./cidfile-1 --cidfile /home/user/cidfile-2
```
Forcibly remove a container by container ID. Forcibly remove a container by container ID.
``` ```
podman rm -f 860a4b23 podman rm -f 860a4b23

View File

@ -21,6 +21,10 @@ container and also via command line when creating the container.
Stop all running containers. This does not include paused containers. Stop all running containers. This does not include paused containers.
**--cidfile**
Read container ID from the specified file and remove the container. Can be specified multiple times.
**--latest**, **-l** **--latest**, **-l**
Instead of providing the container name or ID, use the last created container. If you use methods other than Podman Instead of providing the container name or ID, use the last created container. If you use methods other than Podman
@ -40,6 +44,10 @@ podman stop 860a4b235279
podman stop mywebserver 860a4b235279 podman stop mywebserver 860a4b235279
podman stop --cidfile /home/user/cidfile-1
podman stop --cidfile /home/user/cidfile-1 --cidfile ./cidfile-2
podman stop --timeout 2 860a4b235279 podman stop --timeout 2 860a4b235279
podman stop -a podman stop -a

View File

@ -79,7 +79,17 @@ func (r *LocalRuntime) StopContainers(ctx context.Context, cli *cliconfig.StopVa
} }
logrus.Debugf("Setting maximum stop workers to %d", maxWorkers) logrus.Debugf("Setting maximum stop workers to %d", maxWorkers)
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, cli.InputArgs, r.Runtime) names := cli.InputArgs
for _, cidFile := range cli.CIDFiles {
content, err := ioutil.ReadFile(cidFile)
if err != nil {
return nil, nil, errors.Wrap(err, "error reading CIDFile")
}
id := strings.Split(string(content), "\n")[0]
names = append(names, id)
}
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, names, r.Runtime)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -203,7 +213,17 @@ func (r *LocalRuntime) RemoveContainers(ctx context.Context, cli *cliconfig.RmVa
return ok, failures, nil return ok, failures, nil
} }
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, cli.InputArgs, r.Runtime) names := cli.InputArgs
for _, cidFile := range cli.CIDFiles {
content, err := ioutil.ReadFile(cidFile)
if err != nil {
return nil, nil, errors.Wrap(err, "error reading CIDFile")
}
id := strings.Split(string(content), "\n")[0]
names = append(names, id)
}
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, names, r.Runtime)
if err != nil { if err != nil {
// Failed to get containers. If force is specified, get the containers ID // Failed to get containers. If force is specified, get the containers ID
// and evict them // and evict them

View File

@ -1,6 +1,7 @@
package integration package integration
import ( import (
"io/ioutil"
"os" "os"
. "github.com/containers/libpod/test/utils" . "github.com/containers/libpod/test/utils"
@ -138,11 +139,86 @@ var _ = Describe("Podman rm", func() {
}) })
It("podman rm --cidfile", func() {
SkipIfRemote()
tmpDir, err := ioutil.TempDir("", "")
Expect(err).To(BeNil())
tmpFile := tmpDir + "cid"
defer os.RemoveAll(tmpDir)
session := podmanTest.Podman([]string{"create", "--cidfile", tmpFile, ALPINE, "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
cid := session.OutputToStringArray()[0]
Expect(podmanTest.NumberOfContainers()).To(Equal(1))
result := podmanTest.Podman([]string{"rm", "--cidfile", tmpFile})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
output := result.OutputToString()
Expect(output).To(ContainSubstring(cid))
Expect(podmanTest.NumberOfContainers()).To(Equal(0))
})
It("podman rm multiple --cidfile", func() {
SkipIfRemote()
tmpDir, err := ioutil.TempDir("", "")
Expect(err).To(BeNil())
tmpFile1 := tmpDir + "cid-1"
tmpFile2 := tmpDir + "cid-2"
defer os.RemoveAll(tmpDir)
session := podmanTest.Podman([]string{"create", "--cidfile", tmpFile1, ALPINE, "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
cid1 := session.OutputToStringArray()[0]
Expect(podmanTest.NumberOfContainers()).To(Equal(1))
session = podmanTest.Podman([]string{"create", "--cidfile", tmpFile2, ALPINE, "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
cid2 := session.OutputToStringArray()[0]
Expect(podmanTest.NumberOfContainers()).To(Equal(2))
result := podmanTest.Podman([]string{"rm", "--cidfile", tmpFile1, "--cidfile", tmpFile2})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
output := result.OutputToString()
Expect(output).To(ContainSubstring(cid1))
Expect(output).To(ContainSubstring(cid2))
Expect(podmanTest.NumberOfContainers()).To(Equal(0))
})
It("podman rm invalid --latest and --cidfile and --all", func() {
SkipIfRemote()
result := podmanTest.Podman([]string{"rm", "--cidfile", "foobar", "--latest"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
result = podmanTest.Podman([]string{"rm", "--cidfile", "foobar", "--all"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
result = podmanTest.Podman([]string{"rm", "--cidfile", "foobar", "--all", "--latest"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
result = podmanTest.Podman([]string{"rm", "--latest", "--all"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
})
It("podman rm bogus container", func() { It("podman rm bogus container", func() {
session := podmanTest.Podman([]string{"rm", "bogus"}) session := podmanTest.Podman([]string{"rm", "bogus"})
session.WaitWithDefaultTimeout() session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(1)) Expect(session.ExitCode()).To(Equal(1))
}) })
It("podman rm bogus container and a running container", func() { It("podman rm bogus container and a running container", func() {
session := podmanTest.RunTopContainer("test1") session := podmanTest.RunTopContainer("test1")
session.WaitWithDefaultTimeout() session.WaitWithDefaultTimeout()

View File

@ -1,6 +1,7 @@
package integration package integration
import ( import (
"io/ioutil"
"os" "os"
"strings" "strings"
@ -215,4 +216,79 @@ var _ = Describe("Podman stop", func() {
Expect(strings.TrimSpace(finalCtrs.OutputToString())).To(Equal("")) Expect(strings.TrimSpace(finalCtrs.OutputToString())).To(Equal(""))
}) })
It("podman stop --cidfile", func() {
SkipIfRemote()
tmpDir, err := ioutil.TempDir("", "")
Expect(err).To(BeNil())
tmpFile := tmpDir + "cid"
defer os.RemoveAll(tmpDir)
session := podmanTest.Podman([]string{"create", "--cidfile", tmpFile, "-d", ALPINE, "top"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
cid := session.OutputToStringArray()[0]
session = podmanTest.Podman([]string{"start", cid})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
result := podmanTest.Podman([]string{"stop", "--cidfile", tmpFile})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
output := result.OutputToString()
Expect(output).To(ContainSubstring(cid))
})
It("podman stop multiple --cidfile", func() {
SkipIfRemote()
tmpDir, err := ioutil.TempDir("", "")
Expect(err).To(BeNil())
tmpFile1 := tmpDir + "cid-1"
tmpFile2 := tmpDir + "cid-2"
defer os.RemoveAll(tmpDir)
session := podmanTest.Podman([]string{"run", "--cidfile", tmpFile1, "-d", ALPINE, "top"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
cid1 := session.OutputToStringArray()[0]
Expect(podmanTest.NumberOfContainers()).To(Equal(1))
session = podmanTest.Podman([]string{"run", "--cidfile", tmpFile2, "-d", ALPINE, "top"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
cid2 := session.OutputToStringArray()[0]
Expect(podmanTest.NumberOfContainers()).To(Equal(2))
result := podmanTest.Podman([]string{"stop", "--cidfile", tmpFile1, "--cidfile", tmpFile2})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
output := result.OutputToString()
Expect(output).To(ContainSubstring(cid1))
Expect(output).To(ContainSubstring(cid2))
Expect(podmanTest.NumberOfContainers()).To(Equal(2))
})
It("podman stop invalid --latest and --cidfile and --all", func() {
SkipIfRemote()
result := podmanTest.Podman([]string{"stop", "--cidfile", "foobar", "--latest"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
result = podmanTest.Podman([]string{"stop", "--cidfile", "foobar", "--all"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
result = podmanTest.Podman([]string{"stop", "--cidfile", "foobar", "--all", "--latest"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
result = podmanTest.Podman([]string{"stop", "--latest", "--all"})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(125))
})
}) })