summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichal Minar <miminar@redhat.com>2013-12-05 10:36:01 +0100
committerMichal Minar <miminar@redhat.com>2013-12-12 15:04:10 +0100
commit0ff1628666bc2ad52da91297c55a59d10b077e4e (patch)
tree50f4ef98cdfd5a234662678b0526abd89e29cc9e /src
parent61f41e54ba8e153b8de97335e60624f890052633 (diff)
downloadopenlmi-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.py22
-rw-r--r--src/software/lmi/software/yumdb/process.py10
-rw-r--r--src/software/lmi/software/yumdb/util.py17
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)