Further optimizations pointed out by @kustodian in #1516
* Only install yum-utils if needed (b/c we're going to use repoquery) * Add a warning message explaining that why slower repoquery was used rather than yum API.
This commit is contained in:
parent
9c88f91092
commit
ef7a75938a
1 changed files with 45 additions and 41 deletions
|
@ -165,12 +165,17 @@ def yum_base(conf_file=None):
|
|||
my.preconf.fn = conf_file
|
||||
return my
|
||||
|
||||
def install_yum_utils(module):
|
||||
def ensure_yum_utils(module):
|
||||
|
||||
if not module.check_mode:
|
||||
repoquerybin = module.get_bin_path('repoquery', required=False)
|
||||
|
||||
if module.params['install_repoquery'] and not repoquerybin and not module.check_mode:
|
||||
yum_path = module.get_bin_path('yum')
|
||||
if yum_path:
|
||||
rc, so, se = module.run_command('%s -y install yum-utils' % yum_path)
|
||||
rc, so, se = module.run_command('%s -y install yum-utils' % yum_path)
|
||||
repoquerybin = module.get_bin_path('repoquery', required=False)
|
||||
|
||||
return repoquerybin
|
||||
|
||||
def po_to_nevra(po):
|
||||
|
||||
|
@ -313,7 +318,7 @@ def is_update(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_r
|
|||
else:
|
||||
module.fail_json(msg='Error from repoquery: %s: %s' % (cmd, err))
|
||||
|
||||
return []
|
||||
return set()
|
||||
|
||||
def what_provides(module, repoq, req_spec, conf_file, qf=def_qf, en_repos=None, dis_repos=None):
|
||||
if en_repos is None:
|
||||
|
@ -365,7 +370,7 @@ def what_provides(module, repoq, req_spec, conf_file, qf=def_qf, en_repos=None,
|
|||
else:
|
||||
module.fail_json(msg='Error from repoquery: %s: %s' % (cmd, err + err2))
|
||||
|
||||
return []
|
||||
return set()
|
||||
|
||||
def transaction_exists(pkglist):
|
||||
"""
|
||||
|
@ -626,8 +631,8 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos):
|
|||
shutil.rmtree(tempdir)
|
||||
except Exception, e:
|
||||
module.fail_json(msg="Failure deleting temp directory %s, %s" % (tempdir, e))
|
||||
|
||||
module.exit_json(**res)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos):
|
||||
|
@ -681,8 +686,8 @@ def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos):
|
|||
|
||||
if rc != 0:
|
||||
module.fail_json(**res)
|
||||
|
||||
module.exit_json(**res)
|
||||
|
||||
return res
|
||||
|
||||
def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos):
|
||||
|
||||
|
@ -764,30 +769,15 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos):
|
|||
else:
|
||||
res['changed'] = True
|
||||
|
||||
module.exit_json(**res)
|
||||
return res
|
||||
|
||||
def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
||||
disable_gpg_check, exclude):
|
||||
disable_gpg_check, exclude, repoq):
|
||||
|
||||
yumbin = module.get_bin_path('yum')
|
||||
# need debug level 2 to get 'Nothing to do' for groupinstall.
|
||||
yum_basecmd = [yumbin, '-d', '2', '-y']
|
||||
|
||||
# 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. Use
|
||||
# repoquery in those cases.
|
||||
|
||||
my = yum_base(conf_file)
|
||||
# A sideeffect of accessing conf is that the configuration is
|
||||
# loaded and plugins are discovered
|
||||
my.conf
|
||||
|
||||
repoq = None
|
||||
if 'rhnplugin' in my.plugins._plugins:
|
||||
repoquery = module.get_bin_path('repoquery', required=False)
|
||||
if repoquery:
|
||||
repoq = [repoquery, '--show-duplicates', '--plugins', '--quiet']
|
||||
|
||||
if conf_file and os.path.exists(conf_file):
|
||||
yum_basecmd += ['-c', conf_file]
|
||||
if repoq:
|
||||
|
@ -834,16 +824,19 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
|
|||
if state in ['installed', 'present']:
|
||||
if disable_gpg_check:
|
||||
yum_basecmd.append('--nogpgcheck')
|
||||
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)
|
||||
elif state in ['removed', 'absent']:
|
||||
remove(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
|
||||
res = remove(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
|
||||
elif state == 'latest':
|
||||
if disable_gpg_check:
|
||||
yum_basecmd.append('--nogpgcheck')
|
||||
latest(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
|
||||
res = latest(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
|
||||
else:
|
||||
# should be caught by AnsibleModule argument_spec
|
||||
module.fail_json(msg="we should never get here unless this all
|
||||
failed", changed=False, results='', errors='unepected state')
|
||||
|
||||
# should be caught by AnsibleModule argument_spec
|
||||
return dict(changed=False, failed=True, results='', errors='unexpected state')
|
||||
return res
|
||||
|
||||
def main():
|
||||
|
||||
|
@ -878,28 +871,39 @@ def main():
|
|||
supports_check_mode = True
|
||||
)
|
||||
|
||||
# this should not be needed, but exists as a failsafe
|
||||
params = module.params
|
||||
if params['install_repoquery'] and not repoquery and not module.check_mode:
|
||||
install_yum_utils(module)
|
||||
|
||||
repoquerybin = module.get_bin_path('repoquery', required=False)
|
||||
if params['list']:
|
||||
repoquerybin = ensure_yum_utils(module)
|
||||
if not repoquerybin:
|
||||
module.fail_json(msg="repoquery is required to use list= with this module. Please install the yum-utils package.")
|
||||
results = dict(results=list_stuff(module, repoquerybin, params['conf_file'], params['list']))
|
||||
module.exit_json(**results)
|
||||
|
||||
else:
|
||||
# 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.
|
||||
# Use repoquery in those cases.
|
||||
|
||||
my = yum_base(conf_file)
|
||||
# A sideeffect of accessing conf is that the configuration is
|
||||
# loaded and plugins are discovered
|
||||
my.conf
|
||||
repoquery = None
|
||||
if 'rhnplugin' in my.plugins._plugins:
|
||||
repoquerybin = ensure_yum_utils(module)
|
||||
if repoquerybin:
|
||||
repoquery = [repoquerybin, '--show-duplicates', '--plugins', '--quiet']
|
||||
|
||||
pkg = [ p.strip() for p in params['name']]
|
||||
exclude = params['exclude']
|
||||
state = params['state']
|
||||
enablerepo = params.get('enablerepo', '')
|
||||
disablerepo = params.get('disablerepo', '')
|
||||
disable_gpg_check = params['disable_gpg_check']
|
||||
res = ensure(module, state, pkg, params['conf_file'], enablerepo,
|
||||
disablerepo, disable_gpg_check, exclude)
|
||||
module.fail_json(msg="we should never get here unless this all failed", **res)
|
||||
results = ensure(module, state, pkg, params['conf_file'], enablerepo,
|
||||
disablerepo, disable_gpg_check, exclude, repoquery)
|
||||
if repoquery:
|
||||
results['msg'] = '%s %s' % (results.get('msg',''), 'Warning: Due to potential bad behaviour with rhnplugin and certificates, used slower repoquery calls instead of Yum API.')
|
||||
|
||||
module.exit_json(**results)
|
||||
|
||||
# import module snippets
|
||||
from ansible.module_utils.basic import *
|
||||
|
|
Loading…
Reference in a new issue