From 17f257140eaecbe39f679d27df85573eb15a7d51 Mon Sep 17 00:00:00 2001 From: haircommander Date: Thu, 19 Jul 2018 14:58:48 -0400 Subject: Added pod start and stop As well as added tests, man pages, and completions. Also reformatted and refactored a couple of other small things in the other pod commands. Signed-off-by: haircommander --- cmd/podman/pod.go | 2 + cmd/podman/pod_rm.go | 56 ++++++++---------- cmd/podman/pod_start.go | 100 ++++++++++++++++++++++++++++++++ cmd/podman/pod_stop.go | 100 ++++++++++++++++++++++++++++++++ cmd/podman/utils.go | 18 ++++++ commands.md | 4 +- completions/bash/podman | 45 +++++++++++++++ docs/podman-pod-rm.1.md | 2 +- docs/podman-pod-start.1.md | 38 ++++++++++++ docs/podman-pod-stop.1.md | 47 +++++++++++++++ docs/podman-pod.1.md | 2 + test/e2e/pod_start_test.go | 140 ++++++++++++++++++++++++++++++++++++++++++++ test/e2e/pod_stop_test.go | 141 +++++++++++++++++++++++++++++++++++++++++++++ 13 files changed, 661 insertions(+), 34 deletions(-) create mode 100644 cmd/podman/pod_start.go create mode 100644 cmd/podman/pod_stop.go create mode 100644 docs/podman-pod-start.1.md create mode 100644 docs/podman-pod-stop.1.md create mode 100644 test/e2e/pod_start_test.go create mode 100644 test/e2e/pod_stop_test.go diff --git a/cmd/podman/pod.go b/cmd/podman/pod.go index 6cf2920a5..e19fea01b 100644 --- a/cmd/podman/pod.go +++ b/cmd/podman/pod.go @@ -20,6 +20,8 @@ var ( podCreateCommand, podPsCommand, podRmCommand, + podStartCommand, + podStopCommand, }, } ) diff --git a/cmd/podman/pod_rm.go b/cmd/podman/pod_rm.go index 8cc46761e..8b4c09cfe 100644 --- a/cmd/podman/pod_rm.go +++ b/cmd/podman/pod_rm.go @@ -2,24 +2,24 @@ package main import ( "fmt" - "os" "github.com/pkg/errors" "github.com/projectatomic/libpod/cmd/podman/libpodruntime" "github.com/projectatomic/libpod/libpod" + "github.com/sirupsen/logrus" "github.com/urfave/cli" ) var ( podRmFlags = []cli.Flag{ - cli.BoolFlag{ - Name: "force, f", - Usage: "Force removal of a running pod by first stopping all containers, then removing all containers in the pod. The default is false", - }, cli.BoolFlag{ Name: "all, a", Usage: "Remove all pods", }, + cli.BoolFlag{ + Name: "force, f", + Usage: "Force removal of a running pod by first stopping all containers, then removing all containers in the pod. The default is false", + }, LatestFlag, } podRmDescription = "Remove one or more pods" @@ -38,15 +38,9 @@ var ( // saveCmd saves the image to either docker-archive or oci func podRmCmd(c *cli.Context) error { - ctx := getContext() - if err := validateFlags(c, rmFlags); err != nil { + if err := checkMutuallyExclusiveFlags(c); err != nil { return err } - - if c.Bool("latest") && c.Bool("all") { - return errors.Errorf("--all and --latest cannot be used together") - } - runtime, err := libpodruntime.GetRuntime(c) if err != nil { return errors.Wrapf(err, "could not get runtime") @@ -54,45 +48,43 @@ func podRmCmd(c *cli.Context) error { defer runtime.Shutdown(false) args := c.Args() - - if len(args) == 0 && !c.Bool("all") && !c.Bool("latest") { - return errors.Errorf("specify one or more pods to remove") - } - + ctx := getContext() var delPods []*libpod.Pod var lastError error - if c.IsSet("all") { + if c.Bool("all") { delPods, err = runtime.GetAllPods() if err != nil { return errors.Wrapf(err, "unable to get pod list") } - } else if c.IsSet("latest") { + } + + if c.Bool("latest") { delPod, err := runtime.GetLatestPod() if err != nil { return errors.Wrapf(err, "unable to get latest pod") } delPods = append(delPods, delPod) - } else { - for _, i := range args { - pod, err := runtime.LookupPod(i) - if err != nil { - fmt.Fprintln(os.Stderr, err) - if lastError != nil { - fmt.Fprintln(os.Stderr, lastError) - } - lastError = errors.Wrapf(err, "unable to find pods %s", i) - continue + } + + for _, i := range args { + pod, err := runtime.LookupPod(i) + if err != nil { + logrus.Errorf("%q", lastError) + if lastError != nil { + logrus.Errorf("%q", lastError) } - delPods = append(delPods, pod) + lastError = errors.Wrapf(err, "unable to find pods %s", i) + continue } + delPods = append(delPods, pod) } - force := c.IsSet("force") + force := c.Bool("force") for _, pod := range delPods { err = runtime.RemovePod(ctx, pod, force, force) if err != nil { if lastError != nil { - fmt.Fprintln(os.Stderr, lastError) + logrus.Errorf("%q", lastError) } lastError = errors.Wrapf(err, "failed to delete pod %v", pod.ID()) } else { diff --git a/cmd/podman/pod_start.go b/cmd/podman/pod_start.go new file mode 100644 index 000000000..1e82bc0ee --- /dev/null +++ b/cmd/podman/pod_start.go @@ -0,0 +1,100 @@ +package main + +import ( + "fmt" + + "github.com/pkg/errors" + "github.com/projectatomic/libpod/cmd/podman/libpodruntime" + "github.com/projectatomic/libpod/libpod" + "github.com/sirupsen/logrus" + "github.com/urfave/cli" +) + +var ( + podStartFlags = []cli.Flag{ + cli.BoolFlag{ + Name: "all, a", + Usage: "start all running pods", + }, + LatestFlag, + } + podStartDescription = ` + podman pod start + + Starts one or more pods. The pod name or ID can be used. +` + + podStartCommand = cli.Command{ + Name: "start", + Usage: "Start one or more pods", + Description: podStartDescription, + Flags: podStartFlags, + Action: podStartCmd, + ArgsUsage: "POD-NAME [POD-NAME ...]", + UseShortOptionHandling: true, + } +) + +func podStartCmd(c *cli.Context) error { + if err := checkMutuallyExclusiveFlags(c); err != nil { + return err + } + + runtime, err := libpodruntime.GetRuntime(c) + if err != nil { + return errors.Wrapf(err, "error creating libpod runtime") + } + defer runtime.Shutdown(false) + + args := c.Args() + var pods []*libpod.Pod + var lastError error + + if c.Bool("all") { + pods, err = runtime.Pods() + if err != nil { + return errors.Wrapf(err, "unable to get running pods") + } + } + if c.Bool("latest") { + pod, err := runtime.GetLatestPod() + if err != nil { + return errors.Wrapf(err, "unable to get latest pod") + } + pods = append(pods, pod) + } + for _, i := range args { + pod, err := runtime.LookupPod(i) + if err != nil { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to find pod %s", i) + continue + } + pods = append(pods, pod) + } + + ctx := getContext() + for _, pod := range pods { + ctr_errs, err := pod.Start(ctx) + if err != nil { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to start pod %q", pod.ID()) + continue + } else if ctr_errs != nil { + for ctr, err := range ctr_errs { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to start container %q on pod %q", ctr, pod.ID()) + } + continue + } + fmt.Println(pod.ID()) + } + + return lastError +} diff --git a/cmd/podman/pod_stop.go b/cmd/podman/pod_stop.go new file mode 100644 index 000000000..0dcbdaad6 --- /dev/null +++ b/cmd/podman/pod_stop.go @@ -0,0 +1,100 @@ +package main + +import ( + "fmt" + + "github.com/pkg/errors" + "github.com/projectatomic/libpod/cmd/podman/libpodruntime" + "github.com/projectatomic/libpod/libpod" + "github.com/sirupsen/logrus" + "github.com/urfave/cli" +) + +var ( + podStopFlags = []cli.Flag{ + cli.BoolFlag{ + Name: "all, a", + Usage: "stop all running pods", + }, + LatestFlag, + } + podStopDescription = ` + podman pod stop + + Stops one or more running pods. The pod name or ID can be used. +` + + podStopCommand = cli.Command{ + Name: "stop", + Usage: "Stop one or more pods", + Description: podStopDescription, + Flags: podStopFlags, + Action: podStopCmd, + ArgsUsage: "POD-NAME [POD-NAME ...]", + } +) + +func podStopCmd(c *cli.Context) error { + if err := checkMutuallyExclusiveFlags(c); err != nil { + return err + } + + runtime, err := libpodruntime.GetRuntime(c) + if err != nil { + return errors.Wrapf(err, "could not get runtime") + } + defer runtime.Shutdown(false) + + args := c.Args() + var pods []*libpod.Pod + var lastError error + + if c.Bool("all") { + pods, err = runtime.Pods() + if err != nil { + return errors.Wrapf(err, "unable to get running pods") + } + } + + if c.Bool("latest") { + pod, err := runtime.GetLatestPod() + if err != nil { + return errors.Wrapf(err, "unable to get latest pod") + } + pods = append(pods, pod) + } + + for _, i := range args { + pod, err := runtime.LookupPod(i) + if err != nil { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to find pod %s", i) + continue + } + pods = append(pods, pod) + } + + for _, pod := range pods { + // set cleanup to true to clean mounts and namespaces + ctr_errs, err := pod.Stop(true) + if err != nil { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to stop pod %q", pod.ID()) + continue + } else if ctr_errs != nil { + for ctr, err := range ctr_errs { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to stop container %q on pod %q", ctr, pod.ID()) + } + continue + } + fmt.Println(pod.ID()) + } + return lastError +} diff --git a/cmd/podman/utils.go b/cmd/podman/utils.go index 21bc1ae74..9d9e760d6 100644 --- a/cmd/podman/utils.go +++ b/cmd/podman/utils.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/projectatomic/libpod/libpod" "github.com/sirupsen/logrus" + "github.com/urfave/cli" "golang.org/x/crypto/ssh/terminal" "k8s.io/client-go/tools/remotecommand" ) @@ -156,3 +157,20 @@ func (f *RawTtyFormatter) Format(entry *logrus.Entry) ([]byte, error) { return bytes, err } + +func checkMutuallyExclusiveFlags(c *cli.Context) error { + argLen := len(c.Args()) + if (c.Bool("all") || c.Bool("latest")) && argLen > 0 { + return errors.Errorf("no arguments are needed with --all or --latest") + } + if c.Bool("all") && c.Bool("latest") { + return errors.Errorf("--all and --latest cannot be used together") + } + if argLen < 1 && !c.Bool("all") && !c.Bool("latest") { + return errors.Errorf("you must provide at least one pod name or id") + } + if err := validateFlags(c, startFlags); err != nil { + return err + } + return nil +} diff --git a/commands.md b/commands.md index 35f04e558..f15ff1c3d 100644 --- a/commands.md +++ b/commands.md @@ -32,7 +32,9 @@ | [podman-pod(1)](/docs/podman-pod.1.md) | Simple management tool for groups of containers, called pods || | [podman-pod-create(1)](/docs/podman-pod-create.1.md) | Create a new pod || | [podman-pod-ps(1)](/docs/podman-pod-ps.1.md) | List the pods on the system || -| [podman-pod-rm(1)](/docs/podman-pod-rm.1.md) | Remove on or more pods || +| [podman-pod-rm(1)](/docs/podman-pod-rm.1.md) | Remove one or more pods || +| [podman-pod-start(1)](/docs/podman-pod-start.1.md) | Start one or more pods || +| [podman-pod-stop(1)](/docs/podman-pod-stop.1.md) | Stop one or more pods || | [podman-port(1)](/docs/podman-port.1.md) | List port mappings for running containers |[![...](/docs/play.png)]()| | [podman-ps(1)](/docs/podman-ps.1.md) | Prints out information about containers |[![...](/docs/play.png)](https://asciinema.org/a/bbT41kac6CwZ5giESmZLIaTLR)| | [podman-pull(1)](/docs/podman-pull.1.md) | Pull an image from a registry |[![...](/docs/play.png)](https://asciinema.org/a/lr4zfoynHJOUNu1KaXa1dwG2X)| diff --git a/completions/bash/podman b/completions/bash/podman index 424370904..11203e52d 100644 --- a/completions/bash/podman +++ b/completions/bash/podman @@ -2144,6 +2144,49 @@ _podman_pod_rm() { esac } +_podman_pod_start() { + local options_with_args=" + " + + local boolean_options=" + all + a + latest + l + " + _complete_ "$options_with_args" "$boolean_options" + case "$cur" in + -*) + COMPREPLY=($(compgen -W "$boolean_options $options_with_args" -- "$cur")) + ;; + *) + __podman_complete_pod_names + ;; + esac +} + +_podman_pod_stop() { + local options_with_args=" + " + + local boolean_options=" + all + a + cleanup + latest + l + " + _complete_ "$options_with_args" "$boolean_options" + case "$cur" in + -*) + COMPREPLY=($(compgen -W "$boolean_options $options_with_args" -- "$cur")) + ;; + *) + __podman_complete_pod_names + ;; + esac +} + _podman_pod() { local boolean_options=" --help @@ -2153,6 +2196,8 @@ _podman_pod() { create ps rm + start + stop " local aliases=" list diff --git a/docs/podman-pod-rm.1.md b/docs/podman-pod-rm.1.md index 3b571ee9a..834e0d0bb 100644 --- a/docs/podman-pod-rm.1.md +++ b/docs/podman-pod-rm.1.md @@ -17,7 +17,7 @@ Remove all pods. Can be used in conjunction with \-f as well. **--latest, -l** -Instead of providing the pod name or ID, use the last created pod. +Instead of providing the pod name or ID, remove the last created pod. **--force, f** diff --git a/docs/podman-pod-start.1.md b/docs/podman-pod-start.1.md new file mode 100644 index 000000000..5d30db012 --- /dev/null +++ b/docs/podman-pod-start.1.md @@ -0,0 +1,38 @@ +% podman-pod-start "1" + +## NAME +podman\-pod\-start - Start one or more pods + +## SYNOPSIS +**podman pod start** [*options*] *pod* ... + +## DESCRIPTION +Start containers in one or more pods. You may use pod IDs or names as input. The pod must have a container attached +to be started. + +## OPTIONS + +**--all, -a** + +Starts all pods + +**--latest, -l** + +Instead of providing the pod name or ID, start the last created pod. + +## EXAMPLE + +podman pod start mywebserverpod + +podman pod start 860a4b23 5421ab4 + +podman pod start --latest + +podman pod start --all + + +## SEE ALSO +podman-pod(1), podman-pod-stop(1), podman-start(1) + +## HISTORY +July 2018, Adapted from podman start man page by Peter Hunt diff --git a/docs/podman-pod-stop.1.md b/docs/podman-pod-stop.1.md new file mode 100644 index 000000000..05e88041f --- /dev/null +++ b/docs/podman-pod-stop.1.md @@ -0,0 +1,47 @@ +% podman-pod-stop "1" + +## NAME +podman\-pod\-stop - Stop one or more pods + +## SYNOPSIS +**podman pod stop** [*options*] *pod* ... + +## DESCRIPTION +Stop containers in one or more pods. You may use pod IDs or names as input. + +## OPTIONS + +**--all, -a** + +Stops all pods + +**--latest, -l** + +Instead of providing the pod name or ID, stop the last created pod. + +## EXAMPLE + +podman pod stop mywebserverpod +cc8f0bea67b1a1a11aec1ecd38102a1be4b145577f21fc843c7c83b77fc28907 + +podman pod stop 490eb 3557fb +490eb241aaf704d4dd2629904410fe4aa31965d9310a735f8755267f4ded1de5 +3557fbea6ad61569de0506fe037479bd9896603c31d3069a6677f23833916fab + +3557fbea6ad61569de0506fe037479bd9896603c31d3069a6677f23833916fab + +podman pod stop --latest +3557fbea6ad61569de0506fe037479bd9896603c31d3069a6677f23833916fab + +podman pod stop --all +19456b4cd557eaf9629825113a552681a6013f8c8cad258e36ab825ef536e818 +3557fbea6ad61569de0506fe037479bd9896603c31d3069a6677f23833916fab +490eb241aaf704d4dd2629904410fe4aa31965d9310a735f8755267f4ded1de5 +70c358daecf71ef9be8f62404f926080ca0133277ef7ce4f6aa2d5af6bb2d3e9 +cc8f0bea67b1a1a11aec1ecd38102a1be4b145577f21fc843c7c83b77fc28907 + +## SEE ALSO +podman-pod(1), podman-pod-start(1), podman-stop(1) + +## HISTORY +July 2018, Originally compiled by Peter Hunt diff --git a/docs/podman-pod.1.md b/docs/podman-pod.1.md index 511a5841f..9aee75e81 100644 --- a/docs/podman-pod.1.md +++ b/docs/podman-pod.1.md @@ -16,6 +16,8 @@ podman pod is a set of subcommands that manage pods, or groups of containers. | [podman-pod-create(1)](podman-pod-create.1.md) | Create a new pod. | | [podman-pod-ps(1)](podman-pod-ps.1.md) | Prints out information about pods. | | [podman-pod-rm(1)](podman-pod-rm.1.md) | Remove one or more pods. | +| [podman-pod-start(1)](podman-pod-start.1.md) | Start one or more pods. | +| [podman-pod-stop(1)](podman-pod-stop.1.md) | Stop one or more pods. | ## HISTORY July 2018, Originally compiled by Peter Hunt diff --git a/test/e2e/pod_start_test.go b/test/e2e/pod_start_test.go new file mode 100644 index 000000000..682aedd72 --- /dev/null +++ b/test/e2e/pod_start_test.go @@ -0,0 +1,140 @@ +package integration + +import ( + "os" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Podman pod start", func() { + var ( + tempdir string + err error + podmanTest PodmanTest + ) + + BeforeEach(func() { + tempdir, err = CreateTempDirInTempDir() + if err != nil { + os.Exit(1) + } + podmanTest = PodmanCreate(tempdir) + podmanTest.RestoreAllArtifacts() + }) + + AfterEach(func() { + podmanTest.CleanupPod() + }) + + It("podman pod start bogus pod", func() { + session := podmanTest.Podman([]string{"pod", "start", "123"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(125)) + }) + + It("podman pod start single empty pod", func() { + session := podmanTest.Podman([]string{"pod", "create"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + cid := session.OutputToString() + + session = podmanTest.Podman([]string{"pod", "start", cid}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(125)) + }) + + It("podman pod start single pod by name", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"create", "--pod", "foobar99", ALPINE, "ls"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "start", "foobar99"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + }) + + It("podman pod start multiple pods", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + cid1 := session.OutputToString() + + session = podmanTest.Podman([]string{"create", "--pod", "foobar99", ALPINE, "top"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session2 := podmanTest.Podman([]string{"pod", "create", "--name", "foobar100"}) + session2.WaitWithDefaultTimeout() + cid2 := session2.OutputToString() + + session = podmanTest.Podman([]string{"create", "--pod", "foobar100", ALPINE, "top"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "start", cid1, cid2}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(2)) + }) + + It("podman pod start all pods", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + + session = podmanTest.Podman([]string{"create", "--pod", "foobar99", ALPINE, "top"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session2 := podmanTest.Podman([]string{"pod", "create", "--name", "foobar100"}) + session2.WaitWithDefaultTimeout() + + session = podmanTest.Podman([]string{"create", "--pod", "foobar100", ALPINE, "top"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "start", "--all"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(2)) + }) + + It("podman pod start latest pod", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + + session = podmanTest.Podman([]string{"create", "--pod", "foobar99", ALPINE, "top"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session2 := podmanTest.Podman([]string{"pod", "create", "--name", "foobar100"}) + session2.WaitWithDefaultTimeout() + + session = podmanTest.Podman([]string{"create", "--pod", "foobar100", ALPINE, "top"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "start", "--latest"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1)) + }) + + It("podman pod start multiple pods with bogus", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + cid1 := session.OutputToString() + + session = podmanTest.Podman([]string{"create", "--pod", "foobar99", ALPINE, "top"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "start", cid1, "doesnotexist"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(125)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1)) + }) +}) diff --git a/test/e2e/pod_stop_test.go b/test/e2e/pod_stop_test.go new file mode 100644 index 000000000..c954f584d --- /dev/null +++ b/test/e2e/pod_stop_test.go @@ -0,0 +1,141 @@ +package integration + +import ( + "os" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Podman pod stop", func() { + var ( + tempdir string + err error + podmanTest PodmanTest + ) + + BeforeEach(func() { + tempdir, err = CreateTempDirInTempDir() + if err != nil { + os.Exit(1) + } + podmanTest = PodmanCreate(tempdir) + podmanTest.RestoreAllArtifacts() + }) + + AfterEach(func() { + podmanTest.CleanupPod() + }) + + It("podman pod stop bogus pod", func() { + session := podmanTest.Podman([]string{"pod", "stop", "123"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(125)) + }) + + It("podman pod stop single empty pod", func() { + session := podmanTest.Podman([]string{"pod", "create"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + cid := session.OutputToString() + + session = podmanTest.Podman([]string{"pod", "stop", cid}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + }) + + It("podman pod stop single pod by name", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.RunTopContainerInPod("", "foobar99") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "stop", "foobar99"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0)) + }) + + It("podman pod stop multiple pods", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + cid1 := session.OutputToString() + + session = podmanTest.RunTopContainerInPod("", "foobar99") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session2 := podmanTest.Podman([]string{"pod", "create", "--name", "foobar100"}) + session2.WaitWithDefaultTimeout() + cid2 := session2.OutputToString() + + session = podmanTest.RunTopContainerInPod("", "foobar100") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "stop", cid1, cid2}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0)) + }) + + It("podman pod stop all pods", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + + session = podmanTest.RunTopContainerInPod("", "foobar99") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session2 := podmanTest.Podman([]string{"pod", "create", "--name", "foobar100"}) + session2.WaitWithDefaultTimeout() + + session = podmanTest.RunTopContainerInPod("", "foobar100") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "stop", "--all"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0)) + }) + + It("podman pod stop latest pod", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + + session = podmanTest.RunTopContainerInPod("", "foobar99") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session2 := podmanTest.Podman([]string{"pod", "create", "--name", "foobar100"}) + session2.WaitWithDefaultTimeout() + + session = podmanTest.RunTopContainerInPod("", "foobar100") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "stop", "--latest"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1)) + }) + + It("podman pod stop multiple pods with bogus", func() { + session := podmanTest.Podman([]string{"pod", "create", "--name", "foobar99"}) + session.WaitWithDefaultTimeout() + cid1 := session.OutputToString() + + session = podmanTest.RunTopContainerInPod("", "foobar99") + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + session = podmanTest.Podman([]string{"pod", "stop", cid1, "doesnotexist"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(125)) + Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0)) + }) +}) -- cgit v1.2.3-54-g00ecf