From: Dumitru Ceara <dce...@redhat.com> Signed-off-by: Dumitru Ceara <dce...@redhat.com> --- Changes in V3: - Rabsed on top of current main. --- tests/automake.mk | 1 + tests/multinode-bgp-macros.at | 221 ++++++++++++++++++++++++++++++++++ tests/multinode-testsuite.at | 1 + tests/multinode.at | 184 ++-------------------------- 4 files changed, 233 insertions(+), 174 deletions(-) create mode 100644 tests/multinode-bgp-macros.at
diff --git a/tests/automake.mk b/tests/automake.mk index 04d90e659..e6d7b912a 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -71,6 +71,7 @@ PERF_TESTSUITE_AT = \ tests/perf-northd.at MULTINODE_TESTSUITE_AT = \ + tests/multinode-bgp-macros.at \ tests/multinode-testsuite.at \ tests/multinode-macros.at \ tests/multinode.at diff --git a/tests/multinode-bgp-macros.at b/tests/multinode-bgp-macros.at new file mode 100644 index 000000000..803aef909 --- /dev/null +++ b/tests/multinode-bgp-macros.at @@ -0,0 +1,221 @@ +# +# Test helpers for setting up BGP in multinode scenarios. +# + +OVS_START_SHELL_HELPERS + +# m_setup_external_frr_router NODE BGP_AS BGP_IP +# +# Sets up an external FRR BGP speaker in a network namespace on the +# ovn-fake-multinode node NODE. The BGP autonomous system is configured to be +# BGP_AS. The speaker uses as BGP IP address, BGP_IP +m_setup_external_frr_router() { + local node=$1 bgp_as=$2 bgp_ip=$3 + local br_name=br-$node + + check m_as $node ovs-vsctl add-br $br_name + on_exit "m_as $node ovs-vsctl del-br $br_name" + check m_as $node ip netns add frr-ns + on_exit "m_as $node ip netns del frr-ns" + + check m_as $node ip netns exec frr-ns ip link set lo up + check m_as $node ovs-vsctl add-port $br_name ext1 \ + -- set interface ext1 type=internal + + check m_as $node ip link set ext1 netns frr-ns + check m_as $node ip netns exec frr-ns ip link set ext1 up + check m_as $node ip netns exec frr-ns ip addr add $bgp_ip dev ext1 + + check m_as $node sed -i 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons + check m_as $node sed -i 's/StartLimitBurst=.*/StartLimitBurst=100/g' /usr/lib/systemd/system/frr.service + check m_as $node systemctl daemon-reload + + check m_as $node mkdir -p /etc/frr/frr-ns + if m_is_fedora; then + check m_as $node chown -R frr:frr /etc/frr/frr-ns + check m_as $node mkdir -p /run/frr/frr-ns + check m_as $node chown -R frr:frr /run/frr/frr-ns + check m_as $node cp -r /etc/frr/daemons /etc/frr/frr.conf /etc/frr/frr-ns/ + else + check m_as $node cp -r /etc/frr/daemons /etc/frr/frr.conf /etc/frr/support_bundle_commands.conf /etc/frr/frr-ns/ + fi + + on_exit "m_as $node rm -rf /etc/frr/frr-ns" + check m_as $node rm -rf /etc/frr/frr-ns/vtysh.conf + check m_as $node touch /etc/frr/frr-ns/vtysh.conf + + check m_as $node systemctl stop frr + if m_is_fedora; then + m_as $node ip netns exec frr-ns /usr/libexec/frr/frrinit.sh start frr-ns + on_exit "m_as $node ip netns exec frr-ns /usr/libexec/frr/frrinit.sh stop frr-ns" + else + m_as $node ip netns exec frr-ns /usr/lib/frr/frrinit.sh start frr-ns + on_exit "m_as $node ip netns exec frr-ns /usr/lib/frr/frrinit.sh stop frr-ns" + fi + on_exit "m_as $node systemctl stop frr" + check m_as $node systemctl start frr + + local frr_flags="-N frr-ns" + if m_is_fedora; then + frr_flags="--vty_socket /run/frr/frr-ns" + fi + + echo "configure + ip prefix-list accept-all seq 5 permit any + + router bgp $bgp_as + bgp router-id $bgp_ip + neighbor ext1 interface remote-as external + address-family ipv4 unicast + neighbor ext1 soft-reconfiguration inbound + neighbor ext1 prefix-list accept-all in + exit-address-family + ! + address-family ipv6 unicast + neighbor ext1 soft-reconfiguration inbound + neighbor ext1 activate + exit-address-family + " | podman exec -i $node vtysh $frr_flags +} + +# m_ovn_frr_router_name NODE +m_ovn_frr_router_name() { + local node=$1 + + echo lr-$node-ext0 +} + +# m_ovn_frr_router_port_name NODE +m_ovn_frr_router_port_name() { + local node=$1 + + echo lrp-$node-ext0 +} + +# m_ovn_frr_switch_name NODE +m_ovn_frr_switch_name() { + local node=$1 + + echo ls-$node-ext0 +} + +# m_ovn_frr_switch_port_name NODE +m_ovn_frr_switch_port_name() { + local node=$1 + + echo lsp-$node-ext0 +} + +# m_ovn_frr_switch_bgp_port_name NODE +m_ovn_frr_switch_bgp_port_name() { + local node=$1 + + echo $(m_ovn_frr_switch_port_name $node)-bgp +} + +# m_ovn_frr_switch_localnet_port_name NODE +m_ovn_frr_switch_localnet_port_name() { + local node=$1 + + echo $(m_ovn_frr_switch_port_name $node)-ln +} + +# m_setup_ovn_frr_router NODE BGP_AS BGP_IP BGP_MAC VNI +# +# Sets up an FRR BGP speaker in a VRF in the default network namespace on the +# ovn-fake-multinode node NODE. This speaker is running on an interface bound +# to a local OVN logical switch, ls-NODE-ext0, and uses the same BGP_IP and +# BGP_MAC address as a logical router, lr-NODE-ext0, with +# routing-protocol-redirect enabled. +# +# The BGP autonomous system is configured to be BGP_AS and the FRR instance +# runs in vrf VNI. +m_setup_ovn_frr_router() { + local node=$1 bgp_as=$2 bgp_ip=$3 bgp_mac=$4 vni=$5 + local br_name=br-$node physnet=physnet_${node}_ext0 + local lr=$(m_ovn_frr_router_name $node) + local lrp=$(m_ovn_frr_router_port_name $node) + local ls=$(m_ovn_frr_switch_name $node) + local lsp=$(m_ovn_frr_switch_port_name $node) + local lsp_bgp=$(m_ovn_frr_switch_bgp_port_name $node) + local lsp_ln=$(m_ovn_frr_switch_localnet_port_name $node) + + check m_as $node ovs-vsctl set Open_vSwitch . \ + external-ids:ovn-bridge-mappings="$physnet:$br_name" + + check multinode_nbctl lr-add $lr + check multinode_nbctl set Logical_Router $lr options:chassis=$node \ + options:dynamic-routing=true options:requested-tnl-key=$vni + + check multinode_nbctl lrp-add $lr $lrp $bgp_mac + check multinode_nbctl lrp-set-options $lrp \ + dynamic-routing-maintain-vrf=true \ + dynamic-routing-redistribute=nat + + check multinode_nbctl ls-add $ls + + check multinode_nbctl lsp-add $ls $lsp + check multinode_nbctl lsp-set-type $lsp router + check multinode_nbctl lsp-set-options $lsp router-port=$lrp + check multinode_nbctl lsp-set-addresses $lsp router + + check multinode_nbctl lsp-add $ls $lsp_ln + check multinode_nbctl lsp-set-addresses $lsp_ln unknown + check multinode_nbctl lsp-set-type $lsp_ln localnet + check multinode_nbctl lsp-set-options $lsp_ln network_name=$physnet + + OVS_WAIT_UNTIL([m_as $node ip link | grep -q ovnvrf${vni}:.*UP]) + + check multinode_nbctl lsp-add $ls $lsp_bgp + check multinode_nbctl lsp-set-addresses $lsp_bgp unknown + + check multinode_nbctl add Logical_Router_Port $lrp \ + options routing-protocols=\"BGP,BFD\" \ + routing-protocol-redirect=$lsp_bgp + check multinode_nbctl set Logical_Router_Port $lrp \ + ipv6_ra_configs:send_periodic=true + check multinode_nbctl set Logical_Router_Port $lrp \ + ipv6_ra_configs:address_mode=slaac + check multinode_nbctl set Logical_Router_Port $lrp \ + ipv6_ra_configs:max_interval=1 + check multinode_nbctl set Logical_Router_Port $lrp \ + ipv6_ra_configs:min_interval=1 + + check m_as $node ovs-vsctl add-port br-int ext0-bgp -- \ + set Interface ext0-bgp type=internal mac=\"$bgp_mac\" \ + external-ids:iface-id=$lsp_bgp + on_exit "m_as $node ovs-vsctl del-port br-int ext0-bgp" + + check m_as $node ip link set dev ext0-bgp master ovnvrf${vni} + check m_as $node ip link set dev ext0-bgp up + + check multinode_nbctl --wait=hv sync + m_wait_for_ports_up + + echo "configure + ip prefix-list no-default seq 5 deny 0.0.0.0/0 + ip prefix-list no-default seq 10 permit 0.0.0.0/0 le 32 + + ipv6 prefix-list no-default seq 5 deny ::/0 + ipv6 prefix-list no-default seq 10 permit ::/0 le 128 + + vrf ovnvrf${vni} + exit-vrf + + router bgp ${bgp_as} vrf ovnvrf${vni} + bgp router-id $bgp_ip + neighbor ext0-bgp interface remote-as external + address-family ipv4 unicast + redistribute kernel + neighbor ext0-bgp prefix-list no-default out + exit-address-family + address-family ipv6 unicast + neighbor ext0-bgp soft-reconfiguration inbound + neighbor ext0-bgp prefix-list no-default out + redistribute kernel + neighbor ext0-bgp activate + exit-address-family + " | podman exec -i $node vtysh +} + +OVS_END_SHELL_HELPERS diff --git a/tests/multinode-testsuite.at b/tests/multinode-testsuite.at index ea10b0276..ce789809e 100644 --- a/tests/multinode-testsuite.at +++ b/tests/multinode-testsuite.at @@ -23,5 +23,6 @@ m4_include([tests/ofproto-macros.at]) m4_include([tests/ovn-macros.at]) m4_include([tests/system-common-macros.at]) m4_include([tests/multinode-macros.at]) +m4_include([tests/multinode-bgp-macros.at]) m4_include([tests/multinode.at]) diff --git a/tests/multinode.at b/tests/multinode.at index cf748af49..8ac625b6b 100644 --- a/tests/multinode.at +++ b/tests/multinode.at @@ -2997,173 +2997,7 @@ CHECK_VRF() # Delete the multinode NB and OVS resources before starting the test. cleanup_multinode_resources -setup_frr() { - node=$1 - bgp_as=$2 - bgp_ip=$3 - br_name=br-$node - - check m_as $node ovs-vsctl add-br $br_name - on_exit "m_as $node ovs-vsctl del-br $br_name" - check m_as $node ip netns add frr-ns - on_exit "m_as $node ip netns del frr-ns" - - check m_as $node ip netns exec frr-ns ip link set lo up - m_as $node ovs-vsctl add-port $br_name ext1 \ - -- set interface ext1 type=internal - - m_as $node ip link set ext1 netns frr-ns - m_as $node ip netns exec frr-ns ip link set ext1 up - m_as $node ip netns exec frr-ns ip addr add $bgp_ip dev ext1 - - # configure main frr - check m_as $node sed -i 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons - check m_as $node sed -i 's/StartLimitBurst=.*/StartLimitBurst=100/g' /usr/lib/systemd/system/frr.service - check m_as $node systemctl daemon-reload - - # setup frr namespace - check m_as $node mkdir -p /etc/frr/frr-ns - if m_is_fedora; then - check m_as $node chown -R frr:frr /etc/frr/frr-ns - check m_as $node mkdir -p /run/frr/frr-ns - check m_as $node chown -R frr:frr /run/frr/frr-ns - check m_as $node cp -r /etc/frr/daemons /etc/frr/frr.conf /etc/frr/frr-ns/ - else - check m_as $node cp -r /etc/frr/daemons /etc/frr/frr.conf /etc/frr/support_bundle_commands.conf /etc/frr/frr-ns/ - fi - - on_exit "m_as $node rm -rf /etc/frr/frr-ns" - check m_as $node rm -rf /etc/frr/frr-ns/vtysh.conf - check m_as $node touch /etc/frr/frr-ns/vtysh.conf - - check m_as $node systemctl stop frr - # start frr within namespace - if m_is_fedora; then - m_as $node ip netns exec frr-ns /usr/libexec/frr/frrinit.sh start frr-ns - on_exit "m_as $node ip netns exec frr-ns /usr/libexec/frr/frrinit.sh stop frr-ns" - else - m_as $node ip netns exec frr-ns /usr/lib/frr/frrinit.sh start frr-ns - on_exit "m_as $node ip netns exec frr-ns /usr/lib/frr/frrinit.sh stop frr-ns" - fi - on_exit "m_as $node systemctl stop frr" - check m_as $node systemctl start frr - - frr_flags="-N frr-ns" - if m_is_fedora; then - frr_flags="--vty_socket /run/frr/frr-ns" - fi - - # configure frr-ns frr - echo "configure - ip prefix-list accept-all seq 5 permit any - - router bgp $bgp_as - bgp router-id $bgp_ip - neighbor ext1 interface remote-as external - address-family ipv4 unicast - neighbor ext1 soft-reconfiguration inbound - neighbor ext1 prefix-list accept-all in - exit-address-family - ! - address-family ipv6 unicast - neighbor ext1 soft-reconfiguration inbound - neighbor ext1 activate - exit-address-family - " | podman exec -i $node vtysh $frr_flags -} - -setup_ovn_bgp() { - node=$1 - bgp_as=$2 - bgp_ip=$3 - bgp_mac=$4 - vrf_id=$5 - br_name=br-$node - physnet=physnet_${node}_ext0 - - check m_as $node ovs-vsctl set Open_vSwitch . \ - external-ids:ovn-bridge-mappings="$physnet:$br_name" - - # setup lr and lrp for bgp - check multinode_nbctl lr-add lr-$node-ext0 - check multinode_nbctl set Logical_Router lr-$node-ext0 \ - options:chassis=$node \ - options:dynamic-routing=true options:requested-tnl-key=$vrf_id - - check multinode_nbctl lrp-add lr-$node-ext0 lrp-$node-ext0 $bgp_mac - check multinode_nbctl lrp-set-options lrp-$node-ext0 \ - dynamic-routing-maintain-vrf=true \ - dynamic-routing-redistribute=nat - - check multinode_nbctl ls-add ls-$node-ext0 - - check multinode_nbctl lsp-add ls-$node-ext0 lsp-$node-ext0 - check multinode_nbctl lsp-set-type lsp-$node-ext0 router - check multinode_nbctl lsp-set-options lsp-$node-ext0 \ - router-port=lrp-$node-ext0 - check multinode_nbctl lsp-set-addresses lsp-$node-ext0 router - - check multinode_nbctl lsp-add ls-$node-ext0 patch-$node-ext0 - check multinode_nbctl lsp-set-addresses patch-$node-ext0 unknown - check multinode_nbctl lsp-set-type patch-$node-ext0 localnet - check multinode_nbctl lsp-set-options patch-$node-ext0 \ - network_name=$physnet - - OVS_WAIT_UNTIL([m_as $node ip link | grep -q ovnvrf${vrf_id}:.*UP]) - - check multinode_nbctl lsp-add ls-$node-ext0 lsp-$node-ext0-bgp - check multinode_nbctl lsp-set-addresses lsp-$node-ext0-bgp unknown - - # set up lrp with proper configuration for BGP - check multinode_nbctl add Logical_Router_Port lrp-$node-ext0 \ - options routing-protocols=\"BGP,BFD\" \ - routing-protocol-redirect=lsp-$node-ext0-bgp - check multinode_nbctl set Logical_Router_Port lrp-$node-ext0 \ - ipv6_ra_configs:send_periodic=true - check multinode_nbctl set Logical_Router_Port lrp-$node-ext0 \ - ipv6_ra_configs:address_mode=slaac - check multinode_nbctl set Logical_Router_Port lrp-$node-ext0 \ - ipv6_ra_configs:max_interval=1 - check multinode_nbctl set Logical_Router_Port lrp-$node-ext0 \ - ipv6_ra_configs:min_interval=1 - - check m_as $node ovs-vsctl add-port br-int ext0-bgp -- \ - set Interface ext0-bgp type=internal mac=\"$bgp_mac\" \ - external-ids:iface-id=lsp-$node-ext0-bgp - on_exit "m_as $node ovs-vsctl del-port br-int ext0-bgp" - - check m_as $node ip link set dev ext0-bgp master ovnvrf${vrf_id} - check m_as $node ip link set dev ext0-bgp up - - check multinode_nbctl --wait=hv sync - m_wait_for_ports_up - - # configure frr to work with ovn bgp - echo "configure - ip prefix-list no-default seq 5 deny 0.0.0.0/0 - ip prefix-list no-default seq 10 permit 0.0.0.0/0 le 32 - - ipv6 prefix-list no-default seq 5 deny ::/0 - ipv6 prefix-list no-default seq 10 permit ::/0 le 128 - - vrf ovnvrf${vrf_id} - exit-vrf - - router bgp ${bgp_as} vrf ovnvrf${vrf_id} - bgp router-id $bgp_ip - neighbor ext0-bgp interface remote-as external - address-family ipv4 unicast - redistribute kernel - neighbor ext0-bgp prefix-list no-default out - exit-address-family - address-family ipv6 unicast - neighbor ext0-bgp soft-reconfiguration inbound - neighbor ext0-bgp prefix-list no-default out - redistribute kernel - neighbor ext0-bgp activate - exit-address-family - " | podman exec -i $node vtysh -} +CHECK_VRF() add_guest_vm_and_connections() { node=$1 @@ -3173,8 +3007,10 @@ add_guest_vm_and_connections() { default_route_gw=$5 guest_gw_ip=$6 guest_ip=$7 + gw_router=$(m_ovn_frr_router_name $node) + gw_router_lrp=$(m_ovn_frr_router_port_name $node) - gw_lr=lr-$node-ext0 + gw_lr=$(m_ovn_frr_router_name $node) lrp_to_join=lrp-$node-to-join lsp_join_to_lrp=join-to-lrp-$node lrp_guest=lrp-guest-$node @@ -3213,17 +3049,17 @@ add_guest_vm_and_connections() { 00:16:01:00:02:02 1342 $guest_ip 24 $guest_gw_ip 1000::13/64 1000::a neighbor_lla=$(m_as $node vtysh -c "show bgp vrf ovnvrf${vrf_id} neighbor ext0-bgp" | grep "^Foreign host:" | awk '{print $3}' | tr -d ',') - check multinode_nbctl lr-route-add lr-$node-ext0 "0.0.0.0/0" \ - $neighbor_lla lrp-$node-ext0 + check multinode_nbctl lr-route-add $gw_router "0.0.0.0/0" \ + $neighbor_lla $gw_router_lrp check multinode_nbctl lr-route-add $lr_guest \ $default_route $default_route_gw $lrp_guest_join } -setup_frr ovn-gw-1 4200000100 41.41.41.41 -setup_ovn_bgp ovn-gw-1 4210000000 14.14.14.14 12:fb:d6:66:99:1c 10 +m_setup_external_frr_router ovn-gw-1 4200000100 41.41.41.41 +m_setup_ovn_frr_router ovn-gw-1 4210000000 14.14.14.14 12:fb:d6:66:99:1c 10 -setup_frr ovn-gw-2 4200000200 42.42.42.42 -setup_ovn_bgp ovn-gw-2 4210000000 24.24.24.24 22:fb:d6:66:99:2c 20 +m_setup_external_frr_router ovn-gw-2 4200000200 42.42.42.42 +m_setup_ovn_frr_router ovn-gw-2 4210000000 24.24.24.24 22:fb:d6:66:99:2c 20 OVS_WAIT_UNTIL([m_as ovn-gw-2 vtysh -c 'show bgp vrf ovnvrf20 neighbors' | grep -qE 'Connections established 1']) OVS_WAIT_UNTIL([m_as ovn-gw-1 vtysh -c 'show bgp vrf ovnvrf10 neighbors' | grep -qE 'Connections established 1']) -- 2.50.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev