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

Reply via email to