12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // +build !windows
- package daemon
- import (
- "fmt"
- "github.com/docker/docker/api/types"
- "github.com/docker/docker/container"
- )
- // Resolve Network SandboxID in case the container reuse another container's network stack
- func (daemon *Daemon) getNetworkSandboxID(c *container.Container) (string, error) {
- curr := c
- for curr.HostConfig.NetworkMode.IsContainer() {
- containerID := curr.HostConfig.NetworkMode.ConnectedContainer()
- connected, err := daemon.GetContainer(containerID)
- if err != nil {
- return "", fmt.Errorf("Could not get container for %s", containerID)
- }
- curr = connected
- }
- return curr.NetworkSettings.SandboxID, nil
- }
- func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) {
- sandboxID, err := daemon.getNetworkSandboxID(c)
- if err != nil {
- return nil, err
- }
- sb, err := daemon.netController.SandboxByID(sandboxID)
- if err != nil {
- return nil, err
- }
- lnstats, err := sb.Statistics()
- if err != nil {
- return nil, err
- }
- stats := make(map[string]types.NetworkStats)
- // Convert libnetwork nw stats into api stats
- for ifName, ifStats := range lnstats {
- stats[ifName] = types.NetworkStats{
- RxBytes: ifStats.RxBytes,
- RxPackets: ifStats.RxPackets,
- RxErrors: ifStats.RxErrors,
- RxDropped: ifStats.RxDropped,
- TxBytes: ifStats.TxBytes,
- TxPackets: ifStats.TxPackets,
- TxErrors: ifStats.TxErrors,
- TxDropped: ifStats.TxDropped,
- }
- }
- return stats, nil
- }
|