Merge pull request #14421 from Luap99/stats

podman stats: work with network connect/disconnect
This commit is contained in:
OpenShift Merge Robot
2022-06-02 04:26:04 -04:00
committed by GitHub
2 changed files with 37 additions and 7 deletions

View File

@ -930,6 +930,8 @@ func (r *Runtime) reloadContainerNetwork(ctr *Container) (map[string]types.Statu
return r.configureNetNS(ctr, ctr.state.NetNS) return r.configureNetNS(ctr, ctr.state.NetNS)
} }
// TODO (5.0): return the statistics per network interface
// This would allow better compat with docker.
func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) { func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) {
var netStats *netlink.LinkStatistics var netStats *netlink.LinkStatistics
@ -943,21 +945,39 @@ func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) {
return nil, nil return nil, nil
} }
// FIXME get the interface from the container netstatus
dev := "eth0"
netMode := ctr.config.NetMode netMode := ctr.config.NetMode
netStatus := ctr.getNetworkStatus()
if otherCtr != nil { if otherCtr != nil {
netMode = otherCtr.config.NetMode netMode = otherCtr.config.NetMode
netStatus = otherCtr.getNetworkStatus()
} }
if netMode.IsSlirp4netns() { if netMode.IsSlirp4netns() {
dev = "tap0" // create a fake status with correct interface name for the logic below
netStatus = map[string]types.StatusBlock{
"slirp4netns": {
Interfaces: map[string]types.NetInterface{"tap0": {}},
},
}
} }
err := ns.WithNetNSPath(netNSPath, func(_ ns.NetNS) error { err := ns.WithNetNSPath(netNSPath, func(_ ns.NetNS) error {
link, err := netlink.LinkByName(dev) for _, status := range netStatus {
if err != nil { for dev := range status.Interfaces {
return err link, err := netlink.LinkByName(dev)
if err != nil {
return err
}
if netStats == nil {
netStats = link.Attrs().Statistics
continue
}
// Currently only Tx/RxBytes are used.
// In the future we should return all stats per interface so that
// api users have a better options.
stats := link.Attrs().Statistics
netStats.TxBytes += stats.TxBytes
netStats.RxBytes += stats.RxBytes
}
} }
netStats = link.Attrs().Statistics
return nil return nil
}) })
return netStats, err return netStats, err

View File

@ -114,6 +114,11 @@ var _ = Describe("Podman network connect and disconnect", func() {
exec3.WaitWithDefaultTimeout() exec3.WaitWithDefaultTimeout()
Expect(exec3).Should(Exit(0)) Expect(exec3).Should(Exit(0))
Expect(strings.Contains(exec3.OutputToString(), ns)).To(BeFalse()) Expect(strings.Contains(exec3.OutputToString(), ns)).To(BeFalse())
// make sure stats still works https://github.com/containers/podman/issues/13824
stats := podmanTest.Podman([]string{"stats", "test", "--no-stream"})
stats.WaitWithDefaultTimeout()
Expect(stats).Should(Exit(0))
}) })
It("bad network name in connect should result in error", func() { It("bad network name in connect should result in error", func() {
@ -237,6 +242,11 @@ var _ = Describe("Podman network connect and disconnect", func() {
Expect(exec3).Should(Exit(0)) Expect(exec3).Should(Exit(0))
Expect(strings.Contains(exec3.OutputToString(), ns)).To(BeTrue()) Expect(strings.Contains(exec3.OutputToString(), ns)).To(BeTrue())
// make sure stats works https://github.com/containers/podman/issues/13824
stats := podmanTest.Podman([]string{"stats", "test", "--no-stream"})
stats.WaitWithDefaultTimeout()
Expect(stats).Should(Exit(0))
// make sure no logrus errors are shown https://github.com/containers/podman/issues/9602 // make sure no logrus errors are shown https://github.com/containers/podman/issues/9602
rm := podmanTest.Podman([]string{"rm", "--time=0", "-f", "test"}) rm := podmanTest.Podman([]string{"rm", "--time=0", "-f", "test"})
rm.WaitWithDefaultTimeout() rm.WaitWithDefaultTimeout()