summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorhaircommander <pehunt@redhat.com>2018-07-19 14:58:48 -0400
committerhaircommander <pehunt@redhat.com>2018-07-20 08:44:44 -0400
commit17f257140eaecbe39f679d27df85573eb15a7d51 (patch)
tree0cffee6b81f006b89ca01c08148e17711acf532b /cmd
parentba1871dac033783ab0329c9b3c9113a34a90992f (diff)
downloadpodman-17f257140eaecbe39f679d27df85573eb15a7d51.tar.gz
podman-17f257140eaecbe39f679d27df85573eb15a7d51.tar.bz2
podman-17f257140eaecbe39f679d27df85573eb15a7d51.zip
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 <pehunt@redhat.com>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/podman/pod.go2
-rw-r--r--cmd/podman/pod_rm.go56
-rw-r--r--cmd/podman/pod_start.go100
-rw-r--r--cmd/podman/pod_stop.go100
-rw-r--r--cmd/podman/utils.go18
5 files changed, 244 insertions, 32 deletions
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
+}