summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/common/ports.go6
-rw-r--r--cmd/podman/common/specgen.go20
-rw-r--r--cmd/podman/common/util.go11
-rw-r--r--cmd/podman/containers/attach.go9
-rw-r--r--cmd/podman/containers/commit.go1
-rw-r--r--cmd/podman/containers/container.go3
-rw-r--r--cmd/podman/containers/create.go3
-rw-r--r--cmd/podman/containers/diff.go3
-rw-r--r--cmd/podman/containers/exec.go22
-rw-r--r--cmd/podman/containers/export.go1
-rw-r--r--cmd/podman/containers/kill.go3
-rw-r--r--cmd/podman/containers/list.go4
-rw-r--r--cmd/podman/containers/ps.go15
-rw-r--r--cmd/podman/containers/rm.go3
-rw-r--r--cmd/podman/containers/run.go2
-rw-r--r--cmd/podman/containers/stop.go3
-rw-r--r--cmd/podman/containers/unmount.go6
-rw-r--r--cmd/podman/containers/wait.go4
-rw-r--r--cmd/podman/diff.go3
-rw-r--r--cmd/podman/generate/generate.go3
-rw-r--r--cmd/podman/healthcheck/healthcheck.go3
-rw-r--r--cmd/podman/images/image.go3
-rw-r--r--cmd/podman/images/prune.go4
-rw-r--r--cmd/podman/images/pull.go1
-rw-r--r--cmd/podman/login.go2
-rw-r--r--cmd/podman/logout.go2
-rw-r--r--cmd/podman/main.go11
-rw-r--r--cmd/podman/manifest/manifest.go3
-rw-r--r--cmd/podman/networks/network.go5
-rw-r--r--cmd/podman/parse/net.go4
-rw-r--r--cmd/podman/parse/net_test.go4
-rw-r--r--cmd/podman/pods/create.go5
-rw-r--r--cmd/podman/pods/pod.go3
-rw-r--r--cmd/podman/pods/ps.go6
-rw-r--r--cmd/podman/registry/registry.go17
-rw-r--r--cmd/podman/root.go3
-rw-r--r--cmd/podman/system/events.go4
-rw-r--r--cmd/podman/system/info.go4
-rw-r--r--cmd/podman/system/system.go3
-rw-r--r--cmd/podman/system/version.go10
-rw-r--r--cmd/podman/utils/alias.go2
-rw-r--r--cmd/podman/validate/args.go32
-rw-r--r--cmd/podman/validate/choice.go46
-rw-r--r--cmd/podman/volumes/list.go4
-rw-r--r--cmd/podman/volumes/prune.go4
-rw-r--r--cmd/podman/volumes/volume.go3
-rw-r--r--go.mod2
-rw-r--r--go.sum4
-rw-r--r--libpod/runtime_ctr.go3
-rw-r--r--test/e2e/prune_test.go3
-rw-r--r--test/system/015-help.bats21
-rw-r--r--vendor/github.com/containers/psgo/CODE-OF-CONDUCT.md3
-rw-r--r--vendor/github.com/containers/psgo/Makefile12
-rw-r--r--vendor/github.com/containers/psgo/go.mod2
-rw-r--r--vendor/github.com/containers/psgo/go.sum4
-rw-r--r--vendor/github.com/containers/psgo/internal/proc/stat.go21
-rw-r--r--vendor/github.com/containers/psgo/internal/process/process.go2
-rw-r--r--vendor/github.com/containers/psgo/psgo.go22
-rw-r--r--vendor/modules.txt2
59 files changed, 276 insertions, 138 deletions
diff --git a/cmd/podman/common/ports.go b/cmd/podman/common/ports.go
index a96bafabd..2092bbe53 100644
--- a/cmd/podman/common/ports.go
+++ b/cmd/podman/common/ports.go
@@ -9,10 +9,10 @@ func verifyExpose(expose []string) error {
// add the expose ports from the user (--expose)
// can be single or a range
for _, expose := range expose {
- //support two formats for expose, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
+ // support two formats for expose, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
_, port := nat.SplitProtoPort(expose)
- //parse the start and end port and create a sequence of ports to expose
- //if expose a port, the start and end port are the same
+ // parse the start and end port and create a sequence of ports to expose
+ // if expose a port, the start and end port are the same
_, _, err := nat.ParsePortRange(port)
if err != nil {
return errors.Wrapf(err, "invalid range format for --expose: %s", expose)
diff --git a/cmd/podman/common/specgen.go b/cmd/podman/common/specgen.go
index f8c58f1a4..96cd630a3 100644
--- a/cmd/podman/common/specgen.go
+++ b/cmd/podman/common/specgen.go
@@ -192,7 +192,7 @@ func getMemoryLimits(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []strin
func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string) error {
var (
err error
- //namespaces map[string]string
+ // namespaces map[string]string
)
// validate flags as needed
@@ -485,7 +485,7 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
// TODO
// ouitside of specgen and oci though
// defaults to true, check spec/storage
- //s.readon = c.ReadOnlyTmpFS
+ // s.readon = c.ReadOnlyTmpFS
// TODO convert to map?
// check if key=value and convert
sysmap := make(map[string]string)
@@ -528,7 +528,7 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
// Only add read-only tmpfs mounts in case that we are read-only and the
// read-only tmpfs flag has been set.
- mounts, volumes, err := parseVolumes(c.Volume, c.Mount, c.TmpFS, (c.ReadOnlyTmpFS && c.ReadOnly))
+ mounts, volumes, err := parseVolumes(c.Volume, c.Mount, c.TmpFS, c.ReadOnlyTmpFS && c.ReadOnly)
if err != nil {
return err
}
@@ -536,12 +536,12 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
s.Volumes = volumes
// TODO any idea why this was done
- //devices := rtc.Containers.Devices
+ // devices := rtc.Containers.Devices
// TODO conflict on populate?
//
- //if c.Changed("device") {
+ // if c.Changed("device") {
// devices = append(devices, c.StringSlice("device")...)
- //}
+ // }
for _, dev := range c.Devices {
s.Devices = append(s.Devices, specs.LinuxDevice{Path: dev})
@@ -553,7 +553,7 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
// initpath
s.Stdin = c.Interactive
// quiet
- //DeviceCgroupRules: c.StringSlice("device-cgroup-rule"),
+ // DeviceCgroupRules: c.StringSlice("device-cgroup-rule"),
// Rlimits/Ulimits
for _, u := range c.Ulimit {
@@ -573,10 +573,10 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
s.Rlimits = append(s.Rlimits, rl)
}
- //Tmpfs: c.StringArray("tmpfs"),
+ // Tmpfs: c.StringArray("tmpfs"),
// TODO how to handle this?
- //Syslog: c.Bool("syslog"),
+ // Syslog: c.Bool("syslog"),
logOpts := make(map[string]string)
for _, o := range c.LogOptions {
@@ -602,7 +602,7 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
s.StopTimeout = &c.StopTimeout
// TODO where should we do this?
- //func verifyContainerResources(config *cc.CreateConfig, update bool) ([]string, error) {
+ // func verifyContainerResources(config *cc.CreateConfig, update bool) ([]string, error) {
return nil
}
diff --git a/cmd/podman/common/util.go b/cmd/podman/common/util.go
index 5b99b8398..47bbe12fa 100644
--- a/cmd/podman/common/util.go
+++ b/cmd/podman/common/util.go
@@ -1,11 +1,8 @@
package common
import (
- "fmt"
"strconv"
- "github.com/spf13/cobra"
-
"github.com/cri-o/ocicni/pkg/ocicni"
"github.com/docker/go-connections/nat"
"github.com/pkg/errors"
@@ -44,11 +41,3 @@ func createPortBindings(ports []string) ([]ocicni.PortMapping, error) {
}
return portBindings, nil
}
-
-// NoArgs returns an error if any args are included.
-func NoArgs(cmd *cobra.Command, args []string) error {
- if len(args) > 0 {
- return fmt.Errorf("`%s` takes no arguments", cmd.CommandPath())
- }
- return nil
-}
diff --git a/cmd/podman/containers/attach.go b/cmd/podman/containers/attach.go
index ee4d811d7..119b47d3f 100644
--- a/cmd/podman/containers/attach.go
+++ b/cmd/podman/containers/attach.go
@@ -4,6 +4,7 @@ import (
"os"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
"github.com/spf13/cobra"
@@ -17,12 +18,7 @@ var (
Short: "Attach to a running container",
Long: attachDescription,
RunE: attach,
- Args: func(cmd *cobra.Command, args []string) error {
- if len(args) > 1 || (len(args) == 0 && !cmd.Flag("latest").Changed) {
- return errors.Errorf("attach requires the name or id of one running container or the latest flag")
- }
- return nil
- },
+ Args: validate.IdOrLatestArgs,
Example: `podman attach ctrID
podman attach 1234
podman attach --no-stdin foobar`,
@@ -33,6 +29,7 @@ var (
Short: attachCommand.Short,
Long: attachCommand.Long,
RunE: attachCommand.RunE,
+ Args: validate.IdOrLatestArgs,
Example: `podman container attach ctrID
podman container attach 1234
podman container attach --no-stdin foobar`,
diff --git a/cmd/podman/containers/commit.go b/cmd/podman/containers/commit.go
index 137e486eb..b3c3d7626 100644
--- a/cmd/podman/containers/commit.go
+++ b/cmd/podman/containers/commit.go
@@ -30,6 +30,7 @@ var (
}
containerCommitCommand = &cobra.Command{
+ Args: cobra.MinimumNArgs(1),
Use: commitCommand.Use,
Short: commitCommand.Short,
Long: commitCommand.Long,
diff --git a/cmd/podman/containers/container.go b/cmd/podman/containers/container.go
index 97b73cdd0..a102318fb 100644
--- a/cmd/podman/containers/container.go
+++ b/cmd/podman/containers/container.go
@@ -2,6 +2,7 @@ package containers
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/util"
"github.com/spf13/cobra"
@@ -17,7 +18,7 @@ var (
Short: "Manage containers",
Long: "Manage containers",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
containerConfig = util.DefaultContainerConfig()
diff --git a/cmd/podman/containers/create.go b/cmd/podman/containers/create.go
index da550b606..f3f9d18f3 100644
--- a/cmd/podman/containers/create.go
+++ b/cmd/podman/containers/create.go
@@ -33,6 +33,7 @@ var (
}
containerCreateCommand = &cobra.Command{
+ Args: cobra.MinimumNArgs(1),
Use: createCommand.Use,
Short: createCommand.Short,
Long: createCommand.Long,
@@ -59,7 +60,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: createCommand,
})
- //common.GetCreateFlags(createCommand)
+ // common.GetCreateFlags(createCommand)
flags := createCommand.Flags()
createFlags(flags)
diff --git a/cmd/podman/containers/diff.go b/cmd/podman/containers/diff.go
index 046dac53e..59b788010 100644
--- a/cmd/podman/containers/diff.go
+++ b/cmd/podman/containers/diff.go
@@ -3,6 +3,7 @@ package containers
import (
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/cmd/podman/report"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
"github.com/spf13/cobra"
@@ -12,7 +13,7 @@ var (
// podman container _diff_
diffCmd = &cobra.Command{
Use: "diff [flags] CONTAINER",
- Args: registry.IdOrLatestArgs,
+ Args: validate.IdOrLatestArgs,
Short: "Inspect changes on container's file systems",
Long: `Displays changes on a container filesystem. The container will be compared to its parent layer.`,
RunE: diff,
diff --git a/cmd/podman/containers/exec.go b/cmd/podman/containers/exec.go
index 2bff8ae33..0992b3862 100644
--- a/cmd/podman/containers/exec.go
+++ b/cmd/podman/containers/exec.go
@@ -16,20 +16,22 @@ var (
execDescription = `Execute the specified command inside a running container.
`
execCommand = &cobra.Command{
- Use: "exec [flags] CONTAINER [COMMAND [ARG...]]",
- Short: "Run a process in a running container",
- Long: execDescription,
- RunE: exec,
+ Use: "exec [flags] CONTAINER [COMMAND [ARG...]]",
+ Short: "Run a process in a running container",
+ Long: execDescription,
+ RunE: exec,
+ DisableFlagsInUseLine: true,
Example: `podman exec -it ctrID ls
podman exec -it -w /tmp myCtr pwd
podman exec --user root ctrID ls`,
}
containerExecCommand = &cobra.Command{
- Use: execCommand.Use,
- Short: execCommand.Short,
- Long: execCommand.Long,
- RunE: execCommand.RunE,
+ Use: execCommand.Use,
+ Short: execCommand.Short,
+ Long: execCommand.Long,
+ RunE: execCommand.RunE,
+ DisableFlagsInUseLine: true,
Example: `podman container exec -it ctrID ls
podman container exec -it -w /tmp myCtr pwd
podman container exec --user root ctrID ls`,
@@ -79,6 +81,10 @@ func init() {
func exec(cmd *cobra.Command, args []string) error {
var nameOrId string
+
+ if len(args) == 0 && !execOpts.Latest {
+ return errors.New("exec requires the name or ID of a container or the --latest flag")
+ }
execOpts.Cmd = args
if !execOpts.Latest {
execOpts.Cmd = args[1:]
diff --git a/cmd/podman/containers/export.go b/cmd/podman/containers/export.go
index fb5bd468f..bbb6a6bc9 100644
--- a/cmd/podman/containers/export.go
+++ b/cmd/podman/containers/export.go
@@ -28,6 +28,7 @@ var (
}
containerExportCommand = &cobra.Command{
+ Args: cobra.MinimumNArgs(1),
Use: exportCommand.Use,
Short: exportCommand.Short,
Long: exportCommand.Long,
diff --git a/cmd/podman/containers/kill.go b/cmd/podman/containers/kill.go
index 8b4a384fe..ef85aad7d 100644
--- a/cmd/podman/containers/kill.go
+++ b/cmd/podman/containers/kill.go
@@ -30,6 +30,9 @@ var (
}
containerKillCommand = &cobra.Command{
+ Args: func(cmd *cobra.Command, args []string) error {
+ return parse.CheckAllLatestAndCIDFile(cmd, args, false, false)
+ },
Use: killCommand.Use,
Short: killCommand.Short,
Long: killCommand.Long,
diff --git a/cmd/podman/containers/list.go b/cmd/podman/containers/list.go
index 22fa15b7e..c200a49aa 100644
--- a/cmd/podman/containers/list.go
+++ b/cmd/podman/containers/list.go
@@ -1,8 +1,8 @@
package containers
import (
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -12,7 +12,7 @@ var (
listCmd = &cobra.Command{
Use: "list",
Aliases: []string{"ls"},
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "List containers",
Long: "Prints out information about the containers",
RunE: ps,
diff --git a/cmd/podman/containers/ps.go b/cmd/podman/containers/ps.go
index 44f50bab2..c5696a158 100644
--- a/cmd/podman/containers/ps.go
+++ b/cmd/podman/containers/ps.go
@@ -12,8 +12,8 @@ import (
tm "github.com/buger/goterm"
"github.com/containers/buildah/pkg/formats"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/cri-o/ocicni/pkg/ocicni"
"github.com/docker/go-units"
@@ -26,7 +26,7 @@ var (
psDescription = "Prints out information about the containers"
psCommand = &cobra.Command{
Use: "ps",
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "List containers",
Long: psDescription,
RunE: ps,
@@ -41,7 +41,7 @@ var (
}
filters []string
noTrunc bool
- defaultHeaders string = "CONTAINER ID\tIMAGE\tCOMMAND\tCREATED\tSTATUS\tPORTS\tNAMES"
+ defaultHeaders = "CONTAINER ID\tIMAGE\tCOMMAND\tCREATED\tSTATUS\tPORTS\tNAMES"
)
func init() {
@@ -64,9 +64,12 @@ func listFlagSet(flags *pflag.FlagSet) {
flags.BoolVarP(&listOpts.Pod, "pod", "p", false, "Print the ID and name of the pod the containers are associated with")
flags.BoolVarP(&listOpts.Quiet, "quiet", "q", false, "Print the numeric IDs of the containers only")
flags.BoolVarP(&listOpts.Size, "size", "s", false, "Display the total file sizes")
- flags.StringVar(&listOpts.Sort, "sort", "created", "Sort output by command, created, id, image, names, runningfor, size, or status")
flags.BoolVar(&listOpts.Sync, "sync", false, "Sync container state with OCI runtime")
flags.UintVarP(&listOpts.Watch, "watch", "w", 0, "Watch the ps output on an interval in seconds")
+
+ created := validate.ChoiceValue(&listOpts.Sort, "command", "created", "id", "image", "names", "runningfor", "size", "status")
+ flags.Var(created, "sort", "Sort output by: "+created.Choices())
+
if registry.IsRemote() {
_ = flags.MarkHidden("latest")
}
@@ -175,7 +178,7 @@ func ps(cmd *cobra.Command, args []string) error {
headers, format := createPsOut()
if cmd.Flag("format").Changed {
- format = listOpts.Format
+ format = strings.TrimPrefix(listOpts.Format, "table ")
if !strings.HasPrefix(format, "\n") {
format += "\n"
}
@@ -352,7 +355,7 @@ func portsToString(ports []ocicni.PortMapping) string {
if len(ports) == 0 {
return ""
}
- //Sort the ports, so grouping continuous ports become easy.
+ // Sort the ports, so grouping continuous ports become easy.
sort.Slice(ports, func(i, j int) bool {
return comparePorts(ports[i], ports[j])
})
diff --git a/cmd/podman/containers/rm.go b/cmd/podman/containers/rm.go
index 3021853a9..96549cead 100644
--- a/cmd/podman/containers/rm.go
+++ b/cmd/podman/containers/rm.go
@@ -38,6 +38,9 @@ var (
Short: rmCommand.Use,
Long: rmCommand.Long,
RunE: rmCommand.RunE,
+ Args: func(cmd *cobra.Command, args []string) error {
+ return parse.CheckAllLatestAndCIDFile(cmd, args, false, true)
+ },
Example: `podman container rm imageID
podman container rm mywebserver myflaskserver 860a4b23
podman container rm --force --all
diff --git a/cmd/podman/containers/run.go b/cmd/podman/containers/run.go
index e3fe4cd0b..1e4d47b42 100644
--- a/cmd/podman/containers/run.go
+++ b/cmd/podman/containers/run.go
@@ -20,6 +20,7 @@ import (
var (
runDescription = "Runs a command in a new container from the given image"
runCommand = &cobra.Command{
+ Args: cobra.MinimumNArgs(1),
Use: "run [flags] IMAGE [COMMAND [ARG...]]",
Short: "Run a command in a new container",
Long: runDescription,
@@ -30,6 +31,7 @@ var (
}
containerRunCommand = &cobra.Command{
+ Args: cobra.MinimumNArgs(1),
Use: runCommand.Use,
Short: runCommand.Short,
Long: runCommand.Long,
diff --git a/cmd/podman/containers/stop.go b/cmd/podman/containers/stop.go
index 4a451134a..22c487961 100644
--- a/cmd/podman/containers/stop.go
+++ b/cmd/podman/containers/stop.go
@@ -34,6 +34,9 @@ var (
Short: stopCommand.Short,
Long: stopCommand.Long,
RunE: stopCommand.RunE,
+ Args: func(cmd *cobra.Command, args []string) error {
+ return parse.CheckAllLatestAndCIDFile(cmd, args, false, true)
+ },
Example: `podman container stop ctrID
podman container stop --latest
podman container stop --time 2 mywebserver 6e534f14da9d`,
diff --git a/cmd/podman/containers/unmount.go b/cmd/podman/containers/unmount.go
index a4550abbd..d0ca202fe 100644
--- a/cmd/podman/containers/unmount.go
+++ b/cmd/podman/containers/unmount.go
@@ -27,6 +27,9 @@ var (
Args: func(cmd *cobra.Command, args []string) error {
return parse.CheckAllLatestAndCIDFile(cmd, args, false, false)
},
+ Annotations: map[string]string{
+ registry.ParentNSRequired: "",
+ },
Example: `podman umount ctrID
podman umount ctrID1 ctrID2 ctrID3
podman umount --all`,
@@ -37,6 +40,9 @@ var (
Short: umountCommand.Short,
Long: umountCommand.Long,
RunE: umountCommand.RunE,
+ Args: func(cmd *cobra.Command, args []string) error {
+ return parse.CheckAllLatestAndCIDFile(cmd, args, false, false)
+ },
Example: `podman container umount ctrID
podman container umount ctrID1 ctrID2 ctrID3
podman container umount --all`,
diff --git a/cmd/podman/containers/wait.go b/cmd/podman/containers/wait.go
index da746361d..1f4d4159b 100644
--- a/cmd/podman/containers/wait.go
+++ b/cmd/podman/containers/wait.go
@@ -7,6 +7,7 @@ import (
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/cmd/podman/utils"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
@@ -22,7 +23,7 @@ var (
Short: "Block on one or more containers",
Long: waitDescription,
RunE: wait,
- Args: registry.IdOrLatestArgs,
+ Args: validate.IdOrLatestArgs,
Example: `podman wait --latest
podman wait --interval 5000 ctrID
podman wait ctrID1 ctrID2`,
@@ -33,6 +34,7 @@ var (
Short: waitCommand.Short,
Long: waitCommand.Long,
RunE: waitCommand.RunE,
+ Args: validate.IdOrLatestArgs,
Example: `podman container wait --latest
podman container wait --interval 5000 ctrID
podman container wait ctrID1 ctrID2`,
diff --git a/cmd/podman/diff.go b/cmd/podman/diff.go
index ec94c0918..1ff2fce40 100644
--- a/cmd/podman/diff.go
+++ b/cmd/podman/diff.go
@@ -6,6 +6,7 @@ import (
"github.com/containers/libpod/cmd/podman/containers"
"github.com/containers/libpod/cmd/podman/images"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -17,7 +18,7 @@ var (
diffDescription = `Displays changes on a container or image's filesystem. The container or image will be compared to its parent layer.`
diffCmd = &cobra.Command{
Use: "diff [flags] {CONTAINER_ID | IMAGE_ID}",
- Args: registry.IdOrLatestArgs,
+ Args: validate.IdOrLatestArgs,
Short: "Display the changes of object's file system",
Long: diffDescription,
TraverseChildren: true,
diff --git a/cmd/podman/generate/generate.go b/cmd/podman/generate/generate.go
index f04ef58a5..b112e666a 100644
--- a/cmd/podman/generate/generate.go
+++ b/cmd/podman/generate/generate.go
@@ -2,6 +2,7 @@ package pods
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/util"
"github.com/spf13/cobra"
@@ -14,7 +15,7 @@ var (
Short: "Generate structured data based on containers and pods.",
Long: "Generate structured data (e.g., Kubernetes yaml or systemd units) based on containers and pods.",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
containerConfig = util.DefaultContainerConfig()
)
diff --git a/cmd/podman/healthcheck/healthcheck.go b/cmd/podman/healthcheck/healthcheck.go
index 794a94615..ce90dba31 100644
--- a/cmd/podman/healthcheck/healthcheck.go
+++ b/cmd/podman/healthcheck/healthcheck.go
@@ -2,6 +2,7 @@ package healthcheck
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -13,7 +14,7 @@ var (
Short: "Manage Healthcheck",
Long: "Manage Healthcheck",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
)
diff --git a/cmd/podman/images/image.go b/cmd/podman/images/image.go
index 604f49251..790c16c05 100644
--- a/cmd/podman/images/image.go
+++ b/cmd/podman/images/image.go
@@ -2,6 +2,7 @@ package images
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -16,7 +17,7 @@ var (
Short: "Manage images",
Long: "Manage images",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
)
diff --git a/cmd/podman/images/prune.go b/cmd/podman/images/prune.go
index eb9e4a7e4..53a1966c1 100644
--- a/cmd/podman/images/prune.go
+++ b/cmd/podman/images/prune.go
@@ -6,8 +6,8 @@ import (
"os"
"strings"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
"github.com/spf13/cobra"
@@ -19,7 +19,7 @@ var (
If an image is not being used by a container, it will be removed from the system.`
pruneCmd = &cobra.Command{
Use: "prune",
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "Remove unused images",
Long: pruneDescription,
RunE: prune,
diff --git a/cmd/podman/images/pull.go b/cmd/podman/images/pull.go
index fead5f7ed..9f4cbc50e 100644
--- a/cmd/podman/images/pull.go
+++ b/cmd/podman/images/pull.go
@@ -45,6 +45,7 @@ var (
Short: pullCmd.Short,
Long: pullCmd.Long,
RunE: pullCmd.RunE,
+ Args: cobra.ExactArgs(1),
Example: `podman image pull imageName
podman image pull fedora:latest`,
}
diff --git a/cmd/podman/login.go b/cmd/podman/login.go
index 1843a764d..9de805d15 100644
--- a/cmd/podman/login.go
+++ b/cmd/podman/login.go
@@ -19,7 +19,7 @@ type loginOptionsWrapper struct {
var (
loginOptions = loginOptionsWrapper{}
loginCommand = &cobra.Command{
- Use: "login [flags] REGISTRY",
+ Use: "login [flags] [REGISTRY]",
Short: "Login to a container registry",
Long: "Login to a container registry on a specified server.",
RunE: login,
diff --git a/cmd/podman/logout.go b/cmd/podman/logout.go
index 77bdc92b4..c21711fc0 100644
--- a/cmd/podman/logout.go
+++ b/cmd/podman/logout.go
@@ -14,7 +14,7 @@ import (
var (
logoutOptions = auth.LogoutOptions{}
logoutCommand = &cobra.Command{
- Use: "logout [flags] REGISTRY",
+ Use: "logout [flags] [REGISTRY]",
Short: "Logout of a container registry",
Long: "Remove the cached username and password for the registry.",
RunE: logout,
diff --git a/cmd/podman/main.go b/cmd/podman/main.go
index 481214a38..3a8958b6d 100644
--- a/cmd/podman/main.go
+++ b/cmd/podman/main.go
@@ -1,6 +1,7 @@
package main
import (
+ "fmt"
"os"
_ "github.com/containers/libpod/cmd/podman/containers"
@@ -12,7 +13,9 @@ import (
"github.com/containers/libpod/cmd/podman/registry"
_ "github.com/containers/libpod/cmd/podman/system"
_ "github.com/containers/libpod/cmd/podman/volumes"
+ "github.com/containers/libpod/pkg/rootless"
"github.com/containers/storage/pkg/reexec"
+ "github.com/spf13/cobra"
)
func main() {
@@ -26,6 +29,14 @@ func main() {
for _, c := range registry.Commands {
for _, m := range c.Mode {
if cfg.EngineMode == m {
+ // Command cannot be run rootless
+ _, found := c.Command.Annotations[registry.ParentNSRequired]
+ if rootless.IsRootless() && found {
+ c.Command.RunE = func(cmd *cobra.Command, args []string) error {
+ return fmt.Errorf("cannot `%s` in rootless mode", cmd.CommandPath())
+ }
+ }
+
parent := rootCmd
if c.Parent != nil {
parent = c.Parent
diff --git a/cmd/podman/manifest/manifest.go b/cmd/podman/manifest/manifest.go
index b9ac7ea68..b78879b34 100644
--- a/cmd/podman/manifest/manifest.go
+++ b/cmd/podman/manifest/manifest.go
@@ -2,6 +2,7 @@ package manifest
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -13,7 +14,7 @@ var (
Short: "Manipulate manifest lists and image indexes",
Long: manifestDescription,
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
Example: `podman manifest create localhost/list
podman manifest inspect localhost/list`,
}
diff --git a/cmd/podman/networks/network.go b/cmd/podman/networks/network.go
index a0e412098..e2a928312 100644
--- a/cmd/podman/networks/network.go
+++ b/cmd/podman/networks/network.go
@@ -2,6 +2,7 @@ package images
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -13,13 +14,13 @@ var (
Short: "Manage networks",
Long: "Manage networks",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
)
// TODO add the following to main.go to get networks back onto the
// command list.
-//_ "github.com/containers/libpod/cmd/podman/networks"
+// _ "github.com/containers/libpod/cmd/podman/networks"
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode},
diff --git a/cmd/podman/parse/net.go b/cmd/podman/parse/net.go
index 03cda268c..f93c4ab1e 100644
--- a/cmd/podman/parse/net.go
+++ b/cmd/podman/parse/net.go
@@ -1,4 +1,4 @@
-//nolint
+// nolint
// most of these validate and parse functions have been taken from projectatomic/docker
// and modified for cri-o
package parse
@@ -46,7 +46,7 @@ var (
// validateExtraHost validates that the specified string is a valid extrahost and returns it.
// ExtraHost is in the form of name:ip where the ip has to be a valid ip (ipv4 or ipv6).
// for add-host flag
-func ValidateExtraHost(val string) (string, error) { //nolint
+func ValidateExtraHost(val string) (string, error) { // nolint
// allow for IPv6 addresses in extra hosts by only splitting on first ":"
arr := strings.SplitN(val, ":", 2)
if len(arr) != 2 || len(arr[0]) == 0 {
diff --git a/cmd/podman/parse/net_test.go b/cmd/podman/parse/net_test.go
index a6ddc2be9..51c8509df 100644
--- a/cmd/podman/parse/net_test.go
+++ b/cmd/podman/parse/net_test.go
@@ -1,4 +1,4 @@
-//nolint
+// nolint
// most of these validate and parse functions have been taken from projectatomic/docker
// and modified for cri-o
package parse
@@ -41,7 +41,7 @@ func TestValidateExtraHost(t *testing.T) {
want string
wantErr bool
}{
- //2001:0db8:85a3:0000:0000:8a2e:0370:7334
+ // 2001:0db8:85a3:0000:0000:8a2e:0370:7334
{name: "good-ipv4", args: args{val: "foobar:192.168.1.1"}, want: "foobar:192.168.1.1", wantErr: false},
{name: "bad-ipv4", args: args{val: "foobar:999.999.999.99"}, want: "", wantErr: true},
{name: "bad-ipv4", args: args{val: "foobar:999.999.999"}, want: "", wantErr: true},
diff --git a/cmd/podman/pods/create.go b/cmd/podman/pods/create.go
index 0c0d07b3e..85b96d37b 100644
--- a/cmd/podman/pods/create.go
+++ b/cmd/podman/pods/create.go
@@ -9,6 +9,7 @@ import (
"github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/parse"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/errorhandling"
"github.com/containers/libpod/pkg/specgen"
@@ -24,7 +25,7 @@ var (
createCommand = &cobra.Command{
Use: "create",
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "Create a new empty pod",
Long: podCreateDescription,
RunE: create,
@@ -116,7 +117,7 @@ func create(cmd *cobra.Command, args []string) error {
case "slip4netns":
n.NSMode = specgen.Slirp
default:
- if strings.HasPrefix(netInput, "container:") { //nolint
+ if strings.HasPrefix(netInput, "container:") { // nolint
split := strings.Split(netInput, ":")
if len(split) != 2 {
return errors.Errorf("invalid network paramater: %q", netInput)
diff --git a/cmd/podman/pods/pod.go b/cmd/podman/pods/pod.go
index e86b8aba4..edca08202 100644
--- a/cmd/podman/pods/pod.go
+++ b/cmd/podman/pods/pod.go
@@ -2,6 +2,7 @@ package pods
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/util"
"github.com/spf13/cobra"
@@ -17,7 +18,7 @@ var (
Short: "Manage pods",
Long: "Manage pods",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
containerConfig = util.DefaultContainerConfig()
)
diff --git a/cmd/podman/pods/ps.go b/cmd/podman/pods/ps.go
index 8ae1f91a8..b97dfeb66 100644
--- a/cmd/podman/pods/ps.go
+++ b/cmd/podman/pods/ps.go
@@ -11,8 +11,8 @@ import (
"text/template"
"time"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/docker/go-units"
"github.com/pkg/errors"
@@ -29,12 +29,12 @@ var (
Short: "list pods",
Long: psDescription,
RunE: pods,
- Args: common.NoArgs,
+ Args: validate.NoArgs,
}
)
var (
- defaultHeaders string = "POD ID\tNAME\tSTATUS\tCREATED"
+ defaultHeaders = "POD ID\tNAME\tSTATUS\tCREATED"
inputFilters []string
noTrunc bool
psInput entities.PodPSOptions
diff --git a/cmd/podman/registry/registry.go b/cmd/podman/registry/registry.go
index 993b14cbc..69e2babfc 100644
--- a/cmd/podman/registry/registry.go
+++ b/cmd/podman/registry/registry.go
@@ -2,11 +2,9 @@ package registry
import (
"context"
- "fmt"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/domain/infra"
- "github.com/pkg/errors"
"github.com/spf13/cobra"
)
@@ -77,21 +75,6 @@ func NewContainerEngine(cmd *cobra.Command, args []string) (entities.ContainerEn
return containerEngine, nil
}
-func SubCommandExists(cmd *cobra.Command, args []string) error {
- if len(args) > 0 {
- return errors.Errorf("unrecognized command `%[1]s %[2]s`\nTry '%[1]s --help' for more information.", cmd.CommandPath(), args[0])
- }
- return errors.Errorf("missing command '%[1]s COMMAND'\nTry '%[1]s --help' for more information.", cmd.CommandPath())
-}
-
-// IdOrLatestArgs used to validate a nameOrId was provided or the "--latest" flag
-func IdOrLatestArgs(cmd *cobra.Command, args []string) error {
- if len(args) > 1 || (len(args) == 0 && !cmd.Flag("latest").Changed) {
- return fmt.Errorf("%s requires a name, id or the '--latest' flag", cmd.Name())
- }
- return nil
-}
-
type PodmanOptionsKey struct{}
func Context() context.Context {
diff --git a/cmd/podman/root.go b/cmd/podman/root.go
index 8baed42cf..375faf8b1 100644
--- a/cmd/podman/root.go
+++ b/cmd/podman/root.go
@@ -9,6 +9,7 @@ import (
"strings"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/tracing"
@@ -60,7 +61,7 @@ var (
SilenceErrors: true,
TraverseChildren: true,
PersistentPreRunE: persistentPreRunE,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
PersistentPostRunE: persistentPostRunE,
Version: version.Version,
}
diff --git a/cmd/podman/system/events.go b/cmd/podman/system/events.go
index 31dd9aa77..6aae62dc0 100644
--- a/cmd/podman/system/events.go
+++ b/cmd/podman/system/events.go
@@ -7,8 +7,8 @@ import (
"os"
"github.com/containers/buildah/pkg/formats"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/libpod/events"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
@@ -19,7 +19,7 @@ var (
eventsDescription = "Monitor podman events"
eventsCommand = &cobra.Command{
Use: "events",
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "Show podman events",
Long: eventsDescription,
RunE: eventsCmd,
diff --git a/cmd/podman/system/info.go b/cmd/podman/system/info.go
index 143796938..26be794c5 100644
--- a/cmd/podman/system/info.go
+++ b/cmd/podman/system/info.go
@@ -5,8 +5,8 @@ import (
"os"
"text/template"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/ghodss/yaml"
"github.com/spf13/cobra"
@@ -19,7 +19,7 @@ var (
`
infoCommand = &cobra.Command{
Use: "info",
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Long: infoDescription,
Short: "Display podman system information",
RunE: info,
diff --git a/cmd/podman/system/system.go b/cmd/podman/system/system.go
index 2d55e8c13..d9691ad2a 100644
--- a/cmd/podman/system/system.go
+++ b/cmd/podman/system/system.go
@@ -2,6 +2,7 @@ package system
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -16,7 +17,7 @@ var (
Short: "Manage podman",
Long: "Manage podman",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
)
diff --git a/cmd/podman/system/version.go b/cmd/podman/system/version.go
index b0f4eb528..065eef309 100644
--- a/cmd/podman/system/version.go
+++ b/cmd/podman/system/version.go
@@ -9,8 +9,8 @@ import (
"time"
"github.com/containers/buildah/pkg/formats"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
@@ -20,7 +20,7 @@ import (
var (
versionCommand = &cobra.Command{
Use: "version",
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "Display the Podman Version Information",
RunE: version,
Annotations: map[string]string{
@@ -56,14 +56,14 @@ func version(cmd *cobra.Command, args []string) error {
// TODO we need to discuss how to implement
// this more. current endpoints dont have a
// version endpoint. maybe we use info?
- //if remote {
+ // if remote {
// v.Server, err = getRemoteVersion(c)
// if err != nil {
// return err
// }
- //} else {
+ // } else {
v.Server = v.Client
- //}
+ // }
versionOutputFormat := versionFormat
if versionOutputFormat != "" {
diff --git a/cmd/podman/utils/alias.go b/cmd/podman/utils/alias.go
index 54b3c5e89..e484461c5 100644
--- a/cmd/podman/utils/alias.go
+++ b/cmd/podman/utils/alias.go
@@ -2,7 +2,7 @@ package utils
import "github.com/spf13/pflag"
-// AliasFlags is a function to handle backwards compatability with old flags
+// AliasFlags is a function to handle backwards compatibility with old flags
func AliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName {
switch name {
case "healthcheck-command":
diff --git a/cmd/podman/validate/args.go b/cmd/podman/validate/args.go
new file mode 100644
index 000000000..14b4d7897
--- /dev/null
+++ b/cmd/podman/validate/args.go
@@ -0,0 +1,32 @@
+package validate
+
+import (
+ "fmt"
+
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+)
+
+// NoArgs returns an error if any args are included.
+func NoArgs(cmd *cobra.Command, args []string) error {
+ if len(args) > 0 {
+ return fmt.Errorf("`%s` takes no arguments", cmd.CommandPath())
+ }
+ return nil
+}
+
+// SubCommandExists returns an error if no sub command is provided
+func SubCommandExists(cmd *cobra.Command, args []string) error {
+ if len(args) > 0 {
+ return errors.Errorf("unrecognized command `%[1]s %[2]s`\nTry '%[1]s --help' for more information.", cmd.CommandPath(), args[0])
+ }
+ return errors.Errorf("missing command '%[1]s COMMAND'\nTry '%[1]s --help' for more information.", cmd.CommandPath())
+}
+
+// IdOrLatestArgs used to validate a nameOrId was provided or the "--latest" flag
+func IdOrLatestArgs(cmd *cobra.Command, args []string) error {
+ if len(args) > 1 || (len(args) == 0 && !cmd.Flag("latest").Changed) {
+ return fmt.Errorf("`%s` requires a name, id or the \"--latest\" flag", cmd.CommandPath())
+ }
+ return nil
+}
diff --git a/cmd/podman/validate/choice.go b/cmd/podman/validate/choice.go
new file mode 100644
index 000000000..572c5f4a5
--- /dev/null
+++ b/cmd/podman/validate/choice.go
@@ -0,0 +1,46 @@
+package validate
+
+import (
+ "fmt"
+ "strings"
+)
+
+// Honors cobra.Value interface
+type choiceValue struct {
+ value *string
+ choices []string
+}
+
+// ChoiceValue may be used in cobra FlagSet methods Var/VarP/VarPF() to select from a set of values
+//
+// Example:
+// created := validate.ChoiceValue(&opts.Sort, "command", "created", "id", "image", "names", "runningfor", "size", "status")
+// flags.Var(created, "sort", "Sort output by: "+created.Choices())
+func ChoiceValue(p *string, choices ...string) *choiceValue {
+ return &choiceValue{
+ value: p,
+ choices: choices,
+ }
+}
+
+func (c *choiceValue) String() string {
+ return *c.value
+}
+
+func (c *choiceValue) Set(value string) error {
+ for _, v := range c.choices {
+ if v == value {
+ *c.value = value
+ return nil
+ }
+ }
+ return fmt.Errorf("%q is not a valid value. Choose from: %q", value, c.Choices())
+}
+
+func (c *choiceValue) Choices() string {
+ return strings.Join(c.choices, ", ")
+}
+
+func (c *choiceValue) Type() string {
+ return "choice"
+}
diff --git a/cmd/podman/volumes/list.go b/cmd/podman/volumes/list.go
index 8cc6fb301..72bf9f25b 100644
--- a/cmd/podman/volumes/list.go
+++ b/cmd/podman/volumes/list.go
@@ -9,8 +9,8 @@ import (
"strings"
"text/tabwriter"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
"github.com/spf13/cobra"
@@ -25,7 +25,7 @@ and the output format can be changed to JSON or a user specified Go template.`
lsCommand = &cobra.Command{
Use: "ls",
Aliases: []string{"list"},
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "List volumes",
Long: volumeLsDescription,
RunE: list,
diff --git a/cmd/podman/volumes/prune.go b/cmd/podman/volumes/prune.go
index 77138f4b7..2c3ed88f3 100644
--- a/cmd/podman/volumes/prune.go
+++ b/cmd/podman/volumes/prune.go
@@ -7,9 +7,9 @@ import (
"os"
"strings"
- "github.com/containers/libpod/cmd/podman/common"
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/cmd/podman/utils"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/pkg/errors"
"github.com/spf13/cobra"
@@ -22,7 +22,7 @@ var (
Note all data will be destroyed.`
pruneCommand = &cobra.Command{
Use: "prune",
- Args: common.NoArgs,
+ Args: validate.NoArgs,
Short: "Remove all unused volumes",
Long: volumePruneDescription,
RunE: prune,
diff --git a/cmd/podman/volumes/volume.go b/cmd/podman/volumes/volume.go
index 4d74ff084..3e90d178c 100644
--- a/cmd/podman/volumes/volume.go
+++ b/cmd/podman/volumes/volume.go
@@ -2,6 +2,7 @@ package volumes
import (
"github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/cmd/podman/validate"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
@@ -16,7 +17,7 @@ var (
Short: "Manage volumes",
Long: "Volumes are created in and can be shared between containers",
TraverseChildren: true,
- RunE: registry.SubCommandExists,
+ RunE: validate.SubCommandExists,
}
)
diff --git a/go.mod b/go.mod
index 576166df0..14b80e216 100644
--- a/go.mod
+++ b/go.mod
@@ -13,7 +13,7 @@ require (
github.com/containers/common v0.9.5
github.com/containers/conmon v2.0.14+incompatible
github.com/containers/image/v5 v5.4.3
- github.com/containers/psgo v1.4.0
+ github.com/containers/psgo v1.5.0
github.com/containers/storage v1.18.2
github.com/coreos/go-systemd/v22 v22.0.0
github.com/cri-o/ocicni v0.1.1-0.20190920040751-deac903fd99b
diff --git a/go.sum b/go.sum
index 167d52e0a..acd345144 100644
--- a/go.sum
+++ b/go.sum
@@ -76,8 +76,8 @@ github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDpl
github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY=
github.com/containers/ocicrypt v1.0.2 h1:Q0/IPs8ohfbXNxEfyJ2pFVmvJu5BhqJUAmc6ES9NKbo=
github.com/containers/ocicrypt v1.0.2/go.mod h1:nsOhbP19flrX6rE7ieGFvBlr7modwmNjsqWarIUce4M=
-github.com/containers/psgo v1.4.0 h1:D8B4fZCCZhYgc8hDyMPCiShOinmOB1TP1qe46sSC19k=
-github.com/containers/psgo v1.4.0/go.mod h1:ENXXLQ5E1At4K0EUsGogXBJi/C28gwqkONWeLPI9fJ8=
+github.com/containers/psgo v1.5.0 h1:uofUREsrm0Ls5K4tkEIFPqWSHKyg3Bvoqo/Q2eDmj8g=
+github.com/containers/psgo v1.5.0/go.mod h1:2ubh0SsreMZjSXW1Hif58JrEcFudQyIy9EzPUWfawVU=
github.com/containers/storage v1.18.2 h1:4cgFbrrgr9nR9xCeOmfpyxk1MtXYZGr7XGPJfAVkGmc=
github.com/containers/storage v1.18.2/go.mod h1:WTBMf+a9ZZ/LbmEVeLHH2TX4CikWbO1Bt+/m58ZHVPg=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
diff --git a/libpod/runtime_ctr.go b/libpod/runtime_ctr.go
index 3dc8d3d0f..1d880531e 100644
--- a/libpod/runtime_ctr.go
+++ b/libpod/runtime_ctr.go
@@ -869,7 +869,8 @@ func (r *Runtime) PruneContainers(filterFuncs []ContainerFilter) (map[string]int
logrus.Error(err)
return false
}
- if state == define.ContainerStateStopped || state == define.ContainerStateExited {
+ if state == define.ContainerStateStopped || state == define.ContainerStateExited ||
+ state == define.ContainerStateCreated || state == define.ContainerStateConfigured {
return true
}
return false
diff --git a/test/e2e/prune_test.go b/test/e2e/prune_test.go
index e8a208c3c..466a4f739 100644
--- a/test/e2e/prune_test.go
+++ b/test/e2e/prune_test.go
@@ -22,7 +22,6 @@ var _ = Describe("Podman prune", func() {
)
BeforeEach(func() {
- Skip(v2fail)
tempdir, err = CreateTempDirInTempDir()
if err != nil {
os.Exit(1)
@@ -149,6 +148,7 @@ var _ = Describe("Podman prune", func() {
It("podman system image prune unused images", func() {
SkipIfRemote()
+ Skip(v2fail)
podmanTest.RestoreAllArtifacts()
podmanTest.BuildImage(pruneImage, "alpine_bash:latest", "true")
prune := podmanTest.PodmanNoCache([]string{"system", "prune", "-a", "--force"})
@@ -162,6 +162,7 @@ var _ = Describe("Podman prune", func() {
})
It("podman system prune pods", func() {
+ Skip(v2fail)
session := podmanTest.Podman([]string{"pod", "create"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
diff --git a/test/system/015-help.bats b/test/system/015-help.bats
index fd4be87b2..6c3d617dc 100644
--- a/test/system/015-help.bats
+++ b/test/system/015-help.bats
@@ -55,11 +55,24 @@ function check_help() {
# If usage has required arguments, try running without them
if expr "$usage" : '.*\[flags\] [A-Z]' >/dev/null; then
- if [ "$cmd" != "stats"]; then
- dprint "podman $@ $cmd (without required args)"
- run_podman 125 "$@" $cmd
- is "$output" "Error:"
+ # Exceptions: these commands don't work rootless
+ if is_rootless; then
+ # "pause is not supported for rootless containers"
+ if [ "$cmd" = "pause" -o "$cmd" = "unpause" ]; then
+ continue
+ fi
+ # "network rm" too
+ if [ "$@" = "network" -a "$cmd" = "rm" ]; then
+ continue
+ fi
fi
+
+ # The </dev/null protects us from 'podman login' which will
+ # try to read username/password from stdin.
+ dprint "podman $@ $cmd (without required args)"
+ run_podman 125 "$@" $cmd </dev/null
+ is "$output" "Error:.* \(require\|specif\|must\|provide\|need\|choose\|accepts\)" \
+ "'podman $@ $cmd' without required arg"
fi
count=$(expr $count + 1)
diff --git a/vendor/github.com/containers/psgo/CODE-OF-CONDUCT.md b/vendor/github.com/containers/psgo/CODE-OF-CONDUCT.md
new file mode 100644
index 000000000..1081553f8
--- /dev/null
+++ b/vendor/github.com/containers/psgo/CODE-OF-CONDUCT.md
@@ -0,0 +1,3 @@
+## The psgo Project Community Code of Conduct
+
+The psgo project follows the [Containers Community Code of Conduct](https://github.com/containers/common/blob/master/CODE-OF-CONDUCT.md).
diff --git a/vendor/github.com/containers/psgo/Makefile b/vendor/github.com/containers/psgo/Makefile
index 361820784..831dfa31f 100644
--- a/vendor/github.com/containers/psgo/Makefile
+++ b/vendor/github.com/containers/psgo/Makefile
@@ -16,6 +16,8 @@ ifeq ($(shell go help mod >/dev/null 2>&1 && echo true), true)
GO_BUILD=GO111MODULE=on $(GO) build -mod=vendor
endif
+GOBIN ?= $(GO)/bin
+
all: validate build
.PHONY: build
@@ -34,12 +36,7 @@ vendor:
.PHONY: validate
validate: .install.lint
- @which gofmt >/dev/null 2>/dev/null || (echo "ERROR: gofmt not found." && false)
- test -z "$$(gofmt -s -l . | grep -vE 'vendor/' | tee /dev/stderr)"
- @which golangci-lint >/dev/null 2>/dev/null|| (echo "ERROR: golangci-lint not found." && false)
- test -z "$$(golangci-lint run)"
- @go doc cmd/vet >/dev/null 2>/dev/null|| (echo "ERROR: go vet not found." && false)
- test -z "$$($(GO) vet $$($(GO) list $(PROJECT)/...) 2>&1 | tee /dev/stderr)"
+ $(GOBIN)/golangci-lint run
.PHONY: test
test: test-unit test-integration
@@ -59,8 +56,7 @@ install:
.PHONY: .install.lint
.install.lint:
- # Workaround for https://github.com/golangci/golangci-lint/issues/523
- go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
+ VERSION=1.24.0 GOBIN=$(GOBIN) sh ./hack/install_golangci.sh
.PHONY: uninstall
uninstall:
diff --git a/vendor/github.com/containers/psgo/go.mod b/vendor/github.com/containers/psgo/go.mod
index d9d54c5f7..5f3341aa9 100644
--- a/vendor/github.com/containers/psgo/go.mod
+++ b/vendor/github.com/containers/psgo/go.mod
@@ -6,6 +6,6 @@ require (
github.com/opencontainers/runc v0.0.0-20190425234816-dae70e8efea4
github.com/pkg/errors v0.0.0-20190227000051-27936f6d90f9
github.com/sirupsen/logrus v0.0.0-20190403091019-9b3cdde74fbe
- github.com/stretchr/testify v1.4.0
+ github.com/stretchr/testify v1.5.1
golang.org/x/sys v0.0.0-20190425145619-16072639606e
)
diff --git a/vendor/github.com/containers/psgo/go.sum b/vendor/github.com/containers/psgo/go.sum
index bbdd99730..781b26f2b 100644
--- a/vendor/github.com/containers/psgo/go.sum
+++ b/vendor/github.com/containers/psgo/go.sum
@@ -16,8 +16,8 @@ github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190425145619-16072639606e h1:4ktJgTV34+N3qOZUc5fAaG3Pb11qzMm3PkAoTAgUZ2I=
golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/vendor/github.com/containers/psgo/internal/proc/stat.go b/vendor/github.com/containers/psgo/internal/proc/stat.go
index 866a5cdda..e3286704c 100644
--- a/vendor/github.com/containers/psgo/internal/proc/stat.go
+++ b/vendor/github.com/containers/psgo/internal/proc/stat.go
@@ -15,6 +15,7 @@
package proc
import (
+ "errors"
"fmt"
"io/ioutil"
"strings"
@@ -112,21 +113,31 @@ type Stat struct {
}
// readStat is used for mocking in unit tests.
-var readStat = func(path string) ([]string, error) {
- data, err := ioutil.ReadFile(path)
+var readStat = func(path string) (string, error) {
+ rawData, err := ioutil.ReadFile(path)
if err != nil {
- return nil, err
+ return "", err
}
- return strings.Fields(string(data)), nil
+ return string(rawData), nil
}
// ParseStat parses the /proc/$pid/stat file and returns a Stat.
func ParseStat(pid string) (*Stat, error) {
- fields, err := readStat(fmt.Sprintf("/proc/%s/stat", pid))
+ data, err := readStat(fmt.Sprintf("/proc/%s/stat", pid))
if err != nil {
return nil, err
}
+ firstParen := strings.IndexByte(data, '(')
+ lastParen := strings.LastIndexByte(data, ')')
+ if firstParen == -1 || lastParen == -1 {
+ return nil, errors.New("invalid format in stat")
+ }
+ pidstr := data[0 : firstParen-1]
+ comm := data[firstParen+1 : lastParen]
+ rest := strings.Fields(data[lastParen+1:])
+ fields := append([]string{pidstr, comm}, rest...)
+
fieldAt := func(i int) string {
return fields[i-1]
}
diff --git a/vendor/github.com/containers/psgo/internal/process/process.go b/vendor/github.com/containers/psgo/internal/process/process.go
index a936cc4ef..b46a39f46 100644
--- a/vendor/github.com/containers/psgo/internal/process/process.go
+++ b/vendor/github.com/containers/psgo/internal/process/process.go
@@ -192,7 +192,7 @@ func (p *Process) ElapsedTime() (time.Duration, error) {
if err != nil {
return 0, err
}
- return (time.Now()).Sub(startTime), nil
+ return time.Since(startTime), nil
}
// StarTime returns the time.Time when process p was started.
diff --git a/vendor/github.com/containers/psgo/psgo.go b/vendor/github.com/containers/psgo/psgo.go
index 30b8b74ce..57132c94e 100644
--- a/vendor/github.com/containers/psgo/psgo.go
+++ b/vendor/github.com/containers/psgo/psgo.go
@@ -306,6 +306,11 @@ var (
procFn: processHGROUP,
},
{
+ normal: "rss",
+ header: "RSS",
+ procFn: processRSS,
+ },
+ {
normal: "state",
header: "STATE",
procFn: processState,
@@ -663,12 +668,7 @@ func processARGS(p *process.Process, ctx *psContext) (string, error) {
// processCOMM returns the command name (i.e., executable name) of process p.
func processCOMM(p *process.Process, ctx *psContext) (string, error) {
- // ps (1) returns "[$name]" if command/args are empty
- if p.CmdLine[0] == "" {
- return processName(p, ctx)
- }
- spl := strings.Split(p.CmdLine[0], "/")
- return spl[len(spl)-1], nil
+ return p.Stat.Comm, nil
}
// processNICE returns the nice value of process p.
@@ -867,6 +867,16 @@ func processHGROUP(p *process.Process, ctx *psContext) (string, error) {
return "?", nil
}
+// processRSS returns the resident set size of process p in KiB (1024-byte
+// units).
+func processRSS(p *process.Process, ctx *psContext) (string, error) {
+ if p.Status.VMRSS == "" {
+ // probably a kernel thread
+ return "0", nil
+ }
+ return p.Status.VMRSS, nil
+}
+
// processState returns the process state of process p.
func processState(p *process.Process, ctx *psContext) (string, error) {
return p.Status.State, nil
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 0a6d8ccd5..c1d803f84 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -143,7 +143,7 @@ github.com/containers/ocicrypt/keywrap/pgp
github.com/containers/ocicrypt/keywrap/pkcs7
github.com/containers/ocicrypt/spec
github.com/containers/ocicrypt/utils
-# github.com/containers/psgo v1.4.0
+# github.com/containers/psgo v1.5.0
github.com/containers/psgo
github.com/containers/psgo/internal/capabilities
github.com/containers/psgo/internal/cgroups