Skip to content

Commit edc12a2

Browse files
RamLavijcaamano
authored andcommitted
test/e2e, multihoming: Check VLAN-ID change on NAD update
Add tests that make sure that: - the N/S connectivity is broken after NAD updating the VLAN-ID. - the N/S connectivity is restored after the server networking is reconfigured to the new VLAN-ID. Signed-off-by: Ram Lavi <[email protected]>
1 parent c7cae3d commit edc12a2

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

test/e2e/localnet-underlay.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,20 @@ func setupUnderlay(ovsPods []v1.Pod, portName string, nadConfig networkAttachmen
4545
return nil
4646
}
4747

48+
func ovsRemoveSwitchPort(ovsPods []v1.Pod, portName string, newVLANID int) error {
49+
for _, ovsPod := range ovsPods {
50+
if err := ovsRemoveVLANAccessPort(ovsPod.Name, bridgeName, portName); err != nil {
51+
return fmt.Errorf("failed to remove old VLAN port: %v", err)
52+
}
53+
54+
if err := ovsEnableVLANAccessPort(ovsPod.Name, bridgeName, portName, newVLANID); err != nil {
55+
return fmt.Errorf("failed to add new VLAN port: %v", err)
56+
}
57+
}
58+
59+
return nil
60+
}
61+
4862
func teardownUnderlay(ovsPods []v1.Pod) error {
4963
for _, ovsPod := range ovsPods {
5064
if err := removeOVSBridge(ovsPod.Name, bridgeName); err != nil {
@@ -117,6 +131,19 @@ func ovsEnableVLANAccessPort(ovsNodeName string, bridgeName string, portName str
117131
return nil
118132
}
119133

134+
func ovsRemoveVLANAccessPort(ovsNodeName string, bridgeName string, portName string) error {
135+
cmd := []string{
136+
"kubectl", "-n", ovnNamespace, "exec", ovsNodeName, "--",
137+
"ovs-vsctl", "del-port", bridgeName, portName,
138+
}
139+
140+
if _, err := runCommand(cmd...); err != nil {
141+
return fmt.Errorf("failed to remove port %s from OVS bridge %s: %v", portName, bridgeName, err)
142+
}
143+
144+
return nil
145+
}
146+
120147
type BridgeMapping struct {
121148
physnet string
122149
ovsBridge string

test/e2e/multihoming.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,12 +838,15 @@ var _ = Describe("Multi Homing", func() {
838838
excludedSubnetLowerRange2 = "60.128.0.128/26" // Excludes IPs from 60.128.0.128 to 60.128.0.191
839839
excludedSubnetUpperRange1 = "60.128.0.208/28" // Excludes IPs from 60.128.0.208 to 60.128.0.223
840840
excludedSubnetUpperRange2 = "60.128.0.224/27" // Excludes IPs from 60.128.0.224 to 60.128.0.255
841+
newLocalnetVLANID = 30
841842
)
842843
BeforeEach(func() {
843844
By("setting new MTU")
844845
netConfig.mtu = expectedChangedMTU
845846
By("setting new subnets to leave a smaller range")
846847
netConfig.excludeCIDRs = []string{excludedSubnetLowerRange1, excludedSubnetLowerRange2, excludedSubnetUpperRange1, excludedSubnetUpperRange2}
848+
By("setting new VLAN-ID")
849+
netConfig.vlanID = newLocalnetVLANID
847850
p := []byte(fmt.Sprintf(`[{"op":"replace","path":"/spec/config","value":%q}]`, generateNADSpec(netConfig)))
848851
Expect(patchNADSpec(nadClient, netConfig.name, netConfig.namespace, p)).To(Succeed())
849852
})
@@ -896,6 +899,55 @@ var _ = Describe("Multi Homing", func() {
896899
return nil
897900
}).Should(Succeed(), "pod's secondary NIC is not allocated in the desired range")
898901
})
902+
903+
It("can no longer communicate over a localnet secondary network from pod to the underlay service", func() {
904+
Eventually(func() error {
905+
clientPodConfig := podConfiguration{
906+
name: clientPodName,
907+
namespace: f.Namespace.Name,
908+
attachments: []nadapi.NetworkSelectionElement{{Name: secondaryNetworkName}},
909+
}
910+
kickstartPod(cs, clientPodConfig)
911+
912+
By("asserting the *client* pod can no longer contact the underlay service")
913+
var err error
914+
if err = connectToServer(clientPodConfig, underlayServiceIP, servicePort); err != nil && strings.Contains(err.Error(), "exit code 28") {
915+
return nil
916+
}
917+
err = fmt.Errorf("expected exit code 28 from underlay service, got err %w", err)
918+
919+
if delErr := cs.CoreV1().Pods(clientPodConfig.namespace).Delete(context.Background(), clientPodConfig.name, metav1.DeleteOptions{}); delErr != nil {
920+
err = errors.Join(err, fmt.Errorf("pod delete failed: %w", delErr))
921+
}
922+
return err
923+
}).Should(Succeed(), "pod should be disconnected from underlay")
924+
})
925+
926+
Context("and the service connected to the underlay is reconfigured to connect to the new VLAN-ID", func() {
927+
BeforeEach(func() {
928+
Expect(ovsRemoveSwitchPort(nodes, secondaryInterfaceName, newLocalnetVLANID)).To(Succeed())
929+
})
930+
931+
It("can now communicate over a localnet secondary network from pod to the underlay service", func() {
932+
Eventually(func() error {
933+
clientPodConfig := podConfiguration{
934+
name: clientPodName,
935+
namespace: f.Namespace.Name,
936+
attachments: []nadapi.NetworkSelectionElement{{Name: secondaryNetworkName}},
937+
}
938+
kickstartPod(cs, clientPodConfig)
939+
940+
By("asserting the *client* pod can contact the underlay service")
941+
if err := connectToServer(clientPodConfig, underlayServiceIP, servicePort); err != nil {
942+
if delErr := cs.CoreV1().Pods(clientPodConfig.namespace).Delete(context.Background(), clientPodConfig.name, metav1.DeleteOptions{}); delErr != nil {
943+
err = errors.Join(err, fmt.Errorf("pod delete failed: %w", delErr))
944+
}
945+
return err
946+
}
947+
return nil
948+
}).Should(Succeed(), "pod should be connected to underlay")
949+
})
950+
})
899951
})
900952

901953
Context("with multi network policy blocking the traffic", func() {

0 commit comments

Comments
 (0)