From 167c13bdf07c2a86ff7043b4b874073556858e69 Mon Sep 17 00:00:00 2001 From: Michal Minar Date: Sun, 7 Oct 2012 21:19:16 +0200 Subject: accept SoftwareElementID without epoch part in such case epoch is assumed to be 0 bumped Yum version --- mof/LMI_Yum.mof | 3 ++- src/yum/TODO | 4 ++++ src/yum/providers/util/common.py | 45 +++++++++++++++++----------------------- src/yum/setup.py | 2 +- src/yum/test/test_yum_package.py | 10 +++++++++ 5 files changed, 36 insertions(+), 28 deletions(-) create mode 100644 src/yum/TODO diff --git a/mof/LMI_Yum.mof b/mof/LMI_Yum.mof index 74dcfca..892c1fb 100644 --- a/mof/LMI_Yum.mof +++ b/mof/LMI_Yum.mof @@ -415,7 +415,8 @@ class LMI_YumFileCheck : CIM_FileSpecification { [ Override("SoftwareElementID"), Description ( "RPM's nevra. This means: " - "\"name-epoch:version-release.architecture\".") ] + "\"name-[epoch:]version-release.architecture\"." + " If epoch part is missing, a \"0:\" is assumed." ) ] String SoftwareElementID; [ Override("Version"), Description ( diff --git a/src/yum/TODO b/src/yum/TODO new file mode 100644 index 0000000..18c155b --- /dev/null +++ b/src/yum/TODO @@ -0,0 +1,4 @@ +provide a way to manage repositories +associate LMI_YumPackages with each LMI_YumRepository for available packages + this will solve enumeration of available packages +make installation/update/remove asynchronous jobs diff --git a/src/yum/providers/util/common.py b/src/yum/providers/util/common.py index 0cd5116..ba0d16d 100644 --- a/src/yum/providers/util/common.py +++ b/src/yum/providers/util/common.py @@ -38,7 +38,7 @@ import singletonmixin re_evra = re.compile(r'^(?P\d+):(?P[^-]+)' r'-(?P.+)\.(?P[^.]+)$') -re_nevra = re.compile(r'^(?P.+)-(?P(?P\d+):(?P[^-]+)' +re_nevra = re.compile(r'^(?P.+)-(?P((?P\d+):)?(?P[^-]+)' r'-(?P.+)\.(?P[^.]+))$') rpmdb_path = '/var/lib/rpm/Packages' @@ -601,18 +601,14 @@ class YumPackage: if not m: raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Wrong SotwareElementID. Expected valid nevra" - " (name-epoch:version-release.arch).") + " (name-[epoch:]version-release.arch).") if op['Version'] != m.group('ver'): raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Version does not match version part in SoftwareElementID.") - kwargs = dict((k, m.group(k)) for k in - ('name', 'epoch', 'ver', 'rel', 'arch')) + evra = "{}:{}-{}.{}".format(*( + (m.group(k) if k != "epoch" or m.group(k) else "0") + for k in ("epoch", 'ver', 'rel', 'arch'))) with YumDB.getInstance(env) as yb: - if ( package_list == 'installed' - and not yb.rpmdb.installed(**kwargs)): - raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, - "Package not installed") - pl = yb.doPackageLists(package_list, showdups=package_list != 'installed') if package_list != 'all': @@ -622,10 +618,10 @@ class YumPackage: pl = itertools.chain(pl.available, pl.installed) exact,_,_ = yum.packages.parsePackages(pl, [op['Name']]) for pkg in yum.misc.unique(exact): - if pkg.evra == m.group('evra'): break + if pkg.evra == evra: break else: raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, - "No matching package found") + "No matching package found.") return pkg @staticmethod @@ -928,29 +924,26 @@ class YumFileCheck: raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Version does not match version part in SoftwareElementID.") - kwargs = dict((k, m.group(k)) for k in - ('name', 'epoch', 'ver', 'rel', 'arch')) + evra = "{}:{}-{}.{}".format(*( + (m.group(k) if k != "epoch" or m.group(k) else "0") + for k in ("epoch", 'ver', 'rel', 'arch'))) with YumDB.getInstance(env) as yb: - if not yb.rpmdb.installed(**kwargs): - raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, - "Package not installed") - pl = yb.doPackageLists('installed') exact, matched, unmatched = yum.packages.parsePackages( - pl.installed, [kwargs['name']]) + pl.installed, [m.group('name')]) exact = yum.misc.unique(exact) for pkg in exact: - if pkg.evra == m.group('evra'): break + if pkg.evra == evra: break else: raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, - "No matching package installed") + "No matching package installed.") - fi = pkg.hdr.fiFromHeader() - vpkg = yum.packages._RPMVerifyPackage(pkg, fi, - YumFileCheck.pkg_checksum_type(pkg), [], True) - if not op['Name'] in vpkg: - raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, - "File not found in RPM package") + fi = pkg.hdr.fiFromHeader() + vpkg = yum.packages._RPMVerifyPackage(pkg, fi, + YumFileCheck.pkg_checksum_type(pkg), [], True) + if not op['Name'] in vpkg: + raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, + "File not found in RPM package.") return vpkg """ diff --git a/src/yum/setup.py b/src/yum/setup.py index 7f5f1b1..4823b59 100644 --- a/src/yum/setup.py +++ b/src/yum/setup.py @@ -5,7 +5,7 @@ setup( author='Michal Minar', author_email='miminar@redhat.com', url='https://fedorahosted.org/cura/', - version='0.2', + version='0.3', package_dir={'cura.yum': 'providers'}, packages=['cura.yum', 'cura.yum.util'], classifiers=[ diff --git a/src/yum/test/test_yum_package.py b/src/yum/test/test_yum_package.py index c5b2715..b631e21 100755 --- a/src/yum/test/test_yum_package.py +++ b/src/yum/test/test_yum_package.py @@ -35,6 +35,16 @@ class TestYumPackage(YumBaseTestCase): inst = self.conn.GetInstance(InstanceName=op, LocalOnly=False) self.assertEqual(inst.path, op) + # try to leave out epoch part + if pkg.epoch == "0": + op_no_epoch = op.copy() + op_no_epoch["SoftwareElementID"] = make_nevra(pkg.name, pkg.epoch, + pkg.ver, pkg.rel, pkg.arch, "NEVER") + self.assertNotIn(":", op_no_epoch["SoftwareElementID"]) + inst = self.conn.GetInstance( + InstanceName=op_no_epoch, LocalOnly=False) + self.assertIn(inst.path, (op, op_no_epoch)) + def test_method_install(self): for pkg in packages: if is_installed(pkg.name): -- cgit