This patch is superseded
I sent an updated patch with a couple bugs fixed in ovs-vtep

Darrell

On Mon, Apr 25, 2016 at 1:43 PM, Darrell Ball <dlu...@gmail.com> wrote:

> This patch series updates the vtep schema, vtep-ctl commands and vtep
> simulator to support source node replication in addition to service node
> replication per logical switch.  The default replication mode is service
> node
> as that was the only mode previously supported.  Source node replication
> mode is optionally configurable and resetting the replication mode
> implicitly
> sets the replication mode back to a default of service node.
>
> Signed-off-by: Darrell Ball <dlu...@gmail.com>
> ---
>  tests/vtep-ctl.at       | 17 +++++++++++++++
>  vtep/README.ovs-vtep.md | 19 +++++++++++++++--
>  vtep/ovs-vtep           | 31 +++++++++++++++++++++++----
>  vtep/vtep-ctl.8.in      |  9 ++++++++
>  vtep/vtep-ctl.c         | 42 +++++++++++++++++++++++++++++++++++++
>  vtep/vtep.ovsschema     |  9 ++++++--
>  vtep/vtep.xml           | 56
> ++++++++++++++++++++++++++++++++++++++++++++-----
>  7 files changed, 170 insertions(+), 13 deletions(-)
>
> diff --git a/tests/vtep-ctl.at b/tests/vtep-ctl.at
> index 99e97e8..d2323a0 100644
> --- a/tests/vtep-ctl.at
> +++ b/tests/vtep-ctl.at
> @@ -318,6 +318,23 @@ CHECK_LSWITCHES([a])
>  VTEP_CTL_CLEANUP
>  AT_CLEANUP
>
> +AT_SETUP([add-ls a, set-ls-replication-mode a source_node])
> +AT_KEYWORDS([vtep-ctl])
> +VTEP_CTL_SETUP
> +AT_CHECK([RUN_VTEP_CTL(
> +  [add-ls a],[set-ls-replication-mode a source_node])],
> +  [0], [], [], [VTEP_CTL_CLEANUP])
> +VTEP_CTL_CLEANUP
> +AT_CLEANUP
> +
> +AT_SETUP([add-ls a, reset-ls-replication-mode a])
> +AT_KEYWORDS([vtep-ctl])
> +VTEP_CTL_SETUP
> +AT_CHECK([RUN_VTEP_CTL(
> +  [add-ls a],[reset-ls-replication-mode a])],
> +  [0], [], [], [VTEP_CTL_CLEANUP])
> +VTEP_CTL_CLEANUP
> +AT_CLEANUP
>
>  dnl ----------------------------------------------------------------------
>  AT_BANNER([vtep-ctl unit tests -- logical binding tests])
> diff --git a/vtep/README.ovs-vtep.md b/vtep/README.ovs-vtep.md
> index 6734dab..74900f1 100644
> --- a/vtep/README.ovs-vtep.md
> +++ b/vtep/README.ovs-vtep.md
> @@ -166,13 +166,28 @@ vtep-ctl bind-ls br0 p0 0 ls0
>  vtep-ctl set Logical_Switch ls0 tunnel_key=33
>        ```
>
> -3. Direct unknown destinations out a tunnel:
> +3. Optionally, change the replication mode from a default of service_node
> to
> +   an alternate mode of source_node, which can be done at the logical
> switch
> +   level:
> +
> +      ```
> +vtep-ctl set-ls-replication-mode ls0 source_node
> +      ```
> +
> +4. The alternate replication mode can also be reset back to the default of
> +   service node replication, at the logical switch level:
> +
> +      ```
> +vtep-ctl reset-ls-replication-mode ls0
> +      ```
> +
> +5. Direct unknown destinations out a tunnel:
>
>        ```
>  vtep-ctl add-mcast-remote ls0 unknown-dst 10.2.2.2
>        ```
>
> -4. Direct unicast destinations out a different tunnel:
> +6. Direct unicast destinations out a different tunnel:
>
>        ```
>  vtep-ctl add-ucast-remote ls0 00:11:22:33:44:55 10.2.2.3
> diff --git a/vtep/ovs-vtep b/vtep/ovs-vtep
> index 31ff159..0938829 100755
> --- a/vtep/ovs-vtep
> +++ b/vtep/ovs-vtep
> @@ -94,6 +94,7 @@ class Logical_Switch(object):
>          self.unknown_dsts = set()
>          self.tunnel_key = 0
>          self.setup_ls()
> +        self.replication_mode = "service_node"
>
>      def __del__(self):
>          vlog.info("destroying lswitch %s" % self.name)
> @@ -141,13 +142,17 @@ class Logical_Switch(object):
>              ovs_ofctl("add-flow %s
> table=1,priority=1,in_port=%s,action=%s"
>                          % (self.short_name, port_no,
> ",".join(flood_ports)))
>
> -        # Traffic coming from a VTEP physical port should only be flooded
> to
> -        # one 'unknown-dst' and to all other physical ports that belong
> to that
> -        # VTEP device and this logical switch.
> +        # Traffic coming from a VTEP physical port should always be
> flooded to
> +        # to all the other physical ports that belong to that VTEP device
> and
> +        # this logical switch.  If the replication mode is service node
> then
> +        # send to one unknown_dst node (the first one here); else we
> assume the
> +        # replication mode is source node and we send the packet to all
> +        # unknown_dst nodes.
>          for tunnel in self.unknown_dsts:
>              port_no = self.tunnels[tunnel][0]
>              flood_ports.append(port_no)
> -            break
> +            if self.replication_mode == "service_node":
> +                break
>
>          ovs_ofctl("add-flow %s table=1,priority=0,action=%s"
>                    % (self.short_name, ",".join(flood_ports)))
> @@ -293,8 +298,26 @@ class Logical_Switch(object):
>
>          self.remote_macs = remote_macs
>
> +        replication_mode = vtep_ctl("get logical_switch %s
> replication_mode"
> +                                    % self.name)
> +
> +        # If the logical switch level replication mode has changed then
> +        # update to that value.
> +        replic_mode_change = False
> +        if replication_mode and replication_mode != self.replication_mode:
> +            self.replication_mode = replication_mode
> +            vlog.info("%s replication mode changed to %s" %
> +                       (self.name, self.replication_mode))
> +            replic_mode_change = True
> +
> +        unk_dsts_change = False
>          if (self.unknown_dsts != unknown_dsts):
>              self.unknown_dsts = unknown_dsts
> +            unk_dsts_change = True
> +
> +        # If either the replication mode has changed or the unknown
> +        # destinations set has changed, update the flooding decision.
> +        if replic_mode_change is True or unk_dsts_change is True:
>              self.update_flood()
>
>      def update_stats(self):
> diff --git a/vtep/vtep-ctl.8.in b/vtep/vtep-ctl.8.in
> index 129c7ed..25deebd 100644
> --- a/vtep/vtep-ctl.8.in
> +++ b/vtep/vtep-ctl.8.in
> @@ -195,6 +195,15 @@ combination on the physical switch \fIpswitch\fR.
>  List the logical switch bindings for \fIport\fR on the physical switch
>  \fIpswitch\fR.
>  .
> +.IP "\fBset\-ls\-replication\-mode \fIlswitch replication\-mode\fR"
> +Set logical switch \fIlswitch\fR alternate replication mode to
> +\fIreplication\-mode\fR; the only valid value presently for alternate
> +replication mode is "source_node".
> +.
> +.IP "\fBreset\-ls\-replication\-mode \fIlswitch\fR"
> +Reset a logical switch \fIlswitch\fR alternate replication mode to the
> +default of "service_node".
> +.
>  .SS "Logical Router Commands"
>  These commands examine and manipulate logical routers.
>  .
> diff --git a/vtep/vtep-ctl.c b/vtep/vtep-ctl.c
> index 29d9a17..69cdb57 100644
> --- a/vtep/vtep-ctl.c
> +++ b/vtep/vtep-ctl.c
> @@ -335,6 +335,8 @@ Logical Switch commands:\n\
>    bind-ls PS PORT VLAN LS     bind LS to VLAN on PORT\n\
>    unbind-ls PS PORT VLAN      unbind logical switch on VLAN from PORT\n\
>    list-bindings PS PORT       list bindings for PORT on PS\n\
> +  set-ls-replication-mode LS MODE  set replication mode on LS\n\
> +  reset-ls-replication-mode LS     reset replication mode on LS\n\
>  \n\
>  Logical Router commands:\n\
>    add-lr LR                   create a new logical router named LR\n\
> @@ -851,6 +853,8 @@ pre_get_info(struct ctl_context *ctx)
>      ovsdb_idl_add_column(ctx->idl,
> &vteprec_physical_port_col_vlan_bindings);
>
>      ovsdb_idl_add_column(ctx->idl, &vteprec_logical_switch_col_name);
> +    ovsdb_idl_add_column(ctx->idl,
> +
>  &vteprec_logical_switch_col_alt_replication_mode);
>
>      ovsdb_idl_add_column(ctx->idl, &vteprec_logical_router_col_name);
>
> @@ -1523,6 +1527,40 @@ cmd_unbind_ls(struct ctl_context *ctx)
>      vtep_ctl_context_invalidate_cache(ctx);
>  }
>
> +static void
> +cmd_set_ls_replication_mode(struct ctl_context *ctx)
> +{
> +    struct vtep_ctl_context *vtepctl_ctx = vtep_ctl_context_cast(ctx);
> +    struct vtep_ctl_lswitch *ls;
> +    const char *ls_name = ctx->argv[1];
> +
> +    vtep_ctl_context_populate_cache(ctx);
> +
> +    if (strcmp(ctx->argv[2], "source_node")) {
> +        ctl_fatal("Alternate replication mode must be 'source_node'");
> +    }
> +
> +    ls = find_lswitch(vtepctl_ctx, ls_name, true);
> +    vteprec_logical_switch_set_alt_replication_mode(ls->ls_cfg,
> ctx->argv[2]);
> +
> +    vtep_ctl_context_invalidate_cache(ctx);
> +}
> +
> +static void
> +cmd_reset_ls_replication_mode(struct ctl_context *ctx)
> +{
> +    struct vtep_ctl_context *vtepctl_ctx = vtep_ctl_context_cast(ctx);
> +    struct vtep_ctl_lswitch *ls;
> +    const char *ls_name = ctx->argv[1];
> +
> +    vtep_ctl_context_populate_cache(ctx);
> +
> +    ls = find_lswitch(vtepctl_ctx, ls_name, true);
> +    vteprec_logical_switch_set_alt_replication_mode(ls->ls_cfg, NULL);
> +
> +    vtep_ctl_context_invalidate_cache(ctx);
> +}
> +
>  static struct vtep_ctl_lrouter *
>  find_lrouter(struct vtep_ctl_context *vtepctl_ctx,
>               const char *name, bool must_exist)
> @@ -2459,6 +2497,10 @@ static const struct ctl_command_syntax
> vtep_commands[] = {
>      {"list-bindings", 2, 2, NULL, pre_get_info, cmd_list_bindings, NULL,
> "", RO},
>      {"bind-ls", 4, 4, NULL, pre_get_info, cmd_bind_ls, NULL, "", RO},
>      {"unbind-ls", 3, 3, NULL, pre_get_info, cmd_unbind_ls, NULL, "", RO},
> +    {"set-ls-replication-mode", 2, 2, "LS MODE", pre_get_info,
> +        cmd_set_ls_replication_mode, NULL, "", RW},
> +    {"reset-ls-replication-mode", 1, 1, "LS", pre_get_info,
> +        cmd_reset_ls_replication_mode, NULL, "", RW},
>
>      /* Logical Router commands. */
>      {"add-lr", 1, 1, NULL, pre_get_info, cmd_add_lr, NULL, "--may-exist",
> RW},
> diff --git a/vtep/vtep.ovsschema b/vtep/vtep.ovsschema
> index 533fd2e..a0e27fd 100644
> --- a/vtep/vtep.ovsschema
> +++ b/vtep/vtep.ovsschema
> @@ -1,6 +1,6 @@
>  {
>    "name": "hardware_vtep",
> -  "cksum": "770244945 11113",
> +  "cksum": "1527138929 11290",
>    "tables": {
>      "Global": {
>        "columns": {
> @@ -96,6 +96,11 @@
>          "name": {"type": "string"},
>          "description": {"type": "string"},
>          "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}},
> +        "alt_replication_mode": {
> +          "type": {
> +            "key": {
> +              "enum": ["set", ["source_node"]],
> +              "type": "string"},"min": 0, "max": 1}},
>          "other_config": {
>            "type": {"key": "string", "value": "string",
>                     "min": 0, "max": "unlimited"}}},
> @@ -296,4 +301,4 @@
>            "ephemeral": true}},
>        "indexes": [["target"]],
>        "isRoot": false}},
> -  "version": "1.5.1"}
> +  "version": "1.6.1"}
> diff --git a/vtep/vtep.xml b/vtep/vtep.xml
> index a3a6988..0f33284 100644
> --- a/vtep/vtep.xml
> +++ b/vtep/vtep.xml
> @@ -357,6 +357,18 @@
>          Indicates that an error has occurred in the switch but that no
>          more specific information is available.
>        </column>
> +
> +      <column name="switch_fault_status"
> +        key="unsupported_source_node_replication">
> +        Indicates that the requested source node replication mode cannot
> be
> +        supported by the physical switch;  this specifically means in this
> +        context that the physical switch lacks the capability to support
> +        source node replication mode.  This error occurs when a controller
> +        attempts to set source node replication mode for one of the
> logical
> +        switches that the physical switch is keeping context for.  If this
> +        error occurs, logical switches continue to use service node
> +        replication mode.
> +      </column>
>      </group>
>
>      <group title="Common Column">
> @@ -754,6 +766,37 @@
>        </column>
>      </group>
>
> +    <group title="Per Logical-Switch Alternate Replication Mode">
> +      <p>
> +        For handling broadcast, multicast (in default manner) and unknown
> +        unicast traffic, packets can be sent to all members of a logical
> +        switch referenced by a physical switch.  There are different modes
> +        to replicate the packets.  One mode of replication is to send the
> +        traffic to a service node, which can be a hypervisor, server or
> +        appliance and let the service node handle replication to other
> +        transport nodes (defined as hypervisors or other VTEP physical
> +        switches).  This mode is called service node replication.  A
> second
> +        mode of replication, called source node replication involves the
> +        source node sending to all other transport nodes. Hypervisors are
> +        always responsible for doing their own replication for locally
> +        attached VMs in both modes.
> +        Service node mode is a basic requirement since it should be
> +        implementable by all switches, HA considerations not withstanding.
> +        Hence, service node mode replication is the default mode and
> +        source node mode is an alternate replication mode that is
> presently
> +        supported.
> +      </p>
> +
> +      <column name="alt_replication_mode">
> +        <p>
> +          This column defines the alternate replication mode per
> +          <ref table="Logical_Switch"/>.  There is one valid value
> presently,
> +          <code>source_node</code>.
> +        </p>
> +
> +      </column>
> +    </group>
> +
>      <group title="Identification">
>        <column name="name">
>          Symbolic name for the logical switch.
> @@ -887,8 +930,8 @@
>        Multicast packet replication may be handled by a service node,
>        in which case the physical locators will be IP addresses of
>        service nodes. If the VTEP supports replication onto multiple
> -      tunnels, then this may be used to replicate directly onto
> -      VTEP-hypervisor tunnels.
> +      tunnels, using source node replication, then this may be used to
> +      replicate directly onto VTEP-hypervisor or VTEP-VTEP tunnels.
>      </p>
>
>      <column name="MAC">
> @@ -911,9 +954,12 @@
>
>      <column name="locator_set">
>        The physical locator set to be used to reach this MAC address. In
> -      this table, the physical locator set will be either a service node
> IP
> -      address or a set of tunnel IP addresses of hypervisors (and
> -      potentially other VTEPs).
> +      this table, the physical locator set will be either a set of service
> +      node when service node replication is used or the set of transport
> +      nodes (defined as hypervisors or VTEPs) participating in the
> associated
> +      logical switch. When service node replication is used, the VTEP
> should
> +      send packets to one member of the locator set that is known to be
> +      healthy and reachable, which could be determined by BFD.
>      </column>
>
>      <column name="ipaddr">
> --
> 1.9.1
>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to