[ovs-dev] [PATCH v2] ovn: Support l2gateway-chassis option in "l2gateway" logical ports

Numan Siddique nusiddiq at redhat.com
Fri Jul 8 11:37:37 UTC 2016


ovn-controller will now bind the l2gateway logical ports.

Signed-Off-by: Numan Siddique <nusiddiq at 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




More information about the dev mailing list