summaryrefslogtreecommitdiff
path: root/cmd/podman/pod_top.go
diff options
context:
space:
mode:
authorhaircommander <pehunt@redhat.com>2018-08-16 18:26:24 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2018-08-23 15:01:17 +0000
commit88df4ea0f97f2892a6fd588bd3abfad1db634629 (patch)
tree9ecea1234ccf25488095c9b2150ad625c21a3716 /cmd/podman/pod_top.go
parent6c253d00554d5f5c17cc7bbb76e9658f277ab129 (diff)
downloadpodman-88df4ea0f97f2892a6fd588bd3abfad1db634629.tar.gz
podman-88df4ea0f97f2892a6fd588bd3abfad1db634629.tar.bz2
podman-88df4ea0f97f2892a6fd588bd3abfad1db634629.zip
Add podman pod top
Using the vendored changes from psgo, incorporate JoinNamespaceAndProcessInfoByPids to get process information for each pid namespace of running containers in the pod. Also added a man page, and tests. Signed-off-by: haircommander <pehunt@redhat.com> Closes: #1298 Approved by: mheon
Diffstat (limited to 'cmd/podman/pod_top.go')
-rw-r--r--cmd/podman/pod_top.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/cmd/podman/pod_top.go b/cmd/podman/pod_top.go
new file mode 100644
index 000000000..703ec0a44
--- /dev/null
+++ b/cmd/podman/pod_top.go
@@ -0,0 +1,101 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "text/tabwriter"
+
+ "github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/containers/libpod/cmd/podman/shared"
+ "github.com/containers/libpod/libpod"
+ "github.com/pkg/errors"
+ "github.com/urfave/cli"
+)
+
+var (
+ podTopFlags = []cli.Flag{
+ LatestFlag,
+ cli.BoolFlag{
+ Name: "list-descriptors",
+ Hidden: true,
+ },
+ }
+ podTopDescription = fmt.Sprintf(`Display the running processes containers in a pod. Specify format descriptors
+to alter the output. You may run "podman pod top -l pid pcpu seccomp" to print
+the process ID, the CPU percentage and the seccomp mode of each process of
+the latest pod.
+%s
+`, getDescriptorString())
+
+ podTopCommand = cli.Command{
+ Name: "top",
+ Usage: "Display the running processes of containers in a pod",
+ Description: podTopDescription,
+ Flags: podTopFlags,
+ Action: podTopCmd,
+ ArgsUsage: "POD-NAME [format descriptors]",
+ SkipArgReorder: true,
+ }
+)
+
+func podTopCmd(c *cli.Context) error {
+ var pod *libpod.Pod
+ var err error
+ args := c.Args()
+
+ if c.Bool("list-descriptors") {
+ descriptors, err := libpod.GetContainerPidInformationDescriptors()
+ if err != nil {
+ return err
+ }
+ fmt.Println(strings.Join(descriptors, "\n"))
+ return nil
+ }
+
+ if len(args) < 1 && !c.Bool("latest") {
+ return errors.Errorf("you must provide the name or id of a running pod")
+ }
+ if err := validateFlags(c, podTopFlags); err != nil {
+ return err
+ }
+
+ runtime, err := libpodruntime.GetRuntime(c)
+ if err != nil {
+ return errors.Wrapf(err, "error creating libpod runtime")
+ }
+ defer runtime.Shutdown(false)
+
+ var descriptors []string
+ if c.Bool("latest") {
+ descriptors = args
+ pod, err = runtime.GetLatestPod()
+ } else {
+ descriptors = args[1:]
+ pod, err = runtime.LookupPod(args[0])
+ }
+
+ if err != nil {
+ return errors.Wrapf(err, "unable to lookup requested container")
+ }
+
+ podStatus, err := shared.GetPodStatus(pod)
+ if err != nil {
+ return err
+ }
+ if podStatus != "Running" {
+ return errors.Errorf("pod top can only be used on pods with at least one running container")
+ }
+
+ psOutput, err := pod.GetPodPidInformation(descriptors)
+ if err != nil {
+ return err
+ }
+
+ w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0)
+ for _, proc := range psOutput {
+ fmt.Fprintln(w, proc)
+ }
+ w.Flush()
+ return nil
+}