ovn-controller will now bind the l2gateway logical ports. Signed-Off-by: Numan Siddique <nusid...@redhat.com> --- ovn/TODO | 11 ----------- ovn/controller/binding.c | 34 ++++++++++++++++++++++++---------- ovn/ovn-nb.xml | 7 +++++++ ovn/ovn-sb.xml | 8 ++++++-- tests/ovn.at | 5 +---- 5 files changed, 38 insertions(+), 27 deletions(-)
diff --git a/ovn/TODO b/ovn/TODO index 3f358c2..4f134a4 100644 --- a/ovn/TODO +++ b/ovn/TODO @@ -247,14 +247,3 @@ large. ** Support reject action. ** Support log option. - -* Software L2 gateway - -** Support "chassis" option in Logical_Switch_Port with type of "l2gateway". - - Right now an "l2gateway" port is bound to a chassis by setting the "chassis" - column of the port binding in the southbound database directly. We should - support a "chassis" option in the "options" column of the - "Logical_Switch_Port" in the northbound database. This would bring - "l2gateway" into alignment with how chassis binding is done for L3 gateways - (a "chassis" option for Logical_Router). diff --git a/ovn/controller/binding.c b/ovn/controller/binding.c index 4e5c1df..3061b34 100644 --- a/ovn/controller/binding.c +++ b/ovn/controller/binding.c @@ -222,16 +222,30 @@ consider_local_datapath(struct controller_ctx *ctx, struct shash *lports, } sbrec_port_binding_set_chassis(binding_rec, chassis_rec); } - } else if (!strcmp(binding_rec->type, "l2gateway") - && binding_rec->chassis == chassis_rec) { - /* A locally bound L2 gateway port. - * - * ovn-controller does not bind gateway ports itself. - * Choosing a chassis for a gateway port is left - * up to an entity external to OVN. */ - sset_add(&all_lports, binding_rec->logical_port); - add_local_datapath(local_datapaths, binding_rec, - &binding_rec->header_.uuid); + } else if (!strcmp(binding_rec->type, "l2gateway")) { + const char *chassis_id = smap_get(&binding_rec->options, + "l2gateway-chassis"); + if (!chassis_id || strcmp(chassis_id, chassis_rec->name)) { + if ((binding_rec->chassis == chassis_rec) && ctx->ovnsb_idl_txn) { + VLOG_INFO("Releasing l2gateway port %s from this chassis.", + binding_rec->logical_port); + sbrec_port_binding_set_chassis(binding_rec, NULL); + } + return; + } + + if (binding_rec->chassis == chassis_rec) { + return; + } + + if (!strcmp(chassis_id, chassis_rec->name) && ctx->ovnsb_idl_txn) { + VLOG_INFO("Claiming l2gateway port %s for this chassis.", + binding_rec->logical_port); + sbrec_port_binding_set_chassis(binding_rec, chassis_rec); + sset_add(&all_lports, binding_rec->logical_port); + add_local_datapath(local_datapaths, binding_rec, + &binding_rec->header_.uuid); + } } else if (chassis_rec && binding_rec->chassis == chassis_rec && strcmp(binding_rec->type, "gateway")) { if (ctx->ovnsb_idl_txn) { diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml index ff2e695..5542ea4 100644 --- a/ovn/ovn-nb.xml +++ b/ovn/ovn-nb.xml @@ -197,6 +197,13 @@ uses its local configuration to determine exactly how to connect to this network. </column> + + <column name="options" key="l2gateway-chassis"> + Required. The chassis on which the <code>l2gateway</code> logical + port should be bound to. <code>ovn-controller</code> running on the + defined chassis will connect this logical port to the physical network. + </column> + </group> <group title="Options for vtep ports"> diff --git a/ovn/ovn-sb.xml b/ovn/ovn-sb.xml index 759513f..9628256 100644 --- a/ovn/ovn-sb.xml +++ b/ovn/ovn-sb.xml @@ -1476,8 +1476,8 @@ tcp.flags = RST; <dd> The physical location of this L2 gateway. To successfully identify a chassis, this column must be a <ref table="Chassis"/> record. - This is populated by an entity external to OVN, either manually or by - a CMS. + This is populated by <code>ovn-controller</code> based on the value + of the <code>options:l2gateway-chassis</code> column in this table. </dd> </dl> @@ -1657,6 +1657,10 @@ tcp.flags = RST; </p> </column> + <column name="options" key="l2gateway-chassis"> + Required. The <code>chassis</code> in which the port resides. + </column> + <column name="tag"> If set, indicates that the gateway is connected to a specific VLAN on the physical network. The VLAN ID is used to match diff --git a/tests/ovn.at b/tests/ovn.at index 3f2e779..b28c90e 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -1325,7 +1325,7 @@ ovn-nbctl lsp-set-addresses lp2 f0:00:00:00:00:02 ovn-nbctl lsp-add lsw0 lp-gw ovn-nbctl lsp-set-type lp-gw l2gateway -ovn-nbctl lsp-set-options lp-gw network_name=physnet1 +ovn-nbctl lsp-set-options lp-gw network_name=physnet1 l2gateway-chassis=hv_gw ovn-nbctl lsp-set-addresses lp-gw unknown net_add n1 # Network to connect hv1, hv2, and gw @@ -1355,9 +1355,6 @@ ovs-vsctl add-br br-phys2 net_attach n2 br-phys2 ovs-vsctl set open . external_ids:ovn-bridge-mappings="physnet1:br-phys2" -# Bind our gateway port to the hv_gw chassis -ovn-sbctl lsp-bind lp-gw hv_gw - # Add hv3 on the other side of the GW sim_add hv3 as hv3 -- 2.7.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev