mirror of
https://github.com/genuinetools/reg.git
synced 2024-09-17 16:11:01 -04:00
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
|
// +build !windows
|
||
|
|
||
|
package daemon
|
||
|
|
||
|
import (
|
||
|
"github.com/docker/docker/api/types"
|
||
|
"github.com/docker/docker/container"
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
// 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 "", errors.Wrapf(err, "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
|
||
|
}
|