diff options
author | baude <bbaude@redhat.com> | 2019-04-16 10:02:54 -0500 |
---|---|---|
committer | baude <bbaude@redhat.com> | 2019-04-24 13:30:18 -0500 |
commit | 18d66136c1b9180f9571b7dc68a904ca82e0ba9c (patch) | |
tree | 018d125b8aec35a95baaa8acc0e7c4c0f3eb3da4 /pkg/adapter/containers.go | |
parent | b4cba6090d2e44f34f233bee4f2df47582ced7a0 (diff) | |
download | podman-18d66136c1b9180f9571b7dc68a904ca82e0ba9c.tar.gz podman-18d66136c1b9180f9571b7dc68a904ca82e0ba9c.tar.bz2 podman-18d66136c1b9180f9571b7dc68a904ca82e0ba9c.zip |
podman remote-client restart containers
add the ability to restart containers with the remote-client
Signed-off-by: baude <bbaude@redhat.com>
Diffstat (limited to 'pkg/adapter/containers.go')
-rw-r--r-- | pkg/adapter/containers.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/pkg/adapter/containers.go b/pkg/adapter/containers.go index 5279f11b2..1c0a60234 100644 --- a/pkg/adapter/containers.go +++ b/pkg/adapter/containers.go @@ -694,3 +694,72 @@ func (r *LocalRuntime) UnpauseContainers(ctx context.Context, cli *cliconfig.Unp } return pool.Run() } + +// Restart containers without or without a timeout +func (r *LocalRuntime) Restart(ctx context.Context, c *cliconfig.RestartValues) ([]string, map[string]error, error) { + var ( + containers []*libpod.Container + restartContainers []*libpod.Container + err error + ) + useTimeout := c.Flag("timeout").Changed || c.Flag("time").Changed + inputTimeout := c.Timeout + + // Handle --latest + if c.Latest { + lastCtr, err := r.Runtime.GetLatestContainer() + if err != nil { + return nil, nil, errors.Wrapf(err, "unable to get latest container") + } + restartContainers = append(restartContainers, lastCtr) + } else if c.Running { + containers, err = r.GetRunningContainers() + if err != nil { + return nil, nil, err + } + restartContainers = append(restartContainers, containers...) + } else if c.All { + containers, err = r.Runtime.GetAllContainers() + if err != nil { + return nil, nil, err + } + restartContainers = append(restartContainers, containers...) + } else { + for _, id := range c.InputArgs { + ctr, err := r.Runtime.LookupContainer(id) + if err != nil { + return nil, nil, err + } + restartContainers = append(restartContainers, ctr) + } + } + + maxWorkers := shared.DefaultPoolSize("restart") + if c.GlobalIsSet("max-workers") { + maxWorkers = c.GlobalFlags.MaxWorks + } + + logrus.Debugf("Setting maximum workers to %d", maxWorkers) + + // We now have a slice of all the containers to be restarted. Iterate them to + // create restart Funcs with a timeout as needed + pool := shared.NewPool("restart", maxWorkers, len(restartContainers)) + for _, c := range restartContainers { + ctr := c + timeout := ctr.StopTimeout() + if useTimeout { + timeout = inputTimeout + } + pool.Add(shared.Job{ + ID: ctr.ID(), + Fn: func() error { + err := ctr.RestartWithTimeout(ctx, timeout) + if err != nil { + logrus.Debugf("Failed to restart container %s: %s", ctr.ID(), err.Error()) + } + return err + }, + }) + } + return pool.Run() +} |