From: Lucas Alvares Gomes <[email protected]>

In order for the CMS to know which Chassis a distributed gateway port
is bond to, this patch updates the ovn-northd daemon to populate the
Logical_Router_Port table with that information.

To avoid changing the database schema, ovn-northd is setting a new key
called "hosting-chassis" in the options column from the LRP table. This
key value points to the name of the Chassis that is currently hosting
the distributed port.

Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2107515
Signed-off-by: Lucas Alvares Gomes <[email protected]>
---
 northd/northd.c     | 28 ++++++++++++++++++++++++++++
 ovn-nb.xml          | 15 +++++++++++++++
 tests/ovn-northd.at | 34 ++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/northd/northd.c b/northd/northd.c
index fda02c324..667d8358c 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -16440,6 +16440,34 @@ handle_port_binding_changes(struct northd_input 
*input_data,
 
     SBREC_PORT_BINDING_TABLE_FOR_EACH (sb,
                                        input_data->sbrec_port_binding_table) {
+
+        /* Look for a chassisredirect binding and set the "active-chassis"
+         * option in the NBDB logical_router_port table indicating on which
+         * chassis the distributed port is bond to. */
+        if (!strcmp(sb->type, "chassisredirect")) {
+             const char *dist_port =
+                 smap_get(&sb->options, "distributed-port");
+             if (dist_port) {
+                 struct ovn_port *router_port =
+                     ovn_port_find(ports, dist_port);
+                 if (router_port) {
+                     struct smap options;
+                     smap_clone(&options, &router_port->nbrp->options);
+                     if (sb->chassis) {
+                         smap_replace(&options, "hosting-chassis",
+                                      sb->chassis->name);
+                     } else {
+                         smap_remove(&options, "hosting-chassis");
+                     }
+                     nbrec_logical_router_port_set_options(router_port->nbrp,
+                                                           &options);
+                  }
+             }
+             /* Continue since there are no matching logical port for
+              * chassisredirect bindings */
+             continue;
+        }
+
         struct ovn_port *op = ovn_port_find(ports, sb->logical_port);
 
         if (!op || !op->nbsp) {
diff --git a/ovn-nb.xml b/ovn-nb.xml
index 73f707aa0..fcb03a5c6 100644
--- a/ovn-nb.xml
+++ b/ovn-nb.xml
@@ -2993,6 +2993,21 @@ or
             port on the logical router.  It is otherwise ignored.
           </p>
         </column>
+
+        <column name="options" key="hosting-chassis">
+          <p>
+            This option is populated by <code>ovn-northd</code>, rather
+            than by the CMS plugin.
+          </p>
+
+          <p>
+            When a distributed gateway port is bound to a location in
+            the OVN Southbound database
+            <ref db="OVN_Southbound" table="Port_Binding"/>
+            <code>ovn-northd</code> will populate this option with the
+            name of the Chassis that is currently hosting this port.
+          </p>
+        </column>
       </group>
     </group>
 
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index ef29233db..578a42eaf 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -144,6 +144,40 @@ AT_CHECK([test x`ovn-nbctl lsp-get-up S1-R1` = xup])
 AT_CLEANUP
 ])
 
+OVN_FOR_EACH_NORTHD_NO_HV([
+AT_SETUP([check Logical Router Port hosting-chassis option])
+ovn_start
+
+check ovn-sbctl chassis-add ch1 geneve 127.0.0.2
+
+check ovn-nbctl lr-add lr1
+check ovn-nbctl lrp-add lr1 lrp1 00:00:00:00:00:01 10.0.0.1/24
+check ovn-nbctl ls-add ls1
+check ovn-nbctl lsp-add ls1 lsp1 -- \
+    lsp-set-addresses lsp1 router -- \
+    lsp-set-type lsp1 router -- \
+    lsp-set-options lsp1 router-port=lrp1
+
+# make lrp a cr-port
+check ovn-nbctl lrp-set-gateway-chassis lrp1 ch1
+
+ovn-nbctl --wait=sb sync
+
+wait_row_count Port_Binding 1 logical_port=cr-lrp1 \
+    options:always-redirect="true" options:distributed-port="lrp1"
+
+# Simulate cr-port being bound to ch1
+ch1_uuid=`ovn-sbctl --bare --columns _uuid find Chassis name="ch1"`
+ovn-sbctl set Port_Binding cr-lrp1 chassis=${ch1_uuid}
+
+ovn-nbctl --wait=sb sync
+
+# check for ther hosting-chassis option being set by northd
+wait_row_count nb:Logical_Router_Port 1 name=lrp1 options:hosting-chassis=ch1
+
+AT_CLEANUP
+])
+
 OVN_FOR_EACH_NORTHD_NO_HV([
 AT_SETUP([check LRP external id propagation to SBDB])
 ovn_start
-- 
2.40.0

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

Reply via email to