From 483b615bdddc2bdc11babeda67e1261a15edc0f6 Mon Sep 17 00:00:00 2001 From: Saravanan KR Date: Mon, 21 Oct 2019 18:47:37 +0530 Subject: [PATCH] [Rocky&QueensOnly] Update ovs to 2.11 without network loss During the minor update from ovs2.9 to ovs2.11, handled the package name changes to ensure that ovs is not restarted. This change have been handled already on the upgrade path (queens -> rocky). Handle the same in the minor update (update_steps). This change is not required in master or other stable versions, because all other versions are already migrated to ovs2.11 package and the upgrade path is handled. Change-Id: Id563806777679998412a53c693b02152df1e800e (cherry picked from commit bdea2c17f50c2947d9746e55ca6bb91f6659745c) --- puppet/services/tripleo-packages.yaml | 84 +++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/puppet/services/tripleo-packages.yaml b/puppet/services/tripleo-packages.yaml index 9c656fc614..f3b42677e2 100644 --- a/puppet/services/tripleo-packages.yaml +++ b/puppet/services/tripleo-packages.yaml @@ -278,6 +278,90 @@ outputs: name: '*' state: latest update_tasks: + # With the layered product packaging, the key package is rhosp-openvswitch. It depends on + # a openvswitch package that includes the version as part of the name (e.g openvswitch2.10). + # This requires some additional special handling: + # - During an upgrade the package name for openvswitch may change so + # upgrading the currently installed package won't do anything. + # - The rhosp-openvswitch package "obsoletes" several packages, + # including older openvswitch packages. This results in a pretty + # severe uninstall/install sequence of operations that stops and + # removes openvswitch which could break network links required to + # continue the upgrade. + # - To prevent rhosp-openvswitch breaking connectivity, the currently + # installed core openvswitch packages need to be erased from the rpm + # database but leave the binaries intact. This effectively + # short-circuits the obsoletes mechanism in rhosp-openvswitch and + # leaves the core elements of openvswitch running. In the future we + # may replace this mechanism with "an upgrade on reboot". We only + # do this for the core openvswitch packages so other packages + # obsoleted by rhosp-openvswitch will be removed when + # rhosp-openvswitch is installed/upgraded. + # - Neither the rhosp-openvswitch nor openvswitch{m.n} package enables + # or starts the systemd service so there must always be a task + # to ensure that it is enabled or OpenvSwitch functionality won't be + # available on reboot. + # - With LP, we expect that the core openvswitch package name will + # change with every major upgrade so this special handling will + # eventually replace the special handling of upgrading the + # openvswitch package "in place" + - name: Block for gathering information for upgrading OpenvSwitch layered product packaging + when: step|int == 2 + block: + - name: Process rhosp-openvswitch layered package for new version number + shell: | + set -o pipefail + yum info -q rhosp-openvswitch | awk '/^Version/{print $NF}' + register: rhosp_package_result + ignore_errors: true + - name: Set fact for triggering OpenvSwitch layered product package handling + set_fact: + ovs_lp_packaging: "{{ rhosp_package_result.rc == 0 }}" + - name: Capture the expected OpenvSwitch version. + set_fact: + new_ovs_version: "{{ rhosp_package_result.stdout }}" + when: ovs_lp_packaging|default(false) + + - name: Get current OpenvSwitch package name + register: ovs_pkg_out + shell: + rpm -qa | awk -F- '/^(openvswitch[0-9]+\.[0-9]+-|openvswitch-2)/{print $1}' + - name: Get version from current OpenvSwitch package + register: ovs_version_out + shell: + rpm -qi "{{ ovs_pkg_out.stdout }}" | awk '/^Version/{print $NF}' + - name: split numeric version for OpenvSwitch into parts + set_fact: + ovs_version_parts: "{{ ovs_version_out.stdout.split('.') }}" + - name: get major minor version for OpenvSwitch package naming + set_fact: + current_ovs_version: "{{ ovs_version_parts[0] }}.{{ ovs_version_parts[1] }}" + - name: get OpenvSwitch major version + set_fact: + current_ovs_major_version: "{{ ovs_version_parts[0]|int }}" + - name: get OpenvSwitch minor version + set_fact: + current_ovs_minor_version: "{{ ovs_version_parts[1]|int }}" + - name: Block for upgrading OpenvSwitch when layer package is present + when: + - step|int == 2 + - ovs_lp_packaging|default(false) + block: + - name: set current OpenvSwitch package suffix if old version is layered product format + set_fact: + package_suffix: "{{ current_ovs_version }}" + when: + - current_ovs_major_version|int >= 3 or current_ovs_minor_version|int >=10 + - name: remove old OpenvSwitch package(s) if version doesn't match + shell: | + rpm -e --noscripts --nopreun --nopostun --notriggers --nodeps $(rpm -qa 'openvswitch{{ package_suffix|default('') }}*' | grep -v 'selinux') + args: + warn: false + when: new_ovs_version != current_ovs_version + - name: install/upgrade OpenvSwitch LP package + package: + name: rhosp-openvswitch + state: latest - name: Check for existing yum.pid stat: path=/var/run/yum.pid register: yum_pid_file