mirror of
https://github.com/containers/podman.git
synced 2025-06-21 17:38:12 +08:00
Merge pull request #14421 from Luap99/stats
podman stats: work with network connect/disconnect
This commit is contained in:
@ -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
|
||||||
|
@ -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()
|
||||||
|
Reference in New Issue
Block a user