diff options
-rw-r--r-- | cmd/podman/top.go | 190 | ||||
-rw-r--r-- | docs/podman-top.1.md | 17 | ||||
-rw-r--r-- | test/e2e/top_test.go | 72 | ||||
-rw-r--r-- | test/podman_top.bats | 51 |
4 files changed, 75 insertions, 255 deletions
diff --git a/cmd/podman/top.go b/cmd/podman/top.go index 5b1dbd05c..6aff25a71 100644 --- a/cmd/podman/top.go +++ b/cmd/podman/top.go @@ -1,22 +1,16 @@ package main import ( - "encoding/json" "fmt" - "strings" "github.com/pkg/errors" - "github.com/projectatomic/libpod/cmd/podman/formats" "github.com/projectatomic/libpod/libpod" "github.com/urfave/cli" ) var ( topFlags = []cli.Flag{ - cli.StringFlag{ - Name: "format", - Usage: "Change the output to JSON", - }, LatestFlag, + LatestFlag, } topDescription = ` podman top @@ -38,14 +32,6 @@ var ( func topCmd(c *cli.Context) error { var container *libpod.Container var err error - doJSON := false - if c.IsSet("format") { - if strings.ToUpper(c.String("format")) == "JSON" { - doJSON = true - } else { - return errors.Errorf("only 'json' is supported for a format option") - } - } args := c.Args() var psArgs []string psOpts := []string{"-o", "uid,pid,ppid,c,stime,tname,time,cmd"} @@ -88,178 +74,8 @@ func topCmd(c *cli.Context) error { if err != nil { return err } - headers := getHeaders(results[0]) - format := genTopFormat(headers) - var out formats.Writer - psParams, err := psDataToPSParams(results[1:], headers) - if err != nil { - return errors.Wrap(err, "unable to convert ps data to proper structure") - } - if doJSON { - out = formats.JSONStructArray{Output: topToGeneric(psParams)} - } else { - out = formats.StdoutTemplateArray{Output: topToGeneric(psParams), Template: format, Fields: createTopHeaderMap(headers)} + for _, line := range results { + fmt.Println(line) } - formats.Writer(out).Out() return nil } - -func getHeaders(s string) []string { - var headers []string - tmpHeaders := strings.Fields(s) - for _, header := range tmpHeaders { - headers = append(headers, strings.Replace(header, "%", "", -1)) - } - return headers -} - -func genTopFormat(headers []string) string { - format := "table " - for _, header := range headers { - format = fmt.Sprintf("%s{{.%s}}\t", format, header) - } - return format -} - -// imagesToGeneric creates an empty array of interfaces for output -func topToGeneric(templParams []PSParams) (genericParams []interface{}) { - for _, v := range templParams { - genericParams = append(genericParams, interface{}(v)) - } - return -} - -// generate the header based on the template provided -func createTopHeaderMap(v []string) map[string]string { - values := make(map[string]string) - for _, key := range v { - value := key - if value == "CPU" { - value = "%CPU" - } else if value == "MEM" { - value = "%MEM" - } - values[key] = strings.ToUpper(splitCamelCase(value)) - } - return values -} - -// PSDataToParams converts a string array of data and its headers to an -// arra if PSParams -func psDataToPSParams(data []string, headers []string) ([]PSParams, error) { - var params []PSParams - for _, line := range data { - tmpMap := make(map[string]string) - tmpArray := strings.Fields(line) - if len(tmpArray) == 0 { - continue - } - for index, v := range tmpArray { - header := headers[index] - tmpMap[header] = v - } - jsonData, _ := json.Marshal(tmpMap) - var r PSParams - err := json.Unmarshal(jsonData, &r) - if err != nil { - return []PSParams{}, err - } - params = append(params, r) - } - return params, nil -} - -//PSParams is a list of options that the command line ps recognizes -type PSParams struct { - CPU string - MEM string - COMMAND string - BLOCKED string - START string - TIME string - C string - CAUGHT string - CGROUP string - CLSCLS string - CLS string - CMD string - CP string - DRS string - EGID string - EGROUP string - EIP string - ESP string - ELAPSED string - EUIDE string - USER string - F string - FGID string - FGROUP string - FUID string - FUSER string - GID string - GROUP string - IGNORED string - IPCNS string - LABEL string - STARTED string - SESSION string - LWP string - MACHINE string - MAJFLT string - MINFLT string - MNTNS string - NETNS string - NI string - NLWP string - OWNER string - PENDING string - PGID string - PGRP string - PID string - PIDNS string - POL string - PPID string - PRI string - PSR string - RGID string - RGROUP string - RSS string - RSZ string - RTPRIO string - RUID string - RUSER string - S string - SCH string - SEAT string - SESS string - P string - SGID string - SGROUP string - SID string - SIZE string - SLICE string - SPID string - STACKP string - STIME string - SUID string - SUPGID string - SUPGRP string - SUSER string - SVGID string - SZ string - TGID string - THCNT string - TID string - TTY string - TPGID string - TRS string - TT string - UID string - UNIT string - USERNS string - UTSNS string - UUNIT string - VSZ string - WCHAN string -} diff --git a/docs/podman-top.1.md b/docs/podman-top.1.md index eed15c584..1fca50bda 100644 --- a/docs/podman-top.1.md +++ b/docs/podman-top.1.md @@ -18,9 +18,6 @@ Display the running process of the container. ps-OPTION can be any of the option **--help, -h** Print usage statement -**--format** - Display the output in an alternate format. The only supported format is **JSON**. - **--latest, -l** Instead of providing the container name or ID, use the last created container. If you use methods other than Podman to run containers such as CRI-O, the last started container could be from either of those methods. @@ -42,20 +39,6 @@ root 4 bash system_u:system_r:container_t:s0:c429,c1016 root 0 vi system_u:system_r:container_t:s0:c429,c1016 # ``` -``` -# podman top --format=json f5a62a71b07b -o %cpu,%mem,command,blocked -[ - { - "CPU": "0.0", - "MEM": "0.0", - "COMMAND": "vi", - "BLOCKED": "0000000000000000", - "START": "", - "TIME": "", - "C": "", - "CAUGHT": "", - ... -``` ## SEE ALSO podman(1), ps(1) diff --git a/test/e2e/top_test.go b/test/e2e/top_test.go new file mode 100644 index 000000000..d4438293b --- /dev/null +++ b/test/e2e/top_test.go @@ -0,0 +1,72 @@ +package integration + +import ( + "os" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Podman top", func() { + var ( + tempdir string + err error + podmanTest PodmanTest + ) + + BeforeEach(func() { + tempdir, err = CreateTempDirInTempDir() + if err != nil { + os.Exit(1) + } + podmanTest = PodmanCreate(tempdir) + podmanTest.RestoreAllArtifacts() + }) + + AfterEach(func() { + podmanTest.Cleanup() + + }) + + It("podman top without container name or id", func() { + result := podmanTest.Podman([]string{"top"}) + result.WaitWithDefaultTimeout() + Expect(result.ExitCode()).To(Equal(125)) + }) + + It("podman top on bogus container", func() { + result := podmanTest.Podman([]string{"top", "1234"}) + result.WaitWithDefaultTimeout() + Expect(result.ExitCode()).To(Equal(125)) + }) + + It("podman top on non-running container", func() { + _, ec, cid := podmanTest.RunLsContainer("") + Expect(ec).To(Equal(0)) + result := podmanTest.Podman([]string{"top", cid}) + result.WaitWithDefaultTimeout() + Expect(result.ExitCode()).To(Equal(125)) + }) + + It("podman top on container", func() { + session := podmanTest.Podman([]string{"run", "-d", ALPINE, "top", "-d", "2"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + result := podmanTest.Podman([]string{"top", "-l"}) + result.WaitWithDefaultTimeout() + Expect(result.ExitCode()).To(Equal(0)) + Expect(len(result.OutputToStringArray())).To(BeNumerically(">", 1)) + }) + + It("podman top on non-running container", func() { + session := podmanTest.Podman([]string{"run", "-d", ALPINE, "top", "-d", "2"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + + result := podmanTest.Podman([]string{"top", session.OutputToString(), "-o", "fuser,f,comm,label"}) + result.WaitWithDefaultTimeout() + Expect(result.ExitCode()).To(Equal(0)) + Expect(len(result.OutputToStringArray())).To(BeNumerically(">", 1)) + }) +}) diff --git a/test/podman_top.bats b/test/podman_top.bats deleted file mode 100644 index cfa037aa6..000000000 --- a/test/podman_top.bats +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bats - -load helpers - -function teardown() { - cleanup_test -} - -function setup() { - copy_images -} - -@test "top without container name or id" { - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} top - echo "$output" - [ "$status" -eq 125 ] -} - -@test "top a bogus container" { - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} top foobar - echo "$output" - [ "$status" -eq 125 ] -} - -@test "top non-running container by id with defaults" { - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} create -d ${ALPINE} sleep 60 - [ "$status" -eq 0 ] - ctr_id="$output" - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} top $ctr_id - echo "$output" - [ "$status" -eq 125 ] -} - -@test "top running container by id with defaults" { - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} run -dt ${ALPINE} /bin/sh - [ "$status" -eq 0 ] - ctr_id="$output" - echo $ctr_id - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} top $ctr_id - echo "$output" - [ "$status" -eq 0 ] -} - -@test "top running container by id with ps opts" { - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} run -d ${ALPINE} sleep 60 - [ "$status" -eq 0 ] - ctr_id="$output" - run ${PODMAN_BINARY} ${PODMAN_OPTIONS} top $ctr_id -o fuser,f,comm,label - echo "$output" - [ "$status" -eq 0 ] -} |