On 4/4/25 6:20 PM, Lorenzo Bianconi via dev wrote:
>> 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, Lorenzo,

Thanks for the patch and review!  Sorry for the delay on my side.
Next to Lorenzo's comments I also have a few small ones below.

> 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

What if we add a helper to multinode-macros.at?  E.g.:

+# m_is_fedora
+#
+# Checks if the ovn-fake-multinode deployment is running fedora-based images.
+m_is_fedora() {
+    m_central_as grep -qi fedora /etc/os-release
+}
+

And use it as:

if m_is_fedora; then
    ...
else
    ...
fi

where needed?

>> +        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

I guess this should be between quotes:

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
>> -- 

Otherwise, I tested this patch and it seems to work fine both with Fedora
and with Ubuntu images in ovn-fake-multinode.

Thanks,
Dumitru

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to