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 '''
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel