python/pyosaf/utils/__init__.py | 56 +++++++++++++++++++++++++++++++++++
python/pyosaf/utils/immom/__init__.py | 33 ++++++++++++++++++++
2 files changed, 89 insertions(+), 0 deletions(-)
Add a decorate function that takes a raw SAF function call and adds a
retry-loop and raising of an exception if encounters a fault. Use this
decorator to add decorated versions of each function in saImmOm* to the immom
module.
There is no registered ticket as sourceforge is down.
diff --git a/python/pyosaf/utils/__init__.py b/python/pyosaf/utils/__init__.py
--- a/python/pyosaf/utils/__init__.py
+++ b/python/pyosaf/utils/__init__.py
@@ -14,3 +14,59 @@
# Author(s): Oracle
#
############################################################################
+
+import time
+
+from pyosaf.saAis import eSaAisErrorT
+
+TRY_AGAIN_COUNT = 30
+
+class SafException(Exception):
+ ''' SAF Exception that can be printed '''
+
+ def __init__(self, value, msg=None):
+ Exception.__init__(self)
+ self.value = value
+ self.msg = msg
+
+ def __str__(self):
+ return eSaAisErrorT.whatis(self.value)
+
+def raise_saf_exception(function, error):
+ ''' Raises an exception for a given SAF function, based on
+ the given error code
+ '''
+
+ error_string = "%s: %s" % (function.__name__, eSaAisErrorT.whatis(error))
+
+ raise SafException(error, error_string)
+
+def decorate(function):
+ ''' Decorates the given SAF function so that it retries a fixed number of
+ times if needed and raises an exception if it encounters any fault
+ other than SA_AIS_ERR_TRY_AGAIN
+ '''
+
+ def inner(*args):
+ ''' Calls "function" in the lexical scope in a retry loop and raises
+ an exception if it encounters any other faults
+ '''
+ one_sec_sleeps = 0
+
+ error = function(*args)
+
+ while error == eSaAisErrorT.SA_AIS_ERR_TRY_AGAIN:
+ if one_sec_sleeps == TRY_AGAIN_COUNT:
+ break
+
+ time.sleep(1)
+ one_sec_sleeps += 1
+
+ error = function(*args)
+
+ if error != eSaAisErrorT.SA_AIS_OK:
+ raise_saf_exception(function, error)
+
+ return error
+
+ return inner
diff --git a/python/pyosaf/utils/immom/__init__.py
b/python/pyosaf/utils/immom/__init__.py
--- a/python/pyosaf/utils/immom/__init__.py
+++ b/python/pyosaf/utils/immom/__init__.py
@@ -31,6 +31,8 @@ from pyosaf.saImm import eSaImmScopeT, u
from pyosaf.saImmOm import SaImmHandleT, SaImmAccessorHandleT,\
saImmOmAdminOwnerInitialize
+from pyosaf.utils import decorate
+
from pyosaf.utils.immom.common import SafException
from pyosaf.utils.immom.object import ImmObject
@@ -39,6 +41,37 @@ ACCESSOR_HANDLE = SaImmAccessorHandleT()
TRYAGAIN_CNT = 60
+# Decorate IMM functions to add retry loops and error handling
+saImmOmInitialize = decorate(saImmOm.saImmOmInitialize)
+saImmOmSelectionObjectGet = decorate(saImmOm.saImmOmSelectionObjectGet)
+saImmOmDispatch = decorate(saImmOm.saImmOmDispatch)
+saImmOmFinalize = decorate(saImmOm.saImmOmFinalize)
+saImmOmClassCreate_2 = decorate(saImmOm.saImmOmClassCreate_2)
+saImmOmClassDescriptionGet_2 = decorate(saImmOm.saImmOmClassDescriptionGet_2)
+saImmOmClassDescriptionMemoryFree_2 =
decorate(saImmOm.saImmOmClassDescriptionMemoryFree_2)
+saImmOmClassDelete = decorate(saImmOm.saImmOmClassDelete)
+saImmOmSearchInitialize_2 = decorate(saImmOm.saImmOmSearchInitialize_2)
+saImmOmSearchNext_2 = decorate(saImmOm.saImmOmSearchNext_2)
+saImmOmSearchFinalize = decorate(saImmOm.saImmOmSearchFinalize)
+saImmOmAccessorInitialize = decorate(saImmOm.saImmOmAccessorInitialize)
+saImmOmAccessorGet_2 = decorate(saImmOm.saImmOmAccessorGet_2)
+saImmOmAccessorFinalize = decorate(saImmOm.saImmOmAccessorFinalize)
+saImmOmAdminOwnerInitialize = decorate(saImmOm.saImmOmAdminOwnerInitialize)
+saImmOmAdminOwnerSet = decorate(saImmOm.saImmOmAdminOwnerSet)
+saImmOmAdminOwnerRelease = decorate(saImmOm.saImmOmAdminOwnerRelease)
+saImmOmAdminOwnerFinalize = decorate(saImmOm.saImmOmAdminOwnerFinalize)
+saImmOmAdminOwnerClear = decorate(saImmOm.saImmOmAdminOwnerClear)
+saImmOmCcbInitialize = decorate(saImmOm.saImmOmCcbInitialize)
+saImmOmCcbObjectCreate_2 = decorate(saImmOm.saImmOmCcbObjectCreate_2)
+saImmOmCcbObjectDelete = decorate(saImmOm.saImmOmCcbObjectDelete)
+saImmOmCcbObjectModify_2 = decorate(saImmOm.saImmOmCcbObjectModify_2)
+saImmOmCcbApply = decorate(saImmOm.saImmOmCcbApply)
+saImmOmCcbFinalize = decorate(saImmOm.saImmOmCcbFinalize)
+saImmOmAdminOperationInvoke_2 = decorate(saImmOm.saImmOmAdminOperationInvoke_2)
+saImmOmAdminOperationInvokeAsync_2 =
decorate(saImmOm.saImmOmAdminOperationInvokeAsync_2)
+saImmOmAdminOperationContinue = decorate(saImmOm.saImmOmAdminOperationContinue)
+saImmOmAdminOperationContinueAsync =
decorate(saImmOm.saImmOmAdminOperationContinueAsync)
+saImmOmAdminOperationContinuationClear =
decorate(saImmOm.saImmOmAdminOperationContinuationClear)
def _initialize():
''' saImmOmInitialize with TRYAGAIN handling '''
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel