Hi Anh,

Ack. No comment from me.

Best regards,
Hieu

-----Original Message-----
From: Anh Tuan Le <anh.t...@dektech.com.au> 
Sent: Tuesday, April 27, 2021 5:48 PM
To: Thang Duc Nguyen <thang.d.ngu...@dektech.com.au>; Thanh Nguyen 
<thanh.ngu...@dektech.com.au>; Hieu Hong Hoang <hieu.h.ho...@dektech.com.au>
Cc: opensaf-devel@lists.sourceforge.net; Anh Tuan Le <anh.t...@dektech.com.au>
Subject: [PATCH 1/1] pyosaf: support for amf api version b4.02 [#3256]

---
 python/pyosaf/saAmf.py  | 58 ++++++++++++++++++++++++++++++++++++++++-
 python/samples/amf_demo | 35 ++++++++++++++++++++++---
 2 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/python/pyosaf/saAmf.py b/python/pyosaf/saAmf.py index 
ff9265d22..510a34c89 100644
--- a/python/pyosaf/saAmf.py
+++ b/python/pyosaf/saAmf.py
@@ -392,7 +392,12 @@ SaAmfContainedComponentInstantiateCallbackT = 
CFUNCTYPE(None,  SaAmfContainedComponentCleanupCallbackT = CFUNCTYPE(None,
        SaInvocationT, POINTER(SaNameT))
 
-#if defined(SA_AMF_B01) || defined(SA_AMF_B02)
+SaAmfCsiAttributeChangeCallbackT = CFUNCTYPE(None, SaInvocationT,
+                                             POINTER(SaNameT),
+                                             SaAmfCSIAttributeListT)
+
+
+# if defined(SA_AMF_B01) || defined(SA_AMF_B02)
 class SaAmfCallbacksT(Structure):
        """Contain various callbacks AMF may invoke on a component.
        """
@@ -691,6 +696,57 @@ def saAmfInitialize_4(amfHandle, amfCallbacks, version):
        return amfdll.saAmfInitialize_4(BYREF(amfHandle),
                        BYREF(amfCallbacks), BYREF(version))
 
+
+# pylint: disable-msg=R0903, C0103
+class SaAmfCallbacksT_o4(Structure):
+    """Contain various callbacks AMF may invoke on a component.
+    """
+    _fields_ = [('saAmfHealthcheckCallback',
+                 SaAmfHealthcheckCallbackT),
+                ('saAmfComponentTerminateCallback',
+                 SaAmfComponentTerminateCallbackT),
+                ('saAmfCSISetCallback',
+                 SaAmfCSISetCallbackT),
+                ('saAmfCSIRemoveCallback',
+                 SaAmfCSIRemoveCallbackT),
+                ('saAmfProtectionGroupTrackCallback',
+                 SaAmfProtectionGroupTrackCallbackT_4),
+                ('saAmfProxiedComponentInstantiateCallback',
+                 SaAmfProxiedComponentInstantiateCallbackT),
+                ('saAmfProxiedComponentCleanupCallback',
+                 SaAmfProxiedComponentCleanupCallbackT),
+                ('saAmfContainedComponentInstantiateCallback',
+                 SaAmfContainedComponentInstantiateCallbackT),
+                ('saAmfContainedComponentCleanupCallback',
+                 SaAmfContainedComponentCleanupCallbackT),
+                ('osafCsiAttributeChangeCallback',
+                 SaAmfCsiAttributeChangeCallbackT)]
+# pylint: enable-msg=R0903, C0103
+
+
+def saAmfInitialize_o4(amfHandle, amfCallbacks, version):
+    """Register invoking process with AMF.
+
+    type arguments:
+        SaAmfHandleT amfHandle
+        SaAmfCallbacksT_o4 amfCallbacks
+        SaVersionT version
+
+    returns:
+        SaAisErrorT
+
+    """
+
+    amfdll.saAmfInitialize_o4.argtypes = [POINTER(SaAmfHandleT),
+                                          POINTER(SaAmfCallbacksT_o4),
+                                          POINTER(SaVersionT)]
+
+    amfdll.saAmfInitialize_o4.restype = SaAisErrorT
+
+    return amfdll.saAmfInitialize_o4(BYREF(amfHandle),
+                                     BYREF(amfCallbacks), 
+ BYREF(version))
+
+
 def saAmfSelectionObjectGet(amfHandle, selectionObject):
        """Return operating system handle associated with AMF handle to detect
        pending callbacks.
diff --git a/python/samples/amf_demo b/python/samples/amf_demo index 
f076a9d77..2b84f357a 100644
--- a/python/samples/amf_demo
+++ b/python/samples/amf_demo
@@ -26,6 +26,7 @@ import sys
 import errno
 import signal
 import socket
+import ctypes
 import hashlib
 from select import select, error
 
@@ -47,8 +48,8 @@ class AmfDemo(object):
 
     def __init__(self, health_check_key, signal_handler):
         self.handle = saAmf.SaAmfHandleT()
-        self.version = SaVersionT('B', 4, 1)
-        self.callbacks = saAmf.SaAmfCallbacksT_4()
+        self.version = SaVersionT('B', 4, 2)
+        self.callbacks = saAmf.SaAmfCallbacksT_o4()
         self.sel_obj = saAmf.SaSelectionObjectT()
         self.comp_name = SaNameT()
         self.health_check_key = saAmf.SaAmfHealthcheckKeyT(health_check_key)
@@ -66,10 +67,13 @@ class AmfDemo(object):
             saAmf.SaAmfCSISetCallbackT(self.csi_set_callback)
         self.callbacks.saAmfCSIRemoveCallback = \
             saAmf.SaAmfCSIRemoveCallbackT(self.csi_remove_callback)
+        self.callbacks.osafCsiAttributeChangeCallback = \
+            
+ saAmf.SaAmfCsiAttributeChangeCallbackT(self.csi_attr_chg_callback)
 
         log_info("Start initialization.")
 
-        rc = saAmf.saAmfInitialize_4(self.handle, self.callbacks, self.version)
+        rc = saAmf.saAmfInitialize_o4(self.handle,
+                                      self.callbacks, self.version)
         if not self.check_rc("saAmfInitialize", rc):
             return False
 
@@ -201,6 +205,31 @@ class AmfDemo(object):
         self.check_rc("saAmfResponse_4", rc)
         self.term_handler.send_terminate_msg()
 
+    def csi_attr_chg_callback(self, invocation, csi_name, csi_attr_list):
+        """ callback to handle CST attribute change callback event.
+
+        Args:
+            invocation (SaInvocationT): Invocation of the callback
+            csiname POINTER(SaNameT): Name of the csi being changed
+            csi_attr_list (SaAmfCSIAttributeListT): List of csi attributes
+            being changed
+        """
+        log_info("CSI attribute change callback invoked")
+        rc = saAmf.saAmfResponse_4(self.handle, invocation, None,
+                                   eSaAisErrorT.SA_AIS_OK)
+        self.check_rc("saAmfResponse_4", rc)
+        attr_name = ""
+        attr_value = ""
+        log_info("CSI Name:'%s'" % str(csi_name[0]))
+        for i in range(csi_attr_list.number):
+            attr = csi_attr_list.attr[i]
+            attr_name = ctypes.cast(attr.attrName,
+                                    ctypes.c_char_p).value.decode('utf-8')
+            attr_value = ctypes.cast(attr.attrValue,
+                                     ctypes.c_char_p).value.decode('utf-8')
+            log_info("CSI attribute name: %s" % attr_name)
+            log_info("CSI attribute value: %s" % attr_value)
+
     @staticmethod
     def check_rc(function_name, rc):
         """ Check return code if it ok or not.
--
2.17.1



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to