portmap: increase test coverage to 1.0.0 and older spec versions
Signed-off-by: Dan Williams <dcbw@redhat.com>
This commit is contained in:
parent
8f7fe6d8e8
commit
d2e5b5decb
@ -25,7 +25,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/containernetworking/cni/libcni"
|
"github.com/containernetworking/cni/libcni"
|
||||||
current "github.com/containernetworking/cni/pkg/types/100"
|
"github.com/containernetworking/cni/pkg/types/100"
|
||||||
"github.com/containernetworking/plugins/pkg/ns"
|
"github.com/containernetworking/plugins/pkg/ns"
|
||||||
"github.com/containernetworking/plugins/pkg/testutils"
|
"github.com/containernetworking/plugins/pkg/testutils"
|
||||||
"github.com/coreos/go-iptables/iptables"
|
"github.com/coreos/go-iptables/iptables"
|
||||||
@ -37,19 +37,9 @@ import (
|
|||||||
|
|
||||||
const TIMEOUT = 90
|
const TIMEOUT = 90
|
||||||
|
|
||||||
var _ = Describe("portmap integration tests", func() {
|
func makeConfig(ver string) *libcni.NetworkConfigList {
|
||||||
var (
|
configList, err := libcni.ConfListFromBytes([]byte(fmt.Sprintf(`{
|
||||||
configList *libcni.NetworkConfigList
|
"cniVersion": "%s",
|
||||||
cniConf *libcni.CNIConfig
|
|
||||||
targetNS ns.NetNS
|
|
||||||
containerPort int
|
|
||||||
session *gexec.Session
|
|
||||||
)
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
var err error
|
|
||||||
rawConfig := `{
|
|
||||||
"cniVersion": "0.3.0",
|
|
||||||
"name": "cni-portmap-unit-test",
|
"name": "cni-portmap-unit-test",
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
@ -70,15 +60,25 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}`
|
}`, ver)))
|
||||||
|
|
||||||
configList, err = libcni.ConfListFromBytes([]byte(rawConfig))
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
return configList
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ = Describe("portmap integration tests", func() {
|
||||||
|
var (
|
||||||
|
cniConf *libcni.CNIConfig
|
||||||
|
targetNS ns.NetNS
|
||||||
|
containerPort int
|
||||||
|
session *gexec.Session
|
||||||
|
)
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
// turn PATH in to CNI_PATH
|
// turn PATH in to CNI_PATH
|
||||||
dirs := filepath.SplitList(os.Getenv("PATH"))
|
dirs := filepath.SplitList(os.Getenv("PATH"))
|
||||||
cniConf = &libcni.CNIConfig{Path: dirs}
|
cniConf = &libcni.CNIConfig{Path: dirs}
|
||||||
|
|
||||||
|
var err error
|
||||||
targetNS, err = testutils.NewNS()
|
targetNS, err = testutils.NewNS()
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
fmt.Fprintln(GinkgoWriter, "namespace:", targetNS.Path())
|
fmt.Fprintln(GinkgoWriter, "namespace:", targetNS.Path())
|
||||||
@ -90,14 +90,18 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
|
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
session.Terminate().Wait()
|
session.Terminate().Wait()
|
||||||
if targetNS != nil {
|
|
||||||
targetNS.Close()
|
targetNS.Close()
|
||||||
}
|
testutils.UnmountNS(targetNS)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
for _, ver := range []string{"0.3.0", "0.3.1", "0.4.0", "1.0.0"} {
|
||||||
|
// 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
|
||||||
|
|
||||||
Describe("Creating an interface in a namespace with the ptp plugin", func() {
|
Describe("Creating an interface in a namespace with the ptp plugin", func() {
|
||||||
// This needs to be done using Ginkgo's asynchronous testing mode.
|
// This needs to be done using Ginkgo's asynchronous testing mode.
|
||||||
It("forwards a TCP port on ipv4", func(done Done) {
|
It(fmt.Sprintf("[%s] forwards a TCP port on ipv4", ver), func(done Done) {
|
||||||
var err error
|
var err error
|
||||||
hostPort := rand.Intn(10000) + 1025
|
hostPort := rand.Intn(10000) + 1025
|
||||||
runtimeConfig := libcni.RuntimeConf{
|
runtimeConfig := libcni.RuntimeConf{
|
||||||
@ -114,6 +118,7 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
configList := makeConfig(ver)
|
||||||
|
|
||||||
// Make delete idempotent, so we can clean up on failure
|
// Make delete idempotent, so we can clean up on failure
|
||||||
netDeleted := false
|
netDeleted := false
|
||||||
@ -146,7 +151,7 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
_, err = ipt.List("nat", dnatChainName)
|
_, err = ipt.List("nat", dnatChainName)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
result, err := current.GetResult(resI)
|
result, err := types100.GetResult(resI)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
var contIP net.IP
|
var contIP net.IP
|
||||||
|
|
||||||
@ -221,7 +226,7 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
close(done)
|
close(done)
|
||||||
}, TIMEOUT*9)
|
}, TIMEOUT*9)
|
||||||
|
|
||||||
It("forwards a UDP port on ipv4 and keep working after creating a second container with the same HostPort", func(done Done) {
|
It(fmt.Sprintf("[%s] forwards a UDP port on ipv4 and keep working after creating a second container with the same HostPort", ver), func(done Done) {
|
||||||
var err error
|
var err error
|
||||||
hostPort := rand.Intn(10000) + 1025
|
hostPort := rand.Intn(10000) + 1025
|
||||||
runtimeConfig := libcni.RuntimeConf{
|
runtimeConfig := libcni.RuntimeConf{
|
||||||
@ -238,6 +243,7 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
configList := makeConfig(ver)
|
||||||
|
|
||||||
// Make delete idempotent, so we can clean up on failure
|
// Make delete idempotent, so we can clean up on failure
|
||||||
netDeleted := false
|
netDeleted := false
|
||||||
@ -261,7 +267,7 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
err = cmd.Run()
|
err = cmd.Run()
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
result, err := current.GetResult(resI)
|
result, err := types100.GetResult(resI)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
var contIP net.IP
|
var contIP net.IP
|
||||||
|
|
||||||
@ -357,7 +363,7 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
defer deleteNetwork2()
|
defer deleteNetwork2()
|
||||||
|
|
||||||
result2, err := current.GetResult(resI2)
|
result2, err := types100.GetResult(resI2)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
var contIP2 net.IP
|
var contIP2 net.IP
|
||||||
|
|
||||||
@ -417,6 +423,7 @@ var _ = Describe("portmap integration tests", func() {
|
|||||||
close(done)
|
close(done)
|
||||||
}, TIMEOUT*9)
|
}, TIMEOUT*9)
|
||||||
})
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// testEchoServer returns true if we found an echo server on the port
|
// testEchoServer returns true if we found an echo server on the port
|
||||||
|
@ -27,12 +27,17 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
netName := "testNetName"
|
netName := "testNetName"
|
||||||
containerID := "icee6giejonei6sohng6ahngee7laquohquee9shiGo7fohferakah3Feiyoolu2pei7ciPhoh7shaoX6vai3vuf0ahfaeng8yohb9ceu0daez5hashee8ooYai5wa3y"
|
containerID := "icee6giejonei6sohng6ahngee7laquohquee9shiGo7fohferakah3Feiyoolu2pei7ciPhoh7shaoX6vai3vuf0ahfaeng8yohb9ceu0daez5hashee8ooYai5wa3y"
|
||||||
|
|
||||||
|
for _, ver := range []string{"0.3.0", "0.3.1", "0.4.0", "1.0.0"} {
|
||||||
|
// 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
|
||||||
|
|
||||||
Context("config parsing", func() {
|
Context("config parsing", func() {
|
||||||
It("Correctly parses an ADD config", func() {
|
It(fmt.Sprintf("[%s] correctly parses an ADD config", ver), func() {
|
||||||
configBytes := []byte(`{
|
configBytes := []byte(fmt.Sprintf(`{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"type": "portmap",
|
"type": "portmap",
|
||||||
"cniVersion": "0.3.1",
|
"cniVersion": "%s",
|
||||||
"runtimeConfig": {
|
"runtimeConfig": {
|
||||||
"portMappings": [
|
"portMappings": [
|
||||||
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"},
|
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"},
|
||||||
@ -68,10 +73,10 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}`)
|
}`, ver))
|
||||||
c, _, err := parseConfig(configBytes, "container")
|
c, _, err := parseConfig(configBytes, "container")
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(c.CNIVersion).To(Equal("0.3.1"))
|
Expect(c.CNIVersion).To(Equal(ver))
|
||||||
Expect(c.ConditionsV4).To(Equal(&[]string{"a", "b"}))
|
Expect(c.ConditionsV4).To(Equal(&[]string{"a", "b"}))
|
||||||
Expect(c.ConditionsV6).To(Equal(&[]string{"c", "d"}))
|
Expect(c.ConditionsV6).To(Equal(&[]string{"c", "d"}))
|
||||||
fvar := false
|
fvar := false
|
||||||
@ -84,19 +89,19 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
Expect(c.ContIPv6).To(Equal(*n))
|
Expect(c.ContIPv6).To(Equal(*n))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("Correctly parses a DEL config", func() {
|
It(fmt.Sprintf("[%s] correctly parses a DEL config", ver), func() {
|
||||||
// When called with DEL, neither runtimeConfig nor prevResult may be specified
|
// When called with DEL, neither runtimeConfig nor prevResult may be specified
|
||||||
configBytes := []byte(`{
|
configBytes := []byte(fmt.Sprintf(`{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"type": "portmap",
|
"type": "portmap",
|
||||||
"cniVersion": "0.3.1",
|
"cniVersion": "%s",
|
||||||
"snat": false,
|
"snat": false,
|
||||||
"conditionsV4": ["a", "b"],
|
"conditionsV4": ["a", "b"],
|
||||||
"conditionsV6": ["c", "d"]
|
"conditionsV6": ["c", "d"]
|
||||||
}`)
|
}`, ver))
|
||||||
c, _, err := parseConfig(configBytes, "container")
|
c, _, err := parseConfig(configBytes, "container")
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(c.CNIVersion).To(Equal("0.3.1"))
|
Expect(c.CNIVersion).To(Equal(ver))
|
||||||
Expect(c.ConditionsV4).To(Equal(&[]string{"a", "b"}))
|
Expect(c.ConditionsV4).To(Equal(&[]string{"a", "b"}))
|
||||||
Expect(c.ConditionsV6).To(Equal(&[]string{"c", "d"}))
|
Expect(c.ConditionsV6).To(Equal(&[]string{"c", "d"}))
|
||||||
fvar := false
|
fvar := false
|
||||||
@ -104,11 +109,11 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
Expect(c.Name).To(Equal("test"))
|
Expect(c.Name).To(Equal("test"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("fails with invalid mappings", func() {
|
It(fmt.Sprintf("[%s] fails with invalid mappings", ver), func() {
|
||||||
configBytes := []byte(`{
|
configBytes := []byte(fmt.Sprintf(`{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"type": "portmap",
|
"type": "portmap",
|
||||||
"cniVersion": "0.3.1",
|
"cniVersion": "%s",
|
||||||
"snat": false,
|
"snat": false,
|
||||||
"conditionsV4": ["a", "b"],
|
"conditionsV4": ["a", "b"],
|
||||||
"conditionsV6": ["c", "d"],
|
"conditionsV6": ["c", "d"],
|
||||||
@ -117,16 +122,16 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
{ "hostPort": 0, "containerPort": 80, "protocol": "tcp"}
|
{ "hostPort": 0, "containerPort": 80, "protocol": "tcp"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}`)
|
}`, ver))
|
||||||
_, _, err := parseConfig(configBytes, "container")
|
_, _, err := parseConfig(configBytes, "container")
|
||||||
Expect(err).To(MatchError("Invalid host port number: 0"))
|
Expect(err).To(MatchError("Invalid host port number: 0"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("Does not fail on missing prevResult interface index", func() {
|
It(fmt.Sprintf("[%s] does not fail on missing prevResult interface index", ver), func() {
|
||||||
configBytes := []byte(`{
|
configBytes := []byte(fmt.Sprintf(`{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"type": "portmap",
|
"type": "portmap",
|
||||||
"cniVersion": "0.3.1",
|
"cniVersion": "%s",
|
||||||
"runtimeConfig": {
|
"runtimeConfig": {
|
||||||
"portMappings": [
|
"portMappings": [
|
||||||
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"}
|
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"}
|
||||||
@ -145,7 +150,7 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}`)
|
}`, ver))
|
||||||
_, _, err := parseConfig(configBytes, "container")
|
_, _, err := parseConfig(configBytes, "container")
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
})
|
})
|
||||||
@ -153,7 +158,7 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
|
|
||||||
Describe("Generating chains", func() {
|
Describe("Generating chains", func() {
|
||||||
Context("for DNAT", func() {
|
Context("for DNAT", func() {
|
||||||
It("generates a correct standard container chain", func() {
|
It(fmt.Sprintf("[%s] generates a correct standard container chain", ver), func() {
|
||||||
ch := genDnatChain(netName, containerID)
|
ch := genDnatChain(netName, containerID)
|
||||||
|
|
||||||
Expect(ch).To(Equal(chain{
|
Expect(ch).To(Equal(chain{
|
||||||
@ -161,10 +166,10 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
name: "CNI-DN-bfd599665540dd91d5d28",
|
name: "CNI-DN-bfd599665540dd91d5d28",
|
||||||
entryChains: []string{TopLevelDNATChainName},
|
entryChains: []string{TopLevelDNATChainName},
|
||||||
}))
|
}))
|
||||||
configBytes := []byte(`{
|
configBytes := []byte(fmt.Sprintf(`{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"type": "portmap",
|
"type": "portmap",
|
||||||
"cniVersion": "0.3.1",
|
"cniVersion": "%s",
|
||||||
"runtimeConfig": {
|
"runtimeConfig": {
|
||||||
"portMappings": [
|
"portMappings": [
|
||||||
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"},
|
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"},
|
||||||
@ -180,7 +185,7 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
"snat": true,
|
"snat": true,
|
||||||
"conditionsV4": ["a", "b"],
|
"conditionsV4": ["a", "b"],
|
||||||
"conditionsV6": ["c", "d"]
|
"conditionsV6": ["c", "d"]
|
||||||
}`)
|
}`, ver))
|
||||||
|
|
||||||
conf, _, err := parseConfig(configBytes, "foo")
|
conf, _, err := parseConfig(configBytes, "foo")
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
@ -279,7 +284,7 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("generates a correct chain with external mark", func() {
|
It(fmt.Sprintf("[%s] generates a correct chain with external mark", ver), func() {
|
||||||
ch := genDnatChain(netName, containerID)
|
ch := genDnatChain(netName, containerID)
|
||||||
|
|
||||||
Expect(ch).To(Equal(chain{
|
Expect(ch).To(Equal(chain{
|
||||||
@ -287,10 +292,10 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
name: "CNI-DN-bfd599665540dd91d5d28",
|
name: "CNI-DN-bfd599665540dd91d5d28",
|
||||||
entryChains: []string{TopLevelDNATChainName},
|
entryChains: []string{TopLevelDNATChainName},
|
||||||
}))
|
}))
|
||||||
configBytes := []byte(`{
|
configBytes := []byte(fmt.Sprintf(`{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"type": "portmap",
|
"type": "portmap",
|
||||||
"cniVersion": "0.3.1",
|
"cniVersion": "%s",
|
||||||
"runtimeConfig": {
|
"runtimeConfig": {
|
||||||
"portMappings": [
|
"portMappings": [
|
||||||
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"}
|
{ "hostPort": 8080, "containerPort": 80, "protocol": "tcp"}
|
||||||
@ -299,7 +304,7 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
"externalSetMarkChain": "PLZ-SET-MARK",
|
"externalSetMarkChain": "PLZ-SET-MARK",
|
||||||
"conditionsV4": ["a", "b"],
|
"conditionsV4": ["a", "b"],
|
||||||
"conditionsV6": ["c", "d"]
|
"conditionsV6": ["c", "d"]
|
||||||
}`)
|
}`, ver))
|
||||||
|
|
||||||
conf, _, err := parseConfig(configBytes, "foo")
|
conf, _, err := parseConfig(configBytes, "foo")
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
@ -315,7 +320,7 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("generates a correct top-level chain", func() {
|
It(fmt.Sprintf("[%s] generates a correct top-level chain", ver), func() {
|
||||||
ch := genToplevelDnatChain()
|
ch := genToplevelDnatChain()
|
||||||
|
|
||||||
Expect(ch).To(Equal(chain{
|
Expect(ch).To(Equal(chain{
|
||||||
@ -326,7 +331,7 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("generates the correct mark chains", func() {
|
It(fmt.Sprintf("[%s] generates the correct mark chains", ver), func() {
|
||||||
masqBit := 5
|
masqBit := 5
|
||||||
ch := genSetMarkChain(masqBit)
|
ch := genSetMarkChain(masqBit)
|
||||||
Expect(ch).To(Equal(chain{
|
Expect(ch).To(Equal(chain{
|
||||||
@ -359,4 +364,5 @@ var _ = Describe("portmapping configuration", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user