Add monitor for `plugged_by` column.

Add port by interfaces index - To be able to effectively remove
ports previously plugged by us we need to look up ports by
interface records.

Add `enable-dummy-plug` option - To enable testing of the plugging
infrastructure without building OVN with an external plugging
library we include a dummy implementation which can be enabled
using this command line option.

Signed-off-by: Frode Nordahl <frode.nord...@canonical.com>
---
 controller/binding.h        |  1 +
 controller/ovn-controller.c | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/controller/binding.h b/controller/binding.h
index f1abc4b9c..8f4521806 100644
--- a/controller/binding.h
+++ b/controller/binding.h
@@ -46,6 +46,7 @@ struct binding_ctx_in {
     struct ovsdb_idl_index *sbrec_datapath_binding_by_key;
     struct ovsdb_idl_index *sbrec_port_binding_by_datapath;
     struct ovsdb_idl_index *sbrec_port_binding_by_name;
+    struct ovsdb_idl_index *ovsrec_port_by_interfaces;
     const struct ovsrec_port_table *port_table;
     const struct ovsrec_qos_table *qos_table;
     const struct sbrec_port_binding_table *port_binding_table;
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 678419ab3..7c583b959 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -55,7 +55,9 @@
 #include "lib/mcast-group-index.h"
 #include "lib/ovn-sb-idl.h"
 #include "lib/ovn-util.h"
+#include "lib/plug-dummy.h"
 #include "patch.h"
+#include "plug.h"
 #include "physical.h"
 #include "pinctrl.h"
 #include "openvswitch/poll-loop.h"
@@ -232,6 +234,9 @@ update_sb_monitors(struct ovsdb_idl *ovnsb_idl,
         sbrec_port_binding_add_clause_chassis(&pb, OVSDB_F_EQ,
                                               &chassis->header_.uuid);
 
+        sbrec_port_binding_add_clause_plugged_by(&pb, OVSDB_F_EQ,
+                                              &chassis->header_.uuid);
+
         /* Ensure that we find out about l2gateway and l3gateway ports that
          * should be present on this chassis.  Otherwise, we might never find
          * out about those ports, if their datapaths don't otherwise have a VIF
@@ -1239,6 +1244,11 @@ init_binding_ctx(struct engine_node *node,
                 engine_get_input("SB_port_binding", node),
                 "datapath");
 
+    struct ovsdb_idl_index *ovsrec_port_by_interfaces =
+        engine_ovsdb_node_get_index(
+                engine_get_input("OVS_port", node),
+                "interfaces");
+
     struct controller_engine_ctx *ctrl_ctx = engine_get_context()->client_ctx;
 
     b_ctx_in->ovnsb_idl_txn = engine_get_context()->ovnsb_idl_txn;
@@ -1246,6 +1256,7 @@ init_binding_ctx(struct engine_node *node,
     b_ctx_in->sbrec_datapath_binding_by_key = sbrec_datapath_binding_by_key;
     b_ctx_in->sbrec_port_binding_by_datapath = sbrec_port_binding_by_datapath;
     b_ctx_in->sbrec_port_binding_by_name = sbrec_port_binding_by_name;
+    b_ctx_in->ovsrec_port_by_interfaces = ovsrec_port_by_interfaces;
     b_ctx_in->port_table = port_table;
     b_ctx_in->iface_table = iface_table;
     b_ctx_in->qos_table = qos_table;
@@ -3099,6 +3110,11 @@ main(int argc, char *argv[])
     struct ovsdb_idl_loop ovs_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
         ovsdb_idl_create(ovs_remote, &ovsrec_idl_class, false, true));
     ctrl_register_ovs_idl(ovs_idl_loop.idl);
+
+    struct ovsdb_idl_index *ovsrec_port_by_interfaces
+        = ovsdb_idl_index_create1(ovs_idl_loop.idl,
+                                  &ovsrec_port_col_interfaces);
+
     ovsdb_idl_get_initial_snapshot(ovs_idl_loop.idl);
 
     /* Configure OVN SB database. */
@@ -3362,6 +3378,8 @@ main(int argc, char *argv[])
                                 sbrec_port_binding_by_datapath);
     engine_ovsdb_node_add_index(&en_sb_datapath_binding, "key",
                                 sbrec_datapath_binding_by_key);
+    engine_ovsdb_node_add_index(&en_ovs_port, "interfaces",
+                                ovsrec_port_by_interfaces);
 
     struct ed_type_lflow_output *lflow_output_data =
         engine_get_internal_data(&en_lflow_output);
@@ -3883,6 +3901,7 @@ loop_done:
     pinctrl_destroy();
     patch_destroy();
     if_status_mgr_destroy(if_mgr);
+    plug_destroy_all();
 
     ovsdb_idl_loop_destroy(&ovs_idl_loop);
     ovsdb_idl_loop_destroy(&ovnsb_idl_loop);
@@ -3902,6 +3921,7 @@ parse_options(int argc, char *argv[])
         VLOG_OPTION_ENUMS,
         OVN_DAEMON_OPTION_ENUMS,
         SSL_OPTION_ENUMS,
+        OPT_ENABLE_DUMMY_PLUG,
     };
 
     static struct option long_options[] = {
@@ -3912,6 +3932,7 @@ parse_options(int argc, char *argv[])
         STREAM_SSL_LONG_OPTIONS,
         {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT},
         {"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
+        {"enable-dummy-plug", no_argument, NULL, OPT_ENABLE_DUMMY_PLUG},
         {NULL, 0, NULL, 0}
     };
     char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
@@ -3957,6 +3978,10 @@ parse_options(int argc, char *argv[])
             stream_ssl_set_ca_cert_file(optarg, true);
             break;
 
+        case OPT_ENABLE_DUMMY_PLUG:
+            plug_dummy_enable();
+            break;
+
         case '?':
             exit(EXIT_FAILURE);
 
-- 
2.32.0

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

Reply via email to