Just remind,

Hi Anders, Hans and Zoran,

Do you have any comments for my patch?
I hope you spend a little time to quick look this patch. It's related to MR
HL Python Interface [MR54015], will be first demo on this Friday (13th Oct).

Also,  ticket #1410

Thanks,
Hieu
-----Original Message-----
From: Hieu Nguyen [mailto:hieu.t.ngu...@dektech.com.au] 
Sent: Thursday, October 5, 2017 5:27 PM
To: hans.nordeb...@ericsson.com; anders.wid...@ericsson.com;
zoran.milinko...@ericsson.com
Cc: opensaf-devel@lists.sourceforge.net; Hieu Nguyen
<hieu.t.ngu...@dektech.com.au>
Subject: [PATCH 1/1] pyosaf: decorate function does not handle version
struct in initialize functions [#2524]

---
 python/pyosaf/utils/__init__.py       | 38
+++++++++++++++++++++++++++++++++++
 python/pyosaf/utils/clm/__init__.py   | 18 ++++++++---------
 python/pyosaf/utils/immoi/__init__.py | 12 +++++------
python/pyosaf/utils/immom/__init__.py | 11 +++++-----
 python/pyosaf/utils/log/__init__.py   |  4 ++--
 python/pyosaf/utils/ntf/__init__.py   | 17 ++++++++--------
 6 files changed, 69 insertions(+), 31 deletions(-)

diff --git a/python/pyosaf/utils/__init__.py
b/python/pyosaf/utils/__init__.py index 0d4b648..17a1408 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,40 @@ def decorate(function):
         return error
 
     return inner
+
+
+def initialize_decorate(function, current_version):
+    ''' Decorate the given SAF initialize() with current version 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.
+    '''
+    # Backup current version
+    backup_version = deepcopy(current_version)
+
+    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
+
+            # If SAF initialize() returns ERR_TRY_AGAIN, the version will
be
+            # updated to the latest version
+            # Set current version in this case
+            current_version = deepcopy(backup_version)
+            args = args[:2] + (current_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..926e2f4 100644
--- a/python/pyosaf/utils/clm/__init__.py
+++ b/python/pyosaf/utils/clm/__init__.py
@@ -20,12 +20,15 @@
 
 from pyosaf import saClm, saAis
 
-from pyosaf.utils import decorate
+from pyosaf.utils import decorate, initialize_decorate
+
+# Define CLM version
+CLM_VER = saAis.SaVersionT('B', 4, 1)
 
 # 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, CLM_VER)
+saClmInitialize_3 = initialize_decorate(saClm.saClmInitialize_3, 
+CLM_VER)
+saClmInitialize_4 = initialize_decorate(saClm.saClmInitialize_4, 
+CLM_VER)
 saClmSelectionObjectGet        = decorate(saClm.saClmSelectionObjectGet)
 saClmDispatch                  = decorate(saClm.saClmDispatch)
 saClmFinalize                  = decorate(saClm.saClmFinalize)
@@ -119,11 +122,8 @@ def initialize(track_fn=None):
     callbacks.saClmClusterNodeGetCallback =
saClm.SaClmClusterNodeGetCallbackT_4(node_get_callback)
     callbacks.saClmClusterTrackCallback =
saClm.SaClmClusterTrackCallbackT_4(track_callback)
 
-    # Define which version to use of the CLM API
-    version = saAis.SaVersionT('B', 4, 1)
-
     # Initialize the CLM API
-    saClmInitialize_4(HANDLE, callbacks, version)
+    saClmInitialize_4(HANDLE, callbacks, CLM_VER)
 
 def track(flags=saAis.saAis.SA_TRACK_CHANGES_ONLY):
     saClmClusterTrack_4(HANDLE, flags, None) @@ -131,7 +131,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..ecfeb7e 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,11 @@ TRYAGAIN_CNT = 60
 
 OPENSAF_IMM_OBJECT = "opensafImm=opensafImm,safApp=safImmService"
 
+# Define IMM OI version
+OI_VER = SaVersionT('A', 2, 15)
+
 # Decorate the raw saImmOi* functions with retry and raising exceptions
-saImmOiInitialize_2       = decorate(saImmOi.saImmOiInitialize_2)
+saImmOiInitialize_2 = initialize_decorate(saImmOi.saImmOiInitialize_2, 
+OI_VER)
 saImmOiSelectionObjectGet = decorate(saImmOi.saImmOiSelectionObjectGet)
 saImmOiDispatch           = decorate(saImmOi.saImmOiDispatch)
 saImmOiFinalize           = decorate(saImmOi.saImmOiFinalize)
@@ -71,10 +74,7 @@ saImmOiCcbSetErrorString  =
decorate(saImmOi.saImmOiCcbSetErrorString)
 
 def initialize(callbacks=None):
     ''' Initializes IMM OI '''
-
-    version = SaVersionT('A', 2, 15)
-
-    saImmOiInitialize_2(HANDLE, callbacks, version)
+    saImmOiInitialize_2(HANDLE, callbacks, OI_VER)
 
 
 def register_applier(name):
diff --git a/python/pyosaf/utils/immom/__init__.py
b/python/pyosaf/utils/immom/__init__.py
index 09370c8..8d2a49e 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,11 @@ from
pyosaf.utils.immom.object import ImmObject  HANDLE = saImmOm.SaImmHandleT()
ACCESSOR_HANDLE = SaImmAccessorHandleT()
 
+# Define IMM OM version
+OM_VER = SaVersionT('A', 2, 15)
+
 # Decorate IMM functions to add retry loops and error handling
-saImmOmInitialize         = decorate(saImmOm.saImmOmInitialize)
+saImmOmInitialize = initialize_decorate(saImmOm.saImmOmInitialize, 
+OM_VER)
 saImmOmSelectionObjectGet = decorate(saImmOm.saImmOmSelectionObjectGet)
 saImmOmDispatch           = decorate(saImmOm.saImmOmDispatch)
 saImmOmFinalize           = decorate(saImmOm.saImmOmFinalize)
@@ -74,9 +77,7 @@ saImmOmAdminOperationContinuationClear =
decorate(saImmOm.saImmOmAdminOperationC
 
 def initialize():
     ''' saImmOmInitialize with TRYAGAIN handling '''
-    version = SaVersionT('A', 2, 15)
-
-    err = saImmOmInitialize(HANDLE, None, version)
+    err = saImmOmInitialize(HANDLE, None, OM_VER)
 
     err = saImmOmAccessorInitialize(HANDLE, ACCESSOR_HANDLE)
 
diff --git a/python/pyosaf/utils/log/__init__.py
b/python/pyosaf/utils/log/__init__.py
index 152df61..695d53a 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, 
+LOG_VERSION)
 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..4034cfb 100644
--- a/python/pyosaf/utils/ntf/__init__.py
+++ b/python/pyosaf/utils/ntf/__init__.py
@@ -22,17 +22,20 @@
 from pyosaf import saNtf, saAis
 import ctypes
 
-from pyosaf.utils import decorate
+from pyosaf.utils import decorate, initialize_decorate
 
-saNtfInitialize                 = decorate(saNtf.saNtfInitialize)
+# Define NTF version
+NTF_VER = saAis.SaVersionT('A', 1, 1)
+
+saNtfInitialize = initialize_decorate(saNtf.saNtfInitialize, NTF_VER)
 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, 
+NTF_VER)
 saNtfNotificationReadInitialize_2 =
decorate(saNtf.saNtfNotificationReadInitialize_2)
 saNtfNotificationSubscribe      =
decorate(saNtf.saNtfNotificationSubscribe)
-saNtfInitialize_3               = decorate(saNtf.saNtfInitialize_3)
+saNtfInitialize_3 = initialize_decorate(saNtf.saNtfInitialize_3, 
+NTF_VER)
 saNtfSelectionObjectGet         = decorate(saNtf.saNtfSelectionObjectGet)
 saNtfDispatch                   = decorate(saNtf.saNtfDispatch)
 saNtfFinalize                   = decorate(saNtf.saNtfFinalize)
@@ -135,10 +138,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)
@@ -151,7 +150,7 @@ def initialize(notification_callback=None):
                     saNtf.SaNtfNotificationCallbackT(notification_callback)
 
     # Initialize the API
-    saNtfInitialize(HANDLE, CALLBACKS, version)
+    saNtfInitialize(HANDLE, CALLBACKS, NTF_VER)
 
     # Get the selection object
     saNtfSelectionObjectGet(HANDLE, SELECTION_OBJECT)
--
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

Reply via email to