diff options
author | Matthew Heon <matthew.heon@gmail.com> | 2018-08-07 11:56:18 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-08-08 12:37:51 +0000 |
commit | 71793f9f8a26bc2593968f61a68c0bb42f9da71a (patch) | |
tree | aad50ffe94dea6ab6256e17634bc698637454e42 | |
parent | 9e06478d8307b0279c991fd47122755fdf7bd922 (diff) | |
download | podman-71793f9f8a26bc2593968f61a68c0bb42f9da71a.tar.gz podman-71793f9f8a26bc2593968f61a68c0bb42f9da71a.tar.bz2 podman-71793f9f8a26bc2593968f61a68c0bb42f9da71a.zip |
Improve ps handling of container start/stop time
Previously all calculations were done based off the container's
start time. Retrieve end time and use it to calculate time
stopped for containers.
Also, convert ps JSON output to report timestamps for create,
start, and stop times.
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Closes: #1228
Approved by: rhatdan
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | cmd/podman/batchcontainer/container.go | 7 | ||||
-rw-r--r-- | cmd/podman/ps.go | 23 |
3 files changed, 18 insertions, 13 deletions
diff --git a/.gitignore b/.gitignore index 2ea832cde..c35cd3383 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ .ropeproject __pycache__ /cmd/podman/varlink/ioprojectatomicpodman.go +/cmd/podman/varlink/iopodman.go .gopathok diff --git a/cmd/podman/batchcontainer/container.go b/cmd/podman/batchcontainer/container.go index de127c64d..e27914174 100644 --- a/cmd/podman/batchcontainer/container.go +++ b/cmd/podman/batchcontainer/container.go @@ -42,6 +42,7 @@ type BatchContainerStruct struct { Exited bool Pid int StartedTime time.Time + ExitedTime time.Time Size *ContainerSize } @@ -76,6 +77,7 @@ func BatchContainerOp(ctr *libpod.Container, opts PsOptions) (BatchContainerStru pid int size *ContainerSize startedTime time.Time + exitedTime time.Time ) batchErr := ctr.Batch(func(c *libpod.Container) error { @@ -93,6 +95,10 @@ func BatchContainerOp(ctr *libpod.Container, opts PsOptions) (BatchContainerStru if err != nil { logrus.Errorf("error getting started time for %q: %v", c.ID(), err) } + exitedTime, err = c.FinishedTime() + if err != nil { + logrus.Errorf("error getting exited time for %q: %v", c.ID(), err) + } if !opts.Size && !opts.Namespace { return nil @@ -132,6 +138,7 @@ func BatchContainerOp(ctr *libpod.Container, opts PsOptions) (BatchContainerStru Exited: exited, Pid: pid, StartedTime: startedTime, + ExitedTime: exitedTime, Size: size, }, nil } diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go index a0fb9dabc..a5f862f8f 100644 --- a/cmd/podman/ps.go +++ b/cmd/podman/ps.go @@ -29,7 +29,6 @@ type psTemplateParams struct { Command string CreatedAtTime time.Time Created string - RunningFor string Status string Ports string Size string @@ -57,10 +56,11 @@ type psJSONParams struct { Image string `json:"image"` ImageID string `json:"image_id"` Command []string `json:"command"` - CreatedAt time.Time `json:"createdAt"` ExitCode int32 `json:"exitCode"` Exited bool `json:"exited"` - RunningFor time.Duration `json:"runningFor"` + CreatedAt time.Time `json:"createdAt"` + StartedAt time.Time `json:"startedAt"` + ExitedAt time.Time `json:"exitedAt"` Status string `json:"status"` PID int `json:"PID"` Ports []ocicni.PortMapping `json:"ports"` @@ -110,7 +110,7 @@ func (a psSortedPod) Less(i, j int) bool { return a.psSorted[i].Pod < a.psSorted type psSortedRunningFor struct{ psSorted } func (a psSortedRunningFor) Less(i, j int) bool { - return a.psSorted[i].RunningFor < a.psSorted[j].RunningFor + return a.psSorted[j].StartedAt.After(a.psSorted[i].StartedAt) } type psSortedStatus struct{ psSorted } @@ -529,7 +529,6 @@ func getTemplateOutput(psParams []psJSONParams, opts batchcontainer.PsOptions) ( if opts.Pod { pod = psParam.Pod } - runningFor := units.HumanDuration(psParam.RunningFor) command := strings.Join(psParam.Command, " ") if !opts.NoTrunc { @@ -542,9 +541,10 @@ func getTemplateOutput(psParams []psJSONParams, opts batchcontainer.PsOptions) ( switch psParam.Status { case libpod.ContainerStateStopped.String(): - status = fmt.Sprintf("Exited (%d) %s ago", psParam.ExitCode, runningFor) + exitedSince := units.HumanDuration(time.Since(psParam.ExitedAt)) + status = fmt.Sprintf("Exited (%d) %s ago", psParam.ExitCode, exitedSince) case libpod.ContainerStateRunning.String(): - status = "Up " + runningFor + " ago" + status = "Up " + units.HumanDuration(time.Since(psParam.StartedAt)) + " ago" case libpod.ContainerStatePaused.String(): status = "Paused" case libpod.ContainerStateCreated.String(), libpod.ContainerStateConfigured.String(): @@ -563,7 +563,6 @@ func getTemplateOutput(psParams []psJSONParams, opts batchcontainer.PsOptions) ( Command: command, CreatedAtTime: psParam.CreatedAt, Created: units.HumanDuration(time.Since(psParam.CreatedAt)) + " ago", - RunningFor: runningFor, Status: status, Ports: ports, Size: size, @@ -613,9 +612,11 @@ func getAndSortJSONParams(containers []*libpod.Container, opts batchcontainer.Ps Image: batchInfo.ConConfig.RootfsImageName, ImageID: batchInfo.ConConfig.RootfsImageID, Command: batchInfo.ConConfig.Spec.Process.Args, - CreatedAt: batchInfo.ConConfig.CreatedTime, ExitCode: batchInfo.ExitCode, Exited: batchInfo.Exited, + CreatedAt: batchInfo.ConConfig.CreatedTime, + StartedAt: batchInfo.StartedTime, + ExitedAt: batchInfo.ExitedTime, Status: batchInfo.ConState.String(), PID: batchInfo.Pid, Ports: batchInfo.ConConfig.PortMappings, @@ -628,10 +629,6 @@ func getAndSortJSONParams(containers []*libpod.Container, opts batchcontainer.Ps Pod: ctr.PodID(), } - if !batchInfo.StartedTime.IsZero() && batchInfo.ConState == libpod.ContainerStateRunning { - params.RunningFor = time.Since(batchInfo.StartedTime) - } - psOutput = append(psOutput, params) } return sortPsOutput(opts.Sort, psOutput) |