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