diff options
author | Michal Minar <miminar@redhat.com> | 2013-12-05 10:36:01 +0100 |
---|---|---|
committer | Michal Minar <miminar@redhat.com> | 2013-12-12 15:04:10 +0100 |
commit | 0ff1628666bc2ad52da91297c55a59d10b077e4e (patch) | |
tree | 50f4ef98cdfd5a234662678b0526abd89e29cc9e /src | |
parent | 61f41e54ba8e153b8de97335e60624f890052633 (diff) | |
download | openlmi-providers-0ff1628666bc2ad52da91297c55a59d10b077e4e.tar.gz openlmi-providers-0ff1628666bc2ad52da91297c55a59d10b077e4e.tar.xz openlmi-providers-0ff1628666bc2ad52da91297c55a59d10b077e4e.zip |
software: correctly recognize installed from available
When available packages were searched, they were all treated as not
installed. Yum uses two different classes to represent installed and
available packages and the same package may instantiated from both of
them.
Resolves: #1039025
Diffstat (limited to 'src')
-rw-r--r-- | src/software/lmi/software/yumdb/packageinfo.py | 22 | ||||
-rw-r--r-- | src/software/lmi/software/yumdb/process.py | 10 | ||||
-rw-r--r-- | src/software/lmi/software/yumdb/util.py | 17 |
3 files changed, 38 insertions, 11 deletions
diff --git a/src/software/lmi/software/yumdb/packageinfo.py b/src/software/lmi/software/yumdb/packageinfo.py index 7a40d19..bddc7cf 100644 --- a/src/software/lmi/software/yumdb/packageinfo.py +++ b/src/software/lmi/software/yumdb/packageinfo.py @@ -27,6 +27,7 @@ from datetime import datetime import yum from lmi.software import util +from lmi.software.yumdb.util import is_pkg_installed class PackageInfo(object): """ @@ -161,18 +162,27 @@ class PackageInfo(object): and ( (self.repoid is None or other.repoid is None) or (self.repoid == other.repoid))) -def make_package_from_db(pkg): +def make_package_from_db(pkg, rpmdb): """ - Create instance of PackageInfo from instance of - yum.packages.YumAvailablePackage. - @return instance of PackageInfo + Create instance of :py:class:`PackageInfo` from instance of + :py:class:`yum.packages.PackageObject`. + + :param pkg: Yum package object. + :type pkg: :py:class:`yum.packages.PackageObject` + :param rpmdb: Installed package sack. + :type rpmdb: :py:class:`yum.rpmsack.RPMDBPackageSack` + :rtype: :py:class:`PackageInfo` """ metadata = dict((k, getattr(pkg, k)) for k in ( 'summary', 'description', 'license', 'group', 'vendor', 'size', 'repoid')) - if isinstance(pkg, yum.rpmsack.RPMInstalledPackage): + if is_pkg_installed(pkg, rpmdb): metadata['installed'] = True - metadata['install_time'] = datetime.fromtimestamp(pkg.installtime) + if isinstance(pkg, yum.sqlitesack.YumAvailablePackageSqlite): + metadata['install_time'] = datetime.fromtimestamp( + rpmdb._tup2pkg[pkg.pkgtup].installtime) + else: + metadata['install_time'] = datetime.fromtimestamp(pkg.installtime) else: metadata['installed'] = False res = PackageInfo(id(pkg), pkg.name, pkg.epoch, pkg.version, pkg.release, diff --git a/src/software/lmi/software/yumdb/process.py b/src/software/lmi/software/yumdb/process.py index 9711511..9069f72 100644 --- a/src/software/lmi/software/yumdb/process.py +++ b/src/software/lmi/software/yumdb/process.py @@ -25,7 +25,6 @@ Module holding the code of separate process accessing the YUM API. import errno from functools import wraps -from itertools import chain import logging from multiprocessing import Process import os @@ -46,6 +45,7 @@ from lmi.software.yumdb import packageinfo from lmi.software.yumdb import packagecheck from lmi.software.yumdb import repository from lmi.software.yumdb.jobmanager import JobManager +from lmi.software.yumdb.util import is_pkg_installed from lmi.software.yumdb.util import setup_logging # Global variable which gets its value after the start of YumWorker process. @@ -330,7 +330,7 @@ class YumWorker(Process): self._pkg_cache.clear() res = [] for orig in packages: - pkg = packageinfo.make_package_from_db(orig) + pkg = packageinfo.make_package_from_db(orig, self._yum_base.rpmdb) if cache_packages is True: self._pkg_cache[pkg.objid] = orig res.append(pkg) @@ -635,7 +635,7 @@ class YumWorker(Process): pkg_desired = pkgs[-1] else: pkg_desired = self._lookup_package(pkg) - if isinstance(pkg_desired, yum.rpmsack.RPMInstalledPackage): + if is_pkg_installed(pkg_desired, self._yum_base.rpmdb): if force is False: raise errors.PackageAlreadyInstalled(pkg) action = "reinstall" @@ -715,7 +715,7 @@ class YumWorker(Process): pkg = pkgs[-1] else: pkg = self._lookup_package(pkg) - if not isinstance(pkg, yum.rpmsack.RPMInstalledPackage): + if not is_pkg_installed(pkg, self._yum_base.rpmdb): raise errors.PackageNotInstalled(pkg) kwargs = { "name" : pkg.name, "arch" : pkg.arch } if any(v is not None for v in (to_epoch, to_version, to_release)): @@ -753,7 +753,7 @@ class YumWorker(Process): pkg = self._transform_packages((rpm, ), cache_packages=False)[0] else: rpm = self._lookup_package(pkg) - if not isinstance(rpm, yum.rpmsack.RPMInstalledPackage): + if not is_pkg_installed(rpm, self._yum_base.rpmdb): raise errors.PackageNotInstalled(rpm) vpkg = yum.packages._RPMVerifyPackage(rpm, rpm.hdr.fiFromHeader(), packagecheck.pkg_checksum_type(rpm), [], True) diff --git a/src/software/lmi/software/yumdb/util.py b/src/software/lmi/software/yumdb/util.py index 06ecb18..29ab7d6 100644 --- a/src/software/lmi/software/yumdb/util.py +++ b/src/software/lmi/software/yumdb/util.py @@ -24,6 +24,8 @@ Common utilities meant to be used only be ``yumdb`` subpackage. """ import logging +import yum + from lmi.providers import cmpi_logging from lmi.software.util import Configuration @@ -112,3 +114,18 @@ def setup_logging(): # disable logging completely logging.config.dictConfig(DISABLED_LOGGING_CONFIG) +def is_pkg_installed(pkg, rpmdb): + """ + Returns ``True`` if the package is installed. + + :param pkg: Yum package object. + :type pkg: :py:class:`yum.packages.PackageObject` + :param rpmdb: Installed package sack. + :type rpmdb: :py:class:`yum.rpmsack.RPMDBPackageSack` + :returns: Whether the package is installed or not. + :rtype: boolean + """ + if not isinstance(pkg, yum.packages.PackageObject): + raise TypeError("pkg must be a PackageObject") + return ( isinstance(pkg, yum.rpmsack.RPMInstalledPackage) + or pkg.pkgtup in rpmdb._tup2pkg) |