diff options
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/networking_linux.go | 28 | ||||
-rw-r--r-- | libpod/stats.go | 10 |
2 files changed, 35 insertions, 3 deletions
diff --git a/libpod/networking_linux.go b/libpod/networking_linux.go index e5f935e30..77ab97910 100644 --- a/libpod/networking_linux.go +++ b/libpod/networking_linux.go @@ -249,9 +249,35 @@ func (r *Runtime) teardownNetNS(ctr *Container) error { return nil } +func getContainerNetNS(ctr *Container) (string, error) { + if ctr.state.NetNS != nil { + return ctr.state.NetNS.Path(), nil + } + if ctr.config.NetNsCtr != "" { + c, err := ctr.runtime.GetContainer(ctr.config.NetNsCtr) + if err != nil { + return "", err + } + if err = c.syncContainer(); err != nil { + return "", err + } + return c.state.NetNS.Path(), nil + } + return "", nil +} + func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) { var netStats *netlink.LinkStatistics - err := ns.WithNetNSPath(ctr.state.NetNS.Path(), func(_ ns.NetNS) error { + netNSPath, netPathErr := getContainerNetNS(ctr) + if netPathErr != nil { + return nil, netPathErr + } + if netNSPath == "" { + // If netNSPath is empty, it was set as none, and no netNS was set up + // this is a valid state and thus return no error, nor any statistics + return nil, nil + } + err := ns.WithNetNSPath(netNSPath, func(_ ns.NetNS) error { link, err := netlink.LinkByName(ocicni.DefaultInterfaceName) if err != nil { return err diff --git a/libpod/stats.go b/libpod/stats.go index 7830919ba..61e85ed5e 100644 --- a/libpod/stats.go +++ b/libpod/stats.go @@ -66,8 +66,14 @@ func (c *Container) GetContainerStats(previousStats *ContainerStats) (*Container stats.BlockInput, stats.BlockOutput = calculateBlockIO(cgroupStats) stats.CPUNano = cgroupStats.CPU.Usage.Total stats.SystemNano = cgroupStats.CPU.Usage.Kernel - stats.NetInput = netStats.TxBytes - stats.NetOutput = netStats.RxBytes + // Handle case where the container is not in a network namespace + if netStats != nil { + stats.NetInput = netStats.TxBytes + stats.NetOutput = netStats.RxBytes + } else { + stats.NetInput = 0 + stats.NetOutput = 0 + } return stats, nil } |