On 3/18/25 9:28 AM, Ales Musil via dev wrote: > On Fri, Mar 14, 2025 at 1:59 PM Xavier Simonart <[email protected]> wrote: > >> When a container port has been migrated to a dst chassis (i.e. its parent >> has requested-chassis=dst), make sure that we have a flow in src chassis >> for sending the traffic through tunnel to dst. >> >> For the migration scenario test, we were testing the migration of a port p1 >> from src to dst, and checking whether ping to/from a port p2 in a >> 3rd node was fine. >> We now added testing ping from p1 to ports in src, dst and 3rd node. >> The IPs have been changed to make them more 'logical' i.e. simplify >> debugging. >> Due to the high number of ping issued in the test, the ping interval has >> also >> been reduced to limit the test duration. >> >> Fixes: 894ffe8a812b ("controller: Release container lport when releasing >> parent port.") >> Reported-at: https://issues.redhat.com/browse/FDP-1223 >> Signed-off-by: Xavier Simonart <[email protected]> >> --- >> controller/physical.c | 4 +- >> tests/multinode.at | 182 +++++++++++++++++++++++++++++++----------- >> 2 files changed, 138 insertions(+), 48 deletions(-) >> >> diff --git a/controller/physical.c b/controller/physical.c >> index 2abd8bb6f..6a169ba85 100644 >> --- a/controller/physical.c >> +++ b/controller/physical.c >> @@ -1777,9 +1777,9 @@ consider_port_binding(const struct physical_ctx *ctx, >> parent_port)) { >> /* Even though there is an ofport for this container >> * parent port, it is requested on different chassis >> ignore >> - * this container port. >> + * this ofport. >> */ >> - return; >> + ofport = 0; >> } >> } >> } else if (type == LP_LOCALNET || type == LP_L2GATEWAY) { >> diff --git a/tests/multinode.at b/tests/multinode.at >> index f0aeeb346..31bb97e26 100644 >> --- a/tests/multinode.at >> +++ b/tests/multinode.at >> @@ -2795,7 +2795,9 @@ check_fake_multinode_setup_by_nodes 'ovn-chassis-1 >> ovn-chassis-2 ovn-chassis-3' >> cleanup_multinode_resources_by_nodes 'ovn-chassis-1 ovn-chassis-2 >> ovn-chassis-3' >> >> m_as ovn-chassis-1 ip link del migrator-p >> -m_as ovn-chassis-2 ip link del sw0p2-p >> +m_as ovn-chassis-2 ip link del sw0-port1-p >> +m_as ovn-chassis-2 ip link del sw0-port2-p >> +m_as ovn-chassis-2 ip link del sw0-port3-p >> m_as ovn-chassis-3 ip link del migrator-p >> >> OVS_WAIT_UNTIL([m_as ovn-chassis-1 ip link show | grep -q genev_sys]) >> @@ -2829,7 +2831,7 @@ check_ping() { >> dst_chassis=$(multinode_sbctl --bare --columns name list chassis >> $dst_chassis_uuid) >> dst_ip=$(multinode_nbctl lsp-get-addresses $dst_port | awk '{print >> $2}') >> echo "$src_port on $src_chassis => $dst_port on >> $dst_chassis(requested_chassis=$requested_chassis_uuid)" >> - M_NS_CHECK_EXEC([$src_chassis], [$src_ns], [ping -q -c 3 -i 0.3 -w 2 >> $dst_ip | FORMAT_PING], \ >> + M_NS_CHECK_EXEC([$src_chassis], [$src_ns], [ping -q -c 3 -i 0.1 -w 2 >> $dst_ip | FORMAT_PING], \ >> [0], [stdout]) >> if [[ "$status" == "success" ]]; then >> AT_CHECK([cat stdout | grep -c "3 packets transmitted, 3 >> received, 0% packet loss"], [0],[dnl >> @@ -2851,85 +2853,115 @@ check_ping() { >> >> check multinode_nbctl ls-add sw0 >> check multinode_nbctl lsp-add sw0 migrator >> -check multinode_nbctl lsp-set-addresses migrator "50:54:00:00:00:03 >> 10.0.0.3 1000::3" >> -check multinode_nbctl lsp-add sw0 sw0-port2 >> -check multinode_nbctl lsp-set-addresses sw0-port2 "50:54:00:00:00:04 >> 10.0.0.4 1000::4" >> +check multinode_nbctl lsp-set-addresses migrator "50:54:00:00:00:09 >> 10.0.0.9 1000::9" >> +for i in 1 2 3; do >> + check multinode_nbctl lsp-add sw0 sw0-port${i} >> + check multinode_nbctl lsp-set-addresses sw0-port${i} >> "50:54:00:00:00:0${i} 10.0.0.${i} 1000::${i}" >> +done >> >> # Set requested chassis before creating migrator on chassis-3 >> check multinode_nbctl --wait=hv set Logical_Switch_Port migrator >> options:requested-chassis=ovn-chassis-1 >> >> -m_as ovn-chassis-1 /data/create_fake_vm.sh migrator migrator >> 50:54:00:00:00:03 1342 10.0.0.3 24 10.0.0.1 1000::3/64 1000::a >> -m_as ovn-chassis-3 /data/create_fake_vm.sh migrator migrator >> 50:54:00:00:00:03 1342 10.0.0.3 24 10.0.0.1 1000::3/64 1000::a >> -m_as ovn-chassis-2 /data/create_fake_vm.sh sw0-port2 sw0-port2 >> 50:54:00:00:00:04 1342 10.0.0.4 24 10.0.0.1 1000::4/64 1000::a >> +m_as ovn-chassis-1 /data/create_fake_vm.sh migrator migrator >> 50:54:00:00:00:09 1342 10.0.0.9 24 10.0.0.10 1000::9/64 1000::a >> +m_as ovn-chassis-3 /data/create_fake_vm.sh migrator migrator >> 50:54:00:00:00:09 1342 10.0.0.9 24 10.0.0.10 1000::9/64 1000::a >> +for i in 1 2 3; do >> + m_as ovn-chassis-${i} /data/create_fake_vm.sh sw0-port${i} >> sw0-port${i} 50:54:00:00:00:0${i} 1342 10.0.0.${i} 24 10.0.0.10 >> 1000::${i}/64 1000::a >> +done >> >> m_wait_for_ports_up >> >> M_START_TCPDUMP([ovn-chassis-1], [-neei genev_sys_6081 arp or ip], >> [ch1_genev]) >> M_START_TCPDUMP([ovn-chassis-1], [-neei migrator-p arp or ip], >> [ch1_migrator]) >> M_START_TCPDUMP([ovn-chassis-2], [-neei genev_sys_6081 arp or ip], >> [ch2_genev]) >> -M_START_TCPDUMP([ovn-chassis-2], [-neei sw0-port2-p arp or ip], >> [ch2_sw0p2]) >> +for i in 1 2 3; do >> + M_START_TCPDUMP([ovn-chassis-${i}], [-neei sw0-port${i}-p arp or ip], >> [ch${i}_sw0-port${i}]) >> +done >> M_START_TCPDUMP([ovn-chassis-3], [-neei genev_sys_6081 arp or ip], >> [ch3_genev]) >> M_START_TCPDUMP([ovn-chassis-3], [-neei migrator-p arp or ip], >> [ch3_migrator]) >> >> AS_BOX([Migration with vifs]) >> -check_ping migrator ovn-chassis-1 sw0-port2 >> -check_ping sw0-port2 ovn-chassis-2 migrator >> +for i in 1 2 3; do >> + check_ping migrator ovn-chassis-1 sw0-port${i} >> + check_ping sw0-port${i} ovn-chassis-${i} migrator >> +done >> >> echo "== Starting migration ==" >> check multinode_nbctl --wait=hv set Logical_Switch_Port migrator >> options:requested-chassis=ovn-chassis-1,ovn-chassis-3 >> >> -check_ping migrator ovn-chassis-1 sw0-port2 >> -check_ping migrator ovn-chassis-3 sw0-port2 >> - >> -check_ping sw0-port2 ovn-chassis-2 migrator "potential-duplicates" >> +for i in 1 2 3; do >> + check_ping migrator ovn-chassis-1 sw0-port${i} >> + check_ping migrator ovn-chassis-3 sw0-port${i} >> + check_ping sw0-port${i} ovn-chassis-${i} migrator >> "potential-duplicates" >> +done >> >> echo "== Finalizing migration ==" >> check multinode_nbctl --wait=hv set Logical_Switch_Port migrator >> options:requested-chassis=ovn-chassis-3 >> >> -check_ping migrator ovn-chassis-3 sw0-port2 >> -check_ping sw0-port2 ovn-chassis-2 migrator >> +for i in 1 2 3; do >> + check_ping migrator ovn-chassis-1 sw0-port${i} "lost" >> + check_ping migrator ovn-chassis-3 sw0-port${i} >> + check_ping sw0-port${i} ovn-chassis-${i} migrator >> +done >> >> AS_BOX([Migration with container ports]) >> # Create container ports. >> check multinode_nbctl ls-add sw1 >> check multinode_nbctl lsp-add sw1 mig-cont migrator 10 \ >> - -- lsp-set-addresses mig-cont "f0:00:00:01:02:03 >> 20.0.0.3" >> -check multinode_nbctl lsp-add sw1 cont2 sw0-port2 10 \ >> - -- lsp-set-addresses cont2 "f0:00:00:01:02:04 20.0.0.4" >> + -- lsp-set-addresses mig-cont "f0:00:00:01:02:09 >> 20.0.0.9" >> +for i in 1 2 3; do >> + check multinode_nbctl lsp-add sw1 cont${i} sw0-port${i} 10 \ >> + -- lsp-set-addresses cont${i} >> "f0:00:00:01:02:0${i} 20.0.0.${i}" >> +done >> >> # Create the interface for lport mig-cont >> M_NS_CHECK_EXEC([ovn-chassis-1], [migrator], [ip link add link migrator >> name cont type vlan id 10], [0]) >> -M_NS_CHECK_EXEC([ovn-chassis-1], [migrator], [ip link set cont address >> f0:00:00:01:02:03], [0]) >> +M_NS_CHECK_EXEC([ovn-chassis-1], [migrator], [ip link set cont address >> f0:00:00:01:02:09], [0]) >> M_NS_CHECK_EXEC([ovn-chassis-1], [migrator], [ip link set cont up], [0]) >> -M_NS_CHECK_EXEC([ovn-chassis-1], [migrator], [ip addr add 20.0.0.3/24 >> dev cont], [0]) >> +M_NS_CHECK_EXEC([ovn-chassis-1], [migrator], [ip addr add 20.0.0.9/24 >> dev cont], [0]) >> >> M_NS_CHECK_EXEC([ovn-chassis-3], [migrator], [ip link add link migrator >> name cont type vlan id 10], [0]) >> -M_NS_CHECK_EXEC([ovn-chassis-3], [migrator], [ip link set cont address >> f0:00:00:01:02:03], [0]) >> +M_NS_CHECK_EXEC([ovn-chassis-3], [migrator], [ip link set cont address >> f0:00:00:01:02:09], [0]) >> M_NS_CHECK_EXEC([ovn-chassis-3], [migrator], [ip link set cont up], [0]) >> -M_NS_CHECK_EXEC([ovn-chassis-3], [migrator], [ip addr add 20.0.0.3/24 >> dev cont], [0]) >> - >> -# Create the interface for lport sw1-port2 >> -M_NS_CHECK_EXEC([ovn-chassis-2], [sw0-port2], [ip link add link sw0-port2 >> name cont2 type vlan id 10], [0]) >> -M_NS_CHECK_EXEC([ovn-chassis-2], [sw0-port2], [ip link set cont2 address >> f0:00:00:01:02:04], [0]) >> -M_NS_CHECK_EXEC([ovn-chassis-2], [sw0-port2], [ip link set cont2 up], [0]) >> -M_NS_CHECK_EXEC([ovn-chassis-2], [sw0-port2], [ip addr add 20.0.0.4/24 >> dev cont2], [0]) >> +M_NS_CHECK_EXEC([ovn-chassis-3], [migrator], [ip addr add 20.0.0.9/24 >> dev cont], [0]) >> + >> +# Create the cont interface for lport sw0-port1, sw0-port2, sw0-port3 >> +for i in 1 2 3; do >> + M_NS_CHECK_EXEC([ovn-chassis-${i}], [sw0-port${i}], [ip link add link >> sw0-port${i} name cont${i} type vlan id 10], [0]) >> + M_NS_CHECK_EXEC([ovn-chassis-${i}], [sw0-port${i}], [ip link set >> cont${i} address f0:00:00:01:02:0${i}], [0]) >> + M_NS_CHECK_EXEC([ovn-chassis-${i}], [sw0-port${i}], [ip link set >> cont${i} up], [0]) >> + M_NS_CHECK_EXEC([ovn-chassis-${i}], [sw0-port${i}], [ip addr add >> 20.0.0.${i}/24 dev cont${i}], [0]) >> +done >> >> -check_ping mig-cont ovn-chassis-3 cont2 >> -check_ping cont2 ovn-chassis-2 mig-cont >> +for i in 1 2 3; do >> + check_ping mig-cont ovn-chassis-3 cont${i} >> + check_ping cont${i} ovn-chassis-${i} mig-cont >> + check_ping migrator ovn-chassis-3 cont${i} >> + check_ping cont${i} ovn-chassis-${i} migrator >> +done >> >> echo "== Starting migration back ==" >> check multinode_nbctl --wait=hv set Logical_Switch_Port migrator >> options:requested-chassis=ovn-chassis-3,ovn-chassis-1 >> >> -check_ping mig-cont ovn-chassis-3 cont2 >> -check_ping mig-cont ovn-chassis-1 cont2 >> -check_ping cont2 ovn-chassis-2 mig-cont "potential-duplicates" >> +for i in 1 2 3; do >> + check_ping mig-cont ovn-chassis-3 cont${i} >> + check_ping mig-cont ovn-chassis-1 cont${i} >> + check_ping cont${i} ovn-chassis-${i} mig-cont "potential-duplicates" >> + check_ping migrator ovn-chassis-3 cont${i} >> + check_ping migrator ovn-chassis-1 cont${i} >> + check_ping cont${i} ovn-chassis-${i} migrator "potential-duplicates" >> +done >> >> echo "== Finalizing migration ==" >> check multinode_nbctl --wait=hv set Logical_Switch_Port migrator >> options:requested-chassis=ovn-chassis-1 >> >> -check_ping mig-cont ovn-chassis-3 cont2 "lost" >> -check_ping mig-cont ovn-chassis-1 cont2 >> -check_ping cont2 ovn-chassis-2 mig-cont >> +for i in 1 2 3; do >> + check_ping mig-cont ovn-chassis-3 cont${i} "lost" >> + check_ping mig-cont ovn-chassis-1 cont${i} >> + check_ping cont${i} ovn-chassis-${i} mig-cont >> + check_ping migrator ovn-chassis-3 cont${i} "lost" >> + check_ping migrator ovn-chassis-1 cont${i} >> + check_ping cont${i} ovn-chassis-${i} migrator >> +done >> >> echo "== Starting another migration, this time before starting dst VM ==" >> # Unbind migrator from chassis-3 >> @@ -2939,18 +2971,76 @@ check multinode_nbctl --wait=hv set >> Logical_Switch_Port migrator options:request >> sleep 1 >> m_as ovn-chassis-3 ovs-vsctl -- set Interface migrator-p >> external_ids:iface-id=migrator >> >> - >> -check_ping mig-cont ovn-chassis-3 cont2 >> -check_ping mig-cont ovn-chassis-1 cont2 >> -check_ping cont2 ovn-chassis-2 mig-cont "potential-duplicates" >> - >> +for i in 1 2 3; do >> + check_ping mig-cont ovn-chassis-3 cont${i} >> + check_ping mig-cont ovn-chassis-1 cont${i} >> + check_ping cont${i} ovn-chassis-${i} mig-cont "potential-duplicates" >> + check_ping migrator ovn-chassis-3 cont${i} >> + check_ping migrator ovn-chassis-1 cont${i} >> + check_ping cont${i} ovn-chassis-${i} migrator "potential-duplicates" >> +done >> >> echo "== Finalizing migration ==" >> check multinode_nbctl --wait=hv set Logical_Switch_Port migrator >> options:requested-chassis=ovn-chassis-3 >> >> -check_ping mig-cont ovn-chassis-1 cont2 "lost" >> -check_ping mig-cont ovn-chassis-3 cont2 >> -check_ping cont2 ovn-chassis-2 mig-cont >> +for i in 1 2 3; do >> + check_ping mig-cont ovn-chassis-1 cont${i} "lost" >> + check_ping mig-cont ovn-chassis-3 cont${i} >> + check_ping cont${i} ovn-chassis-${i} mig-cont >> + check_ping migrator ovn-chassis-1 cont${i} "lost" >> + check_ping migrator ovn-chassis-3 cont${i} >> + check_ping cont${i} ovn-chassis-${i} migrator >> +done >> + >> +# Remove iface-id from src after migration is completed >> +m_as ovn-chassis-1 ovs-vsctl -- remove Interface migrator-p external_ids >> iface-id >> +check multinode_nbctl --wait=sb sync >> + >> +for i in 1 2 3; do >> + check_ping migrator ovn-chassis-1 sw0-port${i} "lost" >> + check_ping mig-cont ovn-chassis-1 cont${i} "lost" >> + check_ping migrator ovn-chassis-1 cont${i} "lost" >> + check_ping migrator ovn-chassis-3 sw0-port${i} >> + check_ping mig-cont ovn-chassis-3 cont${i} >> + check_ping migrator ovn-chassis-3 cont${i} >> + check_ping sw0-port${i} ovn-chassis-${i} migrator >> + check_ping cont${i} ovn-chassis-${i} mig-cont >> + check_ping cont${i} ovn-chassis-${i} migrator >> +done >> + >> +# Finally, remove interface from src after migration is completed >> +m_as ovn-chassis-1 ovs-vsctl -- del-port migrator-p >> +for i in 1 2 3; do >> + check_ping migrator ovn-chassis-1 sw0-port${i} "lost" >> + check_ping mig-cont ovn-chassis-1 cont${i} "lost" >> + check_ping migrator ovn-chassis-1 cont${i} "lost" >> + check_ping migrator ovn-chassis-3 sw0-port${i} >> + check_ping mig-cont ovn-chassis-3 cont${i} >> + check_ping migrator ovn-chassis-3 cont${i} >> + check_ping sw0-port${i} ovn-chassis-${i} migrator >> + check_ping cont${i} ovn-chassis-${i} mig-cont >> + check_ping cont${i} ovn-chassis-${i} migrator >> +done >> + >> +# Also do some recomputes ... >> +AS_BOX([Recompute after removing interface]) >> +for i in 1 2 3; do >> + m_as ovn-chassis-${i} ovn-appctl -t ovn-controller recompute >> +done >> + >> +check multinode_nbctl --wait=sb sync >> + >> +for i in 1 2 3; do >> + check_ping migrator ovn-chassis-1 sw0-port${i} "lost" >> + check_ping mig-cont ovn-chassis-1 cont${i} "lost" >> + check_ping migrator ovn-chassis-1 cont${i} "lost" >> + check_ping migrator ovn-chassis-3 sw0-port${i} >> + check_ping mig-cont ovn-chassis-3 cont${i} >> + check_ping migrator ovn-chassis-3 cont${i} >> + check_ping sw0-port${i} ovn-chassis-${i} migrator >> + check_ping cont${i} ovn-chassis-${i} mig-cont >> + check_ping cont${i} ovn-chassis-${i} migrator >> +done >> >> m_as ovn-chassis-1 killall tcpdump >> m_as ovn-chassis-2 killall tcpdump >> -- >> 2.47.1 >> >> _______________________________________________ >> dev mailing list >> [email protected] >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >> >> > Looks good to me, thanks. > > Acked-by: Ales Musil <[email protected]>
Thanks, Xavier and Ales! Applied to main, 25.03, 24.09, 24.03. Regards, Dumitru _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
