python/pyosaf/utils/immoi/__init__.py               |   3 -
 python/pyosaf/utils/immoi/implementer.py            |  64 +++++++++-----------
 python/pyosaf/utils/immom/__init__.py               |  10 ++-
 python/samples/immoi/samples/classes.xml            |  15 ++++
 python/samples/immoi/samples/users                  |  30 +++++++++
 python/samples/immoi/samples/users-inheritance-impl |  34 +++++++++++
 6 files changed, 118 insertions(+), 38 deletions(-)


Fix the handling of updates of runtime attributes on request from IMM. Add 
sample application to demonstrate this, both for direct callbacks and by using 
a subclass.

Verify by executing the sample applications:

./users &

immlist usersId=1

or

./users-inheritance-impl &

immlist usersId=2

diff --git a/python/pyosaf/utils/immoi/__init__.py 
b/python/pyosaf/utils/immoi/__init__.py
--- a/python/pyosaf/utils/immoi/__init__.py
+++ b/python/pyosaf/utils/immoi/__init__.py
@@ -281,9 +281,6 @@ def get_object_no_runtime(dn, class_name
     if not class_name:
         class_name = get_class_name_for_dn(dn)
 
-    if not class_name:
-        return None
-
     class_desc = get_class_description(class_name)
 
     config_attrs = []
diff --git a/python/pyosaf/utils/immoi/implementer.py 
b/python/pyosaf/utils/immoi/implementer.py
--- a/python/pyosaf/utils/immoi/implementer.py
+++ b/python/pyosaf/utils/immoi/implementer.py
@@ -182,7 +182,7 @@ def admin_operation(oi_handle, c_invocat
 def abort_ccb(oi_handle, ccb_id):
     ''' Callback for aborted CCBs. 
 
-        Removes the given CCB from the cache 
+        Removes the given CCB from the cache.
     '''
 
     del ccbs[ccb_id]
@@ -223,40 +223,26 @@ def attr_update(oi_handle, c_name, c_att
     class_name = immoi.get_class_name_for_dn(name)
 
     # Get the values from the user and report back
-    if implementer_instance.on_runtime_values_get:
+    attributes = {}
 
-        attr_mods = []
+    for attr_name in attr_names:
+        values = implementer_instance.on_runtime_values_get(name, class_name, 
+                                                            attr_name)
 
-        for attr_name in attr_names:
-            values = implementer_instance.on_runtime_values_get(name, 
-                                                                class_name, 
-                                                                attr_name)
+        if values is None:
+            return eSaAisErrorT.SA_AIS_ERR_UNAVAILABLE
 
-            if values is None:
-                return eSaAisErrorT.SA_AIS_ERR_UNAVAILABLE
+        if not isinstance(values, list):
+            values = [values]
 
-            if not isinstance(values, list):
-                values = [values]
+        attributes[attr_name] = values
 
-            attribute_type = immoi.get_attribute_type(attr_name, class_name)
-
-            attr_mod = saImm.SaImmAttrModificationT_2()
-            attr_mod.modType = 
eSaImmAttrModificationTypeT.SA_IMM_ATTR_VALUES_REPLACE
-            attr_mod.modAttr = saImm.SaImmAttrValuesT_2()
-            attr_mod.modAttr.attrName = saImm.SaImmAttrNameT(attr_name)
-            attr_mod.modAttr.attrValueType = attribute_type
-            attr_mod.modAttr.attrValuesNumber = len(values)
-            attr_mod.modAttr.attrValues = marshal_c_array(attribute_type, 
values)
-            attr_mods = [attr_mod]
-
-        # Report the updated values for the attributes
-        try:
-            immoi.update_rt_object(name, attr_mods)
-        except SafException as err:
-            return eSaAisErrorT.SA_AIS_ERR_FAILED_OPERATION
-
-    else:
-        return eSaAisErrorT.SA_AIS_ERR_NOT_SUPPORTED
+    # Report the updated values for the attributes
+    try:
+        immoi.update_rt_object(name, attributes)
+        return eSaAisErrorT.SA_AIS_OK
+    except SafException as err:
+        return eSaAisErrorT.SA_AIS_ERR_FAILED_OPERATION
 
 def delete_added(oi_handle, ccb_id, c_name):
     ''' Callback for object delete '''
@@ -353,13 +339,10 @@ def create_added(oi_handle, c_ccb_id, c_
     description = immom.class_description_get(class_name)
 
     for attribute in description:
-        print attribute.attrName
+
         if not attribute.attrName in attributes:
-            print "Not in attributes, adding"
             attributes[attribute.attrName] = None
 
-    print attributes
-
     # Create a new CCB in the cache if needed
     if not ccb_id in ccbs.keys():
         ccbs[ccb_id] = []
@@ -619,6 +602,19 @@ class Implementer:
         ''' Sets the admin operations to be executed by the OI '''
         self.admin_operations = admin_operations
 
+    def on_runtime_values_get(self, name, class_name, attribute_name):
+        ''' Retrieves values for the requested attribute in the given 
+            instance
+        '''
+
+        if self.on_runtime_values_get_cb:
+            try:
+                return self.on_runtime_values_get_cb(name, class_name, 
attribute_name)
+            except SafException as err:
+                return err.value
+        else:
+            return None
+
     def on_modify_added(self, attribute_name, modification_type, values):
         ''' Called when an object modify operation has been added to an
             ongoing CCB.
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
@@ -80,9 +80,14 @@ def _initialize():
     err = saImmOmAccessorInitialize(HANDLE, ACCESSOR_HANDLE)
 
 
-def get(object_name, attr_name_list=None):
+def get(object_name, attr_name_list=None, class_name=None):
     ''' obtain values of some attributes of the specified object '''
 
+    # Always request the SaImmAttrClassName attribute if needed
+    if attr_name_list and not class_name and \
+       not 'SaImmAttrClassName' in attr_name_list:
+        attr_name_list.append('SaImmAttrClassName')
+
     attrib_names = [SaImmAttrNameT(a) for a in attr_name_list]\
         if attr_name_list else None
 
@@ -109,6 +114,9 @@ def get(object_name, attr_name_list=None
                 attr.attrValueType) for val in attr_range]
             ]
 
+    if not 'SaImmAttrClassName' in attribs and class_name:
+        attribs['SaImmAttrClassName'] = class_name
+
     return ImmObject(object_name, attribs)
 
 # initialize handles needed when module is loaded
diff --git a/python/samples/immoi/samples/classes.xml 
b/python/samples/immoi/samples/classes.xml
--- a/python/samples/immoi/samples/classes.xml
+++ b/python/samples/immoi/samples/classes.xml
@@ -25,6 +25,21 @@
     </attr>
   </class>
 
+  <class name="UsersSampleClass">
+    <category>SA_RUNTIME</category>
+    <rdn>
+      <name>usersId</name>
+      <type>SA_STRING_T</type>
+      <category>SA_RUNTIME</category>
+      <flag>SA_CACHED</flag>
+    </rdn>
+    <attr>
+      <name>users</name>
+      <type>SA_STRING_T</type>
+      <category>SA_RUNTIME</category>
+    </attr>
+  </class>
+
   <!-- Tones OI -->
   <class name="Do">
     <category>SA_CONFIG</category>
diff --git a/python/samples/immoi/samples/users 
b/python/samples/immoi/samples/users
new file mode 100755
--- /dev/null
+++ b/python/samples/immoi/samples/users
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+
+from pyosaf import saAis
+from pyosaf.utils import immom, immoi, SafException
+from pyosaf.utils.immom.object import ImmObject
+from pyosaf.utils.immoi.implementer import Implementer
+
+import psutil
+
+class_name='UsersSampleClass'
+
+def on_attribute_update(*args):
+    return list(set(map(lambda x: x.name, psutil.get_users())))
+
+if __name__ == '__main__':
+    
+    users_implementer = Implementer(on_runtime_values_get=on_attribute_update,
+                                    name='UsersImplementer')
+
+    try:
+        obj = ImmObject(class_name=class_name, dn='usersId=1')
+
+        obj.usersId = 'usersId=1'
+
+        users_implementer.create(obj)
+    except SafException as err:
+        if not err.value == saAis.eSaAisErrorT.SA_AIS_ERR_EXIST:
+            raise err
+        
+    users_implementer.enter_dispatch_loop()
diff --git a/python/samples/immoi/samples/users-inheritance-impl 
b/python/samples/immoi/samples/users-inheritance-impl
new file mode 100755
--- /dev/null
+++ b/python/samples/immoi/samples/users-inheritance-impl
@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+
+from pyosaf import saAis
+from pyosaf.utils import immom, immoi, SafException
+from pyosaf.utils.immom.object import ImmObject
+from pyosaf.utils.immoi.implementer import Implementer
+
+import psutil
+
+class_name='UsersSampleClass'
+
+class UsersImplementer(Implementer):
+
+    def __init__(self):
+        Implementer.__init__(self, name='UsersImplementer')
+
+    def on_runtime_values_get(self, name, class_name, attribute):
+        return list(set(map(lambda x: x.name, psutil.get_users())))
+
+if __name__ == '__main__':
+    
+    users_implementer = UsersImplementer()
+
+    try:
+        obj = ImmObject(class_name=class_name, dn='usersId=2')
+
+        obj.usersId = 'usersId=2'
+
+        users_implementer.create(obj)
+    except SafException as err:
+        if not err.value == saAis.eSaAisErrorT.SA_AIS_ERR_EXIST:
+            raise err
+        
+    users_implementer.enter_dispatch_loop()

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

Reply via email to