[ovs-dev] [PATCH 2/2] ovs-vsctl: add command to delete transient ports from bridge

Gurucharan Shetty shettyg at nicira.com
Thu Aug 27 15:40:03 UTC 2015


On Thu, Aug 27, 2015 at 8:07 AM, Thadeu Lima de Souza Cascardo
<cascardo at redhat.com> wrote:
> When using virtualization, new ports are created and removed all the time. These
> ports do not persist after a system reboot, for example. They may be created
> again by the virtualization manager, but that will happen after the vswitch is
> already running, and the virtualization manager will add them again to the
> bridge.
>
> If a reboot happens without properly deleting such ports, all kinds of errors
> will happen. The absence of the ports will be logged as errors, and adding those
> ports again to the database will fail.
>
> This patch introduces the notion of transient ports. Ports may be added as
> transient, as a boolean in other_config smap. When openvswitch is restarted by
> using ovs-ctl, all transient ports will be removed. If the system administrator
> wants to remove all transient ports from a bridge, a new ovs-vsctl command,
> del-transient-ports may be used.
>
> Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo at redhat.com>
> ---
>  tests/ovs-vsctl.at       | 21 +++++++++++++++++++++
>  utilities/ovs-ctl.in     |  3 +++
>  utilities/ovs-vsctl.8.in |  3 +++
>  utilities/ovs-vsctl.c    | 30 ++++++++++++++++++++++++++++++
>  vswitchd/vswitch.xml     |  8 ++++++++
>  5 files changed, 65 insertions(+)
>
> diff --git a/tests/ovs-vsctl.at b/tests/ovs-vsctl.at
> index fef7b88..f877070 100644
> --- a/tests/ovs-vsctl.at
> +++ b/tests/ovs-vsctl.at
> @@ -304,6 +304,27 @@ CHECK_IFACES([b], [b1])
>  OVS_VSCTL_CLEANUP
>  AT_CLEANUP
>
> +AT_SETUP([add-br a, add-transient-port a a1 a2, del-transient-ports a])
> +AT_KEYWORDS([ovs-vsctl del-transient-ports])
> +OVS_VSCTL_SETUP
> +AT_CHECK([RUN_OVS_VSCTL(
> +   [add-br a],
> +   [--if-exists del-br b],
> +   [add-port a a1],
> +   [add-port a a2],
> +   [set port a1 other_config:transient=true],
> +   [set port a2 other_config:transient=true])], [0], [], [], [OVS_VSCTL_CLEANUP])
> +CHECK_BRIDGES([a, a, 0])
> +CHECK_PORTS([a], [a1], [a2])
> +CHECK_IFACES([a], [a1], [a2])
> +AT_CHECK([RUN_OVS_VSCTL(
> +   [del-transient-ports a])], [0], [], [], [OVS_VSCTL_CLEANUP])
> +CHECK_BRIDGES([a, a, 0])
> +CHECK_PORTS([a])
> +CHECK_IFACES([a])
> +OVS_VSCTL_CLEANUP
> +AT_CLEANUP
> +
>  AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
>  AT_KEYWORDS([ovs-vsctl])
>  OVS_VSCTL_SETUP
> diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in
> index 9bbbe0d..b08987b 100755
> --- a/utilities/ovs-ctl.in
> +++ b/utilities/ovs-ctl.in
> @@ -219,6 +219,9 @@ start_ovsdb () {
>                  ovs_vsctl del-br $bridge
>              done
>          fi
> +        for bridge in `ovs_vsctl list-br`; do
> +            ovs_vsctl del-transient-ports $bridge
> +        done
This is not a review on the overall idea.
Doing something like this breaks flow restoration logic. See
'force_reload_kmod' and 'restart' functions in ovs-ctl.in



>      fi
>  }
>
> diff --git a/utilities/ovs-vsctl.8.in b/utilities/ovs-vsctl.8.in
> index 265ffde..6229312 100644
> --- a/utilities/ovs-vsctl.8.in
> +++ b/utilities/ovs-vsctl.8.in
> @@ -323,6 +323,9 @@ no effect.
>  Prints the name of the bridge that contains \fIport\fR on standard
>  output.
>  .
> +.IP "\fBdel\-transient\-ports \fIbridge\fR"
> +Deletes ports configured as transient from the specified bridge.
> +.
>  .SS "Interface Commands"
>  .
>  These commands examine the interfaces attached to an Open vSwitch
> diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c
> index e177060..4526c90 100644
> --- a/utilities/ovs-vsctl.c
> +++ b/utilities/ovs-vsctl.c
> @@ -380,6 +380,7 @@ Port commands (a bond is considered to be a single port):\n\
>    add-bond BRIDGE PORT IFACE...  add bonded port PORT in BRIDGE from IFACES\n\
>    del-port [BRIDGE] PORT      delete PORT (which may be bonded) from BRIDGE\n\
>    port-to-br PORT             print name of bridge that contains PORT\n\
> +  del-transient-ports BRIDGE  delete transient ports from BRIDGE\n\
>  \n\
>  Interface commands (a bond consists of multiple interfaces):\n\
>    list-ifaces BRIDGE          print the names of all interfaces on BRIDGE\n\
> @@ -1678,6 +1679,33 @@ cmd_del_port(struct ctl_context *ctx)
>  }
>
>  static void
> +pre_transient_ports(struct ctl_context *ctx)
> +{
> +    pre_get_info(ctx);
> +    ovsdb_idl_add_column(ctx->idl, &ovsrec_port_col_other_config);
> +}
> +
> +static void
> +cmd_del_transient_ports(struct ctl_context *ctx)
> +{
> +    struct vsctl_context *vsctl_ctx = vsctl_context_cast(ctx);
> +    const char *target = ctx->argv[1];
> +    struct vsctl_bridge *bridge;
> +    struct vsctl_port *port, *next_port;
> +
> +    vsctl_context_populate_cache(ctx);
> +    bridge = find_bridge(vsctl_ctx, target, true);
> +
> +    LIST_FOR_EACH_SAFE (port, next_port, ports_node, &bridge->ports) {
> +        struct ovsrec_port *cfg = port->port_cfg;
> +        bool transient = smap_get_bool(&cfg->other_config, "transient", false);
> +        if (transient) {
> +            del_port(vsctl_ctx, port);
> +        }
> +    }
> +}
> +
> +static void
>  cmd_port_to_br(struct ctl_context *ctx)
>  {
>      struct vsctl_context *vsctl_ctx = vsctl_context_cast(ctx);
> @@ -2732,6 +2760,8 @@ static const struct ctl_command_syntax vsctl_commands[] = {
>      {"del-port", 1, 2, "[BRIDGE] PORT|IFACE", pre_get_info, cmd_del_port, NULL,
>       "--if-exists,--with-iface", RW},
>      {"port-to-br", 1, 1, "PORT", pre_get_info, cmd_port_to_br, NULL, "", RO},
> +    {"del-transient-ports", 1, 1, "BRIDGE", pre_transient_ports,
> +     cmd_del_transient_ports, NULL, "", RW},
>
>      /* Interface commands. */
>      {"list-ifaces", 1, 1, "BRIDGE", pre_get_info, cmd_list_ifaces, NULL, "",
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 457f34a..1f9174d 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -1659,6 +1659,14 @@
>          <code>fake-bridge-</code>,
>          e.g. <code>fake-bridge-xs-network-uuids</code>.
>        </column>
> +
> +      <column name="other_config" key="transient"
> +              type='{"type": "boolean"}'>
> +        <p>
> +          If set to <code>true</code>, the port will be removed when
> +          <code>ovs-vsctl del-transient-ports</code> is used on the bridge.
> +        </p>
> +      </column>
>      </group>
>
>      <column name="bond_active_slave">
> --
> 2.4.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list