mirror of
https://github.com/containers/podman.git
synced 2025-06-22 18:08:11 +08:00
Merge pull request #2436 from baude/remotepodpause
podman-remote pod pause|unpause|restart
This commit is contained in:
@ -92,11 +92,8 @@ func getContainerSubCommands() []*cobra.Command {
|
|||||||
// Commands that the local client implements
|
// Commands that the local client implements
|
||||||
func getPodSubCommands() []*cobra.Command {
|
func getPodSubCommands() []*cobra.Command {
|
||||||
return []*cobra.Command{
|
return []*cobra.Command{
|
||||||
_podPauseCommand,
|
|
||||||
_podRestartCommand,
|
|
||||||
_podStatsCommand,
|
_podStatsCommand,
|
||||||
_podTopCommand,
|
_podTopCommand,
|
||||||
_podUnpauseCommand,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,10 +24,13 @@ var podSubCommands = []*cobra.Command{
|
|||||||
_podExistsCommand,
|
_podExistsCommand,
|
||||||
_podInspectCommand,
|
_podInspectCommand,
|
||||||
_podKillCommand,
|
_podKillCommand,
|
||||||
|
_podPauseCommand,
|
||||||
_podPsCommand,
|
_podPsCommand,
|
||||||
|
_podRestartCommand,
|
||||||
_podRmCommand,
|
_podRmCommand,
|
||||||
_podStartCommand,
|
_podStartCommand,
|
||||||
_podStopCommand,
|
_podStopCommand,
|
||||||
|
_podUnpauseCommand,
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -3,7 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
"github.com/containers/libpod/pkg/adapter"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -40,37 +40,33 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func podPauseCmd(c *cliconfig.PodPauseValues) error {
|
func podPauseCmd(c *cliconfig.PodPauseValues) error {
|
||||||
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
|
var lastError error
|
||||||
|
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error creating libpod runtime")
|
return errors.Wrapf(err, "error creating libpod runtime")
|
||||||
}
|
}
|
||||||
defer runtime.Shutdown(false)
|
defer runtime.Shutdown(false)
|
||||||
|
|
||||||
// getPodsFromContext returns an error when a requested pod
|
pauseIDs, conErrors, pauseErrors := runtime.PausePods(c)
|
||||||
// isn't found. The only fatal error scenerio is when there are no pods
|
|
||||||
// in which case the following loop will be skipped.
|
|
||||||
pods, lastError := getPodsFromContext(&c.PodmanCommand, runtime)
|
|
||||||
|
|
||||||
for _, pod := range pods {
|
for _, p := range pauseIDs {
|
||||||
ctr_errs, err := pod.Pause()
|
fmt.Println(p)
|
||||||
if ctr_errs != nil {
|
}
|
||||||
for ctr, err := range ctr_errs {
|
if conErrors != nil && len(conErrors) > 0 {
|
||||||
if lastError != nil {
|
for ctr, err := range conErrors {
|
||||||
logrus.Errorf("%q", lastError)
|
|
||||||
}
|
|
||||||
lastError = errors.Wrapf(err, "unable to pause container %q on pod %q", ctr, pod.ID())
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
if lastError != nil {
|
if lastError != nil {
|
||||||
logrus.Errorf("%q", lastError)
|
logrus.Errorf("%q", lastError)
|
||||||
}
|
}
|
||||||
lastError = errors.Wrapf(err, "unable to pause pod %q", pod.ID())
|
lastError = errors.Wrapf(err, "unable to pause container %s", ctr)
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
fmt.Println(pod.ID())
|
|
||||||
}
|
}
|
||||||
|
if len(pauseErrors) > 0 {
|
||||||
|
lastError = pauseErrors[len(pauseErrors)-1]
|
||||||
|
// Remove the last error from the error slice
|
||||||
|
pauseErrors = pauseErrors[:len(pauseErrors)-1]
|
||||||
|
}
|
||||||
|
for _, err := range pauseErrors {
|
||||||
|
logrus.Errorf("%q", err)
|
||||||
|
}
|
||||||
return lastError
|
return lastError
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
"github.com/containers/libpod/pkg/adapter"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -42,37 +42,33 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func podRestartCmd(c *cliconfig.PodRestartValues) error {
|
func podRestartCmd(c *cliconfig.PodRestartValues) error {
|
||||||
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
|
var lastError error
|
||||||
|
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "could not get runtime")
|
return errors.Wrapf(err, "could not get runtime")
|
||||||
}
|
}
|
||||||
defer runtime.Shutdown(false)
|
defer runtime.Shutdown(false)
|
||||||
|
|
||||||
// getPodsFromContext returns an error when a requested pod
|
restartIDs, conErrors, restartErrors := runtime.RestartPods(getContext(), c)
|
||||||
// isn't found. The only fatal error scenerio is when there are no pods
|
|
||||||
// in which case the following loop will be skipped.
|
|
||||||
pods, lastError := getPodsFromContext(&c.PodmanCommand, runtime)
|
|
||||||
|
|
||||||
ctx := getContext()
|
for _, p := range restartIDs {
|
||||||
for _, pod := range pods {
|
fmt.Println(p)
|
||||||
ctr_errs, err := pod.Restart(ctx)
|
}
|
||||||
if ctr_errs != nil {
|
if conErrors != nil && len(conErrors) > 0 {
|
||||||
for ctr, err := range ctr_errs {
|
for ctr, err := range conErrors {
|
||||||
if lastError != nil {
|
|
||||||
logrus.Errorf("%q", lastError)
|
|
||||||
}
|
|
||||||
lastError = errors.Wrapf(err, "unable to restart container %q on pod %q", ctr, pod.ID())
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
if lastError != nil {
|
if lastError != nil {
|
||||||
logrus.Errorf("%q", lastError)
|
logrus.Errorf("%q", lastError)
|
||||||
}
|
}
|
||||||
lastError = errors.Wrapf(err, "unable to restart pod %q", pod.ID())
|
lastError = errors.Wrapf(err, "unable to pause container %s", ctr)
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
fmt.Println(pod.ID())
|
}
|
||||||
|
if len(restartErrors) > 0 {
|
||||||
|
lastError = restartErrors[len(restartErrors)-1]
|
||||||
|
// Remove the last error from the error slice
|
||||||
|
restartErrors = restartErrors[:len(restartErrors)-1]
|
||||||
|
}
|
||||||
|
for _, err := range restartErrors {
|
||||||
|
logrus.Errorf("%q", err)
|
||||||
}
|
}
|
||||||
return lastError
|
return lastError
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
"github.com/containers/libpod/pkg/adapter"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -41,37 +41,33 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func podUnpauseCmd(c *cliconfig.PodUnpauseValues) error {
|
func podUnpauseCmd(c *cliconfig.PodUnpauseValues) error {
|
||||||
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
|
var lastError error
|
||||||
|
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error creating libpod runtime")
|
return errors.Wrapf(err, "error creating libpod runtime")
|
||||||
}
|
}
|
||||||
defer runtime.Shutdown(false)
|
defer runtime.Shutdown(false)
|
||||||
|
|
||||||
// getPodsFromContext returns an error when a requested pod
|
unpauseIDs, conErrors, unpauseErrors := runtime.UnpausePods(c)
|
||||||
// isn't found. The only fatal error scenerio is when there are no pods
|
|
||||||
// in which case the following loop will be skipped.
|
|
||||||
pods, lastError := getPodsFromContext(&c.PodmanCommand, runtime)
|
|
||||||
|
|
||||||
for _, pod := range pods {
|
for _, p := range unpauseIDs {
|
||||||
ctr_errs, err := pod.Unpause()
|
fmt.Println(p)
|
||||||
if ctr_errs != nil {
|
}
|
||||||
for ctr, err := range ctr_errs {
|
if conErrors != nil && len(conErrors) > 0 {
|
||||||
if lastError != nil {
|
for ctr, err := range conErrors {
|
||||||
logrus.Errorf("%q", lastError)
|
|
||||||
}
|
|
||||||
lastError = errors.Wrapf(err, "unable to unpause container %q on pod %q", ctr, pod.ID())
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
if lastError != nil {
|
if lastError != nil {
|
||||||
logrus.Errorf("%q", lastError)
|
logrus.Errorf("%q", lastError)
|
||||||
}
|
}
|
||||||
lastError = errors.Wrapf(err, "unable to unpause pod %q", pod.ID())
|
lastError = errors.Wrapf(err, "unable to unpause container %s", ctr)
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
fmt.Println(pod.ID())
|
|
||||||
}
|
}
|
||||||
|
if len(unpauseErrors) > 0 {
|
||||||
|
lastError = unpauseErrors[len(unpauseErrors)-1]
|
||||||
|
// Remove the last error from the error slice
|
||||||
|
unpauseErrors = unpauseErrors[:len(unpauseErrors)-1]
|
||||||
|
}
|
||||||
|
for _, err := range unpauseErrors {
|
||||||
|
logrus.Errorf("%q", err)
|
||||||
|
}
|
||||||
return lastError
|
return lastError
|
||||||
}
|
}
|
||||||
|
@ -224,3 +224,100 @@ func (p *Pod) GetPodStatus() (string, error) {
|
|||||||
func BatchContainerOp(ctr *libpod.Container, opts shared.PsOptions) (shared.BatchContainerStruct, error) {
|
func BatchContainerOp(ctr *libpod.Container, opts shared.PsOptions) (shared.BatchContainerStruct, error) {
|
||||||
return shared.BatchContainerOp(ctr, opts)
|
return shared.BatchContainerOp(ctr, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PausePods is a wrapper for pausing pods via libpod
|
||||||
|
func (r *LocalRuntime) PausePods(c *cliconfig.PodPauseValues) ([]string, map[string]error, []error) {
|
||||||
|
var (
|
||||||
|
pauseIDs []string
|
||||||
|
pauseErrors []error
|
||||||
|
)
|
||||||
|
containerErrors := make(map[string]error)
|
||||||
|
|
||||||
|
pods, err := shortcuts.GetPodsByContext(c.All, c.Latest, c.InputArgs, r.Runtime)
|
||||||
|
if err != nil {
|
||||||
|
pauseErrors = append(pauseErrors, err)
|
||||||
|
return nil, containerErrors, pauseErrors
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pod := range pods {
|
||||||
|
ctrErrs, err := pod.Pause()
|
||||||
|
if err != nil {
|
||||||
|
pauseErrors = append(pauseErrors, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ctrErrs != nil {
|
||||||
|
for ctr, err := range ctrErrs {
|
||||||
|
containerErrors[ctr] = err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pauseIDs = append(pauseIDs, pod.ID())
|
||||||
|
|
||||||
|
}
|
||||||
|
return pauseIDs, containerErrors, pauseErrors
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnpausePods is a wrapper for unpausing pods via libpod
|
||||||
|
func (r *LocalRuntime) UnpausePods(c *cliconfig.PodUnpauseValues) ([]string, map[string]error, []error) {
|
||||||
|
var (
|
||||||
|
unpauseIDs []string
|
||||||
|
unpauseErrors []error
|
||||||
|
)
|
||||||
|
containerErrors := make(map[string]error)
|
||||||
|
|
||||||
|
pods, err := shortcuts.GetPodsByContext(c.All, c.Latest, c.InputArgs, r.Runtime)
|
||||||
|
if err != nil {
|
||||||
|
unpauseErrors = append(unpauseErrors, err)
|
||||||
|
return nil, containerErrors, unpauseErrors
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pod := range pods {
|
||||||
|
ctrErrs, err := pod.Unpause()
|
||||||
|
if err != nil {
|
||||||
|
unpauseErrors = append(unpauseErrors, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ctrErrs != nil {
|
||||||
|
for ctr, err := range ctrErrs {
|
||||||
|
containerErrors[ctr] = err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
unpauseIDs = append(unpauseIDs, pod.ID())
|
||||||
|
|
||||||
|
}
|
||||||
|
return unpauseIDs, containerErrors, unpauseErrors
|
||||||
|
}
|
||||||
|
|
||||||
|
// RestartPods is a wrapper to restart pods via libpod
|
||||||
|
func (r *LocalRuntime) RestartPods(ctx context.Context, c *cliconfig.PodRestartValues) ([]string, map[string]error, []error) {
|
||||||
|
var (
|
||||||
|
restartIDs []string
|
||||||
|
restartErrors []error
|
||||||
|
)
|
||||||
|
containerErrors := make(map[string]error)
|
||||||
|
|
||||||
|
pods, err := shortcuts.GetPodsByContext(c.All, c.Latest, c.InputArgs, r.Runtime)
|
||||||
|
if err != nil {
|
||||||
|
restartErrors = append(restartErrors, err)
|
||||||
|
return nil, containerErrors, restartErrors
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pod := range pods {
|
||||||
|
ctrErrs, err := pod.Restart(ctx)
|
||||||
|
if err != nil {
|
||||||
|
restartErrors = append(restartErrors, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ctrErrs != nil {
|
||||||
|
for ctr, err := range ctrErrs {
|
||||||
|
containerErrors[ctr] = err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
restartIDs = append(restartIDs, pod.ID())
|
||||||
|
|
||||||
|
}
|
||||||
|
return restartIDs, containerErrors, restartErrors
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -327,3 +327,75 @@ func (p *Pod) SharesCgroup() bool {
|
|||||||
func (p *Pod) CgroupParent() string {
|
func (p *Pod) CgroupParent() string {
|
||||||
return p.config.CgroupParent
|
return p.config.CgroupParent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PausePods pauses a pod using varlink and the remote client
|
||||||
|
func (r *LocalRuntime) PausePods(c *cliconfig.PodPauseValues) ([]string, map[string]error, []error) {
|
||||||
|
var (
|
||||||
|
pauseIDs []string
|
||||||
|
pauseErrors []error
|
||||||
|
)
|
||||||
|
containerErrors := make(map[string]error)
|
||||||
|
|
||||||
|
pods, err := iopodman.GetPodsByContext().Call(r.Conn, c.All, c.Latest, c.InputArgs)
|
||||||
|
if err != nil {
|
||||||
|
pauseErrors = append(pauseErrors, err)
|
||||||
|
return nil, containerErrors, pauseErrors
|
||||||
|
}
|
||||||
|
for _, pod := range pods {
|
||||||
|
reply, err := iopodman.PausePod().Call(r.Conn, pod)
|
||||||
|
if err != nil {
|
||||||
|
pauseErrors = append(pauseErrors, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pauseIDs = append(pauseIDs, reply)
|
||||||
|
}
|
||||||
|
return pauseIDs, nil, pauseErrors
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnpausePods unpauses a pod using varlink and the remote client
|
||||||
|
func (r *LocalRuntime) UnpausePods(c *cliconfig.PodUnpauseValues) ([]string, map[string]error, []error) {
|
||||||
|
var (
|
||||||
|
unpauseIDs []string
|
||||||
|
unpauseErrors []error
|
||||||
|
)
|
||||||
|
containerErrors := make(map[string]error)
|
||||||
|
|
||||||
|
pods, err := iopodman.GetPodsByContext().Call(r.Conn, c.All, c.Latest, c.InputArgs)
|
||||||
|
if err != nil {
|
||||||
|
unpauseErrors = append(unpauseErrors, err)
|
||||||
|
return nil, containerErrors, unpauseErrors
|
||||||
|
}
|
||||||
|
for _, pod := range pods {
|
||||||
|
reply, err := iopodman.UnpausePod().Call(r.Conn, pod)
|
||||||
|
if err != nil {
|
||||||
|
unpauseErrors = append(unpauseErrors, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
unpauseIDs = append(unpauseIDs, reply)
|
||||||
|
}
|
||||||
|
return unpauseIDs, nil, unpauseErrors
|
||||||
|
}
|
||||||
|
|
||||||
|
// RestartPods restarts pods using varlink and the remote client
|
||||||
|
func (r *LocalRuntime) RestartPods(ctx context.Context, c *cliconfig.PodRestartValues) ([]string, map[string]error, []error) {
|
||||||
|
var (
|
||||||
|
restartIDs []string
|
||||||
|
restartErrors []error
|
||||||
|
)
|
||||||
|
containerErrors := make(map[string]error)
|
||||||
|
|
||||||
|
pods, err := iopodman.GetPodsByContext().Call(r.Conn, c.All, c.Latest, c.InputArgs)
|
||||||
|
if err != nil {
|
||||||
|
restartErrors = append(restartErrors, err)
|
||||||
|
return nil, containerErrors, restartErrors
|
||||||
|
}
|
||||||
|
for _, pod := range pods {
|
||||||
|
reply, err := iopodman.RestartPod().Call(r.Conn, pod)
|
||||||
|
if err != nil {
|
||||||
|
restartErrors = append(restartErrors, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
restartIDs = append(restartIDs, reply)
|
||||||
|
}
|
||||||
|
return restartIDs, nil, restartErrors
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user