From 2e300c770c227cf394929b7d5d025d5c52f1ae2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= Date: Mon, 14 May 2018 11:33:13 +0100 Subject: [PATCH] Add "all_versions" parameter to include all installed version on rpm.info Enable "all_versions" parameter for zypper.info_installed Enable "all_versions" parameter for yumpkg.info_installed Prevent adding failed packages when pkg name contains the arch (on SUSE) Add 'all_versions' documentation for info_installed on yum/zypper modules Add unit tests for info_installed with all_versions Refactor: use dict.setdefault instead if-else statement Allow removing only specific package versions with zypper and yum --- salt/states/pkg.py | 285 +++++++++++++++++++++++---------------------- 1 file changed, 146 insertions(+), 139 deletions(-) diff --git a/salt/states/pkg.py b/salt/states/pkg.py index 51b5a06e8f..a1b2a122bb 100644 --- a/salt/states/pkg.py +++ b/salt/states/pkg.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Installation of packages using OS package managers such as yum or apt-get ========================================================================= @@ -71,21 +70,16 @@ state module used. This will be addressed in a future release of Salt. """ -# Import python libs -from __future__ import absolute_import, print_function, unicode_literals import fnmatch import logging import os import re -# Import Salt libs import salt.utils.pkg import salt.utils.platform import salt.utils.versions from salt.exceptions import CommandExecutionError, MinionError, SaltInvocationError - -# Import 3rd-party libs from salt.ext import six from salt.modules.pkg_resource import _repack_pkgs from salt.output import nested @@ -323,7 +317,7 @@ def _find_download_targets( "name": name, "changes": {}, "result": True, - "comment": "Version {0} of package '{1}' is already " + "comment": "Version {} of package '{}' is already " "downloaded".format(version, name), } @@ -334,7 +328,7 @@ def _find_download_targets( "name": name, "changes": {}, "result": True, - "comment": "Package {0} is already " "downloaded".format(name), + "comment": "Package {} is already " "downloaded".format(name), } version_spec = False @@ -349,13 +343,13 @@ def _find_download_targets( comments.append( "The following package(s) were not found, and no " "possible matches were found in the package db: " - "{0}".format(", ".join(sorted(problems["no_suggest"]))) + "{}".format(", ".join(sorted(problems["no_suggest"]))) ) if problems.get("suggest"): - for pkgname, suggestions in six.iteritems(problems["suggest"]): + for pkgname, suggestions in problems["suggest"].items(): comments.append( - "Package '{0}' not found (possible matches: " - "{1})".format(pkgname, ", ".join(suggestions)) + "Package '{}' not found (possible matches: " + "{})".format(pkgname, ", ".join(suggestions)) ) if comments: if len(comments) > 1: @@ -371,7 +365,7 @@ def _find_download_targets( # Check current downloaded versions against specified versions targets = {} problems = [] - for pkgname, pkgver in six.iteritems(to_download): + for pkgname, pkgver in to_download.items(): cver = cur_pkgs.get(pkgname, {}) # Package not yet downloaded, so add to targets if not cver: @@ -401,7 +395,7 @@ def _find_download_targets( if not targets: # All specified packages are already downloaded - msg = "All specified packages{0} are already downloaded".format( + msg = "All specified packages{} are already downloaded".format( " (matching specified versions)" if version_spec else "" ) return {"name": name, "changes": {}, "result": True, "comment": msg} @@ -425,7 +419,7 @@ def _find_advisory_targets(name=None, advisory_ids=None, **kwargs): "name": name, "changes": {}, "result": True, - "comment": "Advisory patch {0} is already " "installed".format(name), + "comment": "Advisory patch {} is already " "installed".format(name), } # Find out which advisory patches will be targeted in the call to pkg.install @@ -477,12 +471,22 @@ def _find_remove_targets( # Check current versions against specified versions targets = [] problems = [] - for pkgname, pkgver in six.iteritems(to_remove): + for pkgname, pkgver in to_remove.items(): # FreeBSD pkg supports `openjdk` and `java/openjdk7` package names origin = bool(re.search("/", pkgname)) if __grains__["os"] == "FreeBSD" and origin: - cver = [k for k, v in six.iteritems(cur_pkgs) if v["origin"] == pkgname] + cver = [k for k, v in cur_pkgs.items() if v["origin"] == pkgname] + elif __grains__["os_family"] == "Suse": + # On SUSE systems. Zypper returns packages without "arch" in name + try: + namepart, archpart = pkgname.rsplit(".", 1) + except ValueError: + cver = cur_pkgs.get(pkgname, []) + else: + if archpart in salt.utils.pkg.rpm.ARCHES + ("noarch",): + pkgname = namepart + cver = cur_pkgs.get(pkgname, []) else: cver = cur_pkgs.get(pkgname, []) @@ -518,7 +522,7 @@ def _find_remove_targets( if not targets: # All specified packages are already absent - msg = "All specified packages{0} are already absent".format( + msg = "All specified packages{} are already absent".format( " (matching specified versions)" if version_spec else "" ) return {"name": name, "changes": {}, "result": True, "comment": msg} @@ -619,7 +623,7 @@ def _find_install_targets( "name": name, "changes": {}, "result": False, - "comment": "Invalidly formatted '{0}' parameter. See " + "comment": "Invalidly formatted '{}' parameter. See " "minion log.".format("pkgs" if pkgs else "sources"), } @@ -634,7 +638,7 @@ def _find_install_targets( "name": name, "changes": {}, "result": False, - "comment": "Package {0} not found in the " + "comment": "Package {} not found in the " "repository.".format(name), } if version is None: @@ -656,7 +660,7 @@ def _find_install_targets( origin = bool(re.search("/", name)) if __grains__["os"] == "FreeBSD" and origin: - cver = [k for k, v in six.iteritems(cur_pkgs) if v["origin"] == name] + cver = [k for k, v in cur_pkgs.items() if v["origin"] == name] else: cver = cur_pkgs.get(name, []) @@ -667,7 +671,7 @@ def _find_install_targets( "name": name, "changes": {}, "result": True, - "comment": "Version {0} of package '{1}' is already " + "comment": "Version {} of package '{}' is already " "installed".format(version, name), } @@ -678,7 +682,7 @@ def _find_install_targets( "name": name, "changes": {}, "result": True, - "comment": "Package {0} is already " "installed".format(name), + "comment": "Package {} is already " "installed".format(name), } version_spec = False @@ -687,21 +691,19 @@ def _find_install_targets( # enforced. Takes extra time. Disable for improved performance if not skip_suggestions: # Perform platform-specific pre-flight checks - not_installed = dict( - [ - (name, version) - for name, version in desired.items() - if not ( - name in cur_pkgs - and ( - version is None - or _fulfills_version_string( - cur_pkgs[name], version, ignore_epoch=ignore_epoch - ) + not_installed = { + name: version + for name, version in desired.items() + if not ( + name in cur_pkgs + and ( + version is None + or _fulfills_version_string( + cur_pkgs[name], version, ignore_epoch=ignore_epoch ) ) - ] - ) + ) + } if not_installed: try: problems = _preflight_check(not_installed, **kwargs) @@ -713,13 +715,13 @@ def _find_install_targets( comments.append( "The following package(s) were not found, and no " "possible matches were found in the package db: " - "{0}".format(", ".join(sorted(problems["no_suggest"]))) + "{}".format(", ".join(sorted(problems["no_suggest"]))) ) if problems.get("suggest"): - for pkgname, suggestions in six.iteritems(problems["suggest"]): + for pkgname, suggestions in problems["suggest"].items(): comments.append( - "Package '{0}' not found (possible matches: " - "{1})".format(pkgname, ", ".join(suggestions)) + "Package '{}' not found (possible matches: " + "{})".format(pkgname, ", ".join(suggestions)) ) if comments: if len(comments) > 1: @@ -733,9 +735,7 @@ def _find_install_targets( # Resolve the latest package version for any packages with "latest" in the # package version - wants_latest = ( - [] if sources else [x for x, y in six.iteritems(desired) if y == "latest"] - ) + wants_latest = [] if sources else [x for x, y in desired.items() if y == "latest"] if wants_latest: resolved_latest = __salt__["pkg.latest_version"]( *wants_latest, refresh=refresh, **kwargs @@ -766,7 +766,7 @@ def _find_install_targets( problems = [] warnings = [] failed_verify = False - for package_name, version_string in six.iteritems(desired): + for package_name, version_string in desired.items(): cver = cur_pkgs.get(package_name, []) if resolve_capabilities and not cver and package_name in cur_prov: cver = cur_pkgs.get(cur_prov.get(package_name)[0], []) @@ -795,12 +795,12 @@ def _find_install_targets( problems.append(err.format(version_string, "file not found")) continue elif not os.path.exists(cached_path): - problems.append("{0} does not exist on minion".format(version_string)) + problems.append("{} does not exist on minion".format(version_string)) continue source_info = __salt__["lowpkg.bin_pkg_info"](cached_path) if source_info is None: warnings.append( - "Failed to parse metadata for {0}".format(version_string) + "Failed to parse metadata for {}".format(version_string) ) continue else: @@ -923,13 +923,24 @@ def _verify_install(desired, new_pkgs, ignore_epoch=None, new_caps=None): has_origin = "/" in pkgname if __grains__["os"] == "FreeBSD" and has_origin: - cver = [k for k, v in six.iteritems(new_pkgs) if v["origin"] == pkgname] + cver = [k for k, v in new_pkgs.items() if v["origin"] == pkgname] elif __grains__["os"] == "MacOS" and has_origin: cver = new_pkgs.get(pkgname, new_pkgs.get(pkgname.split("/")[-1])) elif __grains__["os"] == "OpenBSD": cver = new_pkgs.get(pkgname.split("%")[0]) elif __grains__["os_family"] == "Debian": cver = new_pkgs.get(pkgname.split("=")[0]) + elif __grains__["os_family"] == "Suse": + # On SUSE systems. Zypper returns packages without "arch" in name + try: + namepart, archpart = pkgname.rsplit(".", 1) + except ValueError: + cver = new_pkgs.get(pkgname) + else: + if archpart in salt.utils.pkg.rpm.ARCHES + ("noarch",): + cver = new_pkgs.get(namepart) + else: + cver = new_pkgs.get(pkgname) else: cver = new_pkgs.get(pkgname) if not cver and pkgname in new_caps: @@ -964,7 +975,7 @@ def _get_desired_pkg(name, desired): oper = "" else: oper = "=" - return "{0}{1}{2}".format(name, oper, "" if not desired[name] else desired[name]) + return "{}{}{}".format(name, oper, "" if not desired[name] else desired[name]) def _preflight_check(desired, fromrepo, **kwargs): @@ -1709,8 +1720,8 @@ def installed( "comment": "pkg.verify not implemented", } - if not isinstance(version, six.string_types) and version is not None: - version = six.text_type(version) + if not isinstance(version, str) and version is not None: + version = str(version) kwargs["allow_updates"] = allow_updates @@ -1754,7 +1765,7 @@ def installed( "name": name, "changes": {}, "result": False, - "comment": six.text_type(exc), + "comment": str(exc), } if "result" in hold_ret and not hold_ret["result"]: @@ -1763,7 +1774,7 @@ def installed( "changes": {}, "result": False, "comment": "An error was encountered while " - "holding/unholding package(s): {0}".format(hold_ret["comment"]), + "holding/unholding package(s): {}".format(hold_ret["comment"]), } else: modified_hold = [ @@ -1779,16 +1790,16 @@ def installed( ] for i in modified_hold: - result["comment"] += ".\n{0}".format(i["comment"]) + result["comment"] += ".\n{}".format(i["comment"]) result["result"] = i["result"] result["changes"][i["name"]] = i["changes"] for i in not_modified_hold: - result["comment"] += ".\n{0}".format(i["comment"]) + result["comment"] += ".\n{}".format(i["comment"]) result["result"] = i["result"] for i in failed_hold: - result["comment"] += ".\n{0}".format(i["comment"]) + result["comment"] += ".\n{}".format(i["comment"]) result["result"] = i["result"] return result @@ -1805,8 +1816,8 @@ def installed( # Remove any targets not returned by _find_install_targets if pkgs: - pkgs = [dict([(x, y)]) for x, y in six.iteritems(targets)] - pkgs.extend([dict([(x, y)]) for x, y in six.iteritems(to_reinstall)]) + pkgs = [dict([(x, y)]) for x, y in targets.items()] + pkgs.extend([dict([(x, y)]) for x, y in to_reinstall.items()]) elif sources: oldsources = sources sources = [x for x in oldsources if next(iter(list(x.keys()))) in targets] @@ -1823,12 +1834,12 @@ def installed( summary = ", ".join([_get_desired_pkg(x, targets) for x in targets]) comment.append( "The following packages would be " - "installed/updated: {0}".format(summary) + "installed/updated: {}".format(summary) ) if to_unpurge: comment.append( "The following packages would have their selection status " - "changed from 'purge' to 'install': {0}".format(", ".join(to_unpurge)) + "changed from 'purge' to 'install': {}".format(", ".join(to_unpurge)) ) if to_reinstall: # Add a comment for each package in to_reinstall with its @@ -1852,7 +1863,7 @@ def installed( else: pkgstr = _get_desired_pkg(reinstall_pkg, to_reinstall) comment.append( - "Package '{0}' would be reinstalled because the " + "Package '{}' would be reinstalled because the " "following files have been altered:".format(pkgstr) ) comment.append(_nested_output(altered_files[reinstall_pkg])) @@ -1896,7 +1907,7 @@ def installed( ret["changes"] = {} ret["comment"] = ( "An error was encountered while installing " - "package(s): {0}".format(exc) + "package(s): {}".format(exc) ) if warnings: ret.setdefault("warnings", []).extend(warnings) @@ -1907,7 +1918,7 @@ def installed( if isinstance(pkg_ret, dict): changes["installed"].update(pkg_ret) - elif isinstance(pkg_ret, six.string_types): + elif isinstance(pkg_ret, str): comment.append(pkg_ret) # Code below will be looking for a dictionary. If this is a string # it means that there was an exception raised and that no packages @@ -1921,7 +1932,7 @@ def installed( action = "pkg.hold" if kwargs["hold"] else "pkg.unhold" hold_ret = __salt__[action](name=name, pkgs=desired) except (CommandExecutionError, SaltInvocationError) as exc: - comment.append(six.text_type(exc)) + comment.append(str(exc)) ret = { "name": name, "changes": changes, @@ -1938,7 +1949,7 @@ def installed( "changes": {}, "result": False, "comment": "An error was encountered while " - "holding/unholding package(s): {0}".format(hold_ret["comment"]), + "holding/unholding package(s): {}".format(hold_ret["comment"]), } if warnings: ret.setdefault("warnings", []).extend(warnings) @@ -1996,11 +2007,11 @@ def installed( summary = ", ".join([_get_desired_pkg(x, desired) for x in modified]) if len(summary) < 20: comment.append( - "The following packages were installed/updated: " "{0}".format(summary) + "The following packages were installed/updated: " "{}".format(summary) ) else: comment.append( - "{0} targeted package{1} {2} installed/updated.".format( + "{} targeted package{} {} installed/updated.".format( len(modified), "s" if len(modified) > 1 else "", "were" if len(modified) > 1 else "was", @@ -2014,14 +2025,14 @@ def installed( comment.append(i["comment"]) if len(changes[change_name]["new"]) > 0: changes[change_name]["new"] += "\n" - changes[change_name]["new"] += "{0}".format(i["changes"]["new"]) + changes[change_name]["new"] += "{}".format(i["changes"]["new"]) if len(changes[change_name]["old"]) > 0: changes[change_name]["old"] += "\n" - changes[change_name]["old"] += "{0}".format(i["changes"]["old"]) + changes[change_name]["old"] += "{}".format(i["changes"]["old"]) else: comment.append(i["comment"]) changes[change_name] = {} - changes[change_name]["new"] = "{0}".format(i["changes"]["new"]) + changes[change_name]["new"] = "{}".format(i["changes"]["new"]) # Any requested packages that were not targeted for install or reinstall if not_modified: @@ -2031,11 +2042,11 @@ def installed( summary = ", ".join([_get_desired_pkg(x, desired) for x in not_modified]) if len(not_modified) <= 20: comment.append( - "The following packages were already installed: " "{0}".format(summary) + "The following packages were already installed: " "{}".format(summary) ) else: comment.append( - "{0} targeted package{1} {2} already installed".format( + "{} targeted package{} {} already installed".format( len(not_modified), "s" if len(not_modified) > 1 else "", "were" if len(not_modified) > 1 else "was", @@ -2054,7 +2065,7 @@ def installed( else: summary = ", ".join([_get_desired_pkg(x, desired) for x in failed]) comment.insert( - 0, "The following packages failed to " "install/update: {0}".format(summary) + 0, "The following packages failed to " "install/update: {}".format(summary) ) result = False @@ -2118,7 +2129,7 @@ def installed( pkgstr = modified_pkg else: pkgstr = _get_desired_pkg(modified_pkg, desired) - msg = "Package {0} was reinstalled.".format(pkgstr) + msg = "Package {} was reinstalled.".format(pkgstr) if modified_pkg in altered_files: msg += " The following files were remediated:" comment.append(msg) @@ -2133,7 +2144,7 @@ def installed( pkgstr = failed_pkg else: pkgstr = _get_desired_pkg(failed_pkg, desired) - msg = "Reinstall was not successful for package {0}.".format(pkgstr) + msg = "Reinstall was not successful for package {}.".format(pkgstr) if failed_pkg in altered_files: msg += " The following files could not be remediated:" comment.append(msg) @@ -2274,12 +2285,12 @@ def downloaded( ret["result"] = False ret[ "comment" - ] = "An error was encountered while checking targets: " "{0}".format(targets) + ] = "An error was encountered while checking targets: " "{}".format(targets) return ret if __opts__["test"]: summary = ", ".join(targets) - ret["comment"] = "The following packages would be " "downloaded: {0}".format( + ret["comment"] = "The following packages would be " "downloaded: {}".format( summary ) return ret @@ -2306,7 +2317,7 @@ def downloaded( ret["changes"] = {} ret["comment"] = ( "An error was encountered while downloading " - "package(s): {0}".format(exc) + "package(s): {}".format(exc) ) return ret @@ -2316,13 +2327,13 @@ def downloaded( if failed: summary = ", ".join([_get_desired_pkg(x, targets) for x in failed]) ret["result"] = False - ret["comment"] = "The following packages failed to " "download: {0}".format( + ret["comment"] = "The following packages failed to " "download: {}".format( summary ) if not ret["changes"] and not ret["comment"]: ret["result"] = True - ret["comment"] = "Packages downloaded: " "{0}".format(", ".join(targets)) + ret["comment"] = "Packages downloaded: " "{}".format(", ".join(targets)) return ret @@ -2382,14 +2393,14 @@ def patch_installed(name, advisory_ids=None, downloadonly=None, **kwargs): ret["result"] = False ret[ "comment" - ] = "An error was encountered while checking targets: " "{0}".format(targets) + ] = "An error was encountered while checking targets: " "{}".format(targets) return ret if __opts__["test"]: summary = ", ".join(targets) ret[ "comment" - ] = "The following advisory patches would be " "downloaded: {0}".format(summary) + ] = "The following advisory patches would be " "downloaded: {}".format(summary) return ret try: @@ -2408,7 +2419,7 @@ def patch_installed(name, advisory_ids=None, downloadonly=None, **kwargs): ret["changes"] = {} ret["comment"] = ( "An error was encountered while downloading " - "package(s): {0}".format(exc) + "package(s): {}".format(exc) ) return ret @@ -2417,7 +2428,7 @@ def patch_installed(name, advisory_ids=None, downloadonly=None, **kwargs): ret["result"] = True ret["comment"] = ( "Advisory patch is not needed or related packages " - "are already {0}".format(status) + "are already {}".format(status) ) return ret @@ -2674,7 +2685,7 @@ def latest( "changes": {}, "result": False, "comment": "An error was encountered while checking the " - "newest available version of package(s): {0}".format(exc), + "newest available version of package(s): {}".format(exc), } try: @@ -2683,9 +2694,9 @@ def latest( return {"name": name, "changes": {}, "result": False, "comment": exc.strerror} # Repack the cur/avail data if only a single package is being checked - if isinstance(cur, six.string_types): + if isinstance(cur, str): cur = {desired_pkgs[0]: cur} - if isinstance(avail, six.string_types): + if isinstance(avail, str): avail = {desired_pkgs[0]: avail} targets = {} @@ -2695,7 +2706,7 @@ def latest( # Package either a) is up-to-date, or b) does not exist if not cur.get(pkg): # Package does not exist - msg = "No information found for '{0}'.".format(pkg) + msg = "No information found for '{}'.".format(pkg) log.error(msg) problems.append(msg) elif ( @@ -2741,12 +2752,12 @@ def latest( comments.append( "The following packages are already up-to-date: " + ", ".join( - ["{0} ({1})".format(x, cur[x]) for x in sorted(up_to_date)] + ["{} ({})".format(x, cur[x]) for x in sorted(up_to_date)] ) ) else: comments.append( - "{0} packages are already up-to-date".format(up_to_date_count) + "{} packages are already up-to-date".format(up_to_date_count) ) return { @@ -2784,7 +2795,7 @@ def latest( "changes": {}, "result": False, "comment": "An error was encountered while installing " - "package(s): {0}".format(exc), + "package(s): {}".format(exc), } if changes: @@ -2800,7 +2811,7 @@ def latest( comments = [] if failed: - msg = "The following packages failed to update: " "{0}".format( + msg = "The following packages failed to update: " "{}".format( ", ".join(sorted(failed)) ) comments.append(msg) @@ -2808,19 +2819,17 @@ def latest( msg = ( "The following packages were successfully " "installed/upgraded: " - "{0}".format(", ".join(sorted(successful))) + "{}".format(", ".join(sorted(successful))) ) comments.append(msg) if up_to_date: if len(up_to_date) <= 10: msg = ( "The following packages were already up-to-date: " - "{0}".format(", ".join(sorted(up_to_date))) + "{}".format(", ".join(sorted(up_to_date))) ) else: - msg = "{0} packages were already up-to-date ".format( - len(up_to_date) - ) + msg = "{} packages were already up-to-date ".format(len(up_to_date)) comments.append(msg) return { @@ -2832,18 +2841,18 @@ def latest( else: if len(targets) > 10: comment = ( - "{0} targeted packages failed to update. " + "{} targeted packages failed to update. " "See debug log for details.".format(len(targets)) ) elif len(targets) > 1: comment = ( "The following targeted packages failed to update. " - "See debug log for details: ({0}).".format( + "See debug log for details: ({}).".format( ", ".join(sorted(targets)) ) ) else: - comment = "Package {0} failed to " "update.".format( + comment = "Package {} failed to " "update.".format( next(iter(list(targets.keys()))) ) if up_to_date: @@ -2851,10 +2860,10 @@ def latest( comment += ( " The following packages were already " "up-to-date: " - "{0}".format(", ".join(sorted(up_to_date))) + "{}".format(", ".join(sorted(up_to_date))) ) else: - comment += "{0} packages were already " "up-to-date".format( + comment += "{} packages were already " "up-to-date".format( len(up_to_date) ) @@ -2866,13 +2875,13 @@ def latest( } else: if len(desired_pkgs) > 10: - comment = "All {0} packages are up-to-date.".format(len(desired_pkgs)) + comment = "All {} packages are up-to-date.".format(len(desired_pkgs)) elif len(desired_pkgs) > 1: - comment = "All packages are up-to-date " "({0}).".format( + comment = "All packages are up-to-date " "({}).".format( ", ".join(sorted(desired_pkgs)) ) else: - comment = "Package {0} is already " "up-to-date".format(desired_pkgs[0]) + comment = "Package {} is already " "up-to-date".format(desired_pkgs[0]) return {"name": name, "changes": {}, "result": True, "comment": comment} @@ -2894,8 +2903,7 @@ def _uninstall( "name": name, "changes": {}, "result": False, - "comment": "Invalid action '{0}'. " - "This is probably a bug.".format(action), + "comment": "Invalid action '{}'. " "This is probably a bug.".format(action), } try: @@ -2908,7 +2916,7 @@ def _uninstall( "changes": {}, "result": False, "comment": "An error was encountered while parsing targets: " - "{0}".format(exc), + "{}".format(exc), } targets = _find_remove_targets( name, version, pkgs, normalize, ignore_epoch=ignore_epoch, **kwargs @@ -2921,7 +2929,7 @@ def _uninstall( "changes": {}, "result": False, "comment": "An error was encountered while checking targets: " - "{0}".format(targets), + "{}".format(targets), } if action == "purge": old_removed = __salt__["pkg.list_pkgs"]( @@ -2936,7 +2944,7 @@ def _uninstall( "changes": {}, "result": True, "comment": "None of the targeted packages are installed" - "{0}".format(" or partially installed" if action == "purge" else ""), + "{}".format(" or partially installed" if action == "purge" else ""), } if __opts__["test"]: @@ -2944,11 +2952,11 @@ def _uninstall( "name": name, "changes": {}, "result": None, - "comment": "The following packages will be {0}d: " - "{1}.".format(action, ", ".join(targets)), + "comment": "The following packages will be {}d: " + "{}.".format(action, ", ".join(targets)), } - changes = __salt__["pkg.{0}".format(action)]( + changes = __salt__["pkg.{}".format(action)]( name, pkgs=pkgs, version=version, **kwargs ) new = __salt__["pkg.list_pkgs"](versions_as_list=True, **kwargs) @@ -2975,8 +2983,8 @@ def _uninstall( "name": name, "changes": changes, "result": False, - "comment": "The following packages failed to {0}: " - "{1}.".format(action, ", ".join(failed)), + "comment": "The following packages failed to {}: " + "{}.".format(action, ", ".join(failed)), } comments = [] @@ -2984,14 +2992,13 @@ def _uninstall( if not_installed: comments.append( "The following packages were not installed: " - "{0}".format(", ".join(not_installed)) + "{}".format(", ".join(not_installed)) ) comments.append( - "The following packages were {0}d: " - "{1}.".format(action, ", ".join(targets)) + "The following packages were {}d: " "{}.".format(action, ", ".join(targets)) ) else: - comments.append("All targeted packages were {0}d.".format(action)) + comments.append("All targeted packages were {}d.".format(action)) return { "name": name, @@ -3089,7 +3096,7 @@ def removed(name, version=None, pkgs=None, normalize=True, ignore_epoch=None, ** ret["changes"] = {} ret[ "comment" - ] = "An error was encountered while removing " "package(s): {0}".format(exc) + ] = "An error was encountered while removing " "package(s): {}".format(exc) return ret @@ -3181,7 +3188,7 @@ def purged(name, version=None, pkgs=None, normalize=True, ignore_epoch=None, **k ret["changes"] = {} ret[ "comment" - ] = "An error was encountered while purging " "package(s): {0}".format(exc) + ] = "An error was encountered while purging " "package(s): {}".format(exc) return ret @@ -3247,17 +3254,17 @@ def uptodate(name, refresh=False, pkgs=None, **kwargs): "new": pkgver, "old": __salt__["pkg.version"](pkgname, **kwargs), } - for pkgname, pkgver in six.iteritems(packages) + for pkgname, pkgver in packages.items() } if isinstance(pkgs, list): packages = [pkg for pkg in packages if pkg in pkgs] expected = { pkgname: pkgver - for pkgname, pkgver in six.iteritems(expected) + for pkgname, pkgver in expected.items() if pkgname in pkgs } except Exception as exc: # pylint: disable=broad-except - ret["comment"] = six.text_type(exc) + ret["comment"] = str(exc) return ret else: ret["comment"] = "refresh must be either True or False" @@ -3284,16 +3291,16 @@ def uptodate(name, refresh=False, pkgs=None, **kwargs): ret["changes"] = {} ret[ "comment" - ] = "An error was encountered while updating " "packages: {0}".format(exc) + ] = "An error was encountered while updating " "packages: {}".format(exc) return ret # If a package list was provided, ensure those packages were updated missing = [] if isinstance(pkgs, list): - missing = [pkg for pkg in six.iterkeys(expected) if pkg not in ret["changes"]] + missing = [pkg for pkg in expected.keys() if pkg not in ret["changes"]] if missing: - ret["comment"] = "The following package(s) failed to update: {0}".format( + ret["comment"] = "The following package(s) failed to update: {}".format( ", ".join(missing) ) ret["result"] = False @@ -3362,8 +3369,8 @@ def group_installed(name, skip=None, include=None, **kwargs): ret["comment"] = "skip must be formatted as a list" return ret for idx, item in enumerate(skip): - if not isinstance(item, six.string_types): - skip[idx] = six.text_type(item) + if not isinstance(item, str): + skip[idx] = str(item) if include is None: include = [] @@ -3372,15 +3379,15 @@ def group_installed(name, skip=None, include=None, **kwargs): ret["comment"] = "include must be formatted as a list" return ret for idx, item in enumerate(include): - if not isinstance(item, six.string_types): - include[idx] = six.text_type(item) + if not isinstance(item, str): + include[idx] = str(item) try: diff = __salt__["pkg.group_diff"](name) except CommandExecutionError as err: ret["comment"] = ( "An error was encountered while installing/updating " - "group '{0}': {1}.".format(name, err) + "group '{}': {}.".format(name, err) ) return ret @@ -3390,7 +3397,7 @@ def group_installed(name, skip=None, include=None, **kwargs): if invalid_skip: ret[ "comment" - ] = "The following mandatory packages cannot be skipped: {0}".format( + ] = "The following mandatory packages cannot be skipped: {}".format( ", ".join(invalid_skip) ) return ret @@ -3401,7 +3408,7 @@ def group_installed(name, skip=None, include=None, **kwargs): if not targets: ret["result"] = True - ret["comment"] = "Group '{0}' is already installed".format(name) + ret["comment"] = "Group '{}' is already installed".format(name) return ret partially_installed = ( @@ -3415,9 +3422,9 @@ def group_installed(name, skip=None, include=None, **kwargs): if partially_installed: ret[ "comment" - ] = "Group '{0}' is partially installed and will be updated".format(name) + ] = "Group '{}' is partially installed and will be updated".format(name) else: - ret["comment"] = "Group '{0}' will be installed".format(name) + ret["comment"] = "Group '{}' will be installed".format(name) return ret try: @@ -3432,19 +3439,19 @@ def group_installed(name, skip=None, include=None, **kwargs): ret["changes"] = {} ret["comment"] = ( "An error was encountered while " - "installing/updating group '{0}': {1}".format(name, exc) + "installing/updating group '{}': {}".format(name, exc) ) return ret failed = [x for x in targets if x not in __salt__["pkg.list_pkgs"](**kwargs)] if failed: - ret["comment"] = "Failed to install the following packages: {0}".format( + ret["comment"] = "Failed to install the following packages: {}".format( ", ".join(failed) ) return ret ret["result"] = True - ret["comment"] = "Group '{0}' was {1}".format( + ret["comment"] = "Group '{}' was {}".format( name, "updated" if partially_installed else "installed" ) return ret @@ -3561,6 +3568,6 @@ def mod_watch(name, **kwargs): return { "name": name, "changes": {}, - "comment": "pkg.{0} does not work with the watch requisite".format(sfun), + "comment": "pkg.{} does not work with the watch requisite".format(sfun), "result": False, } -- 2.29.2