mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
disable_excludes (#42510)
* implementing disable_excludes * add check for yum version * limit choices * add testcases for disable_exclude * fix formating * add documentation * syntax fix for test case * fix indentation * need to ignore errors when we want to do a test that fails * test disable_excludes with zip and not sos * add tests for yum < 3.4 not supported * fix formating * centos 6.1 does not support map * drop unsupported selectattr * cleanup testcases * fix test cases beloging to wrong test scenarion (propper when) * evaluate expression * minor test fixes * check output of msg
This commit is contained in:
parent
f2acc97b84
commit
66adabfd42
2 changed files with 201 additions and 57 deletions
|
@ -146,6 +146,15 @@ options:
|
||||||
The disabled plugins will not persist beyond the transaction.
|
The disabled plugins will not persist beyond the transaction.
|
||||||
required: false
|
required: false
|
||||||
version_added: "2.5"
|
version_added: "2.5"
|
||||||
|
disable_excludes:
|
||||||
|
description:
|
||||||
|
- Disable the excludes defined in YUM config files.
|
||||||
|
- If set to C(all), disables all excludes.
|
||||||
|
- If set to C(main), disable excludes defined in [main] in yum.conf.
|
||||||
|
- If set to C(repoid), disable excludes defined for given repo id.
|
||||||
|
required: false
|
||||||
|
choices: [ all, main, repoid ]
|
||||||
|
version_added: "2.7"
|
||||||
notes:
|
notes:
|
||||||
- When used with a `loop:` each package will be processed individually,
|
- When used with a `loop:` each package will be processed individually,
|
||||||
it is much more efficient to pass the list directly to the `name` option.
|
it is much more efficient to pass the list directly to the `name` option.
|
||||||
|
@ -298,7 +307,8 @@ def_qf = "%{epoch}:%{name}-%{version}-%{release}.%{arch}"
|
||||||
rpmbin = None
|
rpmbin = None
|
||||||
|
|
||||||
|
|
||||||
def yum_base(conf_file=None, installroot='/', enabled_plugins=None, disabled_plugins=None):
|
def yum_base(conf_file=None, installroot='/', enabled_plugins=None,
|
||||||
|
disabled_plugins=None, disable_excludes=None):
|
||||||
my = yum.YumBase()
|
my = yum.YumBase()
|
||||||
my.preconf.debuglevel = 0
|
my.preconf.debuglevel = 0
|
||||||
my.preconf.errorlevel = 0
|
my.preconf.errorlevel = 0
|
||||||
|
@ -321,6 +331,8 @@ def yum_base(conf_file=None, installroot='/', enabled_plugins=None, disabled_plu
|
||||||
cachedir = yum.misc.getCacheDir()
|
cachedir = yum.misc.getCacheDir()
|
||||||
my.repos.setCacheDir(cachedir)
|
my.repos.setCacheDir(cachedir)
|
||||||
my.conf.cache = 0
|
my.conf.cache = 0
|
||||||
|
if disable_excludes:
|
||||||
|
my.conf.disable_excludes = disable_excludes
|
||||||
|
|
||||||
return my
|
return my
|
||||||
|
|
||||||
|
@ -367,10 +379,11 @@ def po_to_envra(po):
|
||||||
return '%s:%s-%s-%s.%s' % (po.epoch, po.name, po.version, po.release, po.arch)
|
return '%s:%s-%s-%s.%s' % (po.epoch, po.name, po.version, po.release, po.arch)
|
||||||
|
|
||||||
|
|
||||||
def is_group_env_installed(name, conf_file, en_plugins=None, dis_plugins=None, installroot='/'):
|
def is_group_env_installed(name, conf_file, en_plugins=None, dis_plugins=None,
|
||||||
|
installroot='/', disable_excludes=None):
|
||||||
name_lower = name.lower()
|
name_lower = name.lower()
|
||||||
|
|
||||||
my = yum_base(conf_file, installroot, en_plugins, dis_plugins)
|
my = yum_base(conf_file, installroot, en_plugins, dis_plugins, disable_excludes)
|
||||||
if yum.__version_info__ >= (3, 4):
|
if yum.__version_info__ >= (3, 4):
|
||||||
groups_list = my.doGroupLists(return_evgrps=True)
|
groups_list = my.doGroupLists(return_evgrps=True)
|
||||||
else:
|
else:
|
||||||
|
@ -392,7 +405,8 @@ def is_group_env_installed(name, conf_file, en_plugins=None, dis_plugins=None, i
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def is_installed(module, repoq, pkgspec, conf_file, qf=None, en_repos=None, dis_repos=None, en_plugins=None, dis_plugins=None, is_pkg=False, installroot='/'):
|
def is_installed(module, repoq, pkgspec, conf_file, qf=None, en_repos=None, dis_repos=None, en_plugins=None, dis_plugins=None, is_pkg=False,
|
||||||
|
installroot='/', disable_excludes=None):
|
||||||
if en_repos is None:
|
if en_repos is None:
|
||||||
en_repos = []
|
en_repos = []
|
||||||
if dis_repos is None:
|
if dis_repos is None:
|
||||||
|
@ -403,7 +417,7 @@ def is_installed(module, repoq, pkgspec, conf_file, qf=None, en_repos=None, dis_
|
||||||
if not repoq:
|
if not repoq:
|
||||||
pkgs = []
|
pkgs = []
|
||||||
try:
|
try:
|
||||||
my = yum_base(conf_file, installroot, en_plugins, dis_plugins)
|
my = yum_base(conf_file, installroot, en_plugins, dis_plugins, disable_excludes)
|
||||||
for rid in dis_repos:
|
for rid in dis_repos:
|
||||||
my.repos.disableRepo(rid)
|
my.repos.disableRepo(rid)
|
||||||
for rid in en_repos:
|
for rid in en_repos:
|
||||||
|
@ -454,7 +468,8 @@ def is_installed(module, repoq, pkgspec, conf_file, qf=None, en_repos=None, dis_
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
def is_available(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_repos=None, en_plugins=None, dis_plugins=None, installroot='/'):
|
def is_available(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_repos=None, en_plugins=None, dis_plugins=None,
|
||||||
|
installroot='/', disable_excludes=None):
|
||||||
if en_repos is None:
|
if en_repos is None:
|
||||||
en_repos = []
|
en_repos = []
|
||||||
if dis_repos is None:
|
if dis_repos is None:
|
||||||
|
@ -464,7 +479,7 @@ def is_available(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, di
|
||||||
|
|
||||||
pkgs = []
|
pkgs = []
|
||||||
try:
|
try:
|
||||||
my = yum_base(conf_file, installroot, en_plugins, dis_plugins)
|
my = yum_base(conf_file, installroot, en_plugins, dis_plugins, disable_excludes)
|
||||||
for rid in dis_repos:
|
for rid in dis_repos:
|
||||||
my.repos.disableRepo(rid)
|
my.repos.disableRepo(rid)
|
||||||
for rid in en_repos:
|
for rid in en_repos:
|
||||||
|
@ -498,7 +513,8 @@ def is_available(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, di
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
def is_update(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_repos=None, en_plugins=None, dis_plugins=None, installroot='/'):
|
def is_update(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_repos=None, en_plugins=None, dis_plugins=None,
|
||||||
|
installroot='/', disable_excludes=None):
|
||||||
if en_repos is None:
|
if en_repos is None:
|
||||||
en_repos = []
|
en_repos = []
|
||||||
if dis_repos is None:
|
if dis_repos is None:
|
||||||
|
@ -511,7 +527,7 @@ def is_update(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_r
|
||||||
updates = []
|
updates = []
|
||||||
|
|
||||||
try:
|
try:
|
||||||
my = yum_base(conf_file, installroot, en_plugins, dis_plugins)
|
my = yum_base(conf_file, installroot, en_plugins, dis_plugins, disable_excludes)
|
||||||
for rid in dis_repos:
|
for rid in dis_repos:
|
||||||
my.repos.disableRepo(rid)
|
my.repos.disableRepo(rid)
|
||||||
for rid in en_repos:
|
for rid in en_repos:
|
||||||
|
@ -552,7 +568,7 @@ def is_update(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_r
|
||||||
|
|
||||||
def what_provides(module, repoq, yum_basecmd, req_spec, conf_file, qf=def_qf,
|
def what_provides(module, repoq, yum_basecmd, req_spec, conf_file, qf=def_qf,
|
||||||
en_repos=None, dis_repos=None, en_plugins=None,
|
en_repos=None, dis_repos=None, en_plugins=None,
|
||||||
dis_plugins=None, installroot='/'):
|
dis_plugins=None, installroot='/', disable_excludes=None):
|
||||||
if en_repos is None:
|
if en_repos is None:
|
||||||
en_repos = []
|
en_repos = []
|
||||||
if dis_repos is None:
|
if dis_repos is None:
|
||||||
|
@ -562,7 +578,7 @@ def what_provides(module, repoq, yum_basecmd, req_spec, conf_file, qf=def_qf,
|
||||||
|
|
||||||
pkgs = []
|
pkgs = []
|
||||||
try:
|
try:
|
||||||
my = yum_base(conf_file, installroot, en_plugins, dis_plugins)
|
my = yum_base(conf_file, installroot, en_plugins, dis_plugins, disable_excludes)
|
||||||
for rid in dis_repos:
|
for rid in dis_repos:
|
||||||
my.repos.disableRepo(rid)
|
my.repos.disableRepo(rid)
|
||||||
for rid in en_repos:
|
for rid in en_repos:
|
||||||
|
@ -609,7 +625,7 @@ def what_provides(module, repoq, yum_basecmd, req_spec, conf_file, qf=def_qf,
|
||||||
out += out2
|
out += out2
|
||||||
pkgs = set([p for p in out.split('\n') if p.strip()])
|
pkgs = set([p for p in out.split('\n') if p.strip()])
|
||||||
if not pkgs:
|
if not pkgs:
|
||||||
pkgs = is_installed(module, repoq, req_spec, conf_file, qf=qf, installroot=installroot)
|
pkgs = is_installed(module, repoq, req_spec, conf_file, qf=qf, installroot=installroot, disable_excludes=disable_excludes)
|
||||||
return pkgs
|
return pkgs
|
||||||
else:
|
else:
|
||||||
module.fail_json(msg='Error from repoquery: %s: %s' % (cmd, err + err2))
|
module.fail_json(msg='Error from repoquery: %s: %s' % (cmd, err + err2))
|
||||||
|
@ -741,7 +757,7 @@ def repolist(module, repoq, qf="%{repoid}"):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def list_stuff(module, repoquerybin, conf_file, stuff, installroot='/', disablerepo='', enablerepo=''):
|
def list_stuff(module, repoquerybin, conf_file, stuff, installroot='/', disablerepo='', enablerepo='', disable_excludes=None):
|
||||||
|
|
||||||
qf = "%{name}|%{epoch}|%{version}|%{release}|%{arch}|%{repoid}"
|
qf = "%{name}|%{epoch}|%{version}|%{release}|%{arch}|%{repoid}"
|
||||||
# is_installed goes through rpm instead of repoquery so it needs a slightly different format
|
# is_installed goes through rpm instead of repoquery so it needs a slightly different format
|
||||||
|
@ -757,19 +773,24 @@ def list_stuff(module, repoquerybin, conf_file, stuff, installroot='/', disabler
|
||||||
repoq += ['-c', conf_file]
|
repoq += ['-c', conf_file]
|
||||||
|
|
||||||
if stuff == 'installed':
|
if stuff == 'installed':
|
||||||
return [pkg_to_dict(p) for p in sorted(is_installed(module, repoq, '-a', conf_file, qf=is_installed_qf, installroot=installroot)) if p.strip()]
|
return [pkg_to_dict(p) for p in sorted(is_installed(module, repoq, '-a', conf_file, qf=is_installed_qf,
|
||||||
|
installroot=installroot, disable_excludes=disable_excludes)) if p.strip()]
|
||||||
|
|
||||||
if stuff == 'updates':
|
if stuff == 'updates':
|
||||||
return [pkg_to_dict(p) for p in sorted(is_update(module, repoq, '-a', conf_file, qf=qf, installroot=installroot)) if p.strip()]
|
return [pkg_to_dict(p) for p in sorted(is_update(module, repoq, '-a', conf_file, qf=qf,
|
||||||
|
installroot=installroot, disable_excludes=disable_excludes)) if p.strip()]
|
||||||
|
|
||||||
if stuff == 'available':
|
if stuff == 'available':
|
||||||
return [pkg_to_dict(p) for p in sorted(is_available(module, repoq, '-a', conf_file, qf=qf, installroot=installroot)) if p.strip()]
|
return [pkg_to_dict(p) for p in sorted(is_available(module, repoq, '-a', conf_file, qf=qf,
|
||||||
|
installroot=installroot, disable_excludes=disable_excludes)) if p.strip()]
|
||||||
|
|
||||||
if stuff == 'repos':
|
if stuff == 'repos':
|
||||||
return [dict(repoid=name, state='enabled') for name in sorted(repolist(module, repoq)) if name.strip()]
|
return [dict(repoid=name, state='enabled') for name in sorted(repolist(module, repoq)) if name.strip()]
|
||||||
|
|
||||||
return [pkg_to_dict(p) for p in sorted(is_installed(module, repoq, stuff, conf_file, qf=is_installed_qf, installroot=installroot) +
|
return [pkg_to_dict(p) for p in sorted(is_installed(module, repoq, stuff, conf_file, qf=is_installed_qf,
|
||||||
is_available(module, repoq, stuff, conf_file, qf=qf, installroot=installroot)) if p.strip()]
|
installroot=installroot, disable_excludes=disable_excludes) +
|
||||||
|
is_available(module, repoq, stuff, conf_file, qf=qf, installroot=installroot,
|
||||||
|
disable_excludes=disable_excludes)) if p.strip()]
|
||||||
|
|
||||||
|
|
||||||
def exec_install(module, items, action, pkgs, res, yum_basecmd):
|
def exec_install(module, items, action, pkgs, res, yum_basecmd):
|
||||||
|
@ -807,7 +828,8 @@ def exec_install(module, items, action, pkgs, res, yum_basecmd):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en_plugins, dis_plugins, installroot='/', allow_downgrade=False):
|
def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en_plugins, dis_plugins, installroot='/',
|
||||||
|
allow_downgrade=False, disable_excludes=None):
|
||||||
|
|
||||||
pkgs = []
|
pkgs = []
|
||||||
downgrade_pkgs = []
|
downgrade_pkgs = []
|
||||||
|
@ -841,15 +863,15 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
module.fail_json(msg="Failed to get nevra information from RPM package: %s" % spec)
|
module.fail_json(msg="Failed to get nevra information from RPM package: %s" % spec)
|
||||||
installed_pkgs = is_installed(module, repoq, envra, conf_file, en_repos=en_repos,
|
installed_pkgs = is_installed(module, repoq, envra, conf_file, en_repos=en_repos,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_plugins=dis_plugins, installroot=installroot)
|
dis_plugins=dis_plugins, installroot=installroot, disable_excludes=disable_excludes)
|
||||||
if installed_pkgs:
|
if installed_pkgs:
|
||||||
res['results'].append('%s providing %s is already installed' % (installed_pkgs[0], package))
|
res['results'].append('%s providing %s is already installed' % (installed_pkgs[0], package))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
(name, ver, rel, epoch, arch) = splitFilename(envra)
|
(name, ver, rel, epoch, arch) = splitFilename(envra)
|
||||||
installed_pkgs = is_installed(module, repoq, name, conf_file, en_repos=en_repos,
|
installed_pkgs = is_installed(module, repoq, name, conf_file, en_repos=en_repos,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_repos=dis_repos, en_plugins=en_plugins, dis_plugins=dis_plugins,
|
||||||
dis_plugins=dis_plugins, installroot=installroot)
|
installroot=installroot, disable_excludes=disable_excludes)
|
||||||
|
|
||||||
# case for two same envr but differrent archs like x86_64 and i686
|
# case for two same envr but differrent archs like x86_64 and i686
|
||||||
if len(installed_pkgs) == 2:
|
if len(installed_pkgs) == 2:
|
||||||
|
@ -884,7 +906,8 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
|
|
||||||
# groups
|
# groups
|
||||||
elif spec.startswith('@'):
|
elif spec.startswith('@'):
|
||||||
if is_group_env_installed(spec, conf_file, en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot):
|
if is_group_env_installed(spec, conf_file, en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot,
|
||||||
|
disable_excludes=disable_excludes):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
pkg = spec
|
pkg = spec
|
||||||
|
@ -898,7 +921,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
installed_pkgs = is_installed(module, repoq, spec, conf_file, en_repos=en_repos,
|
installed_pkgs = is_installed(module, repoq, spec, conf_file, en_repos=en_repos,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_plugins=dis_plugins, is_pkg=True,
|
dis_plugins=dis_plugins, is_pkg=True,
|
||||||
installroot=installroot)
|
installroot=installroot, disable_excludes=disable_excludes)
|
||||||
if installed_pkgs:
|
if installed_pkgs:
|
||||||
res['results'].append('%s providing %s is already installed' % (installed_pkgs[0], spec))
|
res['results'].append('%s providing %s is already installed' % (installed_pkgs[0], spec))
|
||||||
continue
|
continue
|
||||||
|
@ -906,7 +929,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
# look up what pkgs provide this
|
# look up what pkgs provide this
|
||||||
pkglist = what_provides(module, repoq, yum_basecmd, spec, conf_file, en_repos=en_repos,
|
pkglist = what_provides(module, repoq, yum_basecmd, spec, conf_file, en_repos=en_repos,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins, dis_plugins=dis_plugins,
|
dis_repos=dis_repos, en_plugins=en_plugins, dis_plugins=dis_plugins,
|
||||||
installroot=installroot)
|
installroot=installroot, disable_excludes=disable_excludes)
|
||||||
if not pkglist:
|
if not pkglist:
|
||||||
res['msg'] += "No package matching '%s' found available, installed or updated" % spec
|
res['msg'] += "No package matching '%s' found available, installed or updated" % spec
|
||||||
res['results'].append("No package matching '%s' found available, installed or updated" % spec)
|
res['results'].append("No package matching '%s' found available, installed or updated" % spec)
|
||||||
|
@ -928,7 +951,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
for this in pkglist:
|
for this in pkglist:
|
||||||
if is_installed(module, repoq, this, conf_file, en_repos=en_repos, dis_repos=dis_repos,
|
if is_installed(module, repoq, this, conf_file, en_repos=en_repos, dis_repos=dis_repos,
|
||||||
en_plugins=en_plugins, dis_plugins=dis_plugins, is_pkg=True,
|
en_plugins=en_plugins, dis_plugins=dis_plugins, is_pkg=True,
|
||||||
installroot=installroot):
|
installroot=installroot, disable_excludes=disable_excludes):
|
||||||
found = True
|
found = True
|
||||||
res['results'].append('%s providing %s is already installed' % (this, spec))
|
res['results'].append('%s providing %s is already installed' % (this, spec))
|
||||||
break
|
break
|
||||||
|
@ -940,7 +963,8 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
# highly irritating
|
# highly irritating
|
||||||
if not found:
|
if not found:
|
||||||
if is_installed(module, repoq, spec, conf_file, en_repos=en_repos, dis_repos=dis_repos,
|
if is_installed(module, repoq, spec, conf_file, en_repos=en_repos, dis_repos=dis_repos,
|
||||||
en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot):
|
en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot,
|
||||||
|
disable_excludes=disable_excludes):
|
||||||
found = True
|
found = True
|
||||||
res['results'].append('package providing %s is already installed' % (spec))
|
res['results'].append('package providing %s is already installed' % (spec))
|
||||||
|
|
||||||
|
@ -960,7 +984,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
# Check if any version of the requested package is installed
|
# Check if any version of the requested package is installed
|
||||||
inst_pkgs = is_installed(module, repoq, name, conf_file, en_repos=en_repos,
|
inst_pkgs = is_installed(module, repoq, name, conf_file, en_repos=en_repos,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_plugins=dis_plugins, is_pkg=True)
|
dis_plugins=dis_plugins, is_pkg=True, disable_excludes=disable_excludes)
|
||||||
if inst_pkgs:
|
if inst_pkgs:
|
||||||
(cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(inst_pkgs[0])
|
(cur_name, cur_ver, cur_rel, cur_epoch, cur_arch) = splitFilename(inst_pkgs[0])
|
||||||
compare = compareEVR((cur_epoch, cur_ver, cur_rel), (epoch, ver, rel))
|
compare = compareEVR((cur_epoch, cur_ver, cur_rel), (epoch, ver, rel))
|
||||||
|
@ -989,7 +1013,8 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, e
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en_plugins, dis_plugins, installroot='/'):
|
def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en_plugins, dis_plugins,
|
||||||
|
installroot='/', disable_excludes=None):
|
||||||
|
|
||||||
pkgs = []
|
pkgs = []
|
||||||
res = {}
|
res = {}
|
||||||
|
@ -1000,11 +1025,11 @@ def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en
|
||||||
|
|
||||||
for pkg in items:
|
for pkg in items:
|
||||||
if pkg.startswith('@'):
|
if pkg.startswith('@'):
|
||||||
installed = is_group_env_installed(pkg, conf_file, en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot)
|
installed = is_group_env_installed(pkg, conf_file, en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot,
|
||||||
|
disable_excludes=disable_excludes)
|
||||||
else:
|
else:
|
||||||
installed = is_installed(module, repoq, pkg, conf_file, en_repos=en_repos,
|
installed = is_installed(module, repoq, pkg, conf_file, en_repos=en_repos, dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_plugins=dis_plugins, installroot=installroot, disable_excludes=disable_excludes)
|
||||||
dis_plugins=dis_plugins, installroot=installroot)
|
|
||||||
|
|
||||||
if installed:
|
if installed:
|
||||||
pkgs.append(pkg)
|
pkgs.append(pkg)
|
||||||
|
@ -1035,11 +1060,11 @@ def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en
|
||||||
# at this point we check to see if the pkg is no longer present
|
# at this point we check to see if the pkg is no longer present
|
||||||
for pkg in pkgs:
|
for pkg in pkgs:
|
||||||
if pkg.startswith('@'):
|
if pkg.startswith('@'):
|
||||||
installed = is_group_env_installed(pkg, conf_file, en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot)
|
installed = is_group_env_installed(pkg, conf_file, en_plugins=en_plugins, dis_plugins=dis_plugins,
|
||||||
|
installroot=installroot, disable_excludes=disable_excludes)
|
||||||
else:
|
else:
|
||||||
installed = is_installed(module, repoq, pkg, conf_file, en_repos=en_repos,
|
installed = is_installed(module, repoq, pkg, conf_file, en_repos=en_repos, dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_plugins=dis_plugins, installroot=installroot, disable_excludes=disable_excludes)
|
||||||
dis_plugins=dis_plugins, installroot=installroot)
|
|
||||||
|
|
||||||
if installed:
|
if installed:
|
||||||
module.fail_json(**res)
|
module.fail_json(**res)
|
||||||
|
@ -1095,7 +1120,8 @@ def parse_check_update(check_update_output):
|
||||||
return updates
|
return updates
|
||||||
|
|
||||||
|
|
||||||
def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en_plugins, dis_plugins, update_only, installroot='/'):
|
def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en_plugins, dis_plugins, update_only,
|
||||||
|
installroot='/', disable_excludes=None):
|
||||||
|
|
||||||
res = {}
|
res = {}
|
||||||
res['results'] = []
|
res['results'] = []
|
||||||
|
@ -1155,9 +1181,8 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en
|
||||||
module.fail_json(msg="Failed to get nevra information from RPM package: %s" % spec)
|
module.fail_json(msg="Failed to get nevra information from RPM package: %s" % spec)
|
||||||
|
|
||||||
# local rpm files can't be updated
|
# local rpm files can't be updated
|
||||||
if not is_installed(module, repoq, envra, conf_file, en_repos=en_repos,
|
if not is_installed(module, repoq, envra, conf_file, en_repos=en_repos, dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_plugins=dis_plugins, installroot=installroot, disable_excludes=disable_excludes):
|
||||||
dis_plugins=dis_plugins, installroot=installroot):
|
|
||||||
pkgs['install'].append(spec)
|
pkgs['install'].append(spec)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -1172,22 +1197,22 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en
|
||||||
module.fail_json(msg="Failed to get nevra information from RPM package: %s" % spec)
|
module.fail_json(msg="Failed to get nevra information from RPM package: %s" % spec)
|
||||||
|
|
||||||
# local rpm files can't be updated
|
# local rpm files can't be updated
|
||||||
if not is_installed(module, repoq, envra, conf_file, en_repos=en_repos,
|
if not is_installed(module, repoq, envra, conf_file, en_repos=en_repos, dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_plugins=dis_plugins, installroot=installroot, disable_excludes=disable_excludes):
|
||||||
dis_plugins=dis_plugins, installroot=installroot):
|
|
||||||
pkgs['install'].append(package)
|
pkgs['install'].append(package)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# dep/pkgname - find it
|
# dep/pkgname - find it
|
||||||
else:
|
else:
|
||||||
if is_installed(module, repoq, spec, conf_file, en_repos=en_repos, dis_repos=dis_repos,
|
if is_installed(module, repoq, spec, conf_file, en_repos=en_repos, dis_repos=dis_repos,
|
||||||
en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot) or update_only:
|
en_plugins=en_plugins, dis_plugins=dis_plugins, installroot=installroot,
|
||||||
|
disable_excludes=disable_excludes) or update_only:
|
||||||
pkgs['update'].append(spec)
|
pkgs['update'].append(spec)
|
||||||
else:
|
else:
|
||||||
pkgs['install'].append(spec)
|
pkgs['install'].append(spec)
|
||||||
pkglist = what_provides(module, repoq, yum_basecmd, spec, conf_file, en_repos=en_repos,
|
pkglist = what_provides(module, repoq, yum_basecmd, spec, conf_file, en_repos=en_repos,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins, dis_plugins=dis_plugins,
|
dis_repos=dis_repos, en_plugins=en_plugins, dis_plugins=dis_plugins,
|
||||||
installroot=installroot)
|
installroot=installroot, disable_excludes=disable_excludes)
|
||||||
# FIXME..? may not be desirable to throw an exception here if a single package is missing
|
# FIXME..? may not be desirable to throw an exception here if a single package is missing
|
||||||
if not pkglist:
|
if not pkglist:
|
||||||
res['msg'] += "No package matching '%s' found available, installed or updated" % spec
|
res['msg'] += "No package matching '%s' found available, installed or updated" % spec
|
||||||
|
@ -1200,7 +1225,7 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en
|
||||||
if spec in pkgs['install'] and is_available(module, repoq, pkg, conf_file,
|
if spec in pkgs['install'] and is_available(module, repoq, pkg, conf_file,
|
||||||
en_repos=en_repos, dis_repos=dis_repos,
|
en_repos=en_repos, dis_repos=dis_repos,
|
||||||
en_plugins=en_plugins, dis_plugins=dis_plugins,
|
en_plugins=en_plugins, dis_plugins=dis_plugins,
|
||||||
installroot=installroot):
|
installroot=installroot, disable_excludes=disable_excludes):
|
||||||
nothing_to_do = False
|
nothing_to_do = False
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -1220,7 +1245,7 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en
|
||||||
|
|
||||||
if not is_installed(module, repoq, spec, conf_file, en_repos=en_repos,
|
if not is_installed(module, repoq, spec, conf_file, en_repos=en_repos,
|
||||||
dis_repos=dis_repos, en_plugins=en_plugins,
|
dis_repos=dis_repos, en_plugins=en_plugins,
|
||||||
dis_plugins=dis_plugins, installroot=installroot) and update_only:
|
dis_plugins=dis_plugins, installroot=installroot, disable_excludes=disable_excludes) and update_only:
|
||||||
res['results'].append("Packages providing %s not installed due to update_only specified" % spec)
|
res['results'].append("Packages providing %s not installed due to update_only specified" % spec)
|
||||||
continue
|
continue
|
||||||
if nothing_to_do:
|
if nothing_to_do:
|
||||||
|
@ -1285,7 +1310,8 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, en
|
||||||
|
|
||||||
def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
||||||
disable_gpg_check, exclude, repoq, skip_broken, update_only, security,
|
disable_gpg_check, exclude, repoq, skip_broken, update_only, security,
|
||||||
bugfix, installroot='/', allow_downgrade=False, disable_plugin=None, enable_plugin=None):
|
bugfix, installroot='/', allow_downgrade=False, disable_plugin=None,
|
||||||
|
enable_plugin=None, disable_excludes=None):
|
||||||
|
|
||||||
# fedora will redirect yum to dnf, which has incompatibilities
|
# fedora will redirect yum to dnf, which has incompatibilities
|
||||||
# with how this module expects yum to operate. If yum-deprecated
|
# with how this module expects yum to operate. If yum-deprecated
|
||||||
|
@ -1328,6 +1354,9 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
||||||
e_cmd = ['--exclude=%s' % exclude]
|
e_cmd = ['--exclude=%s' % exclude]
|
||||||
yum_basecmd.extend(e_cmd)
|
yum_basecmd.extend(e_cmd)
|
||||||
|
|
||||||
|
if disable_excludes:
|
||||||
|
yum_basecmd.extend(['--disableexcludes=%s' % disable_excludes])
|
||||||
|
|
||||||
if installroot != '/':
|
if installroot != '/':
|
||||||
# do not setup installroot by default, because of error
|
# do not setup installroot by default, because of error
|
||||||
# CRITICAL:yum.cli:Config Error: Error accessing file for config file:////etc/yum.conf
|
# CRITICAL:yum.cli:Config Error: Error accessing file for config file:////etc/yum.conf
|
||||||
|
@ -1364,7 +1393,7 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
||||||
if module.params.get('update_cache'):
|
if module.params.get('update_cache'):
|
||||||
module.run_command(yum_basecmd + ['clean', 'expire-cache'])
|
module.run_command(yum_basecmd + ['clean', 'expire-cache'])
|
||||||
|
|
||||||
my = yum_base(conf_file, installroot, enable_plugin, disable_plugin)
|
my = yum_base(conf_file, installroot, enable_plugin, disable_plugin, disable_excludes)
|
||||||
try:
|
try:
|
||||||
if disablerepo:
|
if disablerepo:
|
||||||
my.repos.disableRepo(disablerepo)
|
my.repos.disableRepo(disablerepo)
|
||||||
|
@ -1387,9 +1416,10 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
||||||
yum_basecmd.append('--nogpgcheck')
|
yum_basecmd.append('--nogpgcheck')
|
||||||
res = install(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos,
|
res = install(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos,
|
||||||
enable_plugin, disable_plugin, installroot=installroot,
|
enable_plugin, disable_plugin, installroot=installroot,
|
||||||
allow_downgrade=allow_downgrade)
|
allow_downgrade=allow_downgrade, disable_excludes=disable_excludes)
|
||||||
elif state in ['removed', 'absent']:
|
elif state in ['removed', 'absent']:
|
||||||
res = remove(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos, enable_plugin, disable_plugin, installroot=installroot)
|
res = remove(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos, enable_plugin, disable_plugin,
|
||||||
|
installroot=installroot, disable_excludes=disable_excludes)
|
||||||
elif state == 'latest':
|
elif state == 'latest':
|
||||||
if disable_gpg_check:
|
if disable_gpg_check:
|
||||||
yum_basecmd.append('--nogpgcheck')
|
yum_basecmd.append('--nogpgcheck')
|
||||||
|
@ -1397,7 +1427,8 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
||||||
yum_basecmd.append('--security')
|
yum_basecmd.append('--security')
|
||||||
if bugfix:
|
if bugfix:
|
||||||
yum_basecmd.append('--bugfix')
|
yum_basecmd.append('--bugfix')
|
||||||
res = latest(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos, enable_plugin, disable_plugin, update_only, installroot=installroot)
|
res = latest(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos, enable_plugin, disable_plugin, update_only,
|
||||||
|
installroot=installroot, disable_excludes=disable_excludes)
|
||||||
else:
|
else:
|
||||||
# should be caught by AnsibleModule argument_spec
|
# should be caught by AnsibleModule argument_spec
|
||||||
module.fail_json(msg="we should never get here unless this all failed",
|
module.fail_json(msg="we should never get here unless this all failed",
|
||||||
|
@ -1440,6 +1471,7 @@ def main():
|
||||||
bugfix=dict(required=False, type='bool', default=False),
|
bugfix=dict(required=False, type='bool', default=False),
|
||||||
enable_plugin=dict(type='list', default=[]),
|
enable_plugin=dict(type='list', default=[]),
|
||||||
disable_plugin=dict(type='list', default=[]),
|
disable_plugin=dict(type='list', default=[]),
|
||||||
|
disable_excludes=dict(type='str', default=None, choices=['all', 'main', 'repoid']),
|
||||||
),
|
),
|
||||||
required_one_of=[['name', 'list']],
|
required_one_of=[['name', 'list']],
|
||||||
mutually_exclusive=[['name', 'list']],
|
mutually_exclusive=[['name', 'list']],
|
||||||
|
@ -1458,6 +1490,8 @@ def main():
|
||||||
params = module.params
|
params = module.params
|
||||||
enable_plugin = params.get('enable_plugin')
|
enable_plugin = params.get('enable_plugin')
|
||||||
disable_plugin = params.get('disable_plugin')
|
disable_plugin = params.get('disable_plugin')
|
||||||
|
if params['disable_excludes'] and yum.__version_info__ < (3, 4):
|
||||||
|
module.fail_json(msg="'disable_includes' is available in yum version 3.4 and onwards.")
|
||||||
|
|
||||||
if params['list']:
|
if params['list']:
|
||||||
repoquerybin = ensure_yum_utils(module)
|
repoquerybin = ensure_yum_utils(module)
|
||||||
|
@ -1465,13 +1499,13 @@ def main():
|
||||||
module.fail_json(msg="repoquery is required to use list= with this module. Please install the yum-utils package.")
|
module.fail_json(msg="repoquery is required to use list= with this module. Please install the yum-utils package.")
|
||||||
results = {'results': list_stuff(module, repoquerybin, params['conf_file'],
|
results = {'results': list_stuff(module, repoquerybin, params['conf_file'],
|
||||||
params['list'], params['installroot'],
|
params['list'], params['installroot'],
|
||||||
params['disablerepo'], params['enablerepo'])}
|
params['disablerepo'], params['enablerepo'], params['disable_excludes'])}
|
||||||
else:
|
else:
|
||||||
# If rhn-plugin is installed and no rhn-certificate is available on
|
# If rhn-plugin is installed and no rhn-certificate is available on
|
||||||
# the system then users will see an error message using the yum API.
|
# the system then users will see an error message using the yum API.
|
||||||
# Use repoquery in those cases.
|
# Use repoquery in those cases.
|
||||||
|
|
||||||
my = yum_base(params['conf_file'], params['installroot'], enable_plugin, disable_plugin)
|
my = yum_base(params['conf_file'], params['installroot'], enable_plugin, disable_plugin, params['disable_excludes'])
|
||||||
# A sideeffect of accessing conf is that the configuration is
|
# A sideeffect of accessing conf is that the configuration is
|
||||||
# loaded and plugins are discovered
|
# loaded and plugins are discovered
|
||||||
my.conf
|
my.conf
|
||||||
|
@ -1502,7 +1536,7 @@ def main():
|
||||||
results = ensure(module, state, pkg, params['conf_file'], enablerepo,
|
results = ensure(module, state, pkg, params['conf_file'], enablerepo,
|
||||||
disablerepo, disable_gpg_check, exclude, repoquery,
|
disablerepo, disable_gpg_check, exclude, repoquery,
|
||||||
skip_broken, update_only, security, bugfix, params['installroot'], allow_downgrade,
|
skip_broken, update_only, security, bugfix, params['installroot'], allow_downgrade,
|
||||||
disable_plugin=disable_plugin, enable_plugin=enable_plugin)
|
disable_plugin=disable_plugin, enable_plugin=enable_plugin, disable_excludes=params['disable_excludes'])
|
||||||
if repoquery:
|
if repoquery:
|
||||||
results['msg'] = '%s %s' % (
|
results['msg'] = '%s %s' % (
|
||||||
results.get('msg', ''),
|
results.get('msg', ''),
|
||||||
|
|
|
@ -214,7 +214,7 @@
|
||||||
- name: check sos with rpm
|
- name: check sos with rpm
|
||||||
shell: rpm -q sos
|
shell: rpm -q sos
|
||||||
|
|
||||||
- name: check sos with rpm
|
- name: check bc with rpm
|
||||||
shell: rpm -q bc
|
shell: rpm -q bc
|
||||||
|
|
||||||
- name: uninstall sos and bc
|
- name: uninstall sos and bc
|
||||||
|
@ -546,3 +546,113 @@
|
||||||
file:
|
file:
|
||||||
name: "/tmp/non_existent_pkg.rpm"
|
name: "/tmp/non_existent_pkg.rpm"
|
||||||
state: absent
|
state: absent
|
||||||
|
|
||||||
|
- name: get yum version
|
||||||
|
yum:
|
||||||
|
list: yum
|
||||||
|
register: yum_version
|
||||||
|
|
||||||
|
- name: set yum_version of installed version
|
||||||
|
set_fact:
|
||||||
|
yum_version: "{%- if item.yumstate == 'installed' -%}{{ item.version }}{%- else -%}{{ yum_version }}{%- endif -%}"
|
||||||
|
with_items: "{{ yum_version.results }}"
|
||||||
|
|
||||||
|
- name: check whether yum supports disableexcludes (>= 3.4)
|
||||||
|
set_fact:
|
||||||
|
supports_disable_excludes: "{{ yum_version is version_compare('3.4.0', '>=') }}"
|
||||||
|
|
||||||
|
- name: uninstall zip
|
||||||
|
yum: name=zip state=removed
|
||||||
|
|
||||||
|
- name: check zip with rpm
|
||||||
|
shell: rpm -q zip
|
||||||
|
ignore_errors: True
|
||||||
|
register: rpm_zip_result
|
||||||
|
|
||||||
|
- name: verify zip is uninstalled
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "rpm_zip_result is failed"
|
||||||
|
|
||||||
|
- name: exclude zip
|
||||||
|
lineinfile:
|
||||||
|
dest: /etc/yum.conf
|
||||||
|
regexp: (^exclude=)(.)*
|
||||||
|
line: "exclude=zip*"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
# begin test case where disable_excludes is supported
|
||||||
|
- name: Try install zip without disable_excludes
|
||||||
|
yum: name=zip state=latest
|
||||||
|
register: yum_zip_result
|
||||||
|
ignore_errors: True
|
||||||
|
when: supports_disable_excludes
|
||||||
|
|
||||||
|
- name: verify zip did not install because it is in exclude list
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "yum_zip_result is failed"
|
||||||
|
when: supports_disable_excludes
|
||||||
|
|
||||||
|
- name: install zip with disable_excludes
|
||||||
|
yum: name=zip state=latest disable_excludes=all
|
||||||
|
register: yum_zip_result_using_excludes
|
||||||
|
when: supports_disable_excludes
|
||||||
|
|
||||||
|
- name: verify zip did install using disable_excludes=all
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "yum_zip_result_using_excludes is success"
|
||||||
|
- "yum_zip_result_using_excludes is changed"
|
||||||
|
- "yum_zip_result_using_excludes is not failed"
|
||||||
|
when: supports_disable_excludes
|
||||||
|
|
||||||
|
- name: remove exclude zip (cleanup yum.conf)
|
||||||
|
lineinfile:
|
||||||
|
dest: /etc/yum.conf
|
||||||
|
regexp: (^exclude=zip*)
|
||||||
|
line: "exclude="
|
||||||
|
state: present
|
||||||
|
when: supports_disable_excludes
|
||||||
|
# end test case where disable_excludes is supported
|
||||||
|
|
||||||
|
# begin test case where disable_excludes is not supported
|
||||||
|
- name: Try install zip with disable_excludes
|
||||||
|
yum: name=zip state=latest disable_excludes=all
|
||||||
|
register: yum_fail_zip_result_old_yum
|
||||||
|
ignore_errors: True
|
||||||
|
when: not supports_disable_excludes
|
||||||
|
|
||||||
|
- name: verify packages did not install because yum version is unsupported
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "yum_fail_zip_result_old_yum is failed"
|
||||||
|
when: not supports_disable_excludes
|
||||||
|
|
||||||
|
- name: verify yum module outputs
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'is available in yum version 3.4 and onwards.' in yum_fail_zip_result_old_yum.msg"
|
||||||
|
when: not supports_disable_excludes
|
||||||
|
|
||||||
|
- name: remove exclude zip (cleanup yum.conf)
|
||||||
|
lineinfile:
|
||||||
|
dest: /etc/yum.conf
|
||||||
|
regexp: (^exclude=zip*)
|
||||||
|
line: "exclude="
|
||||||
|
state: present
|
||||||
|
when: not supports_disable_excludes
|
||||||
|
|
||||||
|
- name: install zip (bring test env in same state as when testing started)
|
||||||
|
yum: name=zip state=latest
|
||||||
|
register: yum_zip_result_old_yum
|
||||||
|
when: not supports_disable_excludes
|
||||||
|
|
||||||
|
- name: verify zip installed
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "yum_zip_result_old_yum is success"
|
||||||
|
- "yum_zip_result_old_yum is changed"
|
||||||
|
- "yum_zip_result_old_yum is not failed"
|
||||||
|
when: not supports_disable_excludes
|
||||||
|
# end test case where disable_excludes is not supported
|
Loading…
Reference in a new issue