From ce97ee141b1bd2a7ac98edf0a527c8201c4cb6bb Mon Sep 17 00:00:00 2001 From: Federico Paolinelli Date: Mon, 28 Aug 2023 19:30:07 +0300 Subject: [PATCH] E2ETests: set the password of the BGP sessions Creating the secrets and configuring the neighbors so the session uses the password. The EBGP-multihop session is left without password so we validate it keeps working. Signed-off-by: Federico Paolinelli --- e2etests/pkg/config/config.go | 24 ++++++++- e2etests/pkg/config/from_containers.go | 44 ++++++++++++--- e2etests/pkg/infra/infra_setup.go | 72 ++++++++++++------------- e2etests/tests/advertise_and_receive.go | 14 ++--- e2etests/tests/advertisement.go | 14 ++--- e2etests/tests/metrics.go | 8 +-- e2etests/tests/node_selector.go | 30 +++++------ e2etests/tests/receiving.go | 24 ++++----- 8 files changed, 140 insertions(+), 90 deletions(-) diff --git a/e2etests/pkg/config/config.go b/e2etests/pkg/config/config.go index af804fd6..9dcd181f 100644 --- a/e2etests/pkg/config/config.go +++ b/e2etests/pkg/config/config.go @@ -6,6 +6,8 @@ import ( "context" frrk8sv1beta1 "github.com/metallb/frrk8s/api/v1beta1" + "github.com/metallb/frrk8stests/pkg/k8s" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" @@ -22,6 +24,9 @@ func NewUpdater(r *rest.Config) (*Updater, error) { if err := frrk8sv1beta1.AddToScheme(myScheme); err != nil { return nil, err } + if err := v1.AddToScheme(myScheme); err != nil { + return nil, err + } cl, err := client.New(r, client.Options{ Scheme: myScheme, @@ -34,7 +39,7 @@ func NewUpdater(r *rest.Config) (*Updater, error) { }, nil } -func (u *Updater) Update(configs ...frrk8sv1beta1.FRRConfiguration) error { +func (u *Updater) Update(secrets []v1.Secret, configs ...frrk8sv1beta1.FRRConfiguration) error { for i, config := range configs { _, err := controllerutil.CreateOrUpdate(context.Background(), u.client, &config, func() error { old := &configs[i].Spec @@ -46,6 +51,18 @@ func (u *Updater) Update(configs ...frrk8sv1beta1.FRRConfiguration) error { return err } } + for i, s := range secrets { + _, err := controllerutil.CreateOrUpdate(context.Background(), u.client, &s, func() error { + s.Data = secrets[i].Data + s.StringData = secrets[i].StringData + s.Type = secrets[i].Type + return nil + }) + + if err != nil { + return err + } + } return nil } @@ -55,5 +72,10 @@ func (u *Updater) Clean() error { if err != nil && !errors.IsNotFound(err) { return err } + err = u.client.DeleteAllOf(context.Background(), &v1.Secret{}, client.InNamespace(k8s.FRRK8sNamespace)) + if err != nil && !errors.IsNotFound(err) { + return err + } + return nil } diff --git a/e2etests/pkg/config/from_containers.go b/e2etests/pkg/config/from_containers.go index 239ad86a..e0cfcc38 100644 --- a/e2etests/pkg/config/from_containers.go +++ b/e2etests/pkg/config/from_containers.go @@ -6,9 +6,11 @@ import ( "net" frrk8sv1beta1 "github.com/metallb/frrk8s/api/v1beta1" - "go.universe.tf/e2etest/pkg/frr" + "github.com/metallb/frrk8stests/pkg/k8s" frrcontainer "go.universe.tf/e2etest/pkg/frr/container" "go.universe.tf/e2etest/pkg/ipfamily" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type Peer struct { @@ -17,10 +19,20 @@ type Peer struct { FRR frrcontainer.FRR } +type PeersConfig struct { + PeersV4 []Peer + PeersV6 []Peer + Secrets []corev1.Secret +} + // PeersForContainers returns two lists of Peers, one for v4 addresses and one for v6 addresses. -func PeersForContainers(frrs []*frrcontainer.FRR, ipFam ipfamily.Family, modify ...func(frr.Neighbor)) ([]Peer, []Peer) { - resV4 := make([]Peer, 0) - resV6 := make([]Peer, 0) +func PeersForContainers(frrs []*frrcontainer.FRR, ipFam ipfamily.Family) PeersConfig { + res := PeersConfig{ + PeersV4: make([]Peer, 0), + PeersV6: make([]Peer, 0), + Secrets: make([]corev1.Secret, 0), + } + for _, f := range frrs { addresses := f.AddressesForFamily(ipFam) ebgpMultihop := false @@ -40,14 +52,32 @@ func PeersForContainers(frrs []*frrcontainer.FRR, ipFam ipfamily.Family, modify FRR: *f, } + if f.RouterConfig.Password != "" { + s := corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: f.Name, + Namespace: k8s.FRRK8sNamespace, + }, + Type: corev1.SecretTypeBasicAuth, + Data: map[string][]byte{ + "password": []byte(f.RouterConfig.Password), + }, + } + peer.Neigh.PasswordSecret = corev1.SecretReference{ + Name: f.Name, + Namespace: k8s.FRRK8sNamespace, + } + res.Secrets = append(res.Secrets, s) + } + if ipfamily.ForAddress(net.ParseIP(address)) == ipfamily.IPv4 { - resV4 = append(resV4, peer) + res.PeersV4 = append(res.PeersV4, peer) continue } - resV6 = append(resV6, peer) + res.PeersV6 = append(res.PeersV6, peer) } } - return resV4, resV6 + return res } func NeighborsFromPeers(peers []Peer, peers1 []Peer) []frrk8sv1beta1.Neighbor { diff --git a/e2etests/pkg/infra/infra_setup.go b/e2etests/pkg/infra/infra_setup.go index 852b9e42..32d330a6 100644 --- a/e2etests/pkg/infra/infra_setup.go +++ b/e2etests/pkg/infra/infra_setup.go @@ -369,14 +369,14 @@ func frrContainersConfigs(image string) map[string]frrcontainer.Config { Name: "ibgp-single-hop", Image: image, Neighbor: frrconfig.NeighborConfig{ - ASN: FRRK8sASN, - // Password: "ibgp-test", + ASN: FRRK8sASN, + Password: "ibgp-test", MultiHop: false, }, Router: frrconfig.RouterConfig{ - ASN: FRRK8sASN, - BGPPort: 179, - // Password: "ibgp-test", + ASN: FRRK8sASN, + BGPPort: 179, + Password: "ibgp-test", }, Network: kindNetwork, } @@ -385,14 +385,14 @@ func frrContainersConfigs(image string) map[string]frrcontainer.Config { Name: "ibgp-multi-hop", Image: image, Neighbor: frrconfig.NeighborConfig{ - ASN: FRRK8sASN, - // Password: "ibgp-test", + ASN: FRRK8sASN, + Password: "ibgp-test", MultiHop: true, }, Router: frrconfig.RouterConfig{ - ASN: FRRK8sASN, - BGPPort: 180, - // Password: "ibgp-test", + ASN: FRRK8sASN, + BGPPort: 180, + Password: "ibgp-test", }, Network: defaultNextHopSettings.multiHopNetwork, HostIPv4: hostIPv4, @@ -402,14 +402,14 @@ func frrContainersConfigs(image string) map[string]frrcontainer.Config { Name: "ebgp-multi-hop", Image: image, Neighbor: frrconfig.NeighborConfig{ - ASN: FRRK8sASN, - // Password: "ebgp-test", + ASN: FRRK8sASN, + Password: "ebgp-test", MultiHop: true, }, Router: frrconfig.RouterConfig{ - ASN: externalASN, - BGPPort: 180, - //Password: "ebgp-test", + ASN: externalASN, + BGPPort: 180, + Password: "ebgp-test", }, Network: defaultNextHopSettings.multiHopNetwork, HostIPv4: hostIPv4, @@ -438,15 +438,15 @@ func vrfContainersConfig(image string) map[string]frrcontainer.Config { Image: image, Network: vrfNetwork, Neighbor: frrconfig.NeighborConfig{ - ASN: FRRK8sASNVRF, - // Password: "vrf-test", + ASN: FRRK8sASNVRF, + Password: "vrf-test", MultiHop: false, }, Router: frrconfig.RouterConfig{ - ASN: externalASN, - // Password: "vrf-test", - BGPPort: 179, - VRF: VRFName, + ASN: externalASN, + Password: "vrf-test", + BGPPort: 179, + VRF: VRFName, }, } res["ibgp-vrf-single-hop"] = frrcontainer.Config{ @@ -454,30 +454,30 @@ func vrfContainersConfig(image string) map[string]frrcontainer.Config { Image: image, Network: vrfNetwork, Neighbor: frrconfig.NeighborConfig{ - ASN: FRRK8sASNVRF, - // Password: "vrf-test", + ASN: FRRK8sASNVRF, + Password: "vrf-test", MultiHop: false, }, Router: frrconfig.RouterConfig{ - ASN: FRRK8sASNVRF, - BGPPort: 179, - // Password: "vrf-test", - VRF: VRFName, + ASN: FRRK8sASNVRF, + BGPPort: 179, + Password: "vrf-test", + VRF: VRFName, }, } res["ibgp-vrf-multi-hop"] = frrcontainer.Config{ Name: "ibgp-vrf-multi-hop", Image: image, Neighbor: frrconfig.NeighborConfig{ - ASN: FRRK8sASNVRF, - // Password: "ibgp-test", + ASN: FRRK8sASNVRF, + Password: "ibgp-test", MultiHop: true, }, Router: frrconfig.RouterConfig{ - ASN: FRRK8sASNVRF, - BGPPort: 180, - // Password: "ibgp-test", - VRF: VRFName, + ASN: FRRK8sASNVRF, + BGPPort: 180, + Password: "ibgp-test", + VRF: VRFName, }, Network: vrfNextHopSettings.multiHopNetwork, } @@ -485,15 +485,13 @@ func vrfContainersConfig(image string) map[string]frrcontainer.Config { Name: "ebgp-vrf-multi-hop", Image: image, Neighbor: frrconfig.NeighborConfig{ - ASN: FRRK8sASNVRF, - //Password: "ebgp-test", + ASN: FRRK8sASNVRF, MultiHop: true, }, Router: frrconfig.RouterConfig{ ASN: externalASN, BGPPort: 180, - // Password: "ebgp-test", - VRF: VRFName, + VRF: VRFName, }, Network: vrfNextHopSettings.multiHopNetwork, } diff --git a/e2etests/tests/advertise_and_receive.go b/e2etests/tests/advertise_and_receive.go index 69467ac9..f3767289 100644 --- a/e2etests/tests/advertise_and_receive.go +++ b/e2etests/tests/advertise_and_receive.go @@ -70,9 +70,9 @@ var _ = ginkgo.Describe("Advertising and Receiving routes", func() { ginkgo.DescribeTable("Works with external frrs", func(p params) { frrs := config.ContainersForVRF(infra.FRRContainers, p.vrf) - peersV4, peersV6 := config.PeersForContainers(frrs, p.ipFamily) - p.modifyPeers(peersV4, peersV6) - neighbors := config.NeighborsFromPeers(peersV4, peersV6) + peersConfig := config.PeersForContainers(frrs, p.ipFamily) + p.modifyPeers(peersConfig.PeersV4, peersConfig.PeersV6) + neighbors := config.NeighborsFromPeers(peersConfig.PeersV4, peersConfig.PeersV6) config := frrk8sv1beta1.FRRConfiguration{ ObjectMeta: metav1.ObjectMeta{ @@ -101,7 +101,7 @@ var _ = ginkgo.Describe("Advertising and Receiving routes", func() { }) framework.ExpectNoError(err) } - err := updater.Update(config) + err := updater.Update(peersConfig.Secrets, config) framework.ExpectNoError(err) nodes, err := k8s.Nodes(cs) @@ -115,7 +115,7 @@ var _ = ginkgo.Describe("Advertising and Receiving routes", func() { framework.ExpectNoError(err) ginkgo.By("validating") - p.validate(peersV4, peersV6, pods, nodes) + p.validate(peersConfig.PeersV4, peersConfig.PeersV6, pods, nodes) if p.splitCfg == nil { return @@ -132,7 +132,7 @@ var _ = ginkgo.Describe("Advertising and Receiving routes", func() { cfgs, err := p.splitCfg(config) framework.ExpectNoError(err) - err = updater.Update(cfgs...) + err = updater.Update(peersConfig.Secrets, cfgs...) framework.ExpectNoError(err) for _, c := range frrs { @@ -140,7 +140,7 @@ var _ = ginkgo.Describe("Advertising and Receiving routes", func() { } ginkgo.By("validating with splitted config") - p.validate(peersV4, peersV6, pods, nodes) + p.validate(peersConfig.PeersV4, peersConfig.PeersV6, pods, nodes) }, ginkgo.Entry("IPV4 - One config for advertising, the other for receiving", params{ ipFamily: ipfamily.IPv4, diff --git a/e2etests/tests/advertisement.go b/e2etests/tests/advertisement.go index 88ca77f9..5b220297 100644 --- a/e2etests/tests/advertisement.go +++ b/e2etests/tests/advertisement.go @@ -68,9 +68,9 @@ var _ = ginkgo.Describe("Advertisement", func() { ginkgo.DescribeTable("Works with external frrs", func(p params) { frrs := config.ContainersForVRF(infra.FRRContainers, p.vrf) - peersV4, peersV6 := config.PeersForContainers(frrs, p.ipFamily) - p.modifyPeers(peersV4, peersV6) - neighbors := config.NeighborsFromPeers(peersV4, peersV6) + peersConfig := config.PeersForContainers(frrs, p.ipFamily) + p.modifyPeers(peersConfig.PeersV4, peersConfig.PeersV6) + neighbors := config.NeighborsFromPeers(peersConfig.PeersV4, peersConfig.PeersV6) config := frrk8sv1beta1.FRRConfiguration{ ObjectMeta: metav1.ObjectMeta{ @@ -97,7 +97,7 @@ var _ = ginkgo.Describe("Advertisement", func() { framework.ExpectNoError(err) } - err := updater.Update(config) + err := updater.Update(peersConfig.Secrets, config) framework.ExpectNoError(err) nodes, err := k8s.Nodes(cs) @@ -108,7 +108,7 @@ var _ = ginkgo.Describe("Advertisement", func() { } ginkgo.By("validating") - p.validate(peersV4, peersV6, nodes) + p.validate(peersConfig.PeersV4, peersConfig.PeersV6, nodes) if p.splitCfg == nil { return @@ -125,7 +125,7 @@ var _ = ginkgo.Describe("Advertisement", func() { cfgs, err := p.splitCfg(config) framework.ExpectNoError(err) - err = updater.Update(cfgs...) + err = updater.Update(peersConfig.Secrets, cfgs...) framework.ExpectNoError(err) for _, c := range frrs { @@ -133,7 +133,7 @@ var _ = ginkgo.Describe("Advertisement", func() { } ginkgo.By("validating with splitted config") - p.validate(peersV4, peersV6, nodes) + p.validate(peersConfig.PeersV4, peersConfig.PeersV6, nodes) }, ginkgo.Entry("IPV4 - Advertise with mode allowall", params{ ipFamily: ipfamily.IPv4, diff --git a/e2etests/tests/metrics.go b/e2etests/tests/metrics.go index 93056f32..014b31de 100644 --- a/e2etests/tests/metrics.go +++ b/e2etests/tests/metrics.go @@ -86,9 +86,9 @@ var _ = ginkgo.Describe("Metrics", func() { ginkgo.DescribeTable("expose prometheus metrics", func(p params) { frrs := config.ContainersForVRF(infra.FRRContainers, p.vrf) - peersV4, peersV6 := config.PeersForContainers(frrs, p.ipFamily) - p.modifyPeers(peersV4, peersV6) - neighbors := config.NeighborsFromPeers(peersV4, peersV6) + peersConfig := config.PeersForContainers(frrs, p.ipFamily) + p.modifyPeers(peersConfig.PeersV4, peersConfig.PeersV6) + neighbors := config.NeighborsFromPeers(peersConfig.PeersV4, peersConfig.PeersV6) config := frrk8sv1beta1.FRRConfiguration{ ObjectMeta: metav1.ObjectMeta{ @@ -115,7 +115,7 @@ var _ = ginkgo.Describe("Metrics", func() { framework.ExpectNoError(err) } - err := updater.Update(config) + err := updater.Update(peersConfig.Secrets, config) framework.ExpectNoError(err) nodes, err := k8s.Nodes(cs) diff --git a/e2etests/tests/node_selector.go b/e2etests/tests/node_selector.go index 7d6cf00c..c1117b08 100644 --- a/e2etests/tests/node_selector.go +++ b/e2etests/tests/node_selector.go @@ -68,9 +68,9 @@ var _ = ginkgo.Describe("Node Selector", func() { ginkgo.DescribeTable("global and single config", func(p params) { frrs := config.ContainersForVRF(infra.FRRContainers, p.vrf) - peersV4, peersV6 := config.PeersForContainers(frrs, p.ipFamily) - p.modifyPeers(peersV4, peersV6) - neighbors := config.NeighborsFromPeers(peersV4, peersV6) + peersConfig := config.PeersForContainers(frrs, p.ipFamily) + p.modifyPeers(peersConfig.PeersV4, peersConfig.PeersV6) + neighbors := config.NeighborsFromPeers(peersConfig.PeersV4, peersConfig.PeersV6) nodes, err := k8s.Nodes(cs) framework.ExpectNoError(err) @@ -106,7 +106,7 @@ var _ = ginkgo.Describe("Node Selector", func() { }, } - err = updater.Update(configWithSelector) + err = updater.Update(peersConfig.Secrets, configWithSelector) framework.ExpectNoError(err) ginkgo.By("validating the containers paired only with the node matching the config") @@ -116,9 +116,9 @@ var _ = ginkgo.Describe("Node Selector", func() { } ginkgo.By("validating only the node matching the config advertises the prefixes") - peers := peersV4 + peers := peersConfig.PeersV4 if p.ipFamily == ipfamily.IPv6 { - peers = peersV6 + peers = peersConfig.PeersV6 } for _, peer := range peers { ValidatePrefixesForNeighbor(peer.FRR, nodes[:1], p.prefixes...) @@ -144,7 +144,7 @@ var _ = ginkgo.Describe("Node Selector", func() { }, }, } - err = updater.Update(globalConfig) + err = updater.Update(peersConfig.Secrets, globalConfig) framework.ExpectNoError(err) ginkgo.By("validating the containers are now paired with all nodes") @@ -201,8 +201,8 @@ var _ = ginkgo.Describe("Node Selector", func() { ginkgo.DescribeTable("global and single config", func(p params) { frrs := config.ContainersForVRF(infra.FRRContainers, p.vrf) - peersV4, peersV6 := config.PeersForContainers(frrs, p.ipFamily) - peersV4ForFirst, peersV6ForFirst := peersV4, peersV6 + peersConfig := config.PeersForContainers(frrs, p.ipFamily) + peersV4ForFirst, peersV6ForFirst := peersConfig.PeersV4, peersConfig.PeersV6 p.modifyPeers(peersV4ForFirst, peersV6ForFirst) neighbors := config.NeighborsFromPeers(peersV4ForFirst, peersV6ForFirst) @@ -261,7 +261,7 @@ var _ = ginkgo.Describe("Node Selector", func() { }, } - err = updater.Update(cfg) + err = updater.Update(peersConfig.Secrets, cfg) framework.ExpectNoError(err) ginkgo.By("validating the containers paired only with the node matching the config") @@ -271,9 +271,9 @@ var _ = ginkgo.Describe("Node Selector", func() { } ginkgo.By("validating only the node matching the config receives the prefixes") - peers := peersV4 + peers := peersConfig.PeersV4 if p.ipFamily == ipfamily.IPv6 { - peers = peersV6 + peers = peersConfig.PeersV6 } pfxsToValidate := p.v4Prefixes @@ -289,8 +289,8 @@ var _ = ginkgo.Describe("Node Selector", func() { } ginkgo.By("creating the global config") - p.globalModifyPeers(peersV4, peersV6) - neighbors = config.NeighborsFromPeers(peersV4, peersV6) + p.globalModifyPeers(peersConfig.PeersV4, peersConfig.PeersV6) + neighbors = config.NeighborsFromPeers(peersConfig.PeersV4, peersConfig.PeersV6) globalConfig := frrk8sv1beta1.FRRConfiguration{ ObjectMeta: metav1.ObjectMeta{ Name: "testreceive-selector-global", @@ -309,7 +309,7 @@ var _ = ginkgo.Describe("Node Selector", func() { }, }, } - err = updater.Update(globalConfig) + err = updater.Update(peersConfig.Secrets, globalConfig) framework.ExpectNoError(err) ginkgo.By("validating the containers are now paired with all nodes") diff --git a/e2etests/tests/receiving.go b/e2etests/tests/receiving.go index 113daae7..6555ac2f 100644 --- a/e2etests/tests/receiving.go +++ b/e2etests/tests/receiving.go @@ -69,9 +69,9 @@ var _ = ginkgo.Describe("Receiving routes", func() { ginkgo.DescribeTable("Works with external frrs", func(p params) { frrs := config.ContainersForVRF(infra.FRRContainers, p.vrf) - peersV4, peersV6 := config.PeersForContainers(frrs, p.ipFamily) - p.modifyPeers(peersV4, peersV6) - neighbors := config.NeighborsFromPeers(peersV4, peersV6) + peersConfig := config.PeersForContainers(frrs, p.ipFamily) + p.modifyPeers(peersConfig.PeersV4, peersConfig.PeersV6) + neighbors := config.NeighborsFromPeers(peersConfig.PeersV4, peersConfig.PeersV6) config := frrk8sv1beta1.FRRConfiguration{ ObjectMeta: metav1.ObjectMeta{ @@ -99,7 +99,7 @@ var _ = ginkgo.Describe("Receiving routes", func() { }) framework.ExpectNoError(err) } - err := updater.Update(config) + err := updater.Update(peersConfig.Secrets, config) framework.ExpectNoError(err) nodes, err := k8s.Nodes(cs) @@ -113,7 +113,7 @@ var _ = ginkgo.Describe("Receiving routes", func() { framework.ExpectNoError(err) ginkgo.By("validating") - p.validate(peersV4, peersV6, pods) + p.validate(peersConfig.PeersV4, peersConfig.PeersV6, pods) if p.splitCfg == nil { return @@ -130,7 +130,7 @@ var _ = ginkgo.Describe("Receiving routes", func() { cfgs, err := p.splitCfg(config) framework.ExpectNoError(err) - err = updater.Update(cfgs...) + err = updater.Update(peersConfig.Secrets, cfgs...) framework.ExpectNoError(err) for _, c := range frrs { @@ -138,7 +138,7 @@ var _ = ginkgo.Describe("Receiving routes", func() { } ginkgo.By("validating with splitted config") - p.validate(peersV4, peersV6, pods) + p.validate(peersConfig.PeersV4, peersConfig.PeersV6, pods) }, ginkgo.Entry("IPV4 - receive ips from all", params{ ipFamily: ipfamily.IPv4, @@ -333,9 +333,9 @@ var _ = ginkgo.Describe("Receiving routes", func() { ginkgo.DescribeTable("Multiple configs", func(p params) { frrs := config.ContainersForVRF(infra.FRRContainers, p.vrf) - peersV4, peersV6 := config.PeersForContainers(frrs, p.ipFamily) - p.modifyPeers(peersV4, peersV6) - neighbors := config.NeighborsFromPeers(peersV4, peersV6) + peersConfig := config.PeersForContainers(frrs, p.ipFamily) + p.modifyPeers(peersConfig.PeersV4, peersConfig.PeersV6) + neighbors := config.NeighborsFromPeers(peersConfig.PeersV4, peersConfig.PeersV6) config := frrk8sv1beta1.FRRConfiguration{ ObjectMeta: metav1.ObjectMeta{ @@ -367,7 +367,7 @@ var _ = ginkgo.Describe("Receiving routes", func() { cfgs, err := p.splitCfg(config) framework.ExpectNoError(err) - err = updater.Update(cfgs...) + err = updater.Update(peersConfig.Secrets, cfgs...) framework.ExpectNoError(err) nodes, err := k8s.Nodes(cs) @@ -381,7 +381,7 @@ var _ = ginkgo.Describe("Receiving routes", func() { framework.ExpectNoError(err) ginkgo.By("validating") - p.validate(peersV4, peersV6, pods) + p.validate(peersConfig.PeersV4, peersConfig.PeersV6, pods) }, ginkgo.Entry("IPV4 - AllowMode=All should override explicit", params{ ipFamily: ipfamily.IPv4,