Pass status along ipam update

Signed-off-by: Lionel Jouin <lionel.jouin@est.tech>
This commit is contained in:
Lionel Jouin 2024-09-30 17:18:23 +02:00 committed by Casey Callendrello
parent a4fc6f93c7
commit fec2d62676
23 changed files with 348 additions and 54 deletions

View File

@ -32,3 +32,7 @@ func ExecCheck(plugin string, netconf []byte) error {
func ExecDel(plugin string, netconf []byte) error { func ExecDel(plugin string, netconf []byte) error {
return invoke.DelegateDel(context.TODO(), plugin, netconf, nil) return invoke.DelegateDel(context.TODO(), plugin, netconf, nil)
} }
func ExecStatus(plugin string, netconf []byte) error {
return invoke.DelegateStatus(context.TODO(), plugin, netconf, nil)
}

View File

@ -128,6 +128,14 @@ func ConfigureIface(ifName string, res *current.Result) error {
route.Scope = netlink.Scope(*r.Scope) route.Scope = netlink.Scope(*r.Scope)
} }
if r.Table != nil {
route.Table = *r.Table
}
if r.Scope != nil {
route.Scope = netlink.Scope(*r.Scope)
}
if err = netlink.RouteAddEcmp(&route); err != nil { if err = netlink.RouteAddEcmp(&route); err != nil {
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) 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)
} }

View File

@ -114,3 +114,12 @@ func CmdDel(cniNetns, cniContainerID, cniIfname string, f func() error) error {
func CmdDelWithArgs(args *skel.CmdArgs, f func() error) error { func CmdDelWithArgs(args *skel.CmdArgs, f func() error) error {
return CmdDel(args.Netns, args.ContainerID, args.IfName, f) return CmdDel(args.Netns, args.ContainerID, args.IfName, f)
} }
func CmdStatus(f func() error) error {
os.Setenv("CNI_COMMAND", "STATUS")
os.Setenv("CNI_PATH", os.Getenv("PATH"))
os.Setenv("CNI_NETNS_OVERRIDE", "1")
defer envCleanup()
return f()
}

View File

@ -19,7 +19,7 @@ import (
) )
// AllSpecVersions contains all CNI spec version numbers // AllSpecVersions contains all CNI spec version numbers
var AllSpecVersions = [...]string{"0.1.0", "0.2.0", "0.3.0", "0.3.1", "0.4.0", "1.0.0"} var AllSpecVersions = [...]string{"0.1.0", "0.2.0", "0.3.0", "0.3.1", "0.4.0", "1.0.0", "1.1.0"}
// SpecVersionHasIPVersion returns true if the given CNI specification version // SpecVersionHasIPVersion returns true if the given CNI specification version
// includes the "version" field in the IP address elements // includes the "version" field in the IP address elements
@ -39,6 +39,13 @@ func SpecVersionHasCHECK(ver string) bool {
return ok return ok
} }
// SpecVersionHasSTATUS returns true if the given CNI specification version
// supports the STATUS command
func SpecVersionHasSTATUS(ver string) bool {
ok, _ := version.GreaterThanOrEqualTo(ver, "1.1.0")
return ok
}
// SpecVersionHasChaining returns true if the given CNI specification version // SpecVersionHasChaining returns true if the given CNI specification version
// supports plugin chaining // supports plugin chaining
func SpecVersionHasChaining(ver string) bool { func SpecVersionHasChaining(ver string) bool {

View File

@ -822,8 +822,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("bridge")) }, version.All, bv.BuildString("bridge"))
} }
@ -1085,3 +1085,18 @@ func cmdCheck(args *skel.CmdArgs) error {
func uniqueID(containerID, cniIface string) string { func uniqueID(containerID, cniIface string) string {
return containerID + "-" + cniIface return containerID + "-" + cniIface
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if conf.IPAM.Type != "" {
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
}
return nil
}

View File

@ -508,6 +508,11 @@ type (
func newTesterByVersion(version string, testNS, targetNS ns.NetNS) cmdAddDelTester { func newTesterByVersion(version string, testNS, targetNS ns.NetNS) cmdAddDelTester {
switch { switch {
case strings.HasPrefix(version, "1.1."):
return &testerV10x{
testNS: testNS,
targetNS: targetNS,
}
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1.0."):
return &testerV10x{ return &testerV10x{
testNS: testNS, testNS: testNS,
@ -1483,6 +1488,14 @@ func (tester *testerV01xOr02x) cmdAddTest(tc testCase, dataDir string) (types.Re
err := tester.testNS.Do(func(ns.NetNS) error { err := tester.testNS.Do(func(ns.NetNS) error {
defer GinkgoRecover() defer GinkgoRecover()
// check that STATUS is
if testutils.SpecVersionHasSTATUS(tc.cniVersion) {
err := testutils.CmdStatus(func() error {
return cmdStatus(&skel.CmdArgs{StdinData: []byte(tc.netConfJSON(dataDir))})
})
Expect(err).NotTo(HaveOccurred())
}
r, raw, err := testutils.CmdAddWithArgs(tester.args, func() error { r, raw, err := testutils.CmdAddWithArgs(tester.args, func() error {
return cmdAdd(tester.args) return cmdAdd(tester.args)
}) })

View File

@ -184,8 +184,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("dummy")) }, version.All, bv.BuildString("dummy"))
} }
@ -295,3 +295,16 @@ func validateCniContainerInterface(intf current.Interface) error {
return nil return nil
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := types.NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
return nil
}

View File

@ -106,7 +106,7 @@ type (
func newTesterByVersion(version string) tester { func newTesterByVersion(version string) tester {
switch { switch {
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1."):
return &testerV10x{} return &testerV10x{}
case strings.HasPrefix(version, "0.4."): case strings.HasPrefix(version, "0.4."):
return &testerV04x{} return &testerV04x{}
@ -261,6 +261,13 @@ var _ = Describe("dummy Operations", func() {
defer GinkgoRecover() defer GinkgoRecover()
var err error var err error
if testutils.SpecVersionHasSTATUS(ver) {
err = testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err = testutils.CmdAddWithArgs(args, func() error { result, _, err = testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })

View File

@ -554,8 +554,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("host-device")) }, version.All, bv.BuildString("host-device"))
} }
@ -663,3 +663,20 @@ func validateCniContainerInterface(intf current.Interface) error {
return nil return nil
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if conf.IPAM.Type != "" {
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
}
// TODO: Check if host device exists.
return nil
}

View File

@ -231,7 +231,7 @@ type (
func newTesterByVersion(version string) tester { func newTesterByVersion(version string) tester {
switch { switch {
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1."):
return &testerV10x{} return &testerV10x{}
case strings.HasPrefix(version, "0.4."): case strings.HasPrefix(version, "0.4."):
return &testerV04x{} return &testerV04x{}
@ -362,6 +362,15 @@ var _ = Describe("base functionality", func() {
"type": "host-device", "type": "host-device",
"device": %q "device": %q
}`, ver, ifname) }`, ver, ifname)
// if v1.1 or greater, call CmdStatus
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(&skel.CmdArgs{StdinData: []byte(conf)})
})
Expect(err).NotTo(HaveOccurred())
}
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
Netns: targetNS.Path(), Netns: targetNS.Path(),

View File

@ -354,8 +354,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("ipvlan")) }, version.All, bv.BuildString("ipvlan"))
} }
@ -491,3 +491,19 @@ func validateCniContainerInterface(intf current.Interface, modeExpected string)
return nil return nil
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if conf.IPAM.Type != "" {
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
}
// TODO: Check if master interface exists.
return nil
}

View File

@ -114,6 +114,13 @@ func ipvlanAddCheckDelTest(conf, masterName string, originalNS, targetNS ns.NetN
err = originalNS.Do(func(ns.NetNS) error { err = originalNS.Do(func(ns.NetNS) error {
defer GinkgoRecover() defer GinkgoRecover()
if testutils.SpecVersionHasSTATUS(cniVersion) {
err = testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err = testutils.CmdAddWithArgs(args, func() error { result, _, err = testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })
@ -214,7 +221,7 @@ type (
func newTesterByVersion(version string) tester { func newTesterByVersion(version string) tester {
switch { switch {
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1."):
return &testerV10x{} return &testerV10x{}
case strings.HasPrefix(version, "0.4.") || strings.HasPrefix(version, "0.3."): case strings.HasPrefix(version, "0.4.") || strings.HasPrefix(version, "0.3."):
return &testerV04x{} return &testerV04x{}

View File

@ -432,8 +432,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("macvlan")) }, version.All, bv.BuildString("macvlan"))
} }
@ -570,3 +570,20 @@ func validateCniContainerInterface(intf current.Interface, modeExpected string)
return nil return nil
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if conf.IPAM.Type != "" {
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
}
// TODO: Check if master interface exists.
return nil
}

View File

@ -117,7 +117,7 @@ type (
func newTesterByVersion(version string) tester { func newTesterByVersion(version string) tester {
switch { switch {
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1."):
return &testerV10x{} return &testerV10x{}
case strings.HasPrefix(version, "0.4."): case strings.HasPrefix(version, "0.4."):
return &testerV04x{} return &testerV04x{}
@ -322,6 +322,13 @@ var _ = Describe("macvlan Operations", func() {
err := originalNS.Do(func(ns.NetNS) error { err := originalNS.Do(func(ns.NetNS) error {
defer GinkgoRecover() defer GinkgoRecover()
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err := testutils.CmdAddWithArgs(args, func() error { result, _, err := testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })
@ -434,6 +441,13 @@ var _ = Describe("macvlan Operations", func() {
err := originalNS.Do(func(ns.NetNS) error { err := originalNS.Do(func(ns.NetNS) error {
defer GinkgoRecover() defer GinkgoRecover()
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err := testutils.CmdAddWithArgs(args, func() error { result, _, err := testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })
@ -520,6 +534,13 @@ var _ = Describe("macvlan Operations", func() {
defer GinkgoRecover() defer GinkgoRecover()
var err error var err error
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err = testutils.CmdAddWithArgs(args, func() error { result, _, err = testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })
@ -660,6 +681,13 @@ var _ = Describe("macvlan Operations", func() {
err = originalNS.Do(func(ns.NetNS) error { err = originalNS.Do(func(ns.NetNS) error {
defer GinkgoRecover() defer GinkgoRecover()
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err := testutils.CmdAddWithArgs(args, func() error { result, _, err := testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })

View File

@ -304,8 +304,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("ptp")) }, version.All, bv.BuildString("ptp"))
} }
@ -409,3 +409,16 @@ func validateCniContainerInterface(intf current.Interface) error {
return nil return nil
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
return nil
}

View File

@ -105,7 +105,7 @@ type (
func newTesterByVersion(version string) tester { func newTesterByVersion(version string) tester {
switch { switch {
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1."):
return &testerV10x{} return &testerV10x{}
case strings.HasPrefix(version, "0.4."): case strings.HasPrefix(version, "0.4."):
return &testerV04x{} return &testerV04x{}
@ -250,6 +250,14 @@ var _ = Describe("ptp Operations", func() {
defer GinkgoRecover() defer GinkgoRecover()
var err error var err error
if testutils.SpecVersionHasSTATUS(cniVersion) {
By("Doing a cni STATUS")
err = testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err = testutils.CmdAddWithArgs(args, func() error { result, _, err = testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })

View File

@ -389,8 +389,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("tap")) }, version.All, bv.BuildString("tap"))
} }
@ -460,3 +460,18 @@ func cmdCheck(args *skel.CmdArgs) error {
return nil return nil
}) })
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if conf.IPAM.Type != "" {
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
}
return nil
}

View File

@ -108,7 +108,7 @@ type (
func newTesterByVersion(version string) tester { func newTesterByVersion(version string) tester {
switch { switch {
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1."):
return &testerV10x{} return &testerV10x{}
case strings.HasPrefix(version, "0.4."): case strings.HasPrefix(version, "0.4."):
return &testerV04x{} return &testerV04x{}
@ -223,6 +223,13 @@ var _ = Describe("Add, check, remove tap plugin", func() {
err = originalNS.Do(func(ns.NetNS) error { err = originalNS.Do(func(ns.NetNS) error {
defer GinkgoRecover() defer GinkgoRecover()
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err = testutils.CmdAddWithArgs(args, func() error { result, _, err = testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })
@ -364,6 +371,13 @@ var _ = Describe("Add, check, remove tap plugin", func() {
err = originalNS.Do(func(ns.NetNS) error { err = originalNS.Do(func(ns.NetNS) error {
defer GinkgoRecover() defer GinkgoRecover()
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err = testutils.CmdAddWithArgs(args, func() error { result, _, err = testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })

View File

@ -264,8 +264,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("vlan")) }, version.All, bv.BuildString("vlan"))
} }
@ -399,3 +399,18 @@ func validateCniContainerInterface(intf current.Interface, vlanID int, mtu int)
return nil return nil
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
// TODO: Check if master interface exists.
return nil
}

View File

@ -113,7 +113,7 @@ type (
func newTesterByVersion(version string) tester { func newTesterByVersion(version string) tester {
switch { switch {
case strings.HasPrefix(version, "1.0."): case strings.HasPrefix(version, "1."):
return &testerV10x{} return &testerV10x{}
case strings.HasPrefix(version, "0.4."): case strings.HasPrefix(version, "0.4."):
return &testerV04x{} return &testerV04x{}
@ -354,6 +354,13 @@ var _ = Describe("vlan Operations", func() {
defer GinkgoRecover() defer GinkgoRecover()
var err error var err error
if testutils.SpecVersionHasSTATUS(ver) {
err := testutils.CmdStatus(func() error {
return cmdStatus(args)
})
Expect(err).NotTo(HaveOccurred())
}
result, _, err = testutils.CmdAddWithArgs(args, func() error { result, _, err = testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })

View File

@ -219,7 +219,22 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("win-bridge")) }, version.All, bv.BuildString("win-bridge"))
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if conf.IPAM.Type != "" {
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
}
return nil
}

View File

@ -131,7 +131,6 @@ func cmdHcnAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) {
n.ApplyOutboundNatPolicy(hnsNetwork.Subnets[0].AddressPrefix) n.ApplyOutboundNatPolicy(hnsNetwork.Subnets[0].AddressPrefix)
} }
hcnEndpoint, err := hns.GenerateHcnEndpoint(epInfo, &n.NetConf) hcnEndpoint, err := hns.GenerateHcnEndpoint(epInfo, &n.NetConf)
if err != nil { if err != nil {
return nil, errors.Annotate(err, "error while generating HostComputeEndpoint") return nil, errors.Annotate(err, "error while generating HostComputeEndpoint")
} }
@ -142,15 +141,14 @@ func cmdHcnAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) {
} }
result, err := hns.ConstructHcnResult(hcnNetwork, hcnEndpoint) result, err := hns.ConstructHcnResult(hcnNetwork, hcnEndpoint)
if err != nil { if err != nil {
ipam.ExecDel(n.IPAM.Type, args.StdinData) ipam.ExecDel(n.IPAM.Type, args.StdinData)
return nil, errors.Annotate(err, "error while constructing HostComputeEndpoint addition result") return nil, errors.Annotate(err, "error while constructing HostComputeEndpoint addition result")
} }
return result, nil return result, nil
} }
func cmdHnsAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) { func cmdHnsAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) {
success := false success := false
@ -243,6 +241,7 @@ func cmdHnsAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) {
success = true success = true
return result, nil return result, nil
} }
func cmdAdd(args *skel.CmdArgs) error { func cmdAdd(args *skel.CmdArgs) error {
n, cniVersion, err := loadNetConf(args.StdinData) n, cniVersion, err := loadNetConf(args.StdinData)
if err != nil { if err != nil {
@ -292,7 +291,20 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("win-overlay")) }, version.All, bv.BuildString("win-overlay"))
} }
func cmdStatus(args *skel.CmdArgs) error {
conf := NetConf{}
if err := json.Unmarshal(args.StdinData, &conf); err != nil {
return fmt.Errorf("failed to load netconf: %w", err)
}
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
return nil
}

View File

@ -24,6 +24,7 @@ import (
"github.com/containernetworking/cni/pkg/types" "github.com/containernetworking/cni/pkg/types"
current "github.com/containernetworking/cni/pkg/types/100" current "github.com/containernetworking/cni/pkg/types/100"
"github.com/containernetworking/cni/pkg/version" "github.com/containernetworking/cni/pkg/version"
"github.com/containernetworking/plugins/pkg/ipam"
bv "github.com/containernetworking/plugins/pkg/utils/buildversion" bv "github.com/containernetworking/plugins/pkg/utils/buildversion"
) )
@ -154,8 +155,8 @@ func main() {
Add: cmdAdd, Add: cmdAdd,
Check: cmdCheck, Check: cmdCheck,
Del: cmdDel, Del: cmdDel,
Status: cmdStatus,
/* FIXME GC */ /* FIXME GC */
/* FIXME Status */
}, version.All, bv.BuildString("TODO")) }, version.All, bv.BuildString("TODO"))
} }
@ -163,3 +164,27 @@ func cmdCheck(_ *skel.CmdArgs) error {
// TODO: implement // TODO: implement
return fmt.Errorf("not implemented") return fmt.Errorf("not implemented")
} }
// cmdStatus implements the STATUS command, which indicates whether or not
// this plugin is able to accept ADD requests.
//
// If the plugin has external dependencies, such as a daemon
// or chained ipam plugin, it should determine their status. If all is well,
// and an ADD can be successfully processed, return nil
func cmdStatus(args *skel.CmdArgs) error {
conf, err := parseConfig(args.StdinData)
if err != nil {
return err
}
_ = conf
// If this plugins delegates IPAM, ensure that IPAM is also running
if err := ipam.ExecStatus(conf.IPAM.Type, args.StdinData); err != nil {
return err
}
// TODO: implement STATUS here
// e.g. querying an external deamon, or delegating STATUS to an IPAM plugin
return nil
}