ovn-controller updates the chassis column of the Bindings table in
OVN_Southbound when a logical port appears on the local switch.  A
logical port that has a parent will never appear on a switch managed
by ovn-controller.  When a parent port appears, all child container
ports should be updated as being on that chassis, as well.

Signed-off-by: Russell Bryant <rbry...@redhat.com>
---
 ovn/controller/bindings.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/ovn/controller/bindings.c b/ovn/controller/bindings.c
index ef233c0..65054c9 100644
--- a/ovn/controller/bindings.c
+++ b/ovn/controller/bindings.c
@@ -76,11 +76,12 @@ bindings_run(struct controller_ctx *ctx)
 {
     const struct sbrec_bindings *bindings_rec;
     struct ovsdb_idl_txn *txn;
-    struct sset lports;
+    struct sset lports, found_lports;
     const char *name;
     int retval;
 
     sset_init(&lports);
+    sset_init(&found_lports);
     get_local_iface_ids(ctx, &lports);
 
     txn = ovsdb_idl_txn_create(ctx->ovnsb_idl);
@@ -90,6 +91,7 @@ bindings_run(struct controller_ctx *ctx)
 
     SBREC_BINDINGS_FOR_EACH(bindings_rec, ctx->ovnsb_idl) {
         if (sset_find_and_delete(&lports, bindings_rec->logical_port)) {
+            sset_add(&found_lports, bindings_rec->logical_port);
             if (!strcmp(bindings_rec->chassis, ctx->chassis_id)) {
                 continue;
             }
@@ -99,6 +101,15 @@ bindings_run(struct controller_ctx *ctx)
                           ctx->chassis_id);
             }
             sbrec_bindings_set_chassis(bindings_rec, ctx->chassis_id);
+        } else if (bindings_rec->parent_port && bindings_rec->parent_port[0] &&
+                (sset_contains(&lports, bindings_rec->parent_port) ||
+                 sset_contains(&found_lports, bindings_rec->parent_port))) {
+            if (bindings_rec->chassis[0]) {
+                VLOG_INFO("Changing chassis for lport %s from %s to %s",
+                          bindings_rec->logical_port, bindings_rec->chassis,
+                          ctx->chassis_id);
+            }
+            sbrec_bindings_set_chassis(bindings_rec, ctx->chassis_id);
         } else if (!strcmp(bindings_rec->chassis, ctx->chassis_id)) {
             sbrec_bindings_set_chassis(bindings_rec, "");
         }
@@ -116,6 +127,7 @@ bindings_run(struct controller_ctx *ctx)
         VLOG_DBG("No binding record for lport %s", name);
     }
     sset_destroy(&lports);
+    sset_destroy(&found_lports);
 }
 
 void
-- 
2.1.0

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to