> This tests OVN BGP capabilities in a multinode environment by setting up > two sets of a ToR switch, connected to an OVN node with BGP set up. The > pair then form a connection and then the ToR switch can connect to a > guest-vm which is accessible via a distributed gateway logical router port. > > Signed-off-by: MJ Ponsonby <mj.ponso...@canonical.com>
Hi MJ and Frode, thx for the patch, LGTM, just some (minor) comments inline. Regards, Lorenzo > --- > tests/multinode.at | 241 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 241 insertions(+) > > diff --git a/tests/multinode.at b/tests/multinode.at > index 68c9eba22..eb8047e7a 100644 > --- a/tests/multinode.at > +++ b/tests/multinode.at > @@ -3030,4 +3030,245 @@ m_as ovn-chassis-3 killall tcpdump > > AT_CLEANUP > > +AT_SETUP([ovn multinode bgp unnumbered]) > > +check_fake_multinode_setup > +cleanup_multinode_resources > + unnecessary blank line > + > +setup_frr() { > + container_prefix=$1 > + container_number=$2 > + br_name=br-$container_prefix-$container_number > + > + check m_as $container_prefix-$container_number ovs-vsctl add-br $br_name > + on_exit "m_as $container_prefix-$container_number ovs-vsctl del-br > br-$container_prefix-$container_number" > + check m_as $container_prefix-$container_number ip netns add frr-ns > + on_exit "m_as $container_prefix-$container_number ip netns del frr-ns" > + check m_as $container_prefix-$container_number ip netns exec frr-ns ip > link set lo up > + m_as $container_prefix-$container_number ovs-vsctl add-port $br_name > ext0 -- set interface ext0 type=internal > + m_as $container_prefix-$container_number ovs-vsctl add-port $br_name > ext1 -- set interface ext1 type=internal > + > + m_as $container_prefix-$container_number ip link set ext1 netns frr-ns > + m_as $container_prefix-$container_number ip netns exec frr-ns ip link > set ext1 up > + m_as $container_prefix-$container_number ip netns exec frr-ns ip addr > add > 4$container_number.4$container_number.4$container_number.4$container_number > dev ext1 > + m_as $container_prefix-$container_number ip link set ext0 up > + > + check m_as $container_prefix-$container_number sed -i > 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons > + check m_as $container_prefix-$container_number sed -i > 's/StartLimitBurst=.*/StartLimitBurst=100/g' > /usr/lib/systemd/system/frr.service > + check m_as $container_prefix-$container_number systemctl daemon-reload > + > + check m_as $container_prefix-$container_number mkdir -p /etc/frr/frr-ns > + if $(m_as ovn-gw-1 grep -qi fedora /etc/os-release); then > + check m_as $container_prefix-$container_number chown -R frr:frr > /etc/frr/frr-ns > + check m_as $container_prefix-$container_number mkdir -p > /run/frr/frr-ns > + check m_as $container_prefix-$container_number chown -R frr:frr > /run/frr/frr-ns > + check m_as $container_prefix-$container_number cp -r > /etc/frr/daemons /etc/frr/frr.conf /etc/frr/frr-ns/ > + else > + check m_as $container_prefix-$container_number cp -r > /etc/frr/daemons /etc/frr/frr.conf /etc/frr/support_bundle_commands.conf > /etc/frr/frr-ns/ > + fi > + on_exit "m_as $container_prefix-$container_number rm -rf /etc/frr/frr-ns" > + check m_as $container_prefix-$container_number rm -rf > /etc/frr/frr-ns/vtysh.conf > + check m_as $container_prefix-$container_number touch > /etc/frr/frr-ns/vtysh.conf > + > + check m_as $container_prefix-$container_number systemctl stop frr > + if $(m_as ovn-gw-1 grep -qi fedora /etc/os-release); then > + m_as $container_prefix-$container_number ip netns exec frr-ns > /usr/libexec/frr/frrinit.sh start frr-ns > + on_exit "m_as $container_prefix-$container_number ip netns exec > frr-ns /usr/libexec/frr/frrinit.sh stop frr-ns" > + else > + m_as $container_prefix-$container_number ip netns exec frr-ns > /usr/lib/frr/frrinit.sh start frr-ns > + on_exit "m_as $container_prefix-$container_number ip netns exec > frr-ns /usr/lib/frr/frrinit.sh stop frr-ns" > + fi > + on_exit "m_as $container_prefix-$container_number systemctl stop frr" > + check m_as $container_prefix-$container_number systemctl start frr > + flag="-N frr-ns" > + if $(m_as ovn-gw-1 grep -qi fedora /etc/os-release); then > + flag=--vty_socket /run/frr/frr-ns > + fi > + echo "configure > + ! > + ip prefix-list accept-all seq 5 permit any > + ! > + router bgp 4200000${container_number}00 > + bgp router-id > ${container_number}0.${container_number}0.${container_number}0.${container_number}0 > + 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 $container_prefix-$container_number vtysh $flag > +} > + > +setup_ovn_bgp() { > + unnecessary blank line > + container_prefix=$1 > + container_number=$2 > + br_name=br-$container_prefix-$container_number > + > + check m_as $container_prefix-$container_number ovs-vsctl set > Open_vSwitch . > external-ids:ovn-bridge-mappings="physnet_$container_prefix-${container_number}_ext0:$br_name" > + > + check multinode_nbctl --wait=hv lr-add > lr-$container_prefix-${container_number}-ext0 > + check multinode_nbctl --wait=hv set Logical_Router > lr-$container_prefix-$container_number-ext0 > options:chassis=$container_prefix-$container_number > + check multinode_nbctl set Logical_Router > lr-$container_prefix-$container_number-ext0 options:dynamic-routing=true > options:requested-tnl-key=${container_number}0 > + > + check multinode_nbctl lrp-add > lr-$container_prefix-$container_number-ext0 > lrp-$container_prefix-$container_number-ext0 > ${container_number}2:fb:d6:66:99:${container_number}c > + check multinode_nbctl lrp-set-options > lrp-$container_prefix-$container_number-ext0 > dynamic-routing-maintain-vrf=true dynamic-routing-redistribute=nat > + > + check multinode_nbctl ls-add ls-$container_prefix-$container_number-ext0 > + > + check multinode_nbctl lsp-add > ls-$container_prefix-$container_number-ext0 > lsp-$container_prefix-$container_number-ext0 > + check multinode_nbctl lsp-set-type > lsp-$container_prefix-$container_number-ext0 router > + check multinode_nbctl lsp-set-options > lsp-$container_prefix-$container_number-ext0 > router-port=lrp-$container_prefix-$container_number-ext0 > + check multinode_nbctl lsp-set-addresses > lsp-$container_prefix-$container_number-ext0 router > + > + check multinode_nbctl lsp-add > ls-$container_prefix-$container_number-ext0 > patch-$container_prefix-$container_number-ext0 > + check multinode_nbctl lsp-set-addresses > patch-$container_prefix-$container_number-ext0 unknown > + check multinode_nbctl lsp-set-type > patch-$container_prefix-$container_number-ext0 localnet > + check multinode_nbctl --wait=hv lsp-set-options > patch-$container_prefix-$container_number-ext0 > network_name=physnet_$container_prefix-${container_number}_ext0 > + > + OVS_WAIT_UNTIL([m_as $container_prefix-$container_number ip link | grep > -q ovnvrf${container_number}0:.*UP]) > + > + check multinode_nbctl lsp-add > ls-$container_prefix-$container_number-ext0 > lsp-$container_prefix-$container_number-ext0-bgp > + check multinode_nbctl lsp-set-addresses > lsp-$container_prefix-$container_number-ext0-bgp unknown > + > + check multinode_nbctl add Logical_Router_Port > lrp-$container_prefix-$container_number-ext0 options > routing-protocols=\"BGP,BFD\" > routing-protocol-redirect=lsp-$container_prefix-$container_number-ext0-bgp > + check multinode_nbctl set Logical_Router_Port > lrp-$container_prefix-$container_number-ext0 > ipv6_ra_configs:send_periodic=true > + check multinode_nbctl set Logical_Router_Port > lrp-$container_prefix-$container_number-ext0 > ipv6_ra_configs:address_mode=slaac > + check multinode_nbctl set Logical_Router_Port > lrp-$container_prefix-$container_number-ext0 ipv6_ra_configs:max_interval=1 > + check multinode_nbctl set Logical_Router_Port > lrp-$container_prefix-$container_number-ext0 ipv6_ra_configs:min_interval=1 > + > + check m_as $container_prefix-$container_number ovs-vsctl add-port br-int > ext0-bgp -- set Interface ext0-bgp type=internal > mac=\"${container_number}2:fb:d6:66:99:${container_number}c\" > external-ids:iface-id=lsp-$container_prefix-$container_number-ext0-bgp > + on_exit "m_as $container_prefix-$container_number ovs-vsctl del-port > br-int ext0-bgp" > + check m_as $container_prefix-$container_number ip link set dev ext0-bgp > master ovnvrf${container_number}0 > + check m_as $container_prefix-$container_number ip link set dev ext0-bgp > 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${container_number}0 > + exit-vrf > + router bgp 42${container_number}0000000 vrf ovnvrf${container_number}0 > + bgp router-id > ${container_number}4.${container_number}4.${container_number}4.${container_number}4 > + 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 > + do copy running-config startup-config" | podman exec -i > $container_prefix-$container_number vtysh > +} > + > +add_guest_vm_and_connections() { > + container_prefix=$1 > + container_number=$2 > + > + gw_lr="lr-${container_prefix}-${container_number}-ext0" > + lrp_to_join="lrp${container_number}-to-join" > + lsp_join_to_lrp="join-to-lrp${container_number}" > + lrp_guest="lrp-guest${container_number}" > + > + ls_g="ls-guest${container_number}" > + lsp_g_lrg="lsp-guest${container_number}-lr-guest" > + lsp_g_iface="lsp-guest${container_number}-guest-vm" > + lrp_g_lsg="lrp-guest-ls-guest${container_number}" > + > + guest_gw_ip="192.168.10.1" > + guest_gw_cidr="$guest_gw_ip/24" > + guest_vm_ip="192.168.10.10" > + guest_vm_cidr="$guest_vm_ip/24" in order to make the code more readable I guess we can reduce the variable usage. What do you think? > + > + check multinode_nbctl lrp-add $gw_lr $lrp_to_join > 00:00:ff:00:00:0${container_number} > + check multinode_nbctl lrp-set-options $lrp_to_join > dynamic-routing-redistribute=nat > + check multinode_nbctl lsp-add $join_ls $lsp_join_to_lrp > + check multinode_nbctl lsp-set-type $lsp_join_to_lrp router > + check multinode_nbctl lsp-set-options $lsp_join_to_lrp > router-port=$lrp_to_join > + check multinode_nbctl lsp-set-addresses $lsp_join_to_lrp router > + > + check multinode_nbctl ls-add $ls_g > + check multinode_nbctl lrp-add $lr_guest $lrp_g_lsg > 00:16:03:0${container_number}:03:03 $guest_gw_cidr > + check multinode_nbctl lsp-add $ls_g $lsp_g_lrg > + check multinode_nbctl lsp-set-type $lsp_g_lrg router > + check multinode_nbctl lsp-set-options $lsp_g_lrg router-port=$lrp_g_lsg > + check multinode_nbctl lsp-set-addresses $lsp_g_lrg router > + check multinode_nbctl lsp-add $ls_g $lsp_g_iface > + check multinode_nbctl lsp-set-addresses $lsp_g_iface > '00:16:0'${container_number}':00:02:02 '$guest_vm_cidr'' > + > + m_as ${container_prefix}-${container_number} /data/create_fake_vm.sh > $lsp_g_iface $guest_vm_ns 00:16:0${container_number}:00:02:02 1342 > $guest_vm_ip 24 $guest_gw_ip 1000::${container_number}3/64 1000::a > + neighbor_lla=$(m_as ${container_prefix}-${container_number} vtysh -c > "show bgp vrf ovnvrf${container_number}0 neighbor ext0-bgp" | grep "^Foreign > host:" | awk '{print $3}' | tr -d ',') > + check multinode_nbctl lr-route-add > lr-${container_prefix}-${container_number}-ext0 "0.0.0.0/0" $neighbor_lla > lrp-${container_prefix}-${container_number}-ext0 > + > + check multinode_nbctl lr-route-add $lr_guest > "4${container_number}.0.0.0/8" fe80::200:ffff:fe00:${container_number} > $lrp_guest_join > +} > + > +setup_frr "ovn-gw" 1 > +setup_ovn_bgp "ovn-gw" 1 > + > +setup_frr "ovn-gw" 2 > +setup_ovn_bgp "ovn-gw" 2 > + > +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']) > + > +# Tor <-> ovn-gw via bgp > +# lr-guest with distributed gateway port > +# bgp on lr-ovn-gw-2-ext0 > +# > +# guest-1 guest-2 > +# \ / > +# lr-guest > +# DGP > +# | > +# ls-join > +# / \ > +# tor <-> lr-ovn-gw-2-ext0* lr-ovn-gw-1-ext0* <-> tor > +# | | > +# ls-ovn-gw-2-ext0 ls-ovn-gw-1-ext0 > +# > +# > +# > + > +join_ls="ls-join" > +lsp_join_guest="lsp-join-guest" > + > +lr_guest="lr-guest" > +lrp_guest_join="lrp-guest-join-dgp" > + > +guest_vm_iface="guest-vm" > +guest_vm_ns="ns-guest" > + > +check multinode_nbctl ls-add $join_ls > + > +check multinode_nbctl lr-add $lr_guest > +check multinode_nbctl lrp-add $lr_guest $lrp_guest_join 00:16:06:12:f0:0d > +check multinode_nbctl lsp-add $join_ls $lsp_join_guest > +check multinode_nbctl lsp-set-type $lsp_join_guest router > +check multinode_nbctl lsp-set-options $lsp_join_guest > router-port=$lrp_guest_join > +check multinode_nbctl lsp-set-addresses $lsp_join_guest router > +check multinode_nbctl lrp-set-gateway-chassis $lrp_guest_join ovn-gw-1 20 > +check multinode_nbctl lrp-set-gateway-chassis $lrp_guest_join ovn-gw-2 20 > + > +add_guest_vm_and_connections "ovn-gw" 1 > +add_guest_vm_and_connections "ovn-gw" 2 > + > +check multinode_nbctl --gateway-port $lrp_guest_join --add-route lr-nat-add > $lr_guest dnat_and_snat 172.16.10.2 192.168.10.10 > + > +OVS_WAIT_UNTIL([m_central_as ovn-sbctl list Advertised_Route | grep -q > 172.16.10.2]) > +OVS_WAIT_UNTIL([m_as ovn-gw-1 ip netns exec frr-ns ip route | grep -q > 'ext1']) > +OVS_WAIT_UNTIL([m_as ovn-gw-1 ip netns exec frr-ns ping -W 1 -c 1 > 172.16.10.2]) > +OVS_WAIT_UNTIL([m_as ovn-gw-2 ip netns exec frr-ns ip route | grep -q > 'ext1']) > +OVS_WAIT_UNTIL([m_as ovn-gw-2 ip netns exec frr-ns ping -W 1 -c 1 > 172.16.10.2]) > + > +AT_CLEANUP > -- > 2.43.0 > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev >
_______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev