Skip to content

Commit fec2d62

Browse files
LionelJouinsqueed
authored andcommitted
Pass status along ipam update
Signed-off-by: Lionel Jouin <[email protected]>
1 parent a4fc6f9 commit fec2d62

23 files changed

+348
-54
lines changed

pkg/ipam/ipam.go

+4
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ func ExecCheck(plugin string, netconf []byte) error {
3232
func ExecDel(plugin string, netconf []byte) error {
3333
return invoke.DelegateDel(context.TODO(), plugin, netconf, nil)
3434
}
35+
36+
func ExecStatus(plugin string, netconf []byte) error {
37+
return invoke.DelegateStatus(context.TODO(), plugin, netconf, nil)
38+
}

pkg/ipam/ipam_linux.go

+8
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,14 @@ func ConfigureIface(ifName string, res *current.Result) error {
128128
route.Scope = netlink.Scope(*r.Scope)
129129
}
130130

131+
if r.Table != nil {
132+
route.Table = *r.Table
133+
}
134+
135+
if r.Scope != nil {
136+
route.Scope = netlink.Scope(*r.Scope)
137+
}
138+
131139
if err = netlink.RouteAddEcmp(&route); err != nil {
132140
return fmt.Errorf("failed to add route '%v via %v dev %v metric %d (Scope: %v, Table: %d)': %v", r.Dst, gw, ifName, r.Priority, route.Scope, route.Table, err)
133141
}

pkg/testutils/cmd.go

+9
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,12 @@ func CmdDel(cniNetns, cniContainerID, cniIfname string, f func() error) error {
114114
func CmdDelWithArgs(args *skel.CmdArgs, f func() error) error {
115115
return CmdDel(args.Netns, args.ContainerID, args.IfName, f)
116116
}
117+
118+
func CmdStatus(f func() error) error {
119+
os.Setenv("CNI_COMMAND", "STATUS")
120+
os.Setenv("CNI_PATH", os.Getenv("PATH"))
121+
os.Setenv("CNI_NETNS_OVERRIDE", "1")
122+
defer envCleanup()
123+
124+
return f()
125+
}

pkg/testutils/testing.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
)
2020

2121
// AllSpecVersions contains all CNI spec version numbers
22-
var AllSpecVersions = [...]string{"0.1.0", "0.2.0", "0.3.0", "0.3.1", "0.4.0", "1.0.0"}
22+
var AllSpecVersions = [...]string{"0.1.0", "0.2.0", "0.3.0", "0.3.1", "0.4.0", "1.0.0", "1.1.0"}
2323

2424
// SpecVersionHasIPVersion returns true if the given CNI specification version
2525
// includes the "version" field in the IP address elements
@@ -39,6 +39,13 @@ func SpecVersionHasCHECK(ver string) bool {
3939
return ok
4040
}
4141

42+
// SpecVersionHasSTATUS returns true if the given CNI specification version
43+
// supports the STATUS command
44+
func SpecVersionHasSTATUS(ver string) bool {
45+
ok, _ := version.GreaterThanOrEqualTo(ver, "1.1.0")
46+
return ok
47+
}
48+
4249
// SpecVersionHasChaining returns true if the given CNI specification version
4350
// supports plugin chaining
4451
func SpecVersionHasChaining(ver string) bool {

plugins/main/bridge/bridge.go

+19-4
Original file line numberDiff line numberDiff line change
@@ -819,11 +819,11 @@ func cmdDel(args *skel.CmdArgs) error {
819819

820820
func main() {
821821
skel.PluginMainFuncs(skel.CNIFuncs{
822-
Add: cmdAdd,
823-
Check: cmdCheck,
824-
Del: cmdDel,
822+
Add: cmdAdd,
823+
Check: cmdCheck,
824+
Del: cmdDel,
825+
Status: cmdStatus,
825826
/* FIXME GC */
826-
/* FIXME Status */
827827
}, version.All, bv.BuildString("bridge"))
828828
}
829829

@@ -1085,3 +1085,18 @@ func cmdCheck(args *skel.CmdArgs) error {
10851085
func uniqueID(containerID, cniIface string) string {
10861086
return containerID + "-" + cniIface
10871087
}
1088+
1089+
func cmdStatus(args *skel.CmdArgs) error {
1090+
conf := NetConf{}
1091+
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
1092+
return fmt.Errorf("failed to load netconf: %w", err)
1093+
}
1094+
1095+
if conf.IPAM.Type != "" {
1096+
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
1097+
return err
1098+
}
1099+
}
1100+
1101+
return nil
1102+
}

plugins/main/bridge/bridge_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,11 @@ type (
508508

509509
func newTesterByVersion(version string, testNS, targetNS ns.NetNS) cmdAddDelTester {
510510
switch {
511+
case strings.HasPrefix(version, "1.1."):
512+
return &testerV10x{
513+
testNS: testNS,
514+
targetNS: targetNS,
515+
}
511516
case strings.HasPrefix(version, "1.0."):
512517
return &testerV10x{
513518
testNS: testNS,
@@ -1483,6 +1488,14 @@ func (tester *testerV01xOr02x) cmdAddTest(tc testCase, dataDir string) (types.Re
14831488
err := tester.testNS.Do(func(ns.NetNS) error {
14841489
defer GinkgoRecover()
14851490

1491+
// check that STATUS is
1492+
if testutils.SpecVersionHasSTATUS(tc.cniVersion) {
1493+
err := testutils.CmdStatus(func() error {
1494+
return cmdStatus(&skel.CmdArgs{StdinData: []byte(tc.netConfJSON(dataDir))})
1495+
})
1496+
Expect(err).NotTo(HaveOccurred())
1497+
}
1498+
14861499
r, raw, err := testutils.CmdAddWithArgs(tester.args, func() error {
14871500
return cmdAdd(tester.args)
14881501
})

plugins/main/dummy/dummy.go

+17-4
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,11 @@ func cmdDel(args *skel.CmdArgs) error {
181181

182182
func main() {
183183
skel.PluginMainFuncs(skel.CNIFuncs{
184-
Add: cmdAdd,
185-
Check: cmdCheck,
186-
Del: cmdDel,
184+
Add: cmdAdd,
185+
Check: cmdCheck,
186+
Del: cmdDel,
187+
Status: cmdStatus,
187188
/* FIXME GC */
188-
/* FIXME Status */
189189
}, version.All, bv.BuildString("dummy"))
190190
}
191191

@@ -295,3 +295,16 @@ func validateCniContainerInterface(intf current.Interface) error {
295295

296296
return nil
297297
}
298+
299+
func cmdStatus(args *skel.CmdArgs) error {
300+
conf := types.NetConf{}
301+
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
302+
return fmt.Errorf("failed to load netconf: %w", err)
303+
}
304+
305+
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
306+
return err
307+
}
308+
309+
return nil
310+
}

plugins/main/dummy/dummy_test.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ type (
106106

107107
func newTesterByVersion(version string) tester {
108108
switch {
109-
case strings.HasPrefix(version, "1.0."):
109+
case strings.HasPrefix(version, "1."):
110110
return &testerV10x{}
111111
case strings.HasPrefix(version, "0.4."):
112112
return &testerV04x{}
@@ -261,6 +261,13 @@ var _ = Describe("dummy Operations", func() {
261261
defer GinkgoRecover()
262262

263263
var err error
264+
if testutils.SpecVersionHasSTATUS(ver) {
265+
err = testutils.CmdStatus(func() error {
266+
return cmdStatus(args)
267+
})
268+
Expect(err).NotTo(HaveOccurred())
269+
}
270+
264271
result, _, err = testutils.CmdAddWithArgs(args, func() error {
265272
return cmdAdd(args)
266273
})

plugins/main/host-device/host-device.go

+21-4
Original file line numberDiff line numberDiff line change
@@ -551,11 +551,11 @@ func getLink(devname, hwaddr, kernelpath, pciaddr string, auxDev string) (netlin
551551

552552
func main() {
553553
skel.PluginMainFuncs(skel.CNIFuncs{
554-
Add: cmdAdd,
555-
Check: cmdCheck,
556-
Del: cmdDel,
554+
Add: cmdAdd,
555+
Check: cmdCheck,
556+
Del: cmdDel,
557+
Status: cmdStatus,
557558
/* FIXME GC */
558-
/* FIXME Status */
559559
}, version.All, bv.BuildString("host-device"))
560560
}
561561

@@ -663,3 +663,20 @@ func validateCniContainerInterface(intf current.Interface) error {
663663

664664
return nil
665665
}
666+
667+
func cmdStatus(args *skel.CmdArgs) error {
668+
conf := NetConf{}
669+
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
670+
return fmt.Errorf("failed to load netconf: %w", err)
671+
}
672+
673+
if conf.IPAM.Type != "" {
674+
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
675+
return err
676+
}
677+
}
678+
679+
// TODO: Check if host device exists.
680+
681+
return nil
682+
}

plugins/main/host-device/host-device_test.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ type (
231231

232232
func newTesterByVersion(version string) tester {
233233
switch {
234-
case strings.HasPrefix(version, "1.0."):
234+
case strings.HasPrefix(version, "1."):
235235
return &testerV10x{}
236236
case strings.HasPrefix(version, "0.4."):
237237
return &testerV04x{}
@@ -362,6 +362,15 @@ var _ = Describe("base functionality", func() {
362362
"type": "host-device",
363363
"device": %q
364364
}`, ver, ifname)
365+
366+
// if v1.1 or greater, call CmdStatus
367+
if testutils.SpecVersionHasSTATUS(ver) {
368+
err := testutils.CmdStatus(func() error {
369+
return cmdStatus(&skel.CmdArgs{StdinData: []byte(conf)})
370+
})
371+
Expect(err).NotTo(HaveOccurred())
372+
}
373+
365374
args := &skel.CmdArgs{
366375
ContainerID: "dummy",
367376
Netns: targetNS.Path(),

plugins/main/ipvlan/ipvlan.go

+20-4
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,11 @@ func cmdDel(args *skel.CmdArgs) error {
351351

352352
func main() {
353353
skel.PluginMainFuncs(skel.CNIFuncs{
354-
Add: cmdAdd,
355-
Check: cmdCheck,
356-
Del: cmdDel,
354+
Add: cmdAdd,
355+
Check: cmdCheck,
356+
Del: cmdDel,
357+
Status: cmdStatus,
357358
/* FIXME GC */
358-
/* FIXME Status */
359359
}, version.All, bv.BuildString("ipvlan"))
360360
}
361361

@@ -491,3 +491,19 @@ func validateCniContainerInterface(intf current.Interface, modeExpected string)
491491

492492
return nil
493493
}
494+
495+
func cmdStatus(args *skel.CmdArgs) error {
496+
conf := NetConf{}
497+
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
498+
return fmt.Errorf("failed to load netconf: %w", err)
499+
}
500+
if conf.IPAM.Type != "" {
501+
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
502+
return err
503+
}
504+
}
505+
506+
// TODO: Check if master interface exists.
507+
508+
return nil
509+
}

plugins/main/ipvlan/ipvlan_test.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ func ipvlanAddCheckDelTest(conf, masterName string, originalNS, targetNS ns.NetN
114114
err = originalNS.Do(func(ns.NetNS) error {
115115
defer GinkgoRecover()
116116

117+
if testutils.SpecVersionHasSTATUS(cniVersion) {
118+
err = testutils.CmdStatus(func() error {
119+
return cmdStatus(args)
120+
})
121+
Expect(err).NotTo(HaveOccurred())
122+
}
123+
117124
result, _, err = testutils.CmdAddWithArgs(args, func() error {
118125
return cmdAdd(args)
119126
})
@@ -214,7 +221,7 @@ type (
214221

215222
func newTesterByVersion(version string) tester {
216223
switch {
217-
case strings.HasPrefix(version, "1.0."):
224+
case strings.HasPrefix(version, "1."):
218225
return &testerV10x{}
219226
case strings.HasPrefix(version, "0.4.") || strings.HasPrefix(version, "0.3."):
220227
return &testerV04x{}

plugins/main/macvlan/macvlan.go

+21-4
Original file line numberDiff line numberDiff line change
@@ -429,11 +429,11 @@ func cmdDel(args *skel.CmdArgs) error {
429429

430430
func main() {
431431
skel.PluginMainFuncs(skel.CNIFuncs{
432-
Add: cmdAdd,
433-
Check: cmdCheck,
434-
Del: cmdDel,
432+
Add: cmdAdd,
433+
Check: cmdCheck,
434+
Del: cmdDel,
435+
Status: cmdStatus,
435436
/* FIXME GC */
436-
/* FIXME Status */
437437
}, version.All, bv.BuildString("macvlan"))
438438
}
439439

@@ -570,3 +570,20 @@ func validateCniContainerInterface(intf current.Interface, modeExpected string)
570570

571571
return nil
572572
}
573+
574+
func cmdStatus(args *skel.CmdArgs) error {
575+
conf := NetConf{}
576+
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
577+
return fmt.Errorf("failed to load netconf: %w", err)
578+
}
579+
580+
if conf.IPAM.Type != "" {
581+
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
582+
return err
583+
}
584+
}
585+
586+
// TODO: Check if master interface exists.
587+
588+
return nil
589+
}

plugins/main/macvlan/macvlan_test.go

+29-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ type (
117117

118118
func newTesterByVersion(version string) tester {
119119
switch {
120-
case strings.HasPrefix(version, "1.0."):
120+
case strings.HasPrefix(version, "1."):
121121
return &testerV10x{}
122122
case strings.HasPrefix(version, "0.4."):
123123
return &testerV04x{}
@@ -322,6 +322,13 @@ var _ = Describe("macvlan Operations", func() {
322322
err := originalNS.Do(func(ns.NetNS) error {
323323
defer GinkgoRecover()
324324

325+
if testutils.SpecVersionHasSTATUS(ver) {
326+
err := testutils.CmdStatus(func() error {
327+
return cmdStatus(args)
328+
})
329+
Expect(err).NotTo(HaveOccurred())
330+
}
331+
325332
result, _, err := testutils.CmdAddWithArgs(args, func() error {
326333
return cmdAdd(args)
327334
})
@@ -434,6 +441,13 @@ var _ = Describe("macvlan Operations", func() {
434441
err := originalNS.Do(func(ns.NetNS) error {
435442
defer GinkgoRecover()
436443

444+
if testutils.SpecVersionHasSTATUS(ver) {
445+
err := testutils.CmdStatus(func() error {
446+
return cmdStatus(args)
447+
})
448+
Expect(err).NotTo(HaveOccurred())
449+
}
450+
437451
result, _, err := testutils.CmdAddWithArgs(args, func() error {
438452
return cmdAdd(args)
439453
})
@@ -520,6 +534,13 @@ var _ = Describe("macvlan Operations", func() {
520534
defer GinkgoRecover()
521535

522536
var err error
537+
if testutils.SpecVersionHasSTATUS(ver) {
538+
err := testutils.CmdStatus(func() error {
539+
return cmdStatus(args)
540+
})
541+
Expect(err).NotTo(HaveOccurred())
542+
}
543+
523544
result, _, err = testutils.CmdAddWithArgs(args, func() error {
524545
return cmdAdd(args)
525546
})
@@ -660,6 +681,13 @@ var _ = Describe("macvlan Operations", func() {
660681
err = originalNS.Do(func(ns.NetNS) error {
661682
defer GinkgoRecover()
662683

684+
if testutils.SpecVersionHasSTATUS(ver) {
685+
err := testutils.CmdStatus(func() error {
686+
return cmdStatus(args)
687+
})
688+
Expect(err).NotTo(HaveOccurred())
689+
}
690+
663691
result, _, err := testutils.CmdAddWithArgs(args, func() error {
664692
return cmdAdd(args)
665693
})

0 commit comments

Comments
 (0)