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

Russell Bryant russell at ovn.org
Thu Jul 7 19:49:56 UTC 2016


Thanks for working on this!  A few comments ...

On Mon, Jul 4, 2016 at 7:10 AM, Numan Siddique <nusiddiq at redhat.com> wrote:

> ovn-controller will now bind the l2gateway logical ports.
>
> Signed-Off-by: Numan Siddique <nusiddiq at redhat.com>
> ---
>  ovn/TODO                 |  9 ---------
>  ovn/controller/binding.c | 33 +++++++++++++++++++++++----------
>  ovn/ovn-nb.xml           |  7 +++++++
>  ovn/ovn-sb.xml           |  6 ++++++
>  tests/ovn.at             |  5 +----
>  5 files changed, 37 insertions(+), 23 deletions(-)
>
> diff --git a/ovn/TODO b/ovn/TODO
> index 3f358c2..5b9d829 100644
> --- a/ovn/TODO
> +++ b/ovn/TODO
> @@ -249,12 +249,3 @@ large.
>  ** Support log option.
>
>  * Software L2 gateway
>

You can remove this line, as well.


> -
> -** 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..d28cd80 100644
> --- a/ovn/controller/binding.c
> +++ b/ovn/controller/binding.c
> @@ -222,16 +222,29 @@ 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,
> "chassis");
>

Can we change this to "l2gateway-chassis" instead of just "chassis"?  That
will make it consistent with the L3 gateway option name, which is
"gateway-chassis", corresponding to the "gateway" port type.my ri


> +        if (!chassis_id) {
>


I think one case is missing here.  If the chassis option is changed, the
chassis column won't be cleared.

In the normal case, it should work itself out, because another
ovn-controller will change the chassis column.  However, if the option is
set to a bad value, or for a host that is currently down, the port will
stay bound to this chassis, when really it should be set to NULL.

I think you can just change this to:

    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..db56e5d 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="chassis">
>

This will need to change to "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..6bc7208 100644
> --- a/ovn/ovn-sb.xml
> +++ b/ovn/ovn-sb.xml
> @@ -1657,6 +1657,12 @@ tcp.flags = RST;
>          </p>
>        </column>
>
> +      <column name="options" key="chassis">
>

"l2gateway-chassis".


> +        Required. <code>ovn-controller</code> running on the defined
> chassis
> +        will bind the <code>l2gateway</code> logical port and connect it
> to the
> +        physical network.
> +      </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
>

The documentation for the "chassis" column of Port_Binding will need to be
updated in this file, as well.  It still refers to the old behavior.


> diff --git a/tests/ovn.at b/tests/ovn.at
> index feb68d3..78311ed 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 chassis=hv_gw
>

l2gateway-chassis after the option name change.


>  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 lport-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 at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



-- 
Russell Bryant



More information about the dev mailing list