zypper cleanup checks for failure/diff (#2569)
* zypper cleanup checks for failure/diff * move check for changed/failed from functions back to main * handle all cases identially * generate diff together * fix module name
This commit is contained in:
parent
4b2563ff4e
commit
3307769ba0
1 changed files with 21 additions and 47 deletions
|
@ -220,6 +220,7 @@ def get_cmd(m, subcommand):
|
||||||
|
|
||||||
|
|
||||||
def set_diff(m, retvals, result):
|
def set_diff(m, retvals, result):
|
||||||
|
# TODO: if there is only one package, set before/after to version numbers
|
||||||
packages = {'installed': [], 'removed': [], 'upgraded': []}
|
packages = {'installed': [], 'removed': [], 'upgraded': []}
|
||||||
for p in result:
|
for p in result:
|
||||||
group = result[p]['group']
|
group = result[p]['group']
|
||||||
|
@ -245,7 +246,7 @@ def set_diff(m, retvals, result):
|
||||||
|
|
||||||
def package_present(m, name, want_latest):
|
def package_present(m, name, want_latest):
|
||||||
"install and update (if want_latest) the packages in name_install, while removing the packages in name_remove"
|
"install and update (if want_latest) the packages in name_install, while removing the packages in name_remove"
|
||||||
retvals = {'rc': 0, 'stdout': '', 'stderr': '', 'changed': False, 'failed': False}
|
retvals = {'rc': 0, 'stdout': '', 'stderr': ''}
|
||||||
name_install, name_remove, urls = get_want_state(m, name)
|
name_install, name_remove, urls = get_want_state(m, name)
|
||||||
|
|
||||||
if not want_latest:
|
if not want_latest:
|
||||||
|
@ -256,7 +257,7 @@ def package_present(m, name, want_latest):
|
||||||
name_remove = [p for p in name_remove if p in prerun_state]
|
name_remove = [p for p in name_remove if p in prerun_state]
|
||||||
if not name_install and not name_remove and not urls:
|
if not name_install and not name_remove and not urls:
|
||||||
# nothing to install/remove and nothing to update
|
# nothing to install/remove and nothing to update
|
||||||
return retvals
|
return None, retvals
|
||||||
|
|
||||||
# zypper install also updates packages
|
# zypper install also updates packages
|
||||||
cmd = get_cmd(m, 'install')
|
cmd = get_cmd(m, 'install')
|
||||||
|
@ -271,25 +272,15 @@ def package_present(m, name, want_latest):
|
||||||
|
|
||||||
retvals['cmd'] = cmd
|
retvals['cmd'] = cmd
|
||||||
result, retvals['rc'], retvals['stdout'], retvals['stderr'] = parse_zypper_xml(m, cmd)
|
result, retvals['rc'], retvals['stdout'], retvals['stderr'] = parse_zypper_xml(m, cmd)
|
||||||
if retvals['rc'] == 0:
|
|
||||||
# installed all packages successfully
|
|
||||||
# checking the output is not straight-forward because zypper rewrites 'capabilities'
|
|
||||||
# could run get_installed_state and recheck, but this takes time
|
|
||||||
if result:
|
|
||||||
retvals['changed'] = True
|
|
||||||
else:
|
|
||||||
retvals['failed'] = True
|
|
||||||
# return retvals
|
|
||||||
if m._diff:
|
|
||||||
set_diff(m, retvals, result)
|
|
||||||
|
|
||||||
return retvals
|
return result, retvals
|
||||||
|
|
||||||
|
|
||||||
def package_update_all(m, do_patch):
|
def package_update_all(m):
|
||||||
"run update or patch on all available packages"
|
"run update or patch on all available packages"
|
||||||
retvals = {'rc': 0, 'stdout': '', 'stderr': '', 'changed': False, 'failed': False}
|
|
||||||
if do_patch:
|
retvals = {'rc': 0, 'stdout': '', 'stderr': ''}
|
||||||
|
if m.params['type'] == 'patch':
|
||||||
cmdname = 'patch'
|
cmdname = 'patch'
|
||||||
else:
|
else:
|
||||||
cmdname = 'update'
|
cmdname = 'update'
|
||||||
|
@ -297,19 +288,12 @@ def package_update_all(m, do_patch):
|
||||||
cmd = get_cmd(m, cmdname)
|
cmd = get_cmd(m, cmdname)
|
||||||
retvals['cmd'] = cmd
|
retvals['cmd'] = cmd
|
||||||
result, retvals['rc'], retvals['stdout'], retvals['stderr'] = parse_zypper_xml(m, cmd)
|
result, retvals['rc'], retvals['stdout'], retvals['stderr'] = parse_zypper_xml(m, cmd)
|
||||||
if retvals['rc'] == 0:
|
return result, retvals
|
||||||
if result:
|
|
||||||
retvals['changed'] = True
|
|
||||||
else:
|
|
||||||
retvals['failed'] = True
|
|
||||||
if m._diff:
|
|
||||||
set_diff(m, retvals, result)
|
|
||||||
return retvals
|
|
||||||
|
|
||||||
|
|
||||||
def package_absent(m, name):
|
def package_absent(m, name):
|
||||||
"remove the packages in name"
|
"remove the packages in name"
|
||||||
retvals = {'rc': 0, 'stdout': '', 'stderr': '', 'changed': False, 'failed': False}
|
retvals = {'rc': 0, 'stdout': '', 'stderr': ''}
|
||||||
# Get package state
|
# Get package state
|
||||||
name_install, name_remove, urls = get_want_state(m, name, remove=True)
|
name_install, name_remove, urls = get_want_state(m, name, remove=True)
|
||||||
if name_install:
|
if name_install:
|
||||||
|
@ -321,28 +305,19 @@ def package_absent(m, name):
|
||||||
prerun_state = get_installed_state(m, name_remove)
|
prerun_state = get_installed_state(m, name_remove)
|
||||||
name_remove = [p for p in name_remove if p in prerun_state]
|
name_remove = [p for p in name_remove if p in prerun_state]
|
||||||
if not name_remove:
|
if not name_remove:
|
||||||
return retvals
|
return None, retvals
|
||||||
|
|
||||||
cmd = get_cmd(m, 'remove')
|
cmd = get_cmd(m, 'remove')
|
||||||
cmd.extend(name_remove)
|
cmd.extend(name_remove)
|
||||||
|
|
||||||
retvals['cmd'] = cmd
|
retvals['cmd'] = cmd
|
||||||
result, retvals['rc'], retvals['stdout'], retvals['stderr'] = parse_zypper_xml(m, cmd)
|
result, retvals['rc'], retvals['stdout'], retvals['stderr'] = parse_zypper_xml(m, cmd)
|
||||||
if retvals['rc'] == 0:
|
return result, retvals
|
||||||
# removed packages successfully
|
|
||||||
if result:
|
|
||||||
retvals['changed'] = True
|
|
||||||
else:
|
|
||||||
retvals['failed'] = True
|
|
||||||
if m._diff:
|
|
||||||
set_diff(m, retvals, result)
|
|
||||||
|
|
||||||
return retvals
|
|
||||||
|
|
||||||
|
|
||||||
def repo_refresh(m):
|
def repo_refresh(m):
|
||||||
"update the repositories"
|
"update the repositories"
|
||||||
retvals = {'rc': 0, 'stdout': '', 'stderr': '', 'changed': False, 'failed': False}
|
retvals = {'rc': 0, 'stdout': '', 'stderr': ''}
|
||||||
|
|
||||||
cmd = get_cmd(m, 'refresh')
|
cmd = get_cmd(m, 'refresh')
|
||||||
|
|
||||||
|
@ -381,20 +356,19 @@ def main():
|
||||||
|
|
||||||
# Perform requested action
|
# Perform requested action
|
||||||
if name == ['*'] and state == 'latest':
|
if name == ['*'] and state == 'latest':
|
||||||
if module.params['type'] == 'package':
|
packages_changed, retvals = package_update_all(module)
|
||||||
retvals = package_update_all(module, False)
|
|
||||||
elif module.params['type'] == 'patch':
|
|
||||||
retvals = package_update_all(module, True)
|
|
||||||
else:
|
else:
|
||||||
if state in ['absent', 'removed']:
|
if state in ['absent', 'removed']:
|
||||||
retvals = package_absent(module, name)
|
packages_changed, retvals = package_absent(module, name)
|
||||||
elif state in ['installed', 'present', 'latest']:
|
elif state in ['installed', 'present', 'latest']:
|
||||||
retvals = package_present(module, name, state == 'latest')
|
packages_changed, retvals = package_present(module, name, state == 'latest')
|
||||||
|
|
||||||
failed = retvals['failed']
|
retvals['changed'] = retvals['rc'] == 0 and packages_changed
|
||||||
del retvals['failed']
|
|
||||||
|
|
||||||
if failed:
|
if module._diff:
|
||||||
|
set_diff(module, retvals, packages_changed)
|
||||||
|
|
||||||
|
if retvals['rc'] != 0:
|
||||||
module.fail_json(msg="Zypper run failed.", **retvals)
|
module.fail_json(msg="Zypper run failed.", **retvals)
|
||||||
|
|
||||||
if not retvals['changed']:
|
if not retvals['changed']:
|
||||||
|
|
Loading…
Reference in a new issue