diff options
-rw-r--r-- | cmd/podman/stats.go | 2 | ||||
-rw-r--r-- | cmd/podman/varlink/io.podman.varlink | 7 | ||||
-rw-r--r-- | libpod/pod.go | 9 | ||||
-rw-r--r-- | libpod/pod_ffjson.go | 2 | ||||
-rw-r--r-- | libpod/stats.go | 2 | ||||
-rw-r--r-- | pkg/varlinkapi/containers.go | 3 | ||||
-rw-r--r-- | pkg/varlinkapi/pods.go | 3 |
7 files changed, 22 insertions, 6 deletions
diff --git a/cmd/podman/stats.go b/cmd/podman/stats.go index 6d54147f6..45868e8d7 100644 --- a/cmd/podman/stats.go +++ b/cmd/podman/stats.go @@ -138,7 +138,7 @@ func statsCmd(c *cli.Context) error { id := ctr.ID() if _, ok := containerStats[ctr.ID()]; !ok { initialStats, err := ctr.GetContainerStats(&libpod.ContainerStats{}) - if errors.Cause(err) == libpod.ErrCtrRemoved || errors.Cause(err) == libpod.ErrNoSuchCtr { + if errors.Cause(err) == libpod.ErrCtrRemoved || errors.Cause(err) == libpod.ErrNoSuchCtr || errors.Cause(err) == libpod.ErrCtrStateInvalid { // skip dealing with a container that is gone continue } diff --git a/cmd/podman/varlink/io.podman.varlink b/cmd/podman/varlink/io.podman.varlink index 2fc53b43e..cd75b3b5f 100644 --- a/cmd/podman/varlink/io.podman.varlink +++ b/cmd/podman/varlink/io.podman.varlink @@ -441,7 +441,8 @@ method ExportContainer(name: string, path: string) -> (tarfile: string) # GetContainerStats takes the name or ID of a container and returns a single ContainerStats structure which # contains attributes like memory and cpu usage. If the container cannot be found, a -# [ContainerNotFound](#ContainerNotFound) error will be returned. +# [ContainerNotFound](#ContainerNotFound) error will be returned. If the container is not running, a [NoContainerRunning](#NoContainerRunning) +# error will be returned # #### Example # ~~~ # $ varlink call -m unix:/run/podman/io.podman/io.podman.GetContainerStats '{"name": "c33e4164f384"}' @@ -759,6 +760,7 @@ method TopPod() -> (notimplemented: NotImplemented) # GetPodStats takes the name or ID of a pod and returns a pod name and slice of ContainerStats structure which # contains attributes like memory and cpu usage. If the pod cannot be found, a [PodNotFound](#PodNotFound) +# error will be returned. If the pod has no running containers associated with it, a [NoContainerRunning](#NoContainerRunning) # error will be returned. # #### Example # ~~~ @@ -792,6 +794,9 @@ error ImageNotFound (name: string) # ContainerNotFound means the container could not be found by the provided name or ID in local storage. error ContainerNotFound (name: string) +# NoContainerRunning means none of the containers requested are running in a command that requires a running container. +error NoContainerRunning () + # PodNotFound means the pod could not be found by the provided name or ID in local storage. error PodNotFound (name: string) diff --git a/libpod/pod.go b/libpod/pod.go index e5d491e52..666480aa8 100644 --- a/libpod/pod.go +++ b/libpod/pod.go @@ -4,6 +4,7 @@ import ( "time" "github.com/containers/storage" + "github.com/pkg/errors" ) // Pod represents a group of containers that are managed together. @@ -192,10 +193,14 @@ func (p *Pod) GetPodStats(previousContainerStats map[string]*ContainerStats) (ma prevStat = &ContainerStats{} } newStats, err := c.GetContainerStats(prevStat) - if err != nil { + // If the container wasn't running, don't include it + // but also suppress the error + if err != nil && errors.Cause(err) != ErrCtrStateInvalid { return nil, err } - newContainerStats[c.ID()] = newStats + if err == nil { + newContainerStats[c.ID()] = newStats + } } return newContainerStats, nil } diff --git a/libpod/pod_ffjson.go b/libpod/pod_ffjson.go index a74c91ccc..36b1cf08f 100644 --- a/libpod/pod_ffjson.go +++ b/libpod/pod_ffjson.go @@ -1,5 +1,5 @@ // Code generated by ffjson <https://github.com/pquerna/ffjson>. DO NOT EDIT. -// source: libpod/pod.go +// source: /home/pehunt/go/src/github.com/containers/libpod/libpod/pod.go package libpod diff --git a/libpod/stats.go b/libpod/stats.go index 61e85ed5e..9d5efd993 100644 --- a/libpod/stats.go +++ b/libpod/stats.go @@ -26,7 +26,7 @@ func (c *Container) GetContainerStats(previousStats *ContainerStats) (*Container } if c.state.State != ContainerStateRunning { - return stats, nil + return stats, ErrCtrStateInvalid } cgroupPath, err := c.CGroupPath() diff --git a/pkg/varlinkapi/containers.go b/pkg/varlinkapi/containers.go index 58452716a..f517e9b6e 100644 --- a/pkg/varlinkapi/containers.go +++ b/pkg/varlinkapi/containers.go @@ -207,6 +207,9 @@ func (i *LibpodAPI) GetContainerStats(call iopodman.VarlinkCall, name string) er } containerStats, err := ctr.GetContainerStats(&libpod.ContainerStats{}) if err != nil { + if errors.Cause(err) == libpod.ErrCtrStateInvalid { + return call.ReplyNoContainerRunning() + } return call.ReplyErrorOccurred(err.Error()) } cs := iopodman.ContainerStats{ diff --git a/pkg/varlinkapi/pods.go b/pkg/varlinkapi/pods.go index 75733db11..9e49ab687 100644 --- a/pkg/varlinkapi/pods.go +++ b/pkg/varlinkapi/pods.go @@ -199,6 +199,9 @@ func (i *LibpodAPI) GetPodStats(call iopodman.VarlinkCall, name string) error { if err != nil { return call.ReplyErrorOccurred(err.Error()) } + if len(podStats) == 0 { + return call.ReplyNoContainerRunning() + } containersStats := make([]iopodman.ContainerStats, 0) for ctrID, containerStats := range podStats { cs := iopodman.ContainerStats{ |