From 2724434369037938f5dceaf7bf8268d4d5ce1a68 Mon Sep 17 00:00:00 2001 From: Matthew Heon Date: Thu, 15 Mar 2018 15:00:18 -0400 Subject: Add 'podman restart' command Signed-off-by: Matthew Heon Closes: #503 Approved by: rhatdan --- cmd/podman/main.go | 1 + cmd/podman/restart.go | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 cmd/podman/restart.go (limited to 'cmd/podman') diff --git a/cmd/podman/main.go b/cmd/podman/main.go index 4034be267..2a0ca30ee 100644 --- a/cmd/podman/main.go +++ b/cmd/podman/main.go @@ -56,6 +56,7 @@ func main() { portCommand, pullCommand, pushCommand, + restartCommand, rmCommand, rmiCommand, runCommand, diff --git a/cmd/podman/restart.go b/cmd/podman/restart.go new file mode 100644 index 000000000..f96959a27 --- /dev/null +++ b/cmd/podman/restart.go @@ -0,0 +1,110 @@ +package main + +import ( + "fmt" + "os" + + "github.com/pkg/errors" + "github.com/projectatomic/libpod/libpod" + "github.com/urfave/cli" +) + +var ( + restartFlags = []cli.Flag{ + cli.UintFlag{ + Name: "timeout, time, t", + Usage: "Seconds to wait for stop before killing the container", + Value: libpod.CtrRemoveTimeout, + }, + LatestFlag, + } + restartDescription = `Restarts one or more running containers. The container ID or name can be used. A timeout before forcibly stopping can be set, but defaults to 10 seconds` + + restartCommand = cli.Command{ + Name: "restart", + Usage: "Restart one or more containers", + Description: restartDescription, + Flags: restartFlags, + Action: restartCmd, + ArgsUsage: "CONTAINER [CONTAINER ...]", + UseShortOptionHandling: true, + } +) + +func restartCmd(c *cli.Context) error { + args := c.Args() + if len(args) < 1 && !c.Bool("latest") { + return errors.Wrapf(libpod.ErrInvalidArg, "you must provide at least one container name or ID") + } + + if err := validateFlags(c, restartFlags); err != nil { + return err + } + + runtime, err := getRuntime(c) + if err != nil { + return errors.Wrapf(err, "error creating libpod runtime") + } + defer runtime.Shutdown(false) + + var lastError error + + timeout := c.Uint("timeout") + useTimeout := c.IsSet("timeout") + + // Handle --latest + if c.Bool("latest") { + lastCtr, err := runtime.GetLatestContainer() + if err != nil { + lastError = errors.Wrapf(err, "unable to get latest container") + } else { + lastError = restartCtr(timeout, useTimeout, lastCtr) + } + } + + for _, id := range args { + ctr, err := runtime.LookupContainer(id) + if err != nil { + if lastError != nil { + fmt.Fprintln(os.Stderr, lastError) + } + lastError = errors.Wrapf(err, "unable to find container %s", id) + continue + } + + if err := restartCtr(timeout, useTimeout, ctr); err != nil { + if lastError != nil { + fmt.Fprintln(os.Stderr, lastError) + } + lastError = errors.Wrapf(err, "error restarting container %s", ctr.ID()) + } + } + + return lastError +} + +// Restart a single container +func restartCtr(cliTimeout uint, useTimeout bool, ctr *libpod.Container) error { + timeout := ctr.StopTimeout() + if useTimeout { + timeout = cliTimeout + } + + state, err := ctr.State() + if err != nil { + return err + } + if state == libpod.ContainerStateRunning { + if err := ctr.StopWithTimeout(timeout); err != nil { + return err + } + } + + if err := ctr.Start(); err != nil { + return err + } + + fmt.Printf("%s\n", ctr.ID()) + + return nil +} -- cgit v1.2.3-54-g00ecf