static: increase test coverage to 1.0.0 and older spec versions

Signed-off-by: Dan Williams <dcbw@redhat.com>
This commit is contained in:
Dan Williams 2021-01-28 14:53:45 -06:00
parent 932653fd3f
commit f534133ec7

View File

@ -15,12 +15,13 @@
package main package main
import ( import (
"fmt"
"net" "net"
"strings" "strings"
"github.com/containernetworking/cni/pkg/skel" "github.com/containernetworking/cni/pkg/skel"
"github.com/containernetworking/cni/pkg/types" "github.com/containernetworking/cni/pkg/types"
current "github.com/containernetworking/cni/pkg/types/100" "github.com/containernetworking/cni/pkg/types/100"
"github.com/containernetworking/plugins/pkg/testutils" "github.com/containernetworking/plugins/pkg/testutils"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -28,12 +29,17 @@ import (
) )
var _ = Describe("static Operations", func() { var _ = Describe("static Operations", func() {
It("allocates and releases addresses with ADD/DEL", func() { for _, ver := range testutils.AllSpecVersions {
// Redefine ver inside for scope so real value is picked up by each dynamically defined It()
// See Gingkgo's "Patterns for dynamically generating tests" documentation.
ver := ver
It(fmt.Sprintf("[%s] allocates and releases addresses with ADD/DEL", ver), func() {
const ifname string = "eth0" const ifname string = "eth0"
const nspath string = "/some/where" const nspath string = "/some/where"
conf := `{ conf := fmt.Sprintf(`{
"cniVersion": "0.3.1", "cniVersion": "%s",
"name": "mynet", "name": "mynet",
"type": "ipvlan", "type": "ipvlan",
"master": "foo0", "master": "foo0",
@ -57,7 +63,7 @@ var _ = Describe("static Operations", func() {
"search": [ "example.com" ] "search": [ "example.com" ]
} }
} }
}` }`, ver)
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
@ -71,20 +77,22 @@ var _ = Describe("static Operations", func() {
return cmdAdd(args) return cmdAdd(args)
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
if testutils.SpecVersionHasIPVersion(ver) {
Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0)) Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0))
}
result, err := current.GetResult(r) result, err := types100.GetResult(r)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// Gomega is cranky about slices with different caps // Gomega is cranky about slices with different caps
Expect(*result.IPs[0]).To(Equal( Expect(*result.IPs[0]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("10.10.0.1/24"), Address: mustCIDR("10.10.0.1/24"),
Gateway: net.ParseIP("10.10.0.254"), Gateway: net.ParseIP("10.10.0.254"),
})) }))
Expect(*result.IPs[1]).To(Equal( Expect(*result.IPs[1]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("3ffe:ffff:0:01ff::1/64"), Address: mustCIDR("3ffe:ffff:0:01ff::1/64"),
Gateway: net.ParseIP("3ffe:ffff:0::1"), Gateway: net.ParseIP("3ffe:ffff:0::1"),
}, },
@ -104,12 +112,12 @@ var _ = Describe("static Operations", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
It("doesn't error when passed an unknown ID on DEL", func() { It(fmt.Sprintf("[%s] doesn't error when passed an unknown ID on DEL", ver), func() {
const ifname string = "eth0" const ifname string = "eth0"
const nspath string = "/some/where" const nspath string = "/some/where"
conf := `{ conf := fmt.Sprintf(`{
"cniVersion": "0.3.0", "cniVersion": "%s",
"name": "mynet", "name": "mynet",
"type": "ipvlan", "type": "ipvlan",
"master": "foo0", "master": "foo0",
@ -131,7 +139,9 @@ var _ = Describe("static Operations", func() {
"nameservers" : ["8.8.8.8"], "nameservers" : ["8.8.8.8"],
"domain": "example.com", "domain": "example.com",
"search": [ "example.com" ] "search": [ "example.com" ]
}}}` }
}
}`, ver)
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
@ -147,12 +157,12 @@ var _ = Describe("static Operations", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
It("allocates and releases addresses with ADD/DEL, with ENV variables", func() { It(fmt.Sprintf("[%s] allocates and releases addresses with ADD/DEL, with ENV variables", ver), func() {
const ifname string = "eth0" const ifname string = "eth0"
const nspath string = "/some/where" const nspath string = "/some/where"
conf := `{ conf := fmt.Sprintf(`{
"cniVersion": "0.3.1", "cniVersion": "%s",
"name": "mynet", "name": "mynet",
"type": "ipvlan", "type": "ipvlan",
"master": "foo0", "master": "foo0",
@ -167,7 +177,7 @@ var _ = Describe("static Operations", func() {
"search": [ "example.com" ] "search": [ "example.com" ]
} }
} }
}` }`, ver)
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
@ -182,14 +192,16 @@ var _ = Describe("static Operations", func() {
return cmdAdd(args) return cmdAdd(args)
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
if testutils.SpecVersionHasIPVersion(ver) {
Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0)) Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0))
}
result, err := current.GetResult(r) result, err := types100.GetResult(r)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// Gomega is cranky about slices with different caps // Gomega is cranky about slices with different caps
Expect(*result.IPs[0]).To(Equal( Expect(*result.IPs[0]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("10.10.0.1/24"), Address: mustCIDR("10.10.0.1/24"),
Gateway: net.ParseIP("10.10.0.254"), Gateway: net.ParseIP("10.10.0.254"),
})) }))
@ -208,19 +220,19 @@ var _ = Describe("static Operations", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
It("allocates and releases multiple addresses with ADD/DEL, with ENV variables", func() { It(fmt.Sprintf("[%s] allocates and releases multiple addresses with ADD/DEL, with ENV variables", ver), func() {
const ifname string = "eth0" const ifname string = "eth0"
const nspath string = "/some/where" const nspath string = "/some/where"
conf := `{ conf := fmt.Sprintf(`{
"cniVersion": "0.3.1", "cniVersion": "%s",
"name": "mynet", "name": "mynet",
"type": "ipvlan", "type": "ipvlan",
"master": "foo0", "master": "foo0",
"ipam": { "ipam": {
"type": "static" "type": "static"
} }
}` }`, ver)
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
@ -234,20 +246,28 @@ var _ = Describe("static Operations", func() {
r, raw, err := testutils.CmdAddWithArgs(args, func() error { r, raw, err := testutils.CmdAddWithArgs(args, func() error {
return cmdAdd(args) return cmdAdd(args)
}) })
Expect(err).NotTo(HaveOccurred()) if !testutils.SpecVersionHasMultipleIPs(ver) {
Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0)) errStr := fmt.Sprintf("CNI version %s does not support more than 1 address per family", ver)
Expect(err).To(MatchError(errStr))
return
}
result, err := current.GetResult(r) Expect(err).NotTo(HaveOccurred())
if testutils.SpecVersionHasIPVersion(ver) {
Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0))
}
result, err := types100.GetResult(r)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// Gomega is cranky about slices with different caps // Gomega is cranky about slices with different caps
Expect(*result.IPs[0]).To(Equal( Expect(*result.IPs[0]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("10.10.0.1/24"), Address: mustCIDR("10.10.0.1/24"),
Gateway: net.ParseIP("10.10.0.254"), Gateway: net.ParseIP("10.10.0.254"),
})) }))
Expect(*result.IPs[1]).To(Equal( Expect(*result.IPs[1]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("11.11.0.1/24"), Address: mustCIDR("11.11.0.1/24"),
Gateway: nil, Gateway: nil,
})) }))
@ -261,12 +281,12 @@ var _ = Describe("static Operations", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
It("allocates and releases multiple addresses with ADD/DEL, from RuntimeConfig", func() { It(fmt.Sprintf("[%s] allocates and releases multiple addresses with ADD/DEL, from RuntimeConfig", ver), func() {
const ifname string = "eth0" const ifname string = "eth0"
const nspath string = "/some/where" const nspath string = "/some/where"
conf := `{ conf := fmt.Sprintf(`{
"cniVersion": "0.3.1", "cniVersion": "%s",
"name": "mynet", "name": "mynet",
"type": "ipvlan", "type": "ipvlan",
"master": "foo0", "master": "foo0",
@ -286,7 +306,7 @@ var _ = Describe("static Operations", func() {
"RuntimeConfig": { "RuntimeConfig": {
"ips" : ["10.10.0.1/24", "3ffe:ffff:0:01ff::1/64"] "ips" : ["10.10.0.1/24", "3ffe:ffff:0:01ff::1/64"]
} }
}` }`, ver)
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
@ -300,18 +320,20 @@ var _ = Describe("static Operations", func() {
return cmdAdd(args) return cmdAdd(args)
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
if testutils.SpecVersionHasIPVersion(ver) {
Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0)) Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0))
}
result, err := current.GetResult(r) result, err := types100.GetResult(r)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// Gomega is cranky about slices with different caps // Gomega is cranky about slices with different caps
Expect(*result.IPs[0]).To(Equal( Expect(*result.IPs[0]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("10.10.0.1/24"), Address: mustCIDR("10.10.0.1/24"),
})) }))
Expect(*result.IPs[1]).To(Equal( Expect(*result.IPs[1]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("3ffe:ffff:0:01ff::1/64"), Address: mustCIDR("3ffe:ffff:0:01ff::1/64"),
}, },
)) ))
@ -328,12 +350,12 @@ var _ = Describe("static Operations", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
It("allocates and releases multiple addresses with ADD/DEL, from args", func() { It(fmt.Sprintf("[%s] allocates and releases multiple addresses with ADD/DEL, from args", ver), func() {
const ifname string = "eth0" const ifname string = "eth0"
const nspath string = "/some/where" const nspath string = "/some/where"
conf := `{ conf := fmt.Sprintf(`{
"cniVersion": "0.3.1", "cniVersion": "%s",
"name": "mynet", "name": "mynet",
"type": "ipvlan", "type": "ipvlan",
"master": "foo0", "master": "foo0",
@ -354,7 +376,7 @@ var _ = Describe("static Operations", func() {
"ips" : ["10.10.0.1/24", "3ffe:ffff:0:01ff::1/64"] "ips" : ["10.10.0.1/24", "3ffe:ffff:0:01ff::1/64"]
} }
} }
}` }`, ver)
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
@ -368,18 +390,20 @@ var _ = Describe("static Operations", func() {
return cmdAdd(args) return cmdAdd(args)
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
if testutils.SpecVersionHasIPVersion(ver) {
Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0)) Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0))
}
result, err := current.GetResult(r) result, err := types100.GetResult(r)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// Gomega is cranky about slices with different caps // Gomega is cranky about slices with different caps
Expect(*result.IPs[0]).To(Equal( Expect(*result.IPs[0]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("10.10.0.1/24"), Address: mustCIDR("10.10.0.1/24"),
})) }))
Expect(*result.IPs[1]).To(Equal( Expect(*result.IPs[1]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("3ffe:ffff:0:01ff::1/64"), Address: mustCIDR("3ffe:ffff:0:01ff::1/64"),
}, },
)) ))
@ -396,12 +420,12 @@ var _ = Describe("static Operations", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
It("allocates and releases multiple addresses with ADD/DEL, from RuntimeConfig/ARGS/CNI_ARGS", func() { It(fmt.Sprintf("[%s] allocates and releases multiple addresses with ADD/DEL, from RuntimeConfig/ARGS/CNI_ARGS", ver), func() {
const ifname string = "eth0" const ifname string = "eth0"
const nspath string = "/some/where" const nspath string = "/some/where"
conf := `{ conf := fmt.Sprintf(`{
"cniVersion": "0.3.1", "cniVersion": "%s",
"name": "mynet", "name": "mynet",
"type": "ipvlan", "type": "ipvlan",
"master": "foo0", "master": "foo0",
@ -426,7 +450,7 @@ var _ = Describe("static Operations", func() {
"ips" : ["10.10.0.2/24", "3ffe:ffff:0:01ff::2/64"] "ips" : ["10.10.0.2/24", "3ffe:ffff:0:01ff::2/64"]
} }
} }
}` }`, ver)
args := &skel.CmdArgs{ args := &skel.CmdArgs{
ContainerID: "dummy", ContainerID: "dummy",
@ -441,18 +465,20 @@ var _ = Describe("static Operations", func() {
return cmdAdd(args) return cmdAdd(args)
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
if testutils.SpecVersionHasIPVersion(ver) {
Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0)) Expect(strings.Index(string(raw), "\"version\":")).Should(BeNumerically(">", 0))
}
result, err := current.GetResult(r) result, err := types100.GetResult(r)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// only addresses in runtimeConfig configured because of its priorities // only addresses in runtimeConfig configured because of its priorities
Expect(*result.IPs[0]).To(Equal( Expect(*result.IPs[0]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("10.10.0.1/24"), Address: mustCIDR("10.10.0.1/24"),
})) }))
Expect(*result.IPs[1]).To(Equal( Expect(*result.IPs[1]).To(Equal(
current.IPConfig{ types100.IPConfig{
Address: mustCIDR("3ffe:ffff:0:01ff::1/64"), Address: mustCIDR("3ffe:ffff:0:01ff::1/64"),
}, },
)) ))
@ -468,7 +494,7 @@ var _ = Describe("static Operations", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
}
}) })
func mustCIDR(s string) net.IPNet { func mustCIDR(s string) net.IPNet {