Merge pull request #6333 from risaacson/pull_6033

Merge pull_6033.
This commit is contained in:
Richard Isaacson 2014-03-07 15:14:21 -06:00
commit 194f270a92

View file

@ -3,6 +3,7 @@
# (c) 2012, Red Hat, Inc # (c) 2012, Red Hat, Inc
# Written by Seth Vidal <skvidal at fedoraproject.org> # Written by Seth Vidal <skvidal at fedoraproject.org>
# (c) 2014, Epic Games, Inc.
# #
# This file is part of Ansible # This file is part of Ansible
# #
@ -28,6 +29,7 @@ import yum
try: try:
from yum.misc import find_unfinished_transactions, find_ts_remaining from yum.misc import find_unfinished_transactions, find_ts_remaining
from rpmUtils.miscutils import splitFilename from rpmUtils.miscutils import splitFilename
from rpmUtils.miscutils import compareEVR
transaction_helpers = True transaction_helpers = True
except: except:
transaction_helpers = False transaction_helpers = False
@ -38,7 +40,7 @@ module: yum
version_added: historical version_added: historical
short_description: Manages packages with the I(yum) package manager short_description: Manages packages with the I(yum) package manager
description: description:
- Installs, upgrade, removes, and lists packages and groups with the I(yum) package manager. - Installs, upgrades, downgrades, removes and lists packages and groups with the I(yum) package manager.
options: options:
name: name:
description: description:
@ -108,7 +110,7 @@ EXAMPLES = '''
- name: remove the Apache package - name: remove the Apache package
yum: name=httpd state=removed yum: name=httpd state=removed
- name: install the latest version of Apche from the testing repo - name: install the latest version of Apache from the testing repo
yum: name=httpd enablerepo=testing state=installed yum: name=httpd enablerepo=testing state=installed
- name: upgrade all packages - name: upgrade all packages
@ -462,6 +464,8 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos):
res['rc'] = 0 res['rc'] = 0
res['changed'] = False res['changed'] = False
downgrade = False
for spec in items: for spec in items:
pkg = None pkg = None
@ -535,12 +539,33 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos):
if found: if found:
continue continue
# downgrade - the yum install command will only install or upgrade to a spec version, it will
# not install an older version of an RPM even if specified by the install spec. So we need to
# determine if this is a downgrade, and then use the yum downgrade command to install the RPM.
split_pkg_name = splitFilename(spec)
# if the Name and Version match a version was not provided and this is not a downgrade.
if split_pkg_name[0] == split_pkg_name[1]:
pkg_name = split_pkg_name[0]
pkgs = is_installed(module, repoq, pkg_name, conf_file, en_repos=en_repos, dis_repos=dis_repos, is_pkg=True)
if pkgs:
(cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(pkgs[0])
(new_name, new_ver, new_rel, new_epoch, new_arch) = splitFilename(spec)
compare = compareEVR((cur_epoch, cur_ver, cur_rel), (new_epoch, new_ver, new_rel))
if compare > 0:
downgrade = True
# if not - then pass in the spec as what to install # if not - then pass in the spec as what to install
# we could get here if nothing provides it but that's not # we could get here if nothing provides it but that's not
# the error we're catching here # the error we're catching here
pkg = spec pkg = spec
cmd = yum_basecmd + ['install', pkg] operation = 'install'
if downgrade:
operation = 'downgrade'
cmd = yum_basecmd + [operation, pkg]
if module.check_mode: if module.check_mode:
module.exit_json(changed=True) module.exit_json(changed=True)