Add multinode test suite which starts the ovn-ic process. This enables
to testing of transit routers created using ovn-ic-nbctl with
ovn-fake-multinode.

Signed-off-by: Mairtin O'Loingsigh <[email protected]>
---
 NEWS                            |   1 +
 tests/automake.mk               |  29 ++++
 tests/multinode-ic-testsuite.at |  27 ++++
 tests/multinode-ic.at           | 256 ++++++++++++++++++++++++++++++++
 tests/multinode-macros.at       |  24 +++
 5 files changed, 337 insertions(+)
 create mode 100644 tests/multinode-ic-testsuite.at
 create mode 100644 tests/multinode-ic.at

diff --git a/NEWS b/NEWS
index a4c8557ee..b439a1e65 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,6 @@
 Post v25.09.0
 -------------
+   - Added new testsuite which enables ovn-ic.
    - Added support for TLS Server Name Indication (SNI) with the new
      --ssl-server-name option in OVN utilities and daemons. This allows
      specifying the server name for SNI, which is useful when connecting
diff --git a/tests/automake.mk b/tests/automake.mk
index 8ae310547..92a357fec 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -7,12 +7,14 @@ EXTRA_DIST += \
        $(SYSTEM_USERSPACE_TESTSUITE_AT) \
        $(PERF_TESTSUITE_AT) \
        $(MULTINODE_TESTSUITE_AT) \
+       $(MULTINODE_IC_TESTSUITE_AT) \
        $(TESTSUITE) \
        $(SYSTEM_DPDK_TESTSUITE) \
        $(SYSTEM_KMOD_TESTSUITE) \
        $(SYSTEM_USERSPACE_TESTSUITE) \
        $(PERF_TESTSUITE) \
        $(MULTINODE_TESTSUITE) \
+       $(MULTINODE_IC_TESTSUITE) \
        tests/atlocal.in \
        $(srcdir)/package.m4 \
        $(srcdir)/tests/testsuite \
@@ -77,6 +79,12 @@ MULTINODE_TESTSUITE_AT = \
        tests/multinode-macros.at \
        tests/multinode.at
 
+MULTINODE_IC_TESTSUITE_AT = \
+       tests/multinode-bgp-macros.at \
+       tests/multinode-ic-testsuite.at \
+       tests/multinode-macros.at \
+       tests/multinode-ic.at
+
 check_SCRIPTS += tests/atlocal
 
 TESTSUITE = $(srcdir)/tests/testsuite
@@ -93,6 +101,10 @@ MULTINODE_TESTSUITE = $(srcdir)/tests/multinode-testsuite
 MULTINODE_TESTSUITE_DIR = $(abs_top_builddir)/tests/multinode-testsuite.dir
 MULTINODE_TESTSUITE_RESULTS = $(MULTINODE_TESTSUITE_DIR)/results
 AUTOTEST_PATH = 
$(ovs_builddir)/utilities:$(ovs_builddir)/vswitchd:$(ovs_builddir)/ovsdb:$(ovs_builddir)/vtep:tests:$(PTHREAD_WIN32_DIR_DLL):$(SSL_DIR):controller-vtep:northd:utilities:controller:ic:br-controller
+MULTINODE_IC_TESTSUITE = $(srcdir)/tests/multinode-ic-testsuite
+MULTINODE_IC_TESTSUITE_DIR = 
$(abs_top_builddir)/tests/multinode-ic-testsuite.dir
+MULTINODE_IC_TESTSUITE_RESULTS = $(MULTINODE_IC_TESTSUITE_DIR)/results
+AUTOTEST_PATH = 
$(ovs_builddir)/utilities:$(ovs_builddir)/vswitchd:$(ovs_builddir)/ovsdb:$(ovs_builddir)/vtep:tests:$(PTHREAD_WIN32_DIR_DLL):$(SSL_DIR):controller-vtep:northd:utilities:controller:ic
 
 export ovs_srcdir
 export ovs_builddir
@@ -233,6 +245,19 @@ check-multinode: all
        @cat $(MULTINODE_TESTSUITE_RESULTS)
        @echo
        @echo "Results can be found in $(MULTINODE_TESTSUITE_RESULTS)"
+
+check-multinode-ic: all
+       @mkdir -p $(MULTINODE_IC_TESTSUITE_DIR)
+       @echo  > $(MULTINODE_IC_TESTSUITE_RESULTS)
+       set $(SHELL) '$(MULTINODE_IC_TESTSUITE)' -C tests  
AUTOTEST_PATH='$(AUTOTEST_PATH)'; \
+       "$$@" $(TESTSUITEFLAGS) -j1 || (test X'$(RECHECK)' = Xyes && "$$@" 
--recheck)
+       @echo
+       @echo  '## -------------------- ##'
+       @echo  '##  Multinode test Results ##'
+       @echo  '## -------------------- ##'
+       @cat $(MULTINODE_IC_TESTSUITE_RESULTS)
+       @echo
+       @echo "Results can be found in $(MULTINODE_IC_TESTSUITE_RESULTS)"
 
 AUTOTEST = $(AUTOM4TE) --language=autotest
 
@@ -267,6 +292,10 @@ $(MULTINODE_TESTSUITE): package.m4 
$(MULTINODE_TESTSUITE_AT) $(COMMON_MACROS_AT)
        $(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o [email protected] [email protected]
        $(AM_V_at)mv [email protected] $@
 
+$(MULTINODE_IC_TESTSUITE): package.m4 $(MULTINODE_IC_TESTSUITE_AT) 
$(COMMON_MACROS_AT)
+       $(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o [email protected] [email protected]
+       $(AM_V_at)mv [email protected] $@
+
 # The `:;' works around a Bash 3.2 bug when the output is not writeable.
 $(srcdir)/package.m4: $(top_srcdir)/configure.ac
        $(AM_V_GEN):;{ \
diff --git a/tests/multinode-ic-testsuite.at b/tests/multinode-ic-testsuite.at
new file mode 100644
index 000000000..a75cc8b0c
--- /dev/null
+++ b/tests/multinode-ic-testsuite.at
@@ -0,0 +1,27 @@
+AT_INIT
+
+AT_COPYRIGHT([Copyright (c) 2025 Red Hat,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at:
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.])
+
+m4_ifdef([AT_COLOR_TESTS], [AT_COLOR_TESTS])
+AT_ARG_OPTION([rebuild], [Do not use cached versions of databases])
+
+m4_include([tests/ovs-macros.at])
+m4_include([tests/ovsdb-macros.at])
+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-ic.at])
diff --git a/tests/multinode-ic.at b/tests/multinode-ic.at
new file mode 100644
index 000000000..d6a52d882
--- /dev/null
+++ b/tests/multinode-ic.at
@@ -0,0 +1,256 @@
+AT_BANNER([ovn multinode interconnect system tests using ovn-fake-multinode])
+
+AT_SETUP([ovn multinode - Transit Router using basic functionality])
+
+# Check that ovn-fake-multinode setup is up and running
+check_fake_multinode_setup
+
+# Delete the multinode NB and OVS resources before starting the test.
+cleanup_multinode_resources
+
+# Network topology
+#    ┌─────────────────────────────────┐     ┌────────────────────────────────┐
+#    │                                 │     │                                │
+#    │    ┌───────────────────┐   AZ1  │     │  AZ2   ┌───────────────────┐   │
+#    │    │     external      │        │     │        │                   │   │
+#    │    │                   │        │     │        │                   │   │
+#    │    │ 192.168.100.10/24 │        │     │        │ ................. │   │
+#    │    │    1000::10/64    │        │     │        │                   │   │
+#    │    └─────────┬─────────┘        │     │        └─────────┬─────────┘   │
+#    │              │                  │     │                  │             │
+#    │              │                  │     │                  │             │
+#    │    ┌─────────┴─────────┐        │     │        ┌─────────┴─────────┐   │
+#    │    │ 192.168.100.1/24  │        │     │        │ 192.168.100.2/24  │   │
+#    │    │    1000::1/64     │        │     │        │    1000::2/64     │   │
+#    │    │                   │        │     │        │                   │   │
+#    │    │        GW         │        │     │        │        GW         │   │
+#    │    │                   │        │     │        │                   │   │
+#    │    │   100.65.0.1/30   │        │     │        │   100.65.0.5/30   │   │
+#    │    │   100:65::1/126   │        │     │        │   100:65::5/126   │   │
+#    │    └─────────┬─────────┘        │     │        └───────────────────┘   │
+#    │              │                  │     │                  │             │
+#    │              │  Peer ports      │     │                  │  Peer ports │
+#    │              │                  │     │                  │             │
+#    │    ┌─────────┴──────────────────│─────│──────────────────┴─────────┐   │
+#    │    │   100.65.0.2/30            │     │            100.65.0.6/30   │   │
+#    │    │   100:65::2/126            │     │            100:65::6/126   │   │
+#    │    │                            │     │                            │   │
+#    │    │                            │  TR │                            │   │
+#    │    │                            │     │                            │   │
+#    │    │  10.100.200.1/24           │     │           10.100.200.1/24  │   │
+#    │    │   10:200::1/64             │     │            10:200::1/64    │   │
+#    │    └─────────┬──────────────────│─────│────────────────────────────┘   │
+#    │              │                  │     │                  │             │
+#    │              │                  │     │                  │             │
+#    │              │                  │     │                  │             │
+#    │    ┌─────────┴──────────────────│─────│────────────────────────────┐   │
+#    │    │                            │  TS │                            │   │
+#    │    └─────────┬──────────────────│─────│────────────────────────────┘   │
+#    │              │                  │     │                  │             │
+#    │              │                  │     │                  │             │
+#    │              │                  │     │                  │             │
+#    │    ┌─────────┴─────────┐        │     │        ┌─────────┴─────────┐   │
+#    │    │       pod10       │        │     │        │       pod20       │   │
+#    │    │                   │        │     │        │                   │   │
+#    │    │  10.100.200.10/24 │        │     │        │  10.100.200.20/24 │   │
+#    │    │   10:200::10/64   │        │     │        │   10:200::20/64   │   │
+#    │    └───────────────────┘        │     │        └───────────────────┘   │
+#    └─────────────────────────────────┘     └────────────────────────────────┘
+
+for i in 1 2; do
+    chassis="ovn-chassis-$i"
+    multinode_setup_northd $chassis
+    multinode_setup_ic $chassis
+done
+
+for i in 1 2; do
+    chassis="ovn-chassis-$i"
+    ip=$(m_as $chassis ip -4 addr show eth1 | grep inet | awk '{print $2}' | 
cut -d'/' -f1)
+
+    #multinode_setup_northd $chassis
+    multinode_setup_controller $chassis $chassis $ip $ip
+
+    check m_as $chassis ovs-vsctl set open . external_ids:ovn-monitor-all=true
+    check m_as $chassis ovs-vsctl set open . external_ids:ovn-is-interconn=true
+
+    OVS_WAIT_UNTIL([m_as ovn-chassis-1 sleep 1])
+
+    check m_as $chassis ovn-nbctl ls-add public
+
+    check m_as $chassis ovn-nbctl lsp-add public public-gw
+    check m_as $chassis ovn-nbctl lsp-set-type public-gw router
+    check m_as $chassis ovn-nbctl lsp-set-addresses public-gw router
+    check m_as $chassis ovn-nbctl lsp-set-options public-gw 
router-port=gw-public
+
+    check m_as $chassis ovn-nbctl lr-add gw
+    check m_as $chassis ovn-nbctl lrp-add gw gw-public 00:00:00:00:20:00 
192.168.100.$i/24 1000::$i/64
+
+    check m_as $chassis ovn-nbctl set logical_router gw 
options:chassis=$chassis
+
+    # Add TR and set the same tunnel key for both chassis
+    check m_as $chassis ovn-nbctl ls-add ts
+    check m_as $chassis ovn-nbctl set logical_switch ts 
other_config:requested-tnl-key=10
+
+    check m_as $chassis ovn-nbctl lsp-add ts ts-tr
+    check m_as $chassis ovn-nbctl lsp-set-type ts-tr router
+    check m_as $chassis ovn-nbctl lsp-set-addresses ts-tr router
+    check m_as $chassis ovn-nbctl lsp-set-options ts-tr router-port=tr-ts
+
+    # Add TS pods, with the same tunnel keys on both sides
+    check m_as $chassis ovn-nbctl lsp-add ts pod10
+    check m_as $chassis ovn-nbctl lsp-set-addresses pod10 "00:00:00:00:10:10 
10.100.200.10 10:200::10"
+    check m_as $chassis ovn-nbctl set logical_switch_port pod10 
options:requested-tnl-key=10
+
+    check m_as $chassis ovn-nbctl lsp-add ts pod20
+    check m_as $chassis ovn-nbctl lsp-set-addresses pod20 "00:00:00:00:10:20 
10.100.200.20 10:200::20"
+    check m_as $chassis ovn-nbctl set logical_switch_port pod20 
options:requested-tnl-key=20
+
+    # Add mgmt pod
+    check m_as $chassis ovn-nbctl lsp-add ts mgmt
+    check m_as $chassis ovn-nbctl lsp-set-addresses mgmt "00:00:00:00:10:11 
10.100.200.11 10:200::11"
+    check m_as $chassis ovn-nbctl set logical_switch_port mgmt 
options:requested-tnl-key=11
+done
+
+check m_as ovn-chassis-1 ovn-ic-nbctl --db=tcp:170.168.0.2:6645 tr-add tr
+
+check m_as ovn-chassis-1 ovn-nbctl lrp-add tr tr-ts 00:00:00:00:10:00 
10.100.200.1/24 10:200::1/64
+check m_as ovn-chassis-1 ovn-nbctl set logical_router tr 
options:requested-tnl-key=20
+check m_as ovn-chassis-1 ovn-nbctl lrp-set-gateway-chassis tr-ts ovn-chassis-1
+
+check m_as ovn-chassis-2 ovn-nbctl lrp-add tr tr-ts 00:00:00:00:10:00 
10.100.200.1/24 10:200::1/64
+check m_as ovn-chassis-2 ovn-nbctl set logical_router tr 
options:requested-tnl-key=20
+check m_as ovn-chassis-2 ovn-nbctl lrp-set-gateway-chassis tr-ts ovn-chassis-2
+
+OVS_WAIT_UNTIL([m_as ovn-chassis-1 ovn-nbctl lrp-list tr | grep tr-ts])
+OVS_WAIT_UNTIL([m_as ovn-chassis-2 ovn-nbctl lrp-list tr | grep tr-ts])
+
+# Add SNAT for the GW router that corresponds to "gw-tr" LRP IP
+check m_as ovn-chassis-1 ovn-nbctl lr-nat-add gw snat 100.65.0.1 
192.168.100.0/24
+check m_as ovn-chassis-1 ovn-nbctl lr-nat-add gw snat 100:65::1 1000::/64
+check m_as ovn-chassis-2 ovn-nbctl lr-nat-add gw snat 100.65.0.5 
192.168.100.0/24
+check m_as ovn-chassis-2 ovn-nbctl lr-nat-add gw snat 100:65::5 1000::/64
+
+# Add peer ports between GW and TR
+check m_as ovn-chassis-1 ovn-nbctl lrp-add gw gw-tr 00:00:00:00:30:01 
100.65.0.1/30 100:65::1/126 peer=tr-gw
+check m_as ovn-chassis-1 ovn-nbctl lrp-add tr tr-gw 00:00:00:00:30:02 
100.65.0.2/30 100:65::2/126 peer=gw-tr
+
+check m_as ovn-chassis-2 ovn-nbctl lrp-add gw gw-tr 00:00:00:00:30:05 
100.65.0.5/30 100:65::5/126 peer=tr-gw
+check m_as ovn-chassis-2 ovn-nbctl lrp-add tr tr-gw 00:00:00:00:30:06 
100.65.0.6/30 100:65::6/126 peer=gw-tr
+
+# Add routes for the TS subnet
+check m_as ovn-chassis-1 ovn-nbctl lr-route-add gw 10.100.200.0/24 100.65.0.2
+check m_as ovn-chassis-1 ovn-nbctl lr-route-add gw 10:200::/64 100:65::2
+check m_as ovn-chassis-2 ovn-nbctl lr-route-add gw 10.100.200.0/24 100.65.0.6
+check m_as ovn-chassis-2 ovn-nbctl lr-route-add gw 10:200::/64 100:65::6
+
+# Add LB on TS and condition NAT
+check m_as ovn-chassis-1 ovn-nbctl lb-add lb0 172.16.0.5:5656 
10.100.200.10:2324 tcp
+check m_as ovn-chassis-1 ovn-nbctl ls-lb-add ts lb0
+check m_as ovn-chassis-1 ovn-nbctl --match="eth.dst == 00:00:00:00:10:11" 
lr-nat-add tr snat 172.16.0.2 10.100.200.0/24
+check m_as ovn-chassis-1 ovn-nbctl set logical_router tr 
options:ct-commit-all="true"
+
+# Add mutual remote ports
+check m_as ovn-chassis-1 ovn-nbctl lrp-add tr tr-az2 00:00:00:00:30:06 
100.65.0.6/30 100:65::6/126
+check m_as ovn-chassis-1 ovn-nbctl set logical_router_port tr-az2 
options:requested-chassis=ovn-chassis-2
+
+check m_as ovn-chassis-2 ovn-nbctl lrp-add tr tr-az1 00:00:00:00:30:02 
100.65.0.2/30 100:65::2/126
+check m_as ovn-chassis-2 ovn-nbctl set logical_router_port tr-az1 
options:requested-chassis=ovn-chassis-1
+
+# Important set the proper tunnel keys
+check m_as ovn-chassis-1 ovn-nbctl set logical_router_port tr-gw 
options:requested-tnl-key=10
+check m_as ovn-chassis-1 ovn-nbctl set logical_router_port tr-az2 
options:requested-tnl-key=20
+
+check m_as ovn-chassis-2 ovn-nbctl set logical_router_port tr-gw 
options:requested-tnl-key=20
+check m_as ovn-chassis-2 ovn-nbctl set logical_router_port tr-az1 
options:requested-tnl-key=10
+
+check m_as ovn-chassis-1 ovn-nbctl lsp-add public external
+check m_as ovn-chassis-1 ovn-nbctl lsp-set-addresses external 
"00:00:00:00:20:10 192.168.100.10 1000::10"
+
+# Add mutual chassis
+m_as ovn-chassis-1 ovn-sbctl chassis-add ovn-chassis-2 geneve $(m_as 
ovn-chassis-2 ip -4 addr show eth1 | grep inet | awk '{print $2}' | cut -d'/' 
-f1)
+m_as ovn-chassis-1 ovn-sbctl set chassis ovn-chassis-2 
other_config:is-remote=true
+
+m_as ovn-chassis-2 ovn-sbctl chassis-add ovn-chassis-1 geneve $(m_as 
ovn-chassis-1 ip -4 addr show eth1 | grep inet | awk '{print $2}' | cut -d'/' 
-f1)
+m_as ovn-chassis-2 ovn-sbctl set chassis ovn-chassis-1 
other_config:is-remote=true
+
+# Configure ports on the transit switch as remotes
+check m_as ovn-chassis-1 ovn-nbctl lsp-set-type pod20 remote
+check m_as ovn-chassis-1 ovn-nbctl lsp-set-options pod10 
requested-chassis=ovn-chassis-1
+check m_as ovn-chassis-1 ovn-nbctl lsp-set-options mgmt 
requested-chassis=ovn-chassis-1
+check m_as ovn-chassis-1 ovn-nbctl lsp-set-options pod20 
requested-chassis=ovn-chassis-2
+
+check m_as ovn-chassis-2 ovn-nbctl lsp-set-type pod10 remote
+check m_as ovn-chassis-2 ovn-nbctl lsp-set-type mgmt remote
+check m_as ovn-chassis-2 ovn-nbctl lsp-set-options pod10 
requested-chassis=ovn-chassis-1
+check m_as ovn-chassis-2 ovn-nbctl lsp-set-options mgmt 
requested-chassis=ovn-chassis-1
+check m_as ovn-chassis-2 ovn-nbctl lsp-set-options pod20 
requested-chassis=ovn-chassis-2
+
+m_as ovn-chassis-1 /data/create_fake_vm.sh external external 00:00:00:00:20:10 
1500 192.168.100.10 24 192.168.100.1 1000::10/64 1000::1
+m_as ovn-chassis-1 /data/create_fake_vm.sh pod10 pod10 00:00:00:00:10:10 1500 
10.100.200.10 24 10.100.200.1 10:200::10/64 10:200::1
+m_as ovn-chassis-1 /data/create_fake_vm.sh mgmt mgmt 00:00:00:00:10:11 1500 
10.100.200.11 24 10.100.200.1 10:200::11/64 10:200::1
+m_as ovn-chassis-2 /data/create_fake_vm.sh pod20 pod20 00:00:00:00:10:20 1500 
10.100.200.20 24 10.100.200.1 10:200::20/64 10:200::1
+
+# We cannot use any of the helpers as they assume that there is only single 
ovn-northd instance running
+check m_as ovn-chassis-1 ovn-nbctl --wait=hv sync
+OVS_WAIT_UNTIL([test -n "$(m_as ovn-chassis-1 ovn-sbctl --bare --columns _uuid 
find Port_Binding logical_port=external up=true)"])
+OVS_WAIT_UNTIL([test -n "$(m_as ovn-chassis-1 ovn-sbctl --bare --columns _uuid 
find Port_Binding logical_port=pod10 up=true)"])
+check m_as ovn-chassis-2 ovn-nbctl --wait=hv sync
+OVS_WAIT_UNTIL([test -n "$(m_as ovn-chassis-2 ovn-sbctl --bare --columns _uuid 
find Port_Binding logical_port=pod20 up=true)"])
+
+M_NS_CHECK_EXEC([ovn-chassis-1], [external], [ping -q -c 5 -i 0.3 -w 2 
10.100.200.20 | FORMAT_PING], \
+[0], [dnl
+5 packets transmitted, 5 received, 0% packet loss, time 0ms
+])
+
+M_NS_CHECK_EXEC([ovn-chassis-1], [external], [ping -q -c 5 -i 0.3 -w 2 
10:200::20 | FORMAT_PING], \
+[0], [dnl
+5 packets transmitted, 5 received, 0% packet loss, time 0ms
+])
+
+M_NS_CHECK_EXEC([ovn-chassis-1], [mgmt], [ip a a 172.16.100.2/24 dev mgmt])
+M_NS_DAEMONIZE([ovn-chassis-1], [pod10], [nc -e /bin/cat -v -l -o server.log 
10.100.200.10 2324], [pod10.pid])
+M_START_TCPDUMP([ovn-chassis-1], [-neei pod10-p ip], [pod10])
+M_START_TCPDUMP([ovn-chassis-1], [-neei mgmt-p ip], [mgmt])
+
+m_as ovn-chassis-1 sh -c 'echo -e "Hello\nHello" > msg.expected'
+check m_as ovn-chassis-1 ovn-nbctl --policy="src-ip" lr-route-add tr 
10.100.200.0/24 10.100.200.11
+
+check test $(m_as ovn-chassis-1 grep -c "skipping output to input port" \
+    /var/log/openvswitch/ovs-vswitchd.log) -eq 0
+check test $(m_as ovn-chassis-2 grep -c "skipping output to input port" \
+    /var/log/openvswitch/ovs-vswitchd.log) -eq 0
+
+M_NS_CHECK_EXEC([ovn-chassis-1], [mgmt], [sh -c '(echo "Hello"; sleep 3) | nc 
-s 172.16.100.2 -o client.log 172.16.0.5 5656'], [0], [ignore], [ignore])
+check m_as ovn-chassis-1 cmp server.log msg.expected
+check m_as ovn-chassis-1 cmp client.log msg.expected
+
+echo "Chassis1"
+m_as ovn-chassis-1 ovn-sbctl show
+m_as ovn-chassis-1 ovn-nbctl show
+m_as ovn-chassis-1 ovs-vsctl show
+
+echo "Chassis2"
+a_as ovn-chassis-2 ovn-sbctl show
+m_as ovn-chassis-2 ovn-nbctl show
+m_as ovn-chassis-2 ovs-vsctl show
+
+m_as ovn-central-az1 ovn-ic-nbctl tr-del tr
+
+for i in 1 2; do
+    chassis="ovn-chassis-$i"
+    multinode_cleanup_ic $chassis
+done
+
+# Connect the chassis back to the original northd and remove northd per 
chassis.
+for i in 1 2; do
+    chassis="ovn-chassis-$i"
+    ip=$(m_as $chassis ip -4 addr show eth1 | grep inet | awk '{print $2}' | 
cut -d'/' -f1)
+
+    multinode_setup_controller $chassis $chassis $ip "170.168.0.2"
+    multinode_cleanup_northd $chassis
+done
+
+m_as ovn-chassis-1 killall tcpdump
+#cleanup_multinode_resources
+
+AT_CLEANUP
diff --git a/tests/multinode-macros.at b/tests/multinode-macros.at
index 487696a62..4a86cef4a 100644
--- a/tests/multinode-macros.at
+++ b/tests/multinode-macros.at
@@ -142,6 +142,7 @@ check_fake_multinode_setup_by_nodes() {
               --ovn-northd-ssl-key=${SSL_CERTS_PATH}/ovn-privkey.pem \
               --ovn-northd-ssl-cert=${SSL_CERTS_PATH}/ovn-cert.pem \
               
--ovn-northd-ssl-ca-cert=${SSL_CERTS_PATH}/pki/switchca/cacert.pem"
+
     else
         REMOTE_PROT=tcp
         CONTROLLER_SSL_ARGS=""
@@ -184,6 +185,9 @@ cleanup_multinode_resources_by_nodes() {
         for i in $(m_as $c ovs-vsctl --bare --columns name list port | grep 
patch); do
             m_as $c ovs-vsctl del-port $i;
         done
+        for i in $(m_as $c ip -o link show | awk -F': ' '{print $2}' | grep 
sw0p | awk -F'@' '{print $1}'); do
+            m_as $c ip link delete $i;
+        done
     done
 }
 
@@ -217,6 +221,26 @@ multinode_setup_northd() {
     m_as $c ovn-sbctl set-connection p${REMOTE_PROT}:6642
 }
 
+# multinode_cleanup_ic NODE
+#
+# Removes previously set nothd on specified node
+multinode_cleanup_ic() {
+    c=$1
+    # Cleanup existing one
+    m_as $c /usr/share/ovn/scripts/ovn-ctl stop_ic
+}
+
+# multinode_setup_ic NODE
+#
+# Sets up ovn_ic on specified node.
+multinode_setup_ic() {
+    c=$1
+
+    check m_as $c ovn-nbctl set NB_Global . name=$c
+    m_as $c ovs-vsctl set open_vswitch . external_ids:ovn-is-interconn=true
+    m_as $c /usr/share/ovn/scripts/ovn-ctl start_ic 
--ovn-ic-nb-db=tcp:170.168.0.2:6645 --ovn-ic-sb-db=tcp:170.168.0.2:6646
+}
+
 # multinode_setup_controller NODE ENCAP_IP REMOTE_IP [ENCAP_TYPE]
 #
 # Sets up controller on specified node.
-- 
2.51.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to