--- python/pyosaf/utils/__init__.py | 44 +++++++++++++++++++++++++++++++++++ python/pyosaf/utils/clm/__init__.py | 11 +++++---- python/pyosaf/utils/immoi/__init__.py | 7 +++--- python/pyosaf/utils/immom/__init__.py | 7 +++--- python/pyosaf/utils/log/__init__.py | 4 ++-- python/pyosaf/utils/ntf/__init__.py | 16 ++++++------- 6 files changed, 66 insertions(+), 23 deletions(-)
diff --git a/python/pyosaf/utils/__init__.py b/python/pyosaf/utils/__init__.py index 0d4b648..3776cef 100644 --- a/python/pyosaf/utils/__init__.py +++ b/python/pyosaf/utils/__init__.py @@ -16,6 +16,7 @@ ############################################################################ import time +from copy import deepcopy from pyosaf.saAis import eSaAisErrorT @@ -70,3 +71,46 @@ def decorate(function): return error return inner + + +def initialize_decorate(function): + ''' Decorate the given SAF initialize(handle, callbacks, version) so that + it retries a fixed number of times if needed with the same arguments 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. + + Args: + args(tuple): Argument of initialize() with format: + tuple(handle, callbacks, version) + ''' + # Backup current version + backup_version = deepcopy(args[2]) + + 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 + + # If SAF initialize() returns ERR_TRY_AGAIN, the version will be + # updated to the latest version, so set original version on + # next initialization. + version = deepcopy(backup_version) + args = args[:2] + (version,) + error = function(*args) + + if error != eSaAisErrorT.SA_AIS_OK: + raise_saf_exception(function, error) + + return error + + return inner diff --git a/python/pyosaf/utils/clm/__init__.py b/python/pyosaf/utils/clm/__init__.py index 9b9e11f..b9b853a 100644 --- a/python/pyosaf/utils/clm/__init__.py +++ b/python/pyosaf/utils/clm/__init__.py @@ -20,12 +20,13 @@ from pyosaf import saClm, saAis -from pyosaf.utils import decorate +from pyosaf.utils import decorate, initialize_decorate + # Decorate the raw saClm* functions with retry and raising exceptions -saClmInitialize = decorate(saClm.saClmInitialize) -saClmInitialize_3 = decorate(saClm.saClmInitialize_3) -saClmInitialize_4 = decorate(saClm.saClmInitialize_4) +saClmInitialize = initialize_decorate(saClm.saClmInitialize) +saClmInitialize_3 = initialize_decorate(saClm.saClmInitialize_3) +saClmInitialize_4 = initialize_decorate(saClm.saClmInitialize_4) saClmSelectionObjectGet = decorate(saClm.saClmSelectionObjectGet) saClmDispatch = decorate(saClm.saClmDispatch) saClmFinalize = decorate(saClm.saClmFinalize) @@ -131,7 +132,7 @@ def track(flags=saAis.saAis.SA_TRACK_CHANGES_ONLY): def get_members(): notification_buffer = saClm.SaClmClusterNotificationBufferT_4() - saClmClusterTrack_4(HANDLE, saAis.saAis.SA_TRACK_CURRENT, + saClmClusterTrack_4(HANDLE, saAis.saAis.SA_TRACK_CURRENT, notification_buffer) cluster_nodes = [] diff --git a/python/pyosaf/utils/immoi/__init__.py b/python/pyosaf/utils/immoi/__init__.py index 02ad89b..2ea0f33 100644 --- a/python/pyosaf/utils/immoi/__init__.py +++ b/python/pyosaf/utils/immoi/__init__.py @@ -38,7 +38,7 @@ from pyosaf.utils.immom.object import ImmObject from pyosaf.utils.immom.ccb import marshal_c_array from pyosaf.utils.immom.iterator import SearchIterator -from pyosaf.utils import decorate +from pyosaf.utils import decorate, initialize_decorate from ctypes import c_char_p, c_void_p, cast, pointer @@ -49,8 +49,9 @@ TRYAGAIN_CNT = 60 OPENSAF_IMM_OBJECT = "opensafImm=opensafImm,safApp=safImmService" + # Decorate the raw saImmOi* functions with retry and raising exceptions -saImmOiInitialize_2 = decorate(saImmOi.saImmOiInitialize_2) +saImmOiInitialize_2 = initialize_decorate(saImmOi.saImmOiInitialize_2) saImmOiSelectionObjectGet = decorate(saImmOi.saImmOiSelectionObjectGet) saImmOiDispatch = decorate(saImmOi.saImmOiDispatch) saImmOiFinalize = decorate(saImmOi.saImmOiFinalize) @@ -71,9 +72,7 @@ saImmOiCcbSetErrorString = decorate(saImmOi.saImmOiCcbSetErrorString) def initialize(callbacks=None): ''' Initializes IMM OI ''' - version = SaVersionT('A', 2, 15) - saImmOiInitialize_2(HANDLE, callbacks, version) diff --git a/python/pyosaf/utils/immom/__init__.py b/python/pyosaf/utils/immom/__init__.py index 09370c8..2246720 100644 --- a/python/pyosaf/utils/immom/__init__.py +++ b/python/pyosaf/utils/immom/__init__.py @@ -31,7 +31,7 @@ from pyosaf.saImm import eSaImmScopeT, unmarshalSaImmValue, SaImmAttrNameT, \ from pyosaf.saImmOm import SaImmHandleT, SaImmAccessorHandleT,\ saImmOmAdminOwnerInitialize -from pyosaf.utils import decorate +from pyosaf.utils import decorate, initialize_decorate from pyosaf.utils import SafException from pyosaf.utils.immom.object import ImmObject @@ -39,8 +39,9 @@ from pyosaf.utils.immom.object import ImmObject HANDLE = saImmOm.SaImmHandleT() ACCESSOR_HANDLE = SaImmAccessorHandleT() + # Decorate IMM functions to add retry loops and error handling -saImmOmInitialize = decorate(saImmOm.saImmOmInitialize) +saImmOmInitialize = initialize_decorate(saImmOm.saImmOmInitialize) saImmOmSelectionObjectGet = decorate(saImmOm.saImmOmSelectionObjectGet) saImmOmDispatch = decorate(saImmOm.saImmOmDispatch) saImmOmFinalize = decorate(saImmOm.saImmOmFinalize) @@ -75,9 +76,7 @@ saImmOmAdminOperationContinuationClear = decorate(saImmOm.saImmOmAdminOperationC def initialize(): ''' saImmOmInitialize with TRYAGAIN handling ''' version = SaVersionT('A', 2, 15) - err = saImmOmInitialize(HANDLE, None, version) - err = saImmOmAccessorInitialize(HANDLE, ACCESSOR_HANDLE) diff --git a/python/pyosaf/utils/log/__init__.py b/python/pyosaf/utils/log/__init__.py index 152df61..4ac2bf8 100644 --- a/python/pyosaf/utils/log/__init__.py +++ b/python/pyosaf/utils/log/__init__.py @@ -20,12 +20,12 @@ ''' from pyosaf import saLog, saAis -from pyosaf.utils import decorate +from pyosaf.utils import decorate, initialize_decorate LOG_VERSION = saAis.SaVersionT('A', 2, 1) # Decorate LOG functions to add retry loops and error handling -saLogInitialize = decorate(saLog.saLogInitialize) +saLogInitialize = initialize_decorate(saLog.saLogInitialize) saLogSelectionObjectGet = decorate(saLog.saLogSelectionObjectGet) saLogDispatch = decorate(saLog.saLogDispatch) saLogFinalize = decorate(saLog.saLogFinalize) diff --git a/python/pyosaf/utils/ntf/__init__.py b/python/pyosaf/utils/ntf/__init__.py index 95df5f6..3355cc2 100644 --- a/python/pyosaf/utils/ntf/__init__.py +++ b/python/pyosaf/utils/ntf/__init__.py @@ -22,17 +22,18 @@ from pyosaf import saNtf, saAis import ctypes -from pyosaf.utils import decorate +from pyosaf.utils import decorate, initialize_decorate -saNtfInitialize = decorate(saNtf.saNtfInitialize) + +saNtfInitialize = initialize_decorate(saNtf.saNtfInitialize) saNtfLocalizedMessageFree = decorate(saNtf.saNtfLocalizedMessageFree) saNtfStateChangeNotificationFilterAllocate = decorate(saNtf.saNtfStateChangeNotificationFilterAllocate) saNtfNotificationUnsubscribe = decorate(saNtf.saNtfNotificationUnsubscribe) saNtfNotificationReadInitialize = decorate(saNtf.saNtfNotificationReadInitialize) -saNtfInitialize_2 = decorate(saNtf.saNtfInitialize_2) +saNtfInitialize_2 = initialize_decorate(saNtf.saNtfInitialize_2) saNtfNotificationReadInitialize_2 = decorate(saNtf.saNtfNotificationReadInitialize_2) saNtfNotificationSubscribe = decorate(saNtf.saNtfNotificationSubscribe) -saNtfInitialize_3 = decorate(saNtf.saNtfInitialize_3) +saNtfInitialize_3 = initialize_decorate(saNtf.saNtfInitialize_3) saNtfSelectionObjectGet = decorate(saNtf.saNtfSelectionObjectGet) saNtfDispatch = decorate(saNtf.saNtfDispatch) saNtfFinalize = decorate(saNtf.saNtfFinalize) @@ -135,10 +136,6 @@ def dummy_func(*args): def initialize(notification_callback=None): ''' Initializes the NTF library''' - - # Initialize the NTF API - version = saAis.SaVersionT('A', 1, 1) - # Assign default values for callbacks CALLBACKS.saNtfNotificationCallback = \ saNtf.SaNtfNotificationCallbackT(dummy_func) @@ -150,6 +147,9 @@ def initialize(notification_callback=None): CALLBACKS.saNtfNotificationCallback = \ saNtf.SaNtfNotificationCallbackT(notification_callback) + # Initialize the NTF API + version = saAis.SaVersionT('A', 1, 1) + # Initialize the API saNtfInitialize(HANDLE, CALLBACKS, version) -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel