diff options
author | Michal Minar <miminar@redhat.com> | 2013-07-03 12:19:22 +0200 |
---|---|---|
committer | Michal Minar <miminar@redhat.com> | 2013-07-04 10:33:48 +0200 |
commit | 3cf188c5f9d9daf47f4814afcf442184e84b89ff (patch) | |
tree | 4953087318be445709c1a9b5726ee9836cda6449 /src/software | |
parent | 9086dae6d7db5c39e19315991e4b393c600263b7 (diff) | |
download | openlmi-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.py | 22 | ||||
-rw-r--r-- | src/software/openlmi/software/yumdb/process.py | 10 | ||||
-rw-r--r-- | src/software/openlmi/software/yumdb/repository.py | 18 | ||||
-rw-r--r-- | src/software/test/rpmcache.py | 11 | ||||
-rwxr-xr-x | src/software/test/test_software_identity_resource.py | 47 | ||||
-rw-r--r-- | src/software/test/util.py | 20 |
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) + })) |