Skip to content

Commit

Permalink
Add support for in-container master for ipvlan
Browse files Browse the repository at this point in the history
Signed-off-by: mmirecki <mmirecki@redhat.com>
  • Loading branch information
mmirecki committed Jan 25, 2023
1 parent c4d24e8 commit c798f80
Show file tree
Hide file tree
Showing 2 changed files with 184 additions and 102 deletions.
75 changes: 61 additions & 14 deletions plugins/main/ipvlan/ipvlan.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ import (

type NetConf struct {
types.NetConf
Master string `json:"master"`
Mode string `json:"mode"`
MTU int `json:"mtu"`
Master string `json:"master"`
Mode string `json:"mode"`
MTU int `json:"mtu"`
LinkContNs bool `json:"linkInContainer,omitempty"`
}

func init() {
Expand All @@ -48,9 +49,9 @@ func init() {
runtime.LockOSThread()
}

func loadConf(bytes []byte, cmdCheck bool) (*NetConf, string, error) {
func loadConf(args *skel.CmdArgs, cmdCheck bool) (*NetConf, string, error) {
n := &NetConf{}
if err := json.Unmarshal(bytes, n); err != nil {
if err := json.Unmarshal(args.StdinData, n); err != nil {
return nil, "", fmt.Errorf("failed to load netconf: %v", err)
}

Expand All @@ -73,8 +74,8 @@ func loadConf(bytes []byte, cmdCheck bool) (*NetConf, string, error) {
}
if n.Master == "" {
if result == nil {
defaultRouteInterface, err := getDefaultRouteInterfaceName()

var defaultRouteInterface string
defaultRouteInterface, err = getNamespacedDefaultRouteInterfaceName(args.Netns, n.LinkContNs)
if err != nil {
return nil, "", err
}
Expand Down Expand Up @@ -124,7 +125,15 @@ func createIpvlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interf
return nil, err
}

m, err := netlink.LinkByName(conf.Master)
var m netlink.Link
if conf.LinkContNs {
err = netns.Do(func(_ ns.NetNS) error {
m, err = netlink.LinkByName(conf.Master)
return err
})
} else {
m, err = netlink.LinkByName(conf.Master)
}
if err != nil {
return nil, fmt.Errorf("failed to lookup master %q: %v", conf.Master, err)
}
Expand All @@ -146,8 +155,14 @@ func createIpvlan(conf *NetConf, ifName string, netns ns.NetNS) (*current.Interf
Mode: mode,
}

if err := netlink.LinkAdd(mv); err != nil {
return nil, fmt.Errorf("failed to create ipvlan: %v", err)
if conf.LinkContNs {
err = netns.Do(func(_ ns.NetNS) error {
return netlink.LinkAdd(mv)
})
} else {
if err := netlink.LinkAdd(mv); err != nil {
return nil, fmt.Errorf("failed to create ipvlan: %v", err)
}
}

err = netns.Do(func(_ ns.NetNS) error {
Expand Down Expand Up @@ -193,8 +208,31 @@ func getDefaultRouteInterfaceName() (string, error) {
return "", fmt.Errorf("no default route interface found")
}

func getNamespacedDefaultRouteInterfaceName(namespace string, inContainer bool) (string, error) {
if !inContainer {
return getDefaultRouteInterfaceName()
}
netns, err := ns.GetNS(namespace)
if err != nil {
return "", fmt.Errorf("failed to open netns %q: %v", netns, err)
}
defer netns.Close()
var defaultRouteInterface string
err = netns.Do(func(_ ns.NetNS) error {
defaultRouteInterface, err = getDefaultRouteInterfaceName()
if err != nil {
return err
}
return nil
})
if err != nil {
return "", err
}
return defaultRouteInterface, nil
}

func cmdAdd(args *skel.CmdArgs) error {
n, cniVersion, err := loadConf(args.StdinData, false)
n, cniVersion, err := loadConf(args, false)
if err != nil {
return err
}
Expand Down Expand Up @@ -272,7 +310,7 @@ func cmdAdd(args *skel.CmdArgs) error {
}

func cmdDel(args *skel.CmdArgs) error {
n, _, err := loadConf(args.StdinData, false)
n, _, err := loadConf(args, false)
if err != nil {
return err
}
Expand Down Expand Up @@ -320,7 +358,7 @@ func main() {

func cmdCheck(args *skel.CmdArgs) error {

n, _, err := loadConf(args.StdinData, true)
n, _, err := loadConf(args, true)
if err != nil {
return err
}
Expand Down Expand Up @@ -369,7 +407,16 @@ func cmdCheck(args *skel.CmdArgs) error {
contMap.Sandbox, args.Netns)
}

m, err := netlink.LinkByName(n.Master)
var m netlink.Link
if n.LinkContNs {
err = netns.Do(func(_ ns.NetNS) error {
m, err = netlink.LinkByName(n.Master)
return err
})
} else {
m, err = netlink.LinkByName(n.Master)
}

if err != nil {
return fmt.Errorf("failed to lookup master %q: %v", n.Master, err)
}
Expand Down

0 comments on commit c798f80

Please sign in to comment.