Introduce iplink(MTU MAC and promiscas) feature into tuning
This change adds 'ip link' command related feature into tuning meta cni plugin. Currently MTU, MAC and promiscas mode are supported.
This commit is contained in:
@ -21,6 +21,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
@ -29,6 +30,7 @@ import (
|
||||
"github.com/containernetworking/cni/pkg/types/current"
|
||||
"github.com/containernetworking/cni/pkg/version"
|
||||
"github.com/containernetworking/plugins/pkg/ns"
|
||||
"github.com/vishvananda/netlink"
|
||||
)
|
||||
|
||||
// TuningConf represents the network tuning configuration.
|
||||
@ -37,14 +39,35 @@ type TuningConf struct {
|
||||
SysCtl map[string]string `json:"sysctl"`
|
||||
RawPrevResult map[string]interface{} `json:"prevResult,omitempty"`
|
||||
PrevResult *current.Result `json:"-"`
|
||||
Mac string `json:"mac,omitempty"`
|
||||
Promisc bool `json:"promisc,omitempty"`
|
||||
Mtu int `json:"mtu,omitempty"`
|
||||
}
|
||||
|
||||
func parseConf(data []byte) (*TuningConf, error) {
|
||||
conf := TuningConf{}
|
||||
type MACEnvArgs struct {
|
||||
types.CommonArgs
|
||||
MAC types.UnmarshallableString `json:"mac,omitempty"`
|
||||
}
|
||||
|
||||
func parseConf(data []byte, envArgs string) (*TuningConf, error) {
|
||||
conf := TuningConf{Promisc: false, Mtu: -1}
|
||||
if err := json.Unmarshal(data, &conf); err != nil {
|
||||
return nil, fmt.Errorf("failed to load netconf: %v", err)
|
||||
}
|
||||
|
||||
// Parse custom MAC from both env args
|
||||
if envArgs != "" {
|
||||
e := MACEnvArgs{}
|
||||
err := types.LoadArgs(envArgs, &e)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if e.MAC != "" {
|
||||
conf.Mac = string(e.MAC)
|
||||
}
|
||||
}
|
||||
|
||||
// Parse previous result.
|
||||
if conf.RawPrevResult != nil {
|
||||
resultBytes, err := json.Marshal(conf.RawPrevResult)
|
||||
@ -65,8 +88,59 @@ func parseConf(data []byte) (*TuningConf, error) {
|
||||
return &conf, nil
|
||||
}
|
||||
|
||||
func changeMacAddr(ifName string, newMacAddr string) error {
|
||||
addr, err := net.ParseMAC(newMacAddr)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid args %v for MAC addr: %v", newMacAddr, err)
|
||||
}
|
||||
|
||||
link, err := netlink.LinkByName(ifName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get %q: %v", ifName, err)
|
||||
}
|
||||
|
||||
err = netlink.LinkSetDown(link)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to set %q down: %v", ifName, err)
|
||||
}
|
||||
err = netlink.LinkSetHardwareAddr(link, addr)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to set %q address to %q: %v", ifName, newMacAddr, err)
|
||||
}
|
||||
return netlink.LinkSetUp(link)
|
||||
}
|
||||
|
||||
func updateResultsMacAddr(config TuningConf, ifName string, newMacAddr string) error {
|
||||
for _, i := range config.PrevResult.Interfaces {
|
||||
if i.Name == ifName {
|
||||
i.Mac = newMacAddr
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func changePromisc(ifName string, val bool) error {
|
||||
link, err := netlink.LinkByName(ifName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get %q: %v", ifName, err)
|
||||
}
|
||||
|
||||
if val {
|
||||
return netlink.SetPromiscOn(link)
|
||||
}
|
||||
return netlink.SetPromiscOff(link)
|
||||
}
|
||||
|
||||
func changeMtu(ifName string, mtu int) error {
|
||||
link, err := netlink.LinkByName(ifName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get %q: %v", ifName, err)
|
||||
}
|
||||
return netlink.LinkSetMTU(link, mtu)
|
||||
}
|
||||
|
||||
func cmdAdd(args *skel.CmdArgs) error {
|
||||
tuningConf, err := parseConf(args.StdinData)
|
||||
tuningConf, err := parseConf(args.StdinData, args.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -90,6 +164,26 @@ func cmdAdd(args *skel.CmdArgs) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var err error
|
||||
|
||||
if tuningConf.Mac != "" {
|
||||
if err = changeMacAddr(args.IfName, tuningConf.Mac); err == nil {
|
||||
err = updateResultsMacAddr(*tuningConf, args.IfName, tuningConf.Mac)
|
||||
}
|
||||
}
|
||||
|
||||
if tuningConf.Promisc != false {
|
||||
if err = changePromisc(args.IfName, true); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if tuningConf.Mtu != -1 {
|
||||
if err = changeMtu(args.IfName, tuningConf.Mtu); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user