summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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: