summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/podman/cliconfig/config.go2
-rw-r--r--cmd/podman/commands.go4
-rw-r--r--cmd/podman/container.go2
-rw-r--r--cmd/podman/main.go2
-rw-r--r--cmd/podman/pause.go54
-rw-r--r--cmd/podman/play_kube.go85
-rw-r--r--cmd/podman/pods_prune.go64
-rw-r--r--cmd/podman/ps.go6
-rw-r--r--cmd/podman/system_prune.go10
-rw-r--r--cmd/podman/unpause.go54
-rw-r--r--cmd/podman/varlink/io.podman.varlink2
11 files changed, 109 insertions, 176 deletions
diff --git a/cmd/podman/cliconfig/config.go b/cmd/podman/cliconfig/config.go
index 16c98a13e..640a4bff4 100644
--- a/cmd/podman/cliconfig/config.go
+++ b/cmd/podman/cliconfig/config.go
@@ -159,7 +159,7 @@ type PruneContainersValues struct {
Force bool
}
-type PrunePodsValues struct {
+type PodPruneValues struct {
PodmanCommand
Force bool
}
diff --git a/cmd/podman/commands.go b/cmd/podman/commands.go
index 1a2da86cf..c36452cfe 100644
--- a/cmd/podman/commands.go
+++ b/cmd/podman/commands.go
@@ -17,14 +17,12 @@ func getMainCommands() []*cobra.Command {
_loginCommand,
_logoutCommand,
_mountCommand,
- _pauseCommand,
_portCommand,
_refreshCommand,
_restartCommand,
_searchCommand,
_statsCommand,
_topCommand,
- _unpauseCommand,
}
if len(_varlinkCommand.Use) > 0 {
@@ -49,7 +47,6 @@ func getContainerSubCommands() []*cobra.Command {
_commitCommand,
_execCommand,
_mountCommand,
- _pauseCommand,
_portCommand,
_pruneContainersCommand,
_refreshCommand,
@@ -60,7 +57,6 @@ func getContainerSubCommands() []*cobra.Command {
_stopCommand,
_topCommand,
_umountCommand,
- _unpauseCommand,
}
}
diff --git a/cmd/podman/container.go b/cmd/podman/container.go
index 1477d158f..7733c8eef 100644
--- a/cmd/podman/container.go
+++ b/cmd/podman/container.go
@@ -59,9 +59,11 @@ var (
_killCommand,
_listSubCommand,
_logsCommand,
+ _pauseCommand,
_runCommand,
_rmCommand,
_startCommand,
+ _unpauseCommand,
_waitCommand,
}
)
diff --git a/cmd/podman/main.go b/cmd/podman/main.go
index 2748df5f5..15f4a5d71 100644
--- a/cmd/podman/main.go
+++ b/cmd/podman/main.go
@@ -45,6 +45,7 @@ var mainCommands = []*cobra.Command{
_killCommand,
_loadCommand,
_logsCommand,
+ _pauseCommand,
podCommand.Command,
&_psCommand,
_pullCommand,
@@ -56,6 +57,7 @@ var mainCommands = []*cobra.Command{
_stopCommand,
_tagCommand,
_umountCommand,
+ _unpauseCommand,
_versionCommand,
_waitCommand,
imageCommand.Command,
diff --git a/cmd/podman/pause.go b/cmd/podman/pause.go
index 3e6d36571..ca137150a 100644
--- a/cmd/podman/pause.go
+++ b/cmd/podman/pause.go
@@ -4,11 +4,9 @@ import (
"os"
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/libpodruntime"
- "github.com/containers/libpod/cmd/podman/shared"
"github.com/containers/libpod/libpod"
+ "github.com/containers/libpod/pkg/adapter"
"github.com/pkg/errors"
- "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
@@ -41,15 +39,11 @@ func init() {
}
func pauseCmd(c *cliconfig.PauseValues) error {
- var (
- pauseContainers []*libpod.Container
- pauseFuncs []shared.ParallelWorkerInput
- )
if os.Geteuid() != 0 {
return errors.New("pause is not supported for rootless containers")
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
@@ -59,41 +53,19 @@ func pauseCmd(c *cliconfig.PauseValues) error {
if len(args) < 1 && !c.All {
return errors.Errorf("you must provide at least one container name or id")
}
- if c.All {
- containers, err := getAllOrLatestContainers(&c.PodmanCommand, runtime, libpod.ContainerStateRunning, "running")
- if err != nil {
- return err
- }
- pauseContainers = append(pauseContainers, containers...)
- } else {
- for _, arg := range args {
- ctr, err := runtime.LookupContainer(arg)
- if err != nil {
- return err
+ ok, failures, err := runtime.PauseContainers(getContext(), c)
+ if err != nil {
+ if errors.Cause(err) == libpod.ErrNoSuchCtr {
+ if len(c.InputArgs) > 1 {
+ exitCode = 125
+ } else {
+ exitCode = 1
}
- pauseContainers = append(pauseContainers, ctr)
- }
- }
-
- // Now assemble the slice of pauseFuncs
- for _, ctr := range pauseContainers {
- con := ctr
-
- f := func() error {
- return con.Pause()
}
- pauseFuncs = append(pauseFuncs, shared.ParallelWorkerInput{
- ContainerID: con.ID(),
- ParallelFunc: f,
- })
+ return err
}
-
- maxWorkers := shared.Parallelize("pause")
- if c.GlobalIsSet("max-workers") {
- maxWorkers = c.GlobalFlags.MaxWorks
+ if len(failures) > 0 {
+ exitCode = 125
}
- logrus.Debugf("Setting maximum workers to %d", maxWorkers)
-
- pauseErrors, errCount := shared.ParallelExecuteWorkerPool(maxWorkers, pauseFuncs)
- return printParallelOutput(pauseErrors, errCount)
+ return printCmdResults(ok, failures)
}
diff --git a/cmd/podman/play_kube.go b/cmd/podman/play_kube.go
index d60c873f8..d1008e615 100644
--- a/cmd/podman/play_kube.go
+++ b/cmd/podman/play_kube.go
@@ -45,7 +45,7 @@ var (
playKubeCommand.InputArgs = args
playKubeCommand.GlobalFlags = MainGlobalOpts
playKubeCommand.Remote = remoteclient
- return playKubeYAMLCmd(&playKubeCommand)
+ return playKubeCmd(&playKubeCommand)
},
Example: `podman play kube demo.yml
podman play kube --cert-dir /mycertsdir --tls-verify=true --quiet myWebPod`,
@@ -65,16 +65,7 @@ func init() {
flags.BoolVar(&playKubeCommand.TlsVerify, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
}
-func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
- var (
- podOptions []libpod.PodCreateOption
- podYAML v1.Pod
- registryCreds *types.DockerAuthConfig
- containers []*libpod.Container
- writer io.Writer
- )
-
- ctx := getContext()
+func playKubeCmd(c *cliconfig.KubePlayValues) error {
args := c.InputArgs
if len(args) > 1 {
return errors.New("you can only play one kubernetes file at a time")
@@ -83,19 +74,39 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
return errors.New("you must supply at least one file")
}
+ ctx := getContext()
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
- content, err := ioutil.ReadFile(args[0])
+ pod, err := playKubeYAMLCmd(c, ctx, runtime, args[0])
+ if err != nil && pod != nil {
+ if err2 := runtime.RemovePod(ctx, pod, true, true); err2 != nil {
+ logrus.Errorf("unable to remove pod %s after failing to play kube", pod.ID())
+ }
+ }
+ return err
+}
+
+func playKubeYAMLCmd(c *cliconfig.KubePlayValues, ctx context.Context, runtime *libpod.Runtime, yamlFile string) (*libpod.Pod, error) {
+ var (
+ containers []*libpod.Container
+ pod *libpod.Pod
+ podOptions []libpod.PodCreateOption
+ podYAML v1.Pod
+ registryCreds *types.DockerAuthConfig
+ writer io.Writer
+ )
+
+ content, err := ioutil.ReadFile(yamlFile)
if err != nil {
- return err
+ return nil, err
}
if err := yaml.Unmarshal(content, &podYAML); err != nil {
- return errors.Wrapf(err, "unable to read %s as YAML", args[0])
+ return nil, errors.Wrapf(err, "unable to read %s as YAML", yamlFile)
}
// check for name collision between pod and container
@@ -113,23 +124,21 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
nsOptions, err := shared.GetNamespaceOptions(strings.Split(shared.DefaultKernelNamespaces, ","))
if err != nil {
- return err
+ return nil, err
}
podOptions = append(podOptions, nsOptions...)
podPorts := getPodPorts(podYAML.Spec.Containers)
podOptions = append(podOptions, libpod.WithInfraContainerPorts(podPorts))
// Create the Pod
- pod, err := runtime.NewPod(ctx, podOptions...)
+ pod, err = runtime.NewPod(ctx, podOptions...)
if err != nil {
- return err
+ return pod, err
}
- // Print the Pod's ID
- fmt.Println(pod.ID())
podInfraID, err := pod.InfraContainerID()
if err != nil {
- return err
+ return pod, err
}
namespaces := map[string]string{
@@ -157,26 +166,26 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
for _, volume := range podYAML.Spec.Volumes {
hostPath := volume.VolumeSource.HostPath
if hostPath == nil {
- return errors.Errorf("HostPath is currently the only supported VolumeSource")
+ return pod, errors.Errorf("HostPath is currently the only supported VolumeSource")
}
if hostPath.Type != nil {
switch *hostPath.Type {
case v1.HostPathDirectoryOrCreate:
if _, err := os.Stat(hostPath.Path); os.IsNotExist(err) {
if err := os.Mkdir(hostPath.Path, createDirectoryPermission); err != nil {
- return errors.Errorf("Error creating HostPath %s at %s", volume.Name, hostPath.Path)
+ return pod, errors.Errorf("Error creating HostPath %s at %s", volume.Name, hostPath.Path)
}
}
// unconditionally label a newly created volume as private
if err := libpod.LabelVolumePath(hostPath.Path, false); err != nil {
- return errors.Wrapf(err, "Error giving %s a label", hostPath.Path)
+ return pod, errors.Wrapf(err, "Error giving %s a label", hostPath.Path)
}
break
case v1.HostPathFileOrCreate:
if _, err := os.Stat(hostPath.Path); os.IsNotExist(err) {
f, err := os.OpenFile(hostPath.Path, os.O_RDONLY|os.O_CREATE, createFilePermission)
if err != nil {
- return errors.Errorf("Error creating HostPath %s at %s", volume.Name, hostPath.Path)
+ return pod, errors.Errorf("Error creating HostPath %s at %s", volume.Name, hostPath.Path)
}
if err := f.Close(); err != nil {
logrus.Warnf("Error in closing newly created HostPath file: %v", err)
@@ -184,7 +193,7 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
}
// unconditionally label a newly created volume as private
if err := libpod.LabelVolumePath(hostPath.Path, false); err != nil {
- return errors.Wrapf(err, "Error giving %s a label", hostPath.Path)
+ return pod, errors.Wrapf(err, "Error giving %s a label", hostPath.Path)
}
break
case v1.HostPathDirectory:
@@ -193,11 +202,11 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
// do nothing here because we will verify the path exists in validateVolumeHostDir
break
default:
- return errors.Errorf("Directories are the only supported HostPath type")
+ return pod, errors.Errorf("Directories are the only supported HostPath type")
}
}
if err := shared.ValidateVolumeHostDir(hostPath.Path); err != nil {
- return errors.Wrapf(err, "Error in parsing HostPath in YAML")
+ return pod, errors.Wrapf(err, "Error in parsing HostPath in YAML")
}
volumes[volume.Name] = hostPath.Path
}
@@ -205,15 +214,15 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
for _, container := range podYAML.Spec.Containers {
newImage, err := runtime.ImageRuntime().New(ctx, container.Image, c.SignaturePolicy, c.Authfile, writer, &dockerRegistryOptions, image.SigningOptions{}, false, nil)
if err != nil {
- return err
+ return pod, err
}
createConfig, err := kubeContainerToCreateConfig(ctx, container, runtime, newImage, namespaces, volumes)
if err != nil {
- return err
+ return pod, err
}
ctr, err := shared.CreateContainerFromCreateConfig(runtime, createConfig, ctx, pod)
if err != nil {
- return err
+ return pod, err
}
containers = append(containers, ctr)
}
@@ -223,12 +232,24 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
if err := ctr.Start(ctx, true); err != nil {
// Making this a hard failure here to avoid a mess
// the other containers are in created status
- return err
+ return pod, err
}
+ }
+
+ // We've now successfully converted this YAML into a pod
+ // print our pod and containers, signifying we succeeded
+ fmt.Printf("Pod:\n%s\n", pod.ID())
+ if len(containers) == 1 {
+ fmt.Printf("Container:\n")
+ }
+ if len(containers) > 1 {
+ fmt.Printf("Containers:\n")
+ }
+ for _, ctr := range containers {
fmt.Println(ctr.ID())
}
- return nil
+ return pod, nil
}
// getPodPorts converts a slice of kube container descriptions to an
diff --git a/cmd/podman/pods_prune.go b/cmd/podman/pods_prune.go
index 89401a98a..e6946f068 100644
--- a/cmd/podman/pods_prune.go
+++ b/cmd/podman/pods_prune.go
@@ -1,19 +1,15 @@
package main
import (
- "context"
-
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/shared"
"github.com/containers/libpod/pkg/adapter"
"github.com/pkg/errors"
- "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var (
- prunePodsCommand cliconfig.PrunePodsValues
- prunePodsDescription = `
+ podPruneCommand cliconfig.PodPruneValues
+ podPruneDescription = `
podman pod prune
Removes all exited pods
@@ -22,62 +18,30 @@ var (
Use: "prune",
Args: noSubArgs,
Short: "Remove all stopped pods",
- Long: prunePodsDescription,
+ Long: podPruneDescription,
RunE: func(cmd *cobra.Command, args []string) error {
- prunePodsCommand.InputArgs = args
- prunePodsCommand.GlobalFlags = MainGlobalOpts
- return prunePodsCmd(&prunePodsCommand)
+ podPruneCommand.InputArgs = args
+ podPruneCommand.GlobalFlags = MainGlobalOpts
+ return podPruneCmd(&podPruneCommand)
},
}
)
func init() {
- prunePodsCommand.Command = _prunePodsCommand
- prunePodsCommand.SetHelpTemplate(HelpTemplate())
- prunePodsCommand.SetUsageTemplate(UsageTemplate())
- flags := prunePodsCommand.Flags()
- flags.BoolVarP(&prunePodsCommand.Force, "force", "f", false, "Force removal of a running pods. The default is false")
+ podPruneCommand.Command = _prunePodsCommand
+ podPruneCommand.SetHelpTemplate(HelpTemplate())
+ podPruneCommand.SetUsageTemplate(UsageTemplate())
+ flags := podPruneCommand.Flags()
+ flags.BoolVarP(&podPruneCommand.Force, "force", "f", false, "Force removal of a running pods. The default is false")
}
-func prunePods(runtime *adapter.LocalRuntime, ctx context.Context, maxWorkers int, force bool) error {
- var deleteFuncs []shared.ParallelWorkerInput
-
- states := []string{shared.PodStateStopped, shared.PodStateExited}
- delPods, err := runtime.GetPodsByStatus(states)
- if err != nil {
- return err
- }
- if len(delPods) < 1 {
- return nil
- }
- for _, pod := range delPods {
- p := pod
- f := func() error {
- return runtime.RemovePod(ctx, p, force, force)
- }
-
- deleteFuncs = append(deleteFuncs, shared.ParallelWorkerInput{
- ContainerID: p.ID(),
- ParallelFunc: f,
- })
- }
- // Run the parallel funcs
- deleteErrors, errCount := shared.ParallelExecuteWorkerPool(maxWorkers, deleteFuncs)
- return printParallelOutput(deleteErrors, errCount)
-}
-
-func prunePodsCmd(c *cliconfig.PrunePodsValues) error {
+func podPruneCmd(c *cliconfig.PodPruneValues) error {
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
- maxWorkers := shared.Parallelize("rm")
- if c.GlobalIsSet("max-workers") {
- maxWorkers = c.GlobalFlags.MaxWorks
- }
- logrus.Debugf("Setting maximum workers to %d", maxWorkers)
-
- return prunePods(runtime, getContext(), maxWorkers, c.Bool("force"))
+ ok, failures, err := runtime.PrunePods(getContext(), c)
+ return printCmdResults(ok, failures)
}
diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go
index a9e46d6b9..df1ea2765 100644
--- a/cmd/podman/ps.go
+++ b/cmd/podman/ps.go
@@ -17,7 +17,6 @@ import (
"github.com/containers/libpod/pkg/adapter"
"github.com/cri-o/ocicni/pkg/ocicni"
"github.com/docker/go-units"
- "github.com/opentracing/opentracing-go"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/fields"
@@ -198,11 +197,6 @@ func init() {
}
func psCmd(c *cliconfig.PsValues) error {
- if c.Bool("trace") {
- span, _ := opentracing.StartSpanFromContext(Ctx, "psCmd")
- defer span.Finish()
- }
-
var watch bool
if c.Watch > 0 {
diff --git a/cmd/podman/system_prune.go b/cmd/podman/system_prune.go
index 14cb96941..8900e2644 100644
--- a/cmd/podman/system_prune.go
+++ b/cmd/podman/system_prune.go
@@ -82,13 +82,21 @@ Are you sure you want to continue? [y/N] `, volumeString)
ctx := getContext()
fmt.Println("Deleted Containers")
lasterr := pruneContainers(runtime, ctx, rmWorkers, false, false)
+
fmt.Println("Deleted Pods")
- if err := prunePods(runtime, ctx, rmWorkers, true); err != nil {
+ pruneValues := cliconfig.PodPruneValues{
+ PodmanCommand: c.PodmanCommand,
+ Force: c.Force,
+ }
+ ok, failures, err := runtime.PrunePods(ctx, &pruneValues)
+ if err != nil {
if lasterr != nil {
logrus.Errorf("%q", lasterr)
}
lasterr = err
}
+ printCmdResults(ok, failures)
+
if c.Bool("volumes") {
fmt.Println("Deleted Volumes")
err := volumePrune(runtime, getContext())
diff --git a/cmd/podman/unpause.go b/cmd/podman/unpause.go
index 65e841b36..fa946bfd7 100644
--- a/cmd/podman/unpause.go
+++ b/cmd/podman/unpause.go
@@ -4,11 +4,9 @@ import (
"os"
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/libpodruntime"
- "github.com/containers/libpod/cmd/podman/shared"
"github.com/containers/libpod/libpod"
+ "github.com/containers/libpod/pkg/adapter"
"github.com/pkg/errors"
- "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
@@ -40,15 +38,11 @@ func init() {
}
func unpauseCmd(c *cliconfig.UnpauseValues) error {
- var (
- unpauseContainers []*libpod.Container
- unpauseFuncs []shared.ParallelWorkerInput
- )
if os.Geteuid() != 0 {
return errors.New("unpause is not supported for rootless containers")
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
@@ -58,41 +52,19 @@ func unpauseCmd(c *cliconfig.UnpauseValues) error {
if len(args) < 1 && !c.All {
return errors.Errorf("you must provide at least one container name or id")
}
- if c.All {
- cs, err := getAllOrLatestContainers(&c.PodmanCommand, runtime, libpod.ContainerStatePaused, "paused")
- if err != nil {
- return err
- }
- unpauseContainers = append(unpauseContainers, cs...)
- } else {
- for _, arg := range args {
- ctr, err := runtime.LookupContainer(arg)
- if err != nil {
- return err
+ ok, failures, err := runtime.UnpauseContainers(getContext(), c)
+ if err != nil {
+ if errors.Cause(err) == libpod.ErrNoSuchCtr {
+ if len(c.InputArgs) > 1 {
+ exitCode = 125
+ } else {
+ exitCode = 1
}
- unpauseContainers = append(unpauseContainers, ctr)
- }
- }
-
- // Assemble the unpause funcs
- for _, ctr := range unpauseContainers {
- con := ctr
- f := func() error {
- return con.Unpause()
}
-
- unpauseFuncs = append(unpauseFuncs, shared.ParallelWorkerInput{
- ContainerID: con.ID(),
- ParallelFunc: f,
- })
+ return err
}
-
- maxWorkers := shared.Parallelize("unpause")
- if c.GlobalIsSet("max-workers") {
- maxWorkers = c.GlobalFlags.MaxWorks
+ if len(failures) > 0 {
+ exitCode = 125
}
- logrus.Debugf("Setting maximum workers to %d", maxWorkers)
-
- unpauseErrors, errCount := shared.ParallelExecuteWorkerPool(maxWorkers, unpauseFuncs)
- return printParallelOutput(unpauseErrors, errCount)
+ return printCmdResults(ok, failures)
}
diff --git a/cmd/podman/varlink/io.podman.varlink b/cmd/podman/varlink/io.podman.varlink
index 497f130bc..1fde72164 100644
--- a/cmd/podman/varlink/io.podman.varlink
+++ b/cmd/podman/varlink/io.podman.varlink
@@ -522,6 +522,8 @@ method ListContainers() -> (containers: []Container)
method Ps(opts: PsOpts) -> (containers: []PsContainer)
+method GetContainersByStatus(status: []string) -> (containerS: []Container)
+
# GetContainer returns information about a single container. If a container
# with the given id doesn't exist, a [ContainerNotFound](#ContainerNotFound)
# error will be returned. See also [ListContainers](ListContainers) and