[ovs-dev] [patch_v8] vtep: add source node replication support.
Darrell Ball
dlu998 at gmail.com
Wed May 4 00:35:36 UTC 2016
Thanks Anupam
Darrell
On Tue, May 3, 2016 at 4:28 PM, Anupam Chanda <achanda at vmware.com> wrote:
> Hi Darrell,
>
>
> Looks good, thanks for working on this. Some comments below tagged with
> [AC].
>
>
> Thanks,
>
> Anupam
>
> From: Darrell Ball <dlu998 at gmail.com>
> Date: Tue, May 3, 2016 at 3:32 PM
> Subject: [patch_v8] vtep: add source node replication support.
> To: dlu998 at gmail.com, bdavie at vmware.com, achanda at vmware.com,
> dev at openvswitch.com
>
>
> 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 <dlu998 at gmail.com>
> ---
> tests/vtep-ctl.at
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.at&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=cqgNSY2RGg_YQcdyKlzS1orMEjgRrjG_SxtnByEef18&e=>
> | 32 +++++++++++++++++++++++
> vtep/README.ovs-vtep.md
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__README.ovs-2Dvtep.md&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=u67AnpfKI7_ta8BmE8NGlLCqf4qXFDTn9a5PuYwp3RU&e=>
> | 30 ++++++++++++++++++++--
> vtep/ovs-vtep | 36 +++++++++++++++++++++++---
> vtep/vtep-ctl.8.in
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.8.in&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=giAJRMO8tjE8s2qz8px4VbvMpr6mm3gd-vHCY1a24cU&e=>
> | 15 +++++++++++
> vtep/vtep-ctl.c | 61 ++++++++++++++++++++++++++++++++++++++++++++
> vtep/vtep.ovsschema | 9 +++++--
> vtep/vtep.xml | 67
> +++++++++++++++++++++++++++++++++++++++++++++----
> 7 files changed, 237 insertions(+), 13 deletions(-)
>
> diff --git a/tests/vtep-ctl.at
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.at&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=cqgNSY2RGg_YQcdyKlzS1orMEjgRrjG_SxtnByEef18&e=>
> b/tests/vtep-ctl.at
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.at&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=cqgNSY2RGg_YQcdyKlzS1orMEjgRrjG_SxtnByEef18&e=>
> index 99e97e8..6a7e059 100644
> --- a/tests/vtep-ctl.at
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.at&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=cqgNSY2RGg_YQcdyKlzS1orMEjgRrjG_SxtnByEef18&e=>
> +++ b/tests/vtep-ctl.at
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.at&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=cqgNSY2RGg_YQcdyKlzS1orMEjgRrjG_SxtnByEef18&e=>
> @@ -318,6 +318,38 @@ CHECK_LSWITCHES([a])
> VTEP_CTL_CLEANUP
> AT_CLEANUP
>
> +AT_SETUP([add-ls a, set-replication-mode a source_node])
> +AT_KEYWORDS([vtep-ctl])
> +VTEP_CTL_SETUP
> +AT_CHECK([RUN_VTEP_CTL(
> + [add-ls a],[set-replication-mode a source_node],
> + [get-replication-mode a])],
> + [0], [source_node
> +], [], [VTEP_CTL_CLEANUP])
> +VTEP_CTL_CLEANUP
> +AT_CLEANUP
> +
> +AT_SETUP([add-ls a, set-replication-mode a service_node])
> +AT_KEYWORDS([vtep-ctl])
> +VTEP_CTL_SETUP
> +AT_CHECK([RUN_VTEP_CTL(
> + [add-ls a],[set-replication-mode a service_node],
> + [get-replication-mode a])],
> + [0], [service_node
> +], [], [VTEP_CTL_CLEANUP])
> +VTEP_CTL_CLEANUP
> +AT_CLEANUP
> +
> +AT_SETUP([add-ls a, reset-replication-mode a])
> +AT_KEYWORDS([vtep-ctl])
> +VTEP_CTL_SETUP
> +AT_CHECK([RUN_VTEP_CTL(
> + [add-ls a],[reset-replication-mode a],
> + [get-replication-mode a])],
> + [0], [[(null)]
> +], [], [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
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__README.ovs-2Dvtep.md&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=u67AnpfKI7_ta8BmE8NGlLCqf4qXFDTn9a5PuYwp3RU&e=>
> b/vtep/README.ovs-vtep.md
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__README.ovs-2Dvtep.md&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=u67AnpfKI7_ta8BmE8NGlLCqf4qXFDTn9a5PuYwp3RU&e=>
> index 6734dab..6d37e37 100644
> --- a/vtep/README.ovs-vtep.md
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__README.ovs-2Dvtep.md&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=u67AnpfKI7_ta8BmE8NGlLCqf4qXFDTn9a5PuYwp3RU&e=>
> +++ b/vtep/README.ovs-vtep.md
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__README.ovs-2Dvtep.md&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=u67AnpfKI7_ta8BmE8NGlLCqf4qXFDTn9a5PuYwp3RU&e=>
> @@ -166,13 +166,39 @@ 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
> + source_node, which can be done at the logical switch level:
> +
> + ```
> +vtep-ctl set-replication-mode ls0 source_node
> + ```
> +
> +The replication mode can also be reset back to the default of service
> node replication, if needed, at the logical switch level:
> +
> + ```
> +vtep-ctl reset-replication-mode ls0
> + ```
> +
> +Setting the replication mode back to the default of service_node
> replication
> +mode can also be done via the set command, if needed:
>
> [AC] How about: The replication mode may be explicitly set to the default
> value of service_node replication via the set command, if needed:
>
Better; thanks
>
> +
> + ```
> +vtep-ctl set-replication-mode ls0 service_node
> + ```
> +
> +The replication mode can also be queried using the command:
> +
> + ```
> +vtep-ctl get-replication-mode ls0
> + ```
>
> [AC] What's the output of this command if replication-mode has not been
> previously set?
>
I mentioned it in the vtep-ctl man page; I said NULL as a simplified
version of [(NULL)].
I thought mentioning these details here may be a distraction, unless you
feel adding here
as well is helpful.
>
> +
> +4. 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:
> +5. 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..7b8cdb1 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
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vlog.info&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=Qu7WpCm9rMljkyQ_V0qCtGOpg0S-xRfCz7BxxaQU71A&e=>("destroying
> lswitch %s" % self.name
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__self.name&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=c9RNWdAiUHVAqA-hNtRQwXwSD3YoyV25LXbyrKp9iFw&e=>
> )
> @@ -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
> + # 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,31 @@ class Logical_Switch(object):
>
> self.remote_macs = remote_macs
>
> + replication_mode = vtep_ctl("get logical_switch %s
> replication_mode"
> + % self.name
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__self.name&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=c9RNWdAiUHVAqA-hNtRQwXwSD3YoyV25LXbyrKp9iFw&e=>
> )
> +
> + # Replication mode is an optional column and if it is not set,
> + # replication mode defaults to service_node.
> + if replication_mode == "[]":
> + replication_mode = "service_node"
> +
> + # If the logical switch level replication mode has changed then
> + # update to that value.
> + replic_mode_change = False
>
> [AC] s/replic_mode_change/replication_mode_change
>
sure
>
> + if replication_mode != self.replication_mode:
> + self.replication_mode = replication_mode
> + vlog.info
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vlog.info&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=Qu7WpCm9rMljkyQ_V0qCtGOpg0S-xRfCz7BxxaQU71A&e=>("%s
> replication mode changed to %s" %
> + (self.name
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__self.name&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=c9RNWdAiUHVAqA-hNtRQwXwSD3YoyV25LXbyrKp9iFw&e=>,
> self.replication_mode))
> + replic_mode_change = True
> +
> + unk_dsts_change = False
>
> [AC] s/unk_dsts_change/unknown_dsts_change
>
sure
>
> 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
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.8.in&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=giAJRMO8tjE8s2qz8px4VbvMpr6mm3gd-vHCY1a24cU&e=>
> b/vtep/vtep-ctl.8.in
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.8.in&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=giAJRMO8tjE8s2qz8px4VbvMpr6mm3gd-vHCY1a24cU&e=>
> index 129c7ed..f0da108 100644
> --- a/vtep/vtep-ctl.8.in
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.8.in&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=giAJRMO8tjE8s2qz8px4VbvMpr6mm3gd-vHCY1a24cU&e=>
> +++ b/vtep/vtep-ctl.8.in
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__vtep-2Dctl.8.in&d=BQMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=qV-i3RRHfITiNOOHCqe5JTEo_Co9bBvDWO_i0mHUWqU&m=TRP9_xzf3amc74NNDwbxinFEBUmjNHAkuOwQ-_Yh0zA&s=giAJRMO8tjE8s2qz8px4VbvMpr6mm3gd-vHCY1a24cU&e=>
> @@ -195,6 +195,21 @@ combination on the physical switch \fIpswitch\fR.
> List the logical switch bindings for \fIport\fR on the physical switch
> \fIpswitch\fR.
> .
> +.IP "\fBset\-replication\-mode \fIlswitch replication\-mode\fR"
> +Set logical switch \fIlswitch\fR replication mode to
> +\fIreplication\-mode\fR; the only valid values presently for replication
> +mode are "service_node" and "source_node".
> +.
> +.IP "\fBget\-replication\-mode \fIlswitch\fR"
> +Get logical switch \fIlswitch\fR replication mode. The only valid values
> +presently for replication mode are "service_node" and "source_node".
> +A return value of NULL indicates the replication mode column is not set
> +and therefore a default of "service_node" is implied.
> +.
> +.IP "\fBreset\-replication\-mode \fIlswitch\fR"
> +Reset a logical switch \fIlswitch\fR 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..2254447 100644
> --- a/vtep/vtep-ctl.c
> +++ b/vtep/vtep-ctl.c
> @@ -335,6 +335,9 @@ 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\
> + get-ls-replication-mode LS get 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 +854,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_replication_mode);
>
> ovsdb_idl_add_column(ctx->idl, &vteprec_logical_router_col_name);
>
> @@ -1523,6 +1528,56 @@ 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], "service_node") &&
> + strcmp(ctx->argv[2], "source_node")) {
> + ctl_fatal("Replication mode must be 'service_node' or
> 'source_node'");
> + }
> +
> + ls = find_lswitch(vtepctl_ctx, ls_name, true);
> + vteprec_logical_switch_set_replication_mode(ls->ls_cfg, ctx->argv[2]);
> +
> + vtep_ctl_context_invalidate_cache(ctx);
>
> [AC] invalidate cache only if the set command actually changes the
> replication mode?
>
I prefer to leave it as is and keep the logic as simple as possible; adding
if/else to skip invalidate cache for a redundant setting of mode seems an
unnecessary complication.
A mode change will be rare and an unnecessary/redundant mode
change will be very rare unless the operator is typing with his beer can.
>
> +}
> +
> +static void
> +cmd_get_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);
> + ds_put_format(&ctx->output, "%s\n", ls->ls_cfg->replication_mode);
> +
> + vtep_ctl_context_invalidate_cache(ctx);
>
> [AC] I think the above invalidate cache operation is not needed.
>
Right, its not needed for "get"
>
> +}
> +
> +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_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 +2514,12 @@ 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-replication-mode", 2, 2, "LS MODE", pre_get_info,
> + cmd_set_ls_replication_mode, NULL, "", RW},
> + {"get-replication-mode", 1, 1, "LS", pre_get_info,
> + cmd_get_ls_replication_mode, NULL, "", RO},
> + {"reset-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..e409d8d 100644
> --- a/vtep/vtep.ovsschema
> +++ b/vtep/vtep.ovsschema
> @@ -1,6 +1,6 @@
> {
> "name": "hardware_vtep",
> - "cksum": "770244945 11113",
> + "cksum": "4127261095 11302",
> "tables": {
> "Global": {
> "columns": {
> @@ -96,6 +96,11 @@
> "name": {"type": "string"},
> "description": {"type": "string"},
> "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}},
> + "replication_mode": {
> + "type": {
> + "key": {
> + "enum": ["set", ["service_node", "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.0"}
> diff --git a/vtep/vtep.xml b/vtep/vtep.xml
> index a3a6988..8a486bb 100644
> --- a/vtep/vtep.xml
> +++ b/vtep/vtep.xml
> @@ -357,6 +357,28 @@
> 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. An NVC
> + that observes this error should take appropriate action (for
> example
> + reverting the logical switch to service node replication mode).
> + It is recommended that an NVC be proactive and test for support of
> + source node replication by using a test logical switch on vtep
> + physical switch nodes and then trying to change the replication
> mode
> + to source node on this logical switch, checking for error. The
> NVC
> + could remember this capability per vtep physical switch. Using
> + mixed replication modes on a given logical switch is not
> recommended.
> + Service node replication mode is considered a basic requirement
> + since it only requires sending a packet to a single transport
> node,
> + hence its not expected that a switch should report that service
> node
> + mode cannot be supported.
> + </column>
> </group>
>
> <group title="Common Column">
> @@ -754,6 +776,38 @@
> </column>
> </group>
>
> + <group title="Replication Mode">
> + <p>
> + For handling broadcast, multicast (in default manner) and unknown
>
> [AC] What is "default manner" here?
>
BUM multicast default is broadcast on the logical switch.
I can clarify as - "in a default, broadcast manner". What do you think ?
>
> + 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. The default 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 (hypervisors or other VTEP physical
> + switches). This mode is called service node replication. An
> + alternate 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 the default and was the only option for prior versions of
> + the schema. Service node replication mode is considered a basic
> + requirement because it only requires sending the the packet to a
> + single transport node.
> + </p>
> +
> + <column name="replication_mode">
> + <p>
> + This optional column defines the replication mode per
> + <ref table="Logical_Switch"/>. There are 2 valid values
> + presently, <code>service_node</code> and
> + <code>source_node</code>. If the column is not set, the
> + replication mode defaults to service_node.
> + </p>
> +
> + </column>
> + </group>
> +
> <group title="Identification">
> <column name="name">
> Symbolic name for the logical switch.
> @@ -887,8 +941,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 +965,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
>
> [AC] s/"node when"/"nodes when"
>
Missed this one earlier when Justin mentioned it :-)
>
> + nodes (defined as hypervisors or VTEPs) participating in the
> associated
> + logical switch. When service node replication is used, the VTEP
> should
>
> [AC] in the associated logical switch when source node replication is used.
>
thanks
>
> + send packets to one member of the locator set that is known to be
> + healthy and reachable, which could be determined by BFD.
>
> [AC] When source node replication is used, the VTEP should send packets to
> all members of the locator set.
>
I might as well mention that here as well; thanks.
>
> </column>
>
> <column name="ipaddr">
> --
> 1.9.1
>
>
>
More information about the dev
mailing list