This patch reads the Bridge.datapath_type column value of the integration bridge and sets it in the external_ids:datapath-type of Chassis table.
This will provide hints to the CMS or clients monitoring OVN SB DB to determine the datapath type (DPDK or non-DPDK) configured and take some actions based on it. One usecase is, OVN neutron plugin can use this information to set the vif_type (ovs or vhostuser) during the port binding. Signed-off-by: Numan Siddique <nusid...@redhat.com> --- ovn/controller/chassis.c | 38 ++++++++++++++++++++++++++---- ovn/controller/chassis.h | 3 ++- ovn/controller/ovn-controller.8.xml | 17 +++++++++++++- ovn/controller/ovn-controller.c | 2 +- ovn/ovn-sb.xml | 8 +++++++ tests/ovn-controller.at | 46 +++++++++++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+), 8 deletions(-) v1 -> v2 -------- * Addressed the review comments. Reading the datapath-type from Bridge.datapath_type column instead of adding a new configuration option. diff --git a/ovn/controller/chassis.c b/ovn/controller/chassis.c index a1545ec..86f3ef5 100644 --- a/ovn/controller/chassis.c +++ b/ovn/controller/chassis.c @@ -38,6 +38,8 @@ chassis_register_ovs_idl(struct ovsdb_idl *ovs_idl) { ovsdb_idl_add_table(ovs_idl, &ovsrec_table_open_vswitch); ovsdb_idl_add_column(ovs_idl, &ovsrec_open_vswitch_col_external_ids); + ovsdb_idl_add_table(ovs_idl, &ovsrec_table_bridge); + ovsdb_idl_add_column(ovs_idl, &ovsrec_bridge_col_datapath_type); } static const char * @@ -67,7 +69,8 @@ get_bridge_mappings(const struct smap *ext_ids) /* Returns this chassis's Chassis record, if it is available and is currently * amenable to a transaction. */ const struct sbrec_chassis * -chassis_run(struct controller_ctx *ctx, const char *chassis_id) +chassis_run(struct controller_ctx *ctx, const char *chassis_id, + const struct ovsrec_bridge *br_int) { if (!ctx->ovnsb_idl_txn) { return NULL; @@ -114,6 +117,8 @@ chassis_run(struct controller_ctx *ctx, const char *chassis_id) } const char *bridge_mappings = get_bridge_mappings(&cfg->external_ids); + const char *datapath_type = + br_int && br_int->datapath_type ? br_int->datapath_type : ""; const struct sbrec_chassis *chassis_rec = get_chassis(ctx->ovnsb_idl, chassis_id); @@ -125,10 +130,30 @@ chassis_run(struct controller_ctx *ctx, const char *chassis_id) const char *chassis_bridge_mappings = get_bridge_mappings(&chassis_rec->external_ids); - if (strcmp(bridge_mappings, chassis_bridge_mappings)) { + const char *chassis_datapath_type + = smap_get(&chassis_rec->external_ids, "datapath-type"); + if (!chassis_datapath_type) { + chassis_datapath_type = ""; + } + + if (!strcmp(bridge_mappings, chassis_bridge_mappings)) { + bridge_mappings = NULL; + } + if (!strcmp(datapath_type, chassis_datapath_type)) { + datapath_type = NULL; + } + + if (bridge_mappings || datapath_type) { struct smap new_ids; smap_clone(&new_ids, &chassis_rec->external_ids); - smap_replace(&new_ids, "ovn-bridge-mappings", bridge_mappings); + if (bridge_mappings) { + smap_replace(&new_ids, "ovn-bridge-mappings", bridge_mappings); + } + + if (datapath_type) { + smap_replace(&new_ids, "datapath-type", datapath_type); + } + sbrec_chassis_verify_external_ids(chassis_rec); sbrec_chassis_set_external_ids(chassis_rec, &new_ids); smap_destroy(&new_ids); @@ -169,12 +194,15 @@ chassis_run(struct controller_ctx *ctx, const char *chassis_id) chassis_id); if (!chassis_rec) { - struct smap ext_ids = SMAP_CONST1(&ext_ids, "ovn-bridge-mappings", - bridge_mappings); + struct smap ext_ids = SMAP_INITIALIZER(&ext_ids); + smap_add(&ext_ids, "ovn-bridge-mappings", bridge_mappings); + smap_add(&ext_ids, "datapath-type", datapath_type); + chassis_rec = sbrec_chassis_insert(ctx->ovnsb_idl_txn); sbrec_chassis_set_name(chassis_rec, chassis_id); sbrec_chassis_set_hostname(chassis_rec, hostname); sbrec_chassis_set_external_ids(chassis_rec, &ext_ids); + smap_destroy(&ext_ids); } int n_encaps = count_1bits(req_tunnels); diff --git a/ovn/controller/chassis.h b/ovn/controller/chassis.h index a14da1c..016d71c 100644 --- a/ovn/controller/chassis.h +++ b/ovn/controller/chassis.h @@ -24,7 +24,8 @@ struct ovsrec_bridge; void chassis_register_ovs_idl(struct ovsdb_idl *); const struct sbrec_chassis *chassis_run(struct controller_ctx *, - const char *chassis_id); + const char *chassis_id, + const struct ovsrec_bridge *br_int); bool chassis_cleanup(struct controller_ctx *, const char *chassis_id); #endif /* ovn/chassis.h */ diff --git a/ovn/controller/ovn-controller.8.xml b/ovn/controller/ovn-controller.8.xml index 3fda8e7..d2fd9b4 100644 --- a/ovn/controller/ovn-controller.8.xml +++ b/ovn/controller/ovn-controller.8.xml @@ -156,6 +156,21 @@ </dd> </dl> + <p> + <code>ovn-controller</code> reads the following values from the + <ref table="Bridge" db="Open_vSwitch"/> table of the local OVS integration + bridge. + </p> + + <dl> + <dt><code>datapath-type</code></dt> + <dd> + This value is populated in <ref key="datapath-type" table="Chassis" + column="external_ids" db="OVN_Southbound"/> in the OVN_Southbound + database's <ref table="Chassis" db="OVN_Southbound"/> table. + </dd> + </dl> + <h1>Open vSwitch Database Usage</h1> <p> @@ -173,7 +188,7 @@ integration bridge as one created by <code>ovn-controller</code> to reach a remote chassis. Its value is the chassis ID of the remote chassis. - </dd> + /dd> <dt> <code>external-ids:ovn-localnet-port</code> in the <code>Port</code> diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c index 5c74186..971735a 100644 --- a/ovn/controller/ovn-controller.c +++ b/ovn/controller/ovn-controller.c @@ -432,7 +432,7 @@ main(int argc, char *argv[]) const struct sbrec_chassis *chassis = NULL; if (chassis_id) { - chassis = chassis_run(&ctx, chassis_id); + chassis = chassis_run(&ctx, chassis_id, br_int); encaps_run(&ctx, br_int, chassis_id); binding_run(&ctx, br_int, chassis_id, &local_datapaths); } diff --git a/ovn/ovn-sb.xml b/ovn/ovn-sb.xml index c5f236e..2512754 100644 --- a/ovn/ovn-sb.xml +++ b/ovn/ovn-sb.xml @@ -213,6 +213,14 @@ information. </column> + <column name="external_ids" key="datapath-type"> + <code>ovn-controller</code> populates this key with the datapath type + configured in the <ref table="Bridge" column="datapath_type"/> of the + Open_vSwitch database's <ref table="Bridge" db="Open_vSwitch"/> table. + Other applications should treat this key as read-only. See + <code>ovn-controller</code>(8) for more information. + </column> + <group title="Common Columns"> The overall purpose of these columns is described under <code>Common Columns</code> at the beginning of this document. diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at index a2349a4..e1e47a6 100644 --- a/tests/ovn-controller.at +++ b/tests/ovn-controller.at @@ -151,3 +151,49 @@ OVS_APP_EXIT_AND_WAIT_BY_TARGET([$ovs_base/ovn-sb/ovsdb-server-2.ctl], [$ovs_bas OVS_APP_EXIT_AND_WAIT([ovsdb-server]) AT_CLEANUP + +AT_SETUP([ovn-controller - datapath-type]) +AT_KEYWORDS([ovn]) +ovn_init_db ovn-sb + +net_add n1 +sim_add hv +as hv +ovs-vsctl \ + -- add-br br-phys \ + -- add-br br-eth0 \ + -- add-br br-eth1 \ + -- add-br br-eth2 +ovn_attach n1 br-phys 192.168.0.1 + +# Make sure that the datapath_type set in the bridge table +# is mirrored into the Chassis record in the OVN_Southbound db. +check_datapath_type () { + datapath_type=$1 + sysid=$(ovs-vsctl get Open_vSwitch . external_ids:system-id) + chassis_datapath_type=$(ovn-sbctl get Chassis ${sysid} external_ids:datapath-type | sed -e 's/\"//g') + AT_CHECK([test "${datapath_type}" = "${chassis_datapath_type}"]) +} + +check_datapath_type "" + +ovs-vsctl set Bridge br-int datapath-type=foo +check_datapath_type foo + +# Change "ovn-bridge-mappings" value. It should not change the "datapath-type". +ovs-vsctl set Open_vSwitch . external_ids:ovn-bridge-mappings=foo-mapping +check_datapath_type foo + +ovs-vsctl set Bridge br-int datapath-type=bar +check_datapath_type bar + +ovs-vsctl set Bridge br-int datapath-type=\"\" +check_datapath_type "" + +# Gracefully terminate daemons +OVN_CLEANUP_SBOX([hv]) +OVN_CLEANUP_VSWITCH([main]) +as ovn-sb +OVS_APP_EXIT_AND_WAIT([ovsdb-server]) + +AT_CLEANUP -- 2.7.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev