bandwidth: get bandwidth interface in host ns through container interface

Signed-off-by: Bruce Ma <brucema19901024@gmail.com>
This commit is contained in:
Bruce Ma 2019-05-18 13:58:33 +08:00
parent 0950a3607b
commit 344d343431

View File

@ -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
} }