@@ -314,5 +314,120 @@ var _ = Describe("Add, check, remove tap plugin", func() {
314
314
Expect (err ).NotTo (HaveOccurred ())
315
315
})
316
316
317
+ It (fmt .Sprintf ("[%s] add, check and remove a tap device as a bridge port" , ver ), func () {
318
+ const bridgeName = "br1"
319
+ conf := fmt .Sprintf (`{
320
+ "cniVersion": "%s",
321
+ "name": "tapTest",
322
+ "type": "tap",
323
+ "owner": 0,
324
+ "group": 0,
325
+ "bridge": %q,
326
+ "ipam": {
327
+ "type": "host-local",
328
+ "subnet": "10.1.2.0/24",
329
+ "dataDir": "%s"
330
+ }
331
+ }` , ver , bridgeName , dataDir )
332
+
333
+ args := & skel.CmdArgs {
334
+ ContainerID : "dummy" ,
335
+ Netns : targetNS .Path (),
336
+ IfName : IFNAME ,
337
+ StdinData : []byte (conf ),
338
+ }
339
+
340
+ t := newTesterByVersion (ver )
341
+
342
+ var bridge netlink.Link
343
+ var result types.Result
344
+ var macAddress string
345
+ var err error
346
+
347
+ Expect (
348
+ targetNS .Do (func (ns.NetNS ) error {
349
+ if err := netlink .LinkAdd (& netlink.Bridge {
350
+ LinkAttrs : netlink.LinkAttrs {
351
+ Name : bridgeName ,
352
+ },
353
+ }); err != nil {
354
+ return err
355
+ }
356
+ bridge , err = netlink .LinkByName (bridgeName )
357
+ if err != nil {
358
+ return err
359
+ }
360
+ return nil
361
+ }),
362
+ ).To (Succeed ())
363
+
364
+ err = originalNS .Do (func (ns.NetNS ) error {
365
+ defer GinkgoRecover ()
366
+
367
+ result , _ , err = testutils .CmdAddWithArgs (args , func () error {
368
+ return cmdAdd (args )
369
+ })
370
+ Expect (err ).NotTo (HaveOccurred ())
371
+ macAddress = t .verifyResult (result , IFNAME )
372
+ return nil
373
+ })
374
+ Expect (err ).NotTo (HaveOccurred ())
375
+
376
+ By ("Make sure the tap link exists in the target namespace" )
377
+ err = targetNS .Do (func (ns.NetNS ) error {
378
+ defer GinkgoRecover ()
379
+
380
+ link , err := netlink .LinkByName (IFNAME )
381
+ Expect (err ).NotTo (HaveOccurred ())
382
+ Expect (link .Attrs ().Name ).To (Equal (IFNAME ))
383
+ Expect (link .Type ()).To (Equal (TYPETAP ))
384
+ Expect (link .Attrs ().MasterIndex ).To (Equal (bridge .Attrs ().Index ))
385
+
386
+ if macAddress != "" {
387
+ hwaddr , err := net .ParseMAC (macAddress )
388
+ Expect (err ).NotTo (HaveOccurred ())
389
+ Expect (link .Attrs ().HardwareAddr ).To (Equal (hwaddr ))
390
+ }
391
+ addrs , err := netlink .AddrList (link , syscall .AF_INET )
392
+ Expect (err ).NotTo (HaveOccurred ())
393
+ Expect (addrs ).To (HaveLen (1 ))
394
+ return nil
395
+ })
396
+ Expect (err ).NotTo (HaveOccurred ())
397
+
398
+ By ("Running cmdDel" )
399
+ args .StdinData = []byte (conf )
400
+ err = originalNS .Do (func (ns.NetNS ) error {
401
+ defer GinkgoRecover ()
402
+
403
+ err = testutils .CmdDelWithArgs (args , func () error {
404
+ return cmdDel (args )
405
+ })
406
+ Expect (err ).NotTo (HaveOccurred ())
407
+ return nil
408
+ })
409
+ Expect (err ).NotTo (HaveOccurred ())
410
+
411
+ err = targetNS .Do (func (ns.NetNS ) error {
412
+ defer GinkgoRecover ()
413
+
414
+ link , err := netlink .LinkByName (IFNAME )
415
+ Expect (err ).To (HaveOccurred ())
416
+ Expect (link ).To (BeNil ())
417
+ return nil
418
+ })
419
+ Expect (err ).NotTo (HaveOccurred ())
420
+
421
+ By ("Running cmdDel more than once without error" )
422
+ err = originalNS .Do (func (ns.NetNS ) error {
423
+ defer GinkgoRecover ()
424
+ err = testutils .CmdDelWithArgs (args , func () error {
425
+ return cmdDel (args )
426
+ })
427
+ Expect (err ).NotTo (HaveOccurred ())
428
+ return nil
429
+ })
430
+ Expect (err ).NotTo (HaveOccurred ())
431
+ })
317
432
}
318
433
})
0 commit comments