diff --git a/lib/ansible/modules/packaging/os/yum.py b/lib/ansible/modules/packaging/os/yum.py index 2b6d3514a1..4fe59021fa 100644 --- a/lib/ansible/modules/packaging/os/yum.py +++ b/lib/ansible/modules/packaging/os/yum.py @@ -747,16 +747,20 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i (name, ver, rel, epoch, arch) = splitFilename(envra) installed_pkgs = is_installed(module, repoq, name, conf_file, en_repos=en_repos, dis_repos=dis_repos, installroot=installroot) - # TODO support downgrade for rpm files if len(installed_pkgs) == 1: installed_pkg = installed_pkgs[0] (cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(installed_pkg) cur_epoch = cur_epoch or '0' compare = compareEVR((cur_epoch, cur_ver, cur_rel), (epoch, ver, rel)) - # compare > 0 (higher version is installed) or compare == 0 (exact version is installed) - if compare >= 0: + # compare > 0 -> higher version is installed + # compare == 0 -> exact version is installed + # compare < 0 -> lower version is installed + if compare > 0 and allow_downgrade: + downgrade_candidate = True + elif compare >= 0: continue + # else: if there are more installed packages with the same name, that would mean # kernel, gpg-pubkey or like, so just let yum deal with it and try to install it diff --git a/test/integration/targets/yum/tasks/repo.yml b/test/integration/targets/yum/tasks/repo.yml index 9116971959..872638bcf4 100644 --- a/test/integration/targets/yum/tasks/repo.yml +++ b/test/integration/targets/yum/tasks/repo.yml @@ -499,3 +499,36 @@ - "'rc' in yum_result" - "'results' in yum_result" # ============================================================================ +- name: Make sure latest foo is installed + yum: + name: foo + state: latest + +- name: Downgrade foo using rpm file + yum: + name: "{{ repodir }}/foo-1.0-1.{{ ansible_architecture }}.rpm" + state: present + allow_downgrade: yes + register: yum_result + +- name: Check foo with rpm + shell: rpm -q foo + register: rpm_result + +- name: Verify installation + assert: + that: + - "rpm_result.rc == 0" + - "yum_result.rc == 0" + - "yum_result.changed" + - "not yum_result|failed" + - "rpm_result.stdout.startswith('foo-1.0-1')" + +- name: Verify yum module outputs + assert: + that: + - "'changed' in yum_result" + - "'msg' in yum_result" + - "'rc' in yum_result" + - "'results' in yum_result" +# ============================================================================