diff options
-rw-r--r-- | mof/70_LMI_SoftwareIndicationFilters.mof | 24 | ||||
-rw-r--r-- | src/python/openlmi/common/IndicationManager.py | 3 | ||||
-rw-r--r-- | src/python/openlmi/common/JobManager.py | 101 | ||||
-rw-r--r-- | src/software/openlmi/software/cimom_entry.py | 7 | ||||
-rw-r--r-- | src/software/openlmi/software/yumdb/jobmanager.py | 81 |
5 files changed, 87 insertions, 129 deletions
diff --git a/mof/70_LMI_SoftwareIndicationFilters.mof b/mof/70_LMI_SoftwareIndicationFilters.mof index e3af599..b79917d 100644 --- a/mof/70_LMI_SoftwareIndicationFilters.mof +++ b/mof/70_LMI_SoftwareIndicationFilters.mof @@ -28,7 +28,7 @@ instance of CIM_IndicationFilter { SystemCreationClassName = "CIM_ComputerSystem"; SystemName = "kvm-fedora18"; Name = "LMI:LMI_SoftwareInstallationJob:PercentUpdated"; - Query = "SELECT * FROM CIM_InstModification WHERE " + Query = "SELECT * FROM LMI_SoftwareInstModification WHERE " "SourceInstance ISA LMI_SoftwareInstallationJob AND " "SourceInstance.CIM_ConcreteJob::PercentComplete <> " "PreviousInstance.CIM_ConcreteJob::PercentComplete"; @@ -47,12 +47,11 @@ instance of CIM_IndicationFilter { SystemName = "kvm-fedora18"; Name = "LMI:LMI_SoftwareInstallationJob:Succeeded"; QueryLanguage = "CIM:CQL"; - Query = "SELECT * FROM CIM_InstModification WHERE " + Query = "SELECT * FROM LMI_SoftwareInstModification WHERE " "SourceInstance ISA LMI_SoftwareInstallationJob AND " - "SourceInstance.CIM_ConcreteJob::JobState" - " = 17" - /* This is not supported by sfcb: - * " = CIM_ConcreteJob.JobState#'Completed'" */; + "SourceInstance.CIM_ConcreteJob::JobState = 17"; + /* This is not supported by sfcb: + * " = CIM_ConcreteJob.JobState#'Completed'" */ SourceNamespace = "root/cimv2"; SourceNamespaces = {"root/cimv2"}; }; @@ -62,12 +61,11 @@ instance of CIM_IndicationFilter { SystemCreationClassName = "CIM_ComputerSystem"; SystemName = "kvm-fedora18"; Name = "LMI:LMI_SoftwareInstallationJob:Failed"; - Query = "SELECT * FROM CIM_InstModification WHERE " + Query = "SELECT * FROM LMI_SoftwareInstModification WHERE " "SourceInstance ISA LMI_SoftwareInstallationJob AND " - "SourceInstance.CIM_ConcreteJob::JobState" - " = 10" - /* This is not supported by sfcb: - * "CIM_ConcreteJob.JobState#'Exception'" */; + "SourceInstance.CIM_ConcreteJob::JobState = 10"; + /* This is not supported by sfcb: + * "CIM_ConcreteJob.JobState#'Exception'" */ QueryLanguage = "CIM:CQL"; Description = "Modification of Operational Status for a " "Concrete Job to 'Complete' and 'OK'."; @@ -80,7 +78,7 @@ instance of CIM_IndicationFilter { SystemCreationClassName = "CIM_ComputerSystem"; SystemName = "kvm-fedora18"; Name = "LMI:LMI_SoftwareInstallationJob:Changed"; - Query = "SELECT * FROM CIM_InstModification WHERE " + Query = "SELECT * FROM LMI_SoftwareInstModification WHERE " "SourceInstance ISA LMI_SoftwareInstallationJob AND " "SourceInstance.CIM_ConcreteJob::JobState <> " "PreviousInstance.CIM_ConcreteJob::JobState"; @@ -95,7 +93,7 @@ instance of CIM_IndicationFilter { SystemCreationClassName = "CIM_ComputerSystem"; SystemName = "kvm-fedora18"; Name = "LMI:LMI_SoftwareInstallationJob:Created"; - Query = "SELECT * FROM CIM_InstCreation WHERE" + Query = "SELECT * FROM LMI_SoftwareInstCreation WHERE" " SourceInstance ISA LMI_SoftwareInstallationJob"; QueryLanguage = "CIM:CQL"; Description = "Creation of a ConcreteJob."; diff --git a/src/python/openlmi/common/IndicationManager.py b/src/python/openlmi/common/IndicationManager.py index ba0919d..7834378 100644 --- a/src/python/openlmi/common/IndicationManager.py +++ b/src/python/openlmi/common/IndicationManager.py @@ -35,8 +35,9 @@ RE_FILTER_NAME = re.compile(r'^(?P<prefix>lmi:' r'(?P<class_name>[a-z0-9_]+):)(?P<filter_id>.*)$', re.IGNORECASE) FILTER_DEFAULTS = { + "SourceNamespace" : "root/cimv2", "SourceNamespaces" : ["root/cimv2"], - "QueryLanguage" : "CIM:CQL" + "QueryLanguage" : "CIM:CQL" } @cmpi_logging.trace_function diff --git a/src/python/openlmi/common/JobManager.py b/src/python/openlmi/common/JobManager.py index f2d0c71..e78967c 100644 --- a/src/python/openlmi/common/JobManager.py +++ b/src/python/openlmi/common/JobManager.py @@ -47,10 +47,33 @@ import threading from Queue import Queue import pywbem import openlmi.common.cmpi_logging as cmpi_logging +from openlmi.common.IndicationManager import IndicationManager from pywbem.cim_provider2 import CIMProvider2 import socket import traceback +@cmpi_logging.trace_function +def register_filters(job_clsname, indication_manager=None): + """ + This function registers static indication filters at IndicationManager. + It should be called upon provider's initialization. + + :param job_clsname: (``String``) CIM class name for asynchonous jobs. + Will be part of filter queries. + :param indication_manager: If not given, global instance will be obtained. + """ + if indication_manager is None: + ind_manager = IndicationManager.get_instance() + filters = {} + query_args = { + "classname" : job_clsname, + "prefix" : indication_manager.nameprefix + } + for fltr_id, fltr_props in JobManager.IND_FILTERS.items(): + filters[fltr_id] = fltr_props.copy() + filters[fltr_id]['Query'] = fltr_props['Query'] % query_args + indication_manager.add_filters(job_clsname, filters) + # Too many instance attributes # pylint: disable-msg=R0902 class Job(object): @@ -660,6 +683,43 @@ class JobManager(object): IND_JOB_CHANGED = "Changed" IND_JOB_CREATED = "Created" + IND_FILTERS = { + IND_JOB_PERCENT_UPDATED: { + "Query" : "SELECT * FROM LMI_%(prefix)sInstModification WHERE " + "SourceInstance ISA %(classname)s AND " + "SourceInstance.CIM_ConcreteJob::PercentComplete <> " + "PreviousInstance.CIM_ConcreteJob::PercentComplete", + "Description" : "Modification of Percentage Complete for a " + "Concrete Job.", + }, + IND_JOB_SUCCEEDED: { + "Query" : "SELECT * FROM LMI_%(prefix)sInstModification WHERE " + "SourceInstance ISA %(classname)s AND " + "SourceInstance.CIM_ConcreteJob::JobState = 17", + "Description": "Modification of Job State for a " + "Concrete Job to 'Complete'.", + }, + IND_JOB_FAILED: { + "Query" : "SELECT * FROM LMI_%(prefix)sInstModification WHERE " + "SourceInstance ISA %(classname)s AND " + "SourceInstance.CIM_ConcreteJob::JobState = 10", + "Description": "Modification of Job State for a " + "Concrete Job to 'Exception'.", + }, + IND_JOB_CHANGED: { + "Query" : "SELECT * FROM LMI_%(prefix)sInstModification WHERE " + "SourceInstance ISA %(classname)s AND " + "SourceInstance.CIM_ConcreteJob::JobState <> " + "PreviousInstance.CIM_ConcreteJob::JobState", + "Description": "Modification of Job State for a ConcreteJob.", + }, + IND_JOB_CREATED: { + "Query" : "SELECT * FROM LMI_%(prefix)sInstCreation WHERE " + "SourceInstance ISA %(classname)s", + "Description": "Creation of a ConcreteJob.", + }, + } + @cmpi_logging.trace_method def __init__(self, name, namespace, indication_manager, timer_manager): """ @@ -710,46 +770,7 @@ class JobManager(object): """ Add all job-related ``IndicationFilters`` to indication manager. """ - filters = { - self.IND_JOB_PERCENT_UPDATED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance.CIM_ConcreteJob::PercentComplete <> " - "PreviousInstance.CIM_ConcreteJob::PercentComplete", - "Description" : "Modification of Percentage Complete for a " - "Concrete Job.", - }, - self.IND_JOB_SUCCEEDED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance.CIM_ConcreteJob::JobState = 17", - "Description": "Modification of Job State for a " - "Concrete Job to 'Complete'.", - }, - self.IND_JOB_FAILED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance.CIM_ConcreteJob::JobState = 10", - "Description": "Modification of Job State for a " - "Concrete Job to 'Exception'.", - }, - self.IND_JOB_CHANGED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance.CIM_ConcreteJob::JobState <> " - "PreviousInstance.CIM_ConcreteJob::JobState", - "Description": "Modification of Job State for a ConcreteJob.", - }, - self.IND_JOB_CREATED: { - "Query" : "SELECT * FROM CIM_InstCreation WHERE " - "SourceInstance ISA %(classname)s", - "Description": "Creation of a ConcreteJob.", - }, - } - # add class name - for f in filters.itervalues(): - f['Query'] = f['Query'] % {"classname" : self.job_classname } - self.indication_manager.add_filters(self.job_classname, filters) + register_filters(self.job_classname, self.indication_manager) @cmpi_logging.trace_method def get_providers(self): diff --git a/src/software/openlmi/software/cimom_entry.py b/src/software/openlmi/software/cimom_entry.py index ad944c8..d507a01 100644 --- a/src/software/openlmi/software/cimom_entry.py +++ b/src/software/openlmi/software/cimom_entry.py @@ -26,6 +26,7 @@ Entry module for OpenLMI Software providers. from multiprocessing import Queue from openlmi.common import cmpi_logging +from openlmi.common import JobManager from openlmi.common.IndicationManager import IndicationManager from openlmi.software.core import InstallationJob from openlmi.software.LMI_SoftwareIdentity import LMI_SoftwareIdentity @@ -113,7 +114,7 @@ def get_providers(env): # daemon. That means it does not have to be cleaned up. im = IndicationManager.get_instance( env, "Software", "root/cimv2", queue=Queue()) - jobmanager.register_filters(im) + JobManager.register_filters("LMI_SoftwareInstallationJob", im) return providers @@ -123,11 +124,11 @@ def authorize_filter(env, fltr, ns, classes, owner): def activate_filter (env, fltr, ns, classes, first_activation): IndicationManager.get_instance().activate_filter( - env, fltr, ns, classes, first_activation) + env, fltr, class_name, class_path, first_activation) def deactivate_filter(env, fltr, ns, classes, last_activation): IndicationManager.get_instance().deactivate_filter( - env, fltr, ns, classes, last_activation) + env, fltr, class_name, class_path, last_activation) def enable_indications(env): IndicationManager.get_instance().enable_indications(env) diff --git a/src/software/openlmi/software/yumdb/jobmanager.py b/src/software/openlmi/software/yumdb/jobmanager.py index 7283d05..977b38f 100644 --- a/src/software/openlmi/software/yumdb/jobmanager.py +++ b/src/software/openlmi/software/yumdb/jobmanager.py @@ -39,8 +39,8 @@ import threading import time import traceback -from openlmi.common import cmpi_logging from openlmi.common.IndicationManager import IndicationManager +from openlmi.common.JobManager import JobManager as JM from openlmi.software.yumdb import errors, jobs from openlmi.software.yumdb.util import trace_function @@ -56,69 +56,6 @@ MINIMUM_TIME_BEFORE_REMOVAL = 10 # replacement for cmpi_logging.logger LOG = None -IND_JOB_PERCENT_UPDATED = "PercentUpdated" -IND_JOB_SUCCEEDED = "Succeeded" -IND_JOB_FAILED = "Failed" -IND_JOB_CHANGED = "Changed" -IND_JOB_CREATED = "Created" - -IND_FILTERS = { - IND_JOB_PERCENT_UPDATED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance.CIM_ConcreteJob::PercentComplete <> " - "PreviousInstance.CIM_ConcreteJob::PercentComplete", - "Description" : "Modification of Percentage Complete for a " - "Concrete Job.", - }, - IND_JOB_SUCCEEDED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance ISA LMI_SoftwareInstallationJob AND " - "SourceInstance.CIM_ConcreteJob::JobState = 17", - # symbolic constants not supported by sfcb - #"CIM_ConcreteJob.JobState#'Completed'" - "Description": "Modification of Operational Status for a " - "Concrete Job to 'Complete' and 'OK'.", - }, - IND_JOB_FAILED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance.CIM_ConcreteJob::JobState = 10", - # symbolic constants not supported by sfcb - #"CIM_ConcreteJob.JobState#'Exception'", - "Description": "Modification of Operational Status for a " - "Concrete Job to 'Complete' and 'Error'.", - }, - IND_JOB_CHANGED: { - "Query" : "SELECT * FROM CIM_InstModification WHERE " - "SourceInstance ISA %(classname)s AND " - "SourceInstance.CIM_ConcreteJob::JobState <> " - "PreviousInstance.CIM_ConcreteJob::JobState", - "Description": "Modification of Job State for a ConcreteJob.", - }, - IND_JOB_CREATED: { - "Query" : "SELECT * FROM CIM_InstCreation WHERE " - "SourceInstance ISA %(classname)s", - "Description": "Creation of a ConcreteJob.", - }, -} - -@cmpi_logging.trace_function -def register_filters(indication_manager): - """ - This function registers static indication filters at IndicationManager. - It should be called upon provider's initialization. - """ - to_register = {} - for fltr_id, fltr in IND_FILTERS.items(): - if not indication_manager.is_registered(JOB_CLASSNAME, fltr_id): - fltr["Query"] = fltr["Query"] % {"classname" : JOB_CLASSNAME } - to_register[fltr_id] = fltr - if to_register: - indication_manager.add_filters(JOB_CLASSNAME, - to_register, ensure_installed=False) - # ***************************************************************************** # Decorators # ***************************************************************************** @@ -183,7 +120,7 @@ class JobIndicationSender(object): """ def __init__(self, indication_manager, job, - indications=IND_JOB_CHANGED, new=None): + indications=JM.IND_JOB_CHANGED, new=None): """ :param job (``YumJob``) Is job instance, which will be immediately snapshoted as old instance and later as a new one. @@ -258,11 +195,11 @@ class JobIndicationSender(object): "can not send any indication without id") if make_snapshot: self.snapshot() - if ( IND_JOB_CHANGED in self._indications + if ( JM.IND_JOB_CHANGED in self._indications and self._new_instance is None): raise errors.IndicationError("no snapshot made for modified job") for fltr_id in self._indications: - if fltr_id == IND_JOB_CREATED: + if fltr_id == JM.IND_JOB_CREATED: LOG.debug("sending instance creation indication for job %s", self._job) self._indication_manager.send_instcreation( @@ -368,7 +305,7 @@ class JobManager(threading.Thread): LOG.debug('job %s enqued for YumWorker to handle', job) heapq.heappush(self._job_queue, job) if getattr(job, 'async', False) is True: - ind = self._prepare_indication_for(job, IND_JOB_CREATED) + ind = self._prepare_indication_for(job, JM.IND_JOB_CREATED) self._async_jobs[job.jobid] = job ind.send() self._job_enqueued.notify() @@ -557,7 +494,7 @@ class JobManager(threading.Thread): 'can not finish not started job "%s"' % job) if getattr(job, 'async', False): ind = self._prepare_indication_for(job, - (IND_JOB_CHANGED, IND_JOB_PERCENT_UPDATED)) + (JM.IND_JOB_CHANGED, JM.IND_JOB_PERCENT_UPDATED)) job.finish(result, result_data) if getattr(job, 'async', False): if job.delete_on_completion: @@ -566,9 +503,9 @@ class JobManager(threading.Thread): self._schedule_event(schedule_at, job.jobid, self.ACTION_REMOVE) if result == job.RESULT_SUCCESS: - ind.add_indication_ids(IND_JOB_SUCCEEDED) + ind.add_indication_ids(JM.IND_JOB_SUCCEEDED) elif result == job.RESULT_ERROR: - ind.add_indication_ids(IND_JOB_FAILED) + ind.add_indication_ids(JM.IND_JOB_FAILED) ind.send(True) else: LOG.debug("sending reply for %s: (%s, %s)", job, @@ -598,7 +535,7 @@ class JobManager(threading.Thread): if job is not None: if getattr(job, "async", False): ind = self._prepare_indication_for(job, - (IND_JOB_CHANGED, IND_JOB_PERCENT_UPDATED)) + (JM.IND_JOB_CHANGED, JM.IND_JOB_PERCENT_UPDATED)) job.start() ind.send(True) else: |