summaryrefslogtreecommitdiffstats
path: root/src/software
diff options
context:
space:
mode:
authorMichal Minar <miminar@redhat.com>2013-07-03 12:19:22 +0200
committerMichal Minar <miminar@redhat.com>2013-07-04 10:33:48 +0200
commit3cf188c5f9d9daf47f4814afcf442184e84b89ff (patch)
tree4953087318be445709c1a9b5726ee9836cda6449 /src/software
parent9086dae6d7db5c39e19315991e4b393c600263b7 (diff)
downloadopenlmi-providers-3cf188c5f9d9daf47f4814afcf442184e84b89ff.tar.gz
openlmi-providers-3cf188c5f9d9daf47f4814afcf442184e84b89ff.tar.xz
openlmi-providers-3cf188c5f9d9daf47f4814afcf442184e84b89ff.zip
fixed RequestStateChange of LMI_SoftwareIdentityResource
added test for this method
Diffstat (limited to 'src/software')
-rw-r--r--src/software/openlmi/software/yumdb/jobs.py22
-rw-r--r--src/software/openlmi/software/yumdb/process.py10
-rw-r--r--src/software/openlmi/software/yumdb/repository.py18
-rw-r--r--src/software/test/rpmcache.py11
-rwxr-xr-xsrc/software/test/test_software_identity_resource.py47
-rw-r--r--src/software/test/util.py20
6 files changed, 103 insertions, 25 deletions
diff --git a/src/software/openlmi/software/yumdb/jobs.py b/src/software/openlmi/software/yumdb/jobs.py
index 966e625..985c0bc 100644
--- a/src/software/openlmi/software/yumdb/jobs.py
+++ b/src/software/openlmi/software/yumdb/jobs.py
@@ -644,23 +644,25 @@ class YumSpecificRepositoryJob(YumJob): #pylint: disable=R0903
"""
Abstract job taking instance of yumdb.Repository as argument.
Arguments:
- repoid - plays different role depending on job subclass
- """
- __slots__ = ('repoid', )
- def __init__(self, repoid):
- if not isinstance(repoid, Repository):
- raise TypeError("repoid must be instance of yumdb.Repository")
+ repo - (``Repository`` or ``str``) plays different role depending
+ on job subclass
+ """
+ __slots__ = ('repo', )
+ def __init__(self, repo):
+ if not isinstance(repo, (Repository, basestring)):
+ raise TypeError("repoid must be either instance of"
+ " yumdb.Repository or string")
YumJob.__init__(self)
- self.repoid = repoid
+ self.repo = repo
class YumSetRepositoryEnabled(YumSpecificRepositoryJob):#pylint: disable=R0903
"""
Job allowing to enable or disable repository.
Arguments:
- enable - boolean representing next state
+ enable - (``boolean``) representing next state
"""
__slots__ = ('enable', )
- def __init__(self, repoid, enable):
- YumSpecificRepositoryJob.__init__(self, repoid)
+ def __init__(self, repo, enable):
+ YumSpecificRepositoryJob.__init__(self, repo)
self.enable = bool(enable)
diff --git a/src/software/openlmi/software/yumdb/process.py b/src/software/openlmi/software/yumdb/process.py
index 56227f3..4e0b262 100644
--- a/src/software/openlmi/software/yumdb/process.py
+++ b/src/software/openlmi/software/yumdb/process.py
@@ -820,6 +820,7 @@ class YumWorker(Process):
LOG.warn('repository with id="%s" could not be found',
filters['repoid'])
raise errors.RepositoryNotFound(filters['repoid'])
+
repos = self._handle_get_repository_list(kind, transform=False)
result = []
for repo in repos:
@@ -838,10 +839,15 @@ class YumWorker(Process):
"""
@return previous enabled state
"""
+ self._check_repository_configs()
+ if isinstance(repo, repository.Repository):
+ repoid = repo.repoid
+ else:
+ repoid = repo
try:
- repo = self._yum_base.repos.getRepo(repo.repoid)
+ repo = self._yum_base.repos.getRepo(repoid)
except (KeyError, yum.Errors.RepoError):
- raise errors.RepositoryNotFound(repo.repoid)
+ raise errors.RepositoryNotFound(repoid)
res = repo.enabled
try:
if enable ^ res:
diff --git a/src/software/openlmi/software/yumdb/repository.py b/src/software/openlmi/software/yumdb/repository.py
index 2863dac..758ae21 100644
--- a/src/software/openlmi/software/yumdb/repository.py
+++ b/src/software/openlmi/software/yumdb/repository.py
@@ -24,7 +24,9 @@ Module holding an abstraction for YUM repository.
"""
from datetime import datetime
+import logging
import yum
+import yum.Errors
# maps names of Repository properties to their corresponding property
# names in YumRepository object
@@ -182,9 +184,19 @@ def make_repository_from_db(repo):
"""
if not isinstance(repo, yum.yumRepo.YumRepository):
raise TypeError("repo must be in instance of yum.yumRepo.YumRepository")
- metadata = dict(
- (prop_name, get_prop_from_yum_repo(repo, prop_name))
- for prop_name in Repository.__slots__[1:])
+ metadata = {}
+ for prop_name in Repository.__slots__[1:]:
+ try:
+ metadata[prop_name] = get_prop_from_yum_repo(repo, prop_name)
+ except yum.Errors.RepoError as exc:
+ # some properties can cause error (like requesting ready)
+ logging.getLogger(__name__).warn(
+ 'failed to get property "%s" of repo "%s": %s' % (
+ prop_name, repo.name, exc))
+ if prop_name == "ready":
+ metadata[prop_name] = False
+ continue
+
res = Repository(id(repo), **metadata)
return res
diff --git a/src/software/test/rpmcache.py b/src/software/test/rpmcache.py
index 18b4779..153f657 100644
--- a/src/software/test/rpmcache.py
+++ b/src/software/test/rpmcache.py
@@ -64,8 +64,6 @@ RE_PKG_INFO = re.compile(
r'^Release\s*:\s*(?P<rel>[^\s]+)\s+.*?'
r'^Size\s*:\s*(?P<size>\d+(\.\d+)?)( *(?P<units>[kMG]))?',
re.MULTILINE | re.DOTALL | re.IGNORECASE)
-RE_REPO = re.compile(
- r'(?:^\*?)(?P<name>[^\s/]+\b)(?!\s+id)', re.MULTILINE | re.IGNORECASE)
# Maximum number of packages, that will be selected for testing / 2
# There are 2 sets of test packages (safe and dangerous). When running
@@ -267,13 +265,6 @@ def _sorted_db_by_size(pkgdb, repolist=None):
pkgdb[i] = Package(**pkg_kwargs)
return pkgdb
-def _get_repo_list():
- """
- @return list of software repository names
- """
- repos_str = check_output(['yum', 'repolist', '-q'])
- return RE_REPO.findall(repos_str)
-
def _download_dangerous(repolist, pkgdb, cache_dir=None):
"""
Downloads all rpm packages (old and newer versions) from package database
@@ -533,7 +524,7 @@ def get_pkg_database(
pkg.name for pkg in dangerous_pkgs))
if use_cache:
- repolist = _get_repo_list() if repolist in (None, []) else repolist
+ repolist = util.get_repo_list() if repolist in (None, []) else repolist
_download_dangerous(repolist, dangerous_pkgs, cache_dir)
#print "Backing up database information"
write_pkgdb(safe_pkgs, dangerous_pkgs, cache_dir)
diff --git a/src/software/test/test_software_identity_resource.py b/src/software/test/test_software_identity_resource.py
index 5c3c329..528c6c0 100755
--- a/src/software/test/test_software_identity_resource.py
+++ b/src/software/test/test_software_identity_resource.py
@@ -29,8 +29,10 @@ import socket
import time
import unittest
+from openlmi.software.core.IdentityResource import Values
import base
import repository
+import util
class TestSoftwareIdentityResource(
base.SoftwareBaseTestCase): #pylint: disable=R0904
@@ -198,6 +200,51 @@ class TestSoftwareIdentityResource(
self.assertIn(inst["Name"], repoids)
self._check_repo_instance(repoids[inst["Name"]], inst)
+ @base.mark_dangerous
+ def test_request_state_change(self):
+ """
+ Tests InvokeMethod on RequestStateChange().
+ """
+ for repo in self.repodb:
+ objpath = self.make_op(repo)
+ self.assertIs(repository.is_repo_enabled(repo), repo.status)
+
+ # change state of repository (enabled/disabled)
+ req_state = ( Values.RequestStateChange.RequestedState.Disabled
+ if repo.status else
+ Values.RequestStateChange.RequestedState.Enabled)
+ (res, oparms) = self.conn.InvokeMethod(
+ MethodName="RequestStateChange",
+ ObjectName=objpath,
+ RequestedState=req_state)
+ self.assertEqual(0, res) #Completed with no error
+ self.assertEqual(0, len(oparms))
+ inst = self.conn.GetInstance(InstanceName=objpath)
+ self.assertEqual(inst["EnabledState"], req_state)
+ for pkg in self.dangerous_pkgs:
+ if pkg.up_repo == repo:
+ pkg_iname = util.make_identity_path(pkg)
+ self.assertRaisesCIM(pywbem.CIM_ERR_NOT_FOUND,
+ self.conn.GetInstance, pkg_iname)
+
+ # revert back to original configuration
+ req_state = ( Values.RequestStateChange.RequestedState.Enabled
+ if repo.status else
+ Values.RequestStateChange.RequestedState.Disabled)
+ (res, oparms) = self.conn.InvokeMethod(
+ MethodName="RequestStateChange",
+ ObjectName=objpath,
+ RequestedState=req_state)
+ self.assertEqual(0, res) #Completed with no error
+ self.assertEqual(0, len(oparms))
+ inst = self.conn.GetInstance(InstanceName=objpath)
+ self.assertEqual(inst["EnabledState"], req_state)
+ for pkg in self.dangerous_pkgs:
+ if pkg.up_repo == repo:
+ pkg_iname = util.make_identity_path(pkg)
+ inst = self.conn.GetInstance(pkg_iname)
+ self.assertIsInstance(inst, pywbem.CIMInstance)
+
def suite():
"""For unittest loaders."""
return unittest.TestLoader().loadTestsFromTestCase(
diff --git a/src/software/test/util.py b/src/software/test/util.py
index 0abd5cf..e72add1 100644
--- a/src/software/test/util.py
+++ b/src/software/test/util.py
@@ -35,6 +35,8 @@ RE_NEVRA_OPT_EPOCH = re.compile(
RE_ENVRA = re.compile(
r'^(?P<epoch>\d+|\(none\)):(?P<name>.+)-(?P<ver>[^-]+)'
r'-(?P<rel>.+)\.(?P<arch>[^.]+)$')
+RE_REPO = re.compile(
+ r'(?:^\*?)(?P<name>[^\s/]+\b)(?!\s+id)', re.MULTILINE | re.IGNORECASE)
def make_nevra(name, epoch, ver, rel, arch, with_epoch='NOT_ZERO'):
"""
@@ -74,6 +76,13 @@ def run_yum(*params, **kwargs):
cmd += ['--enablerepo='+r for r in repolist]
return check_output(cmd)
+def get_repo_list():
+ """
+ @return list of software repository names
+ """
+ repos_str = check_output(['yum', 'repolist', '-q'])
+ return RE_REPO.findall(repos_str)
+
def get_system_architecture():
"""
@return the system architecture name as seen by rpm
@@ -103,3 +112,14 @@ def is_doc_file(pkg, file_path):
out = check_output(cmd)
return file_path in set(out.splitlines()) #pylint: disable=E1103
+def make_identity_path(pkg, newer=True):
+ """
+ Make instance name for LMI_SoftwareIdentity from Package.
+ """
+ return pywbem.CIMInstanceName(
+ classname="LMI_SoftwareIdentity",
+ namespace="root/cimv2",
+ keybindings=pywbem.NocaseDict({
+ "InstanceID" : "LMI:LMI_SoftwareIdentity:%s" % pkg.get_nevra(
+ newer=newer)
+ }))