On 8 August 2017 at 07:42, Timothy Redaelli <tredae...@redhat.com> wrote:

> The reload procedure will trigger a script that saves the flows and tlv
> maps then it restarts ovsdb-server, it stops ovs-vswitchd, it sets
> other_config:flow-restore-wait=true (to wait till flow restore is
> finished), it starts ovs-vswitchd, it restore the backupped flows/tlv
> maps and it removes other_config:flow-restore-wait=true (logic mostly
> ripped
> from ovs-ctl).
>
> It uses systemctl with --job-mode=ignore-dependencies to restart
> ovsdb-server
> and stop and start ovs-vswitchd in order to avoid systemd to restart the
> other components due to dependencies (as explained in
> rhel/README.RHEL.rst).
>
> It also uses --bundle, when available, in order to minimize the downtime.
>

The core script can probably be added to ovs-ctl, reuse some functions and
then you can call it? This way, other platforms can benefit too.



>
> Signed-off-by: Timothy Redaelli <tredae...@redhat.com>
> ---
>  rhel/automake.mk                                 |  1 +
>  rhel/openvswitch-fedora.spec.in                  |  5 ++
>  rhel/usr_lib_systemd_system_openvswitch.service  |  2 +-
>  rhel/usr_lib_systemd_system_ovsdb-server.service |  1 -
>  rhel/usr_share_openvswitch_scripts_ovs-reload    | 73
> ++++++++++++++++++++++++
>  5 files changed, 80 insertions(+), 2 deletions(-)
>  create mode 100755 rhel/usr_share_openvswitch_scripts_ovs-reload
>
> diff --git a/rhel/automake.mk b/rhel/automake.mk
> index 1265fa747..93dbeac0c 100644
> --- a/rhel/automake.mk
> +++ b/rhel/automake.mk
> @@ -23,6 +23,7 @@ EXTRA_DIST += \
>         rhel/openvswitch.spec.in \
>         rhel/openvswitch-fedora.spec \
>         rhel/openvswitch-fedora.spec.in \
> +       rhel/usr_share_openvswitch_scripts_ovs-reload \
>         rhel/usr_share_openvswitch_scripts_sysconfig.template \
>         rhel/usr_share_openvswitch_scripts_systemd_sysconfig.template \
>         rhel/usr_lib_systemd_system_openvswitch.service \
> diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/openvswitch-fedora.
> spec.in
> index 1cad9406e..dc92ab3ca 100644
> --- a/rhel/openvswitch-fedora.spec.in
> +++ b/rhel/openvswitch-fedora.spec.in
> @@ -289,6 +289,10 @@ install -d -m 0755 $RPM_BUILD_ROOT%{_prefix}/lib/
> ocf/resource.d/ovn
>  ln -s %{_datadir}/openvswitch/scripts/ovndb-servers.ocf \
>        $RPM_BUILD_ROOT%{_prefix}/lib/ocf/resource.d/ovn/ovndb-servers
>
> +install -p -D -m 0755 \
> +        rhel/usr_share_openvswitch_scripts_ovs-reload \
> +        $RPM_BUILD_ROOT%{_datadir}/openvswitch/scripts/ovs-reload
> +
>  # remove unpackaged files
>  rm -f $RPM_BUILD_ROOT%{_bindir}/ovs-parse-backtrace \
>          $RPM_BUILD_ROOT%{_sbindir}/ovs-vlan-bug-workaround \
> @@ -493,6 +497,7 @@ fi
>  %{_datadir}/openvswitch/scripts/ovs-save
>  %{_datadir}/openvswitch/scripts/ovs-vtep
>  %{_datadir}/openvswitch/scripts/ovs-ctl
> +%{_datadir}/openvswitch/scripts/ovs-reload
>  %config %{_datadir}/openvswitch/vswitch.ovsschema
>  %config %{_datadir}/openvswitch/vtep.ovsschema
>  %{_bindir}/ovs-appctl
> diff --git a/rhel/usr_lib_systemd_system_openvswitch.service
> b/rhel/usr_lib_systemd_system_openvswitch.service
> index faca44b54..2cf29f0e9 100644
> --- a/rhel/usr_lib_systemd_system_openvswitch.service
> +++ b/rhel/usr_lib_systemd_system_openvswitch.service
> @@ -9,7 +9,7 @@ Requires=ovs-vswitchd.service
>  [Service]
>  Type=oneshot
>  ExecStart=/bin/true
> -ExecReload=/bin/true
> +ExecReload=/usr/share/openvswitch/scripts/ovs-reload
>  ExecStop=/bin/true
>  RemainAfterExit=yes
>
> diff --git a/rhel/usr_lib_systemd_system_ovsdb-server.service
> b/rhel/usr_lib_systemd_system_ovsdb-server.service
> index 68deace7c..b9814bae1 100644
> --- a/rhel/usr_lib_systemd_system_ovsdb-server.service
> +++ b/rhel/usr_lib_systemd_system_ovsdb-server.service
> @@ -2,7 +2,6 @@
>  Description=Open vSwitch Database Unit
>  After=syslog.target network-pre.target
>  Before=network.target network.service
> -ReloadPropagatedFrom=openvswitch.service
>  PartOf=openvswitch.service
>
>  [Service]
> diff --git a/rhel/usr_share_openvswitch_scripts_ovs-reload
> b/rhel/usr_share_openvswitch_scripts_ovs-reload
> new file mode 100755
> index 000000000..793257390
> --- /dev/null
> +++ b/rhel/usr_share_openvswitch_scripts_ovs-reload
> @@ -0,0 +1,73 @@
> +#! /bin/sh
> +
> +# Copyright (c) 2017 Red Hat, Inc.
> +#
> +# Licensed under the Apache License, Version 2.0 (the "License");
> +# you may not use this file except in compliance with the License.
> +# You may obtain a copy of the License at:
> +#
> +#     http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +# See the License for the specific language governing permissions and
> +# limitations under the License.
> +
> +# Highest OpenFlow version enabled by default
> +DEFAULT_OFP_VERSION=OpenFlow14
> +
> +get_highest_ofp_version() {
> +    ovs-vsctl get bridge "$1" protocols | \
> +        awk -v default_ofp_version="$DEFAULT_OFP_VERSION" \
> +            -F '"' '{ print (NF>1)? $(NF-1) : default_ofp_version }'
> +}
> +
> +save_flows () {
> +    for bridge; do
> +        # Get the highest enabled OpenFlow version
> +        ofp_version=$(get_highest_ofp_version "$bridge")
> +
> +        printf "ovs-ofctl -O $ofp_version add-tlv-map %s '" "$bridge"
> +        ovs-ofctl -O $ofp_version dump-tlv-map $bridge | \
> +            awk '/^ 0x/ {if (cnt != 0) printf ","; \
> +                 cnt++;printf "{class="$1",type="$2",len="$3"}->"$4}'
> +        echo "'"
> +
> +        printf "%s" "ovs-ofctl -O $ofp_version add-flows $bridge \
> +            \"$workdir/$bridge.flows.dump\""
> +
> +        # If possible, use OpenFlow 1.4 atomic bundle transaction to add
> flows
> +        [ ${ofp_version#OpenFlow} -ge 14 ] && echo " --bundle"
> +
> +        ovs-ofctl -O $ofp_version dump-flows --no-names --no-stats
> "$bridge" | \
> +            sed -e '/NXST_FLOW/d' \
> +                -e '/OFPST_FLOW/d' \
> +                -e 's/\(idle\|hard\)_age=[^,]*,//g' \
> +                > "$workdir/$bridge.flows.dump"
> +    done
> +}
> +
> +workdir=$(mktemp -d)
> +trap 'rm -rf "$workdir"' EXIT
> +
> +# Save flows
> +bridges=$(ovs-vsctl -- --real list-br)
> +flows=$(save_flows $bridges)
> +
> +# Restart the database first, since a large database may take a
> +# while to load, and we want to minimize forwarding disruption.
> +systemctl --job-mode=ignore-dependencies restart ovsdb-server
> +
> +# Stop ovs-vswitchd.
> +systemctl --job-mode=ignore-dependencies stop ovs-vswitchd
> +
> +# Start vswitchd by asking it to wait till flow restore is finished.
> +ovs-vsctl --no-wait set open_vswitch . other_config:flow-restore-
> wait=true
> +systemctl --job-mode=ignore-dependencies start ovs-vswitchd
> +
> +# Restore saved flows and inform vswitchd that we are done.
> +eval "$flows"
> +ovs-vsctl --if-exists remove open_vswitch . other_config
> flow-restore-wait=true
> +
> +exit 0
> --
> 2.13.4
>
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to