summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Minar <miminar@redhat.com>2013-04-18 22:04:03 +0200
committerMichal Minar <miminar@redhat.com>2013-04-26 10:18:18 +0200
commit272c051e8453d0a98771d8741e08478f18bbf638 (patch)
treea56724b4537491217700576678b1b93d68dd7292
parent59e8bf604c382b9269b4448f10223de631b40036 (diff)
downloadopenlmi-providers-272c051e8453d0a98771d8741e08478f18bbf638.tar.gz
openlmi-providers-272c051e8453d0a98771d8741e08478f18bbf638.tar.xz
openlmi-providers-272c051e8453d0a98771d8741e08478f18bbf638.zip
modified indication filters
And moved software static filters to shared JobManager. Indication filters now reflect the name of indication class, which is instrumented by particular provider. This ensures, that cimom knows, which provider to call and does not bother the others. So instead of selecting indication instances from general class CIM_InstModification, it will be LMI_SoftwareInstModification. This is a common pattern for indication queries. Avoided another shortcoming of sfcbmof parser: /* comment */ something useful is also ignored :-( Static filters of JobManager made more generic for any provider to use. Software jobmanager is now using them. This reduces redundation of code.
-rw-r--r--mof/70_LMI_SoftwareIndicationFilters.mof24
-rw-r--r--src/python/openlmi/common/IndicationManager.py3
-rw-r--r--src/python/openlmi/common/JobManager.py101
-rw-r--r--src/software/openlmi/software/cimom_entry.py7
-rw-r--r--src/software/openlmi/software/yumdb/jobmanager.py81
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: