Pass status along ipam update
Signed-off-by: Lionel Jouin <lionel.jouin@est.tech>
This commit is contained in:
parent
a4fc6f93c7
commit
fec2d62676
@ -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)
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -819,11 +819,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
|
@ -181,11 +181,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
|
@ -551,11 +551,11 @@ func getLink(devname, hwaddr, kernelpath, pciaddr string, auxDev string) (netlin
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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(),
|
||||||
|
@ -351,11 +351,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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{}
|
||||||
|
@ -429,11 +429,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
|
@ -301,11 +301,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
|
@ -386,11 +386,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
|
@ -261,11 +261,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
|
@ -216,10 +216,25 @@ func cmdCheck(_ *skel.CmdArgs) error {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
@ -106,13 +106,13 @@ func cmdHcnAdd(args *skel.CmdArgs, n *NetConf) (*current.Result, error) {
|
|||||||
return nil, errors.Annotatef(err, "error while hcn.GetNetworkByName(%s)", networkName)
|
return nil, errors.Annotatef(err, "error while hcn.GetNetworkByName(%s)", networkName)
|
||||||
}
|
}
|
||||||
if hcnNetwork == nil {
|
if hcnNetwork == nil {
|
||||||
return nil, fmt.Errorf("network %v is not found", networkName)
|
return nil, fmt.Errorf("network %v is not found", networkName)
|
||||||
}
|
}
|
||||||
if hnsNetwork == nil {
|
if hnsNetwork == nil {
|
||||||
return nil, fmt.Errorf("network %v not found", networkName)
|
return nil, fmt.Errorf("network %v not found", networkName)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !strings.EqualFold(string (hcnNetwork.Type), "Overlay") {
|
if !strings.EqualFold(string(hcnNetwork.Type), "Overlay") {
|
||||||
return nil, fmt.Errorf("network %v is of an unexpected type: %v", networkName, hcnNetwork.Type)
|
return nil, fmt.Errorf("network %v is of an unexpected type: %v", networkName, hcnNetwork.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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
|
||||||
|
}
|
||||||
|
@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -151,11 +152,11 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
func main() {
|
func main() {
|
||||||
// replace TODO with your plugin name
|
// replace TODO with your plugin name
|
||||||
skel.PluginMainFuncs(skel.CNIFuncs{
|
skel.PluginMainFuncs(skel.CNIFuncs{
|
||||||
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
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user