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