@@ -22,6 +22,7 @@ import (
2222 "strings"
2323 "syscall"
2424
25+ "github.com/onsi/ginkgo/v2"
2526 . "github.com/onsi/ginkgo/v2"
2627 . "github.com/onsi/gomega"
2728 "github.com/vishvananda/netlink"
@@ -454,6 +455,88 @@ var _ = Describe("vlan Operations", func() {
454455 Expect (err ).NotTo (HaveOccurred ())
455456 })
456457
458+ Context ("When master is not provided" , func () {
459+ masterInterface := ""
460+
461+ Context ("When used as a chained plugin" , func () {
462+ Context ("When linkInContainer is true" , func () {
463+ It (fmt .Sprintf ("[%s] Use IFNAME as a master interface" , ver ), func () {
464+ if ! isInContainer {
465+ ginkgo .Skip ("Skipping because linkInContainer is false" )
466+ }
467+
468+ var err error
469+ const IFNAME = MASTER_NAME_INCONTAINER
470+ vlanId := 1234
471+ NEWIFNAME := fmt .Sprintf ("%s.%d" , IFNAME , vlanId )
472+
473+ conf := fmt .Sprintf (`{
474+ "cniVersion": "%s",
475+ "name": "vlanTestv4",
476+ "type": "vlan",
477+ "master": "%s",
478+ "vlanId": %d,
479+ "linkInContainer": %t,
480+ "ipam": {
481+ "type": "host-local",
482+ "subnet": "10.1.2.0/24",
483+ "dataDir": "%s"
484+ },
485+ "prevResult": {
486+ "cniVersion": "%s"
487+ }
488+ }` , ver , masterInterface , vlanId , isInContainer , dataDir , ver )
489+
490+ args := & skel.CmdArgs {
491+ ContainerID : "dummy" ,
492+ Netns : targetNS .Path (),
493+ IfName : IFNAME ,
494+ StdinData : []byte (conf ),
495+ }
496+
497+ t := newTesterByVersion (ver )
498+
499+ var result types.Result
500+ var macAddress string
501+ err = originalNS .Do (func (ns.NetNS ) error {
502+ defer GinkgoRecover ()
503+
504+ var err error
505+ result , _ , err = testutils .CmdAddWithArgs (args , func () error {
506+ return cmdAdd (args )
507+ })
508+ Expect (err ).NotTo (HaveOccurred ())
509+
510+ macAddress = t .verifyResult (result , NEWIFNAME )
511+ return nil
512+ })
513+ Expect (err ).NotTo (HaveOccurred ())
514+
515+ // Make sure vlan link exists in the target namespace
516+ err = targetNS .Do (func (ns.NetNS ) error {
517+ defer GinkgoRecover ()
518+
519+ link , err := netlink .LinkByName (NEWIFNAME )
520+ Expect (err ).NotTo (HaveOccurred ())
521+ Expect (link .Attrs ().Name ).To (Equal (NEWIFNAME ))
522+
523+ if macAddress != "" {
524+ hwaddr , err := net .ParseMAC (macAddress )
525+ Expect (err ).NotTo (HaveOccurred ())
526+ Expect (link .Attrs ().HardwareAddr ).To (Equal (hwaddr ))
527+ }
528+
529+ addrs , err := netlink .AddrList (link , syscall .AF_INET )
530+ Expect (err ).NotTo (HaveOccurred ())
531+ Expect (addrs ).To (HaveLen (1 ))
532+ return nil
533+ })
534+ Expect (err ).NotTo (HaveOccurred ())
535+ })
536+ })
537+ })
538+ })
539+
457540 Describe ("fails to create vlan link with invalid MTU" , func () {
458541 const confFmt = `{
459542 "cniVersion": "%s",
0 commit comments