github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/cmd/podman/restart.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/containers/libpod/cmd/podman/cliconfig"
     7  	"github.com/containers/libpod/libpod/define"
     8  	"github.com/containers/libpod/pkg/adapter"
     9  	"github.com/pkg/errors"
    10  	"github.com/spf13/cobra"
    11  )
    12  
    13  var (
    14  	restartCommand     cliconfig.RestartValues
    15  	restartDescription = fmt.Sprintf(`Restarts one or more running containers. The container ID or name can be used.
    16  
    17    A timeout before forcibly stopping can be set, but defaults to %d seconds.`, defaultContainerConfig.Engine.StopTimeout)
    18  	_restartCommand = &cobra.Command{
    19  		Use:   "restart [flags] CONTAINER [CONTAINER...]",
    20  		Short: "Restart one or more containers",
    21  		Long:  restartDescription,
    22  		RunE: func(cmd *cobra.Command, args []string) error {
    23  			restartCommand.InputArgs = args
    24  			restartCommand.GlobalFlags = MainGlobalOpts
    25  			return restartCmd(&restartCommand)
    26  		},
    27  		Args: func(cmd *cobra.Command, args []string) error {
    28  			return checkAllLatestAndCIDFile(cmd, args, false, false)
    29  		},
    30  		Example: `podman restart ctrID
    31    podman restart --latest
    32    podman restart ctrID1 ctrID2`,
    33  	}
    34  )
    35  
    36  func init() {
    37  	restartCommand.Command = _restartCommand
    38  	restartCommand.SetHelpTemplate(HelpTemplate())
    39  	restartCommand.SetUsageTemplate(UsageTemplate())
    40  	flags := restartCommand.Flags()
    41  	flags.BoolVarP(&restartCommand.All, "all", "a", false, "Restart all non-running containers")
    42  	flags.BoolVarP(&restartCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
    43  	flags.BoolVar(&restartCommand.Running, "running", false, "Restart only running containers when --all is used")
    44  	flags.UintVarP(&restartCommand.Timeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
    45  
    46  	markFlagHiddenForRemoteClient("latest", flags)
    47  	flags.SetNormalizeFunc(aliasFlags)
    48  }
    49  
    50  func restartCmd(c *cliconfig.RestartValues) error {
    51  	all := c.All
    52  	if len(c.InputArgs) < 1 && !c.Latest && !all {
    53  		return errors.Wrapf(define.ErrInvalidArg, "you must provide at least one container name or ID")
    54  	}
    55  
    56  	runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
    57  	if err != nil {
    58  		return errors.Wrapf(err, "error creating libpod runtime")
    59  	}
    60  	defer runtime.DeferredShutdown(false)
    61  
    62  	ok, failures, err := runtime.Restart(getContext(), c)
    63  	if err != nil {
    64  		if errors.Cause(err) == define.ErrNoSuchCtr {
    65  			if len(c.InputArgs) > 1 {
    66  				exitCode = define.ExecErrorCodeGeneric
    67  			} else {
    68  				exitCode = 1
    69  			}
    70  		}
    71  		return err
    72  	}
    73  	if len(failures) > 0 {
    74  		exitCode = define.ExecErrorCodeGeneric
    75  	}
    76  	return printCmdResults(ok, failures)
    77  }