bandwidth: get bandwidth interface in host ns through container interface
Signed-off-by: Bruce Ma <brucema19901024@gmail.com>
This commit is contained in:
parent
0950a3607b
commit
344d343431
@ -17,7 +17,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/vishvananda/netlink"
|
"github.com/vishvananda/netlink"
|
||||||
@ -28,6 +27,7 @@ import (
|
|||||||
"github.com/containernetworking/cni/pkg/version"
|
"github.com/containernetworking/cni/pkg/version"
|
||||||
|
|
||||||
"github.com/containernetworking/plugins/pkg/ip"
|
"github.com/containernetworking/plugins/pkg/ip"
|
||||||
|
"github.com/containernetworking/plugins/pkg/ns"
|
||||||
bv "github.com/containernetworking/plugins/pkg/utils/buildversion"
|
bv "github.com/containernetworking/plugins/pkg/utils/buildversion"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -130,21 +130,35 @@ func getMTU(deviceName string) (int, error) {
|
|||||||
return link.Attrs().MTU, nil
|
return link.Attrs().MTU, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getHostInterface(interfaces []*current.Interface) (*current.Interface, error) {
|
// get the veth peer of container interface in host namespace
|
||||||
|
func getHostInterface(interfaces []*current.Interface, containerIfName string, netns ns.NetNS) (*current.Interface, error) {
|
||||||
if len(interfaces) == 0 {
|
if len(interfaces) == 0 {
|
||||||
return nil, errors.New("no interfaces provided")
|
return nil, fmt.Errorf("no interfaces provided")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get veth peer index of container interface
|
||||||
|
var peerIndex int
|
||||||
var err error
|
var err error
|
||||||
|
_ = netns.Do(func(_ ns.NetNS) error {
|
||||||
|
_, peerIndex, err = ip.GetVethPeerIfindex(containerIfName)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if peerIndex <= 0 {
|
||||||
|
return nil, fmt.Errorf("container interface %s has no veth peer: %v", containerIfName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// find host interface by index
|
||||||
|
link, err := netlink.LinkByIndex(peerIndex)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("veth peer with index %d is not in host ns", peerIndex)
|
||||||
|
}
|
||||||
for _, iface := range interfaces {
|
for _, iface := range interfaces {
|
||||||
if iface.Sandbox == "" { // host interface
|
if iface.Sandbox == "" && iface.Name == link.Attrs().Name {
|
||||||
_, _, err = ip.GetVethPeerIfindex(iface.Name)
|
return iface, nil
|
||||||
if err == nil {
|
|
||||||
return iface, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, errors.New(fmt.Sprintf("no host interface found. last error: %s", err))
|
|
||||||
|
return nil, fmt.Errorf("no veth peer of container interface found in host ns")
|
||||||
}
|
}
|
||||||
|
|
||||||
func cmdAdd(args *skel.CmdArgs) error {
|
func cmdAdd(args *skel.CmdArgs) error {
|
||||||
@ -166,7 +180,14 @@ func cmdAdd(args *skel.CmdArgs) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not convert result to current version: %v", err)
|
return fmt.Errorf("could not convert result to current version: %v", err)
|
||||||
}
|
}
|
||||||
hostInterface, err := getHostInterface(result.Interfaces)
|
|
||||||
|
netns, err := ns.GetNS(args.Netns)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to open netns %q: %v", netns, err)
|
||||||
|
}
|
||||||
|
defer netns.Close()
|
||||||
|
|
||||||
|
hostInterface, err := getHostInterface(result.Interfaces, args.IfName, netns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -266,7 +287,13 @@ func cmdCheck(args *skel.CmdArgs) error {
|
|||||||
return fmt.Errorf("could not convert result to current version: %v", err)
|
return fmt.Errorf("could not convert result to current version: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
hostInterface, err := getHostInterface(result.Interfaces)
|
netns, err := ns.GetNS(args.Netns)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to open netns %q: %v", netns, err)
|
||||||
|
}
|
||||||
|
defer netns.Close()
|
||||||
|
|
||||||
|
hostInterface, err := getHostInterface(result.Interfaces, args.IfName, netns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user