Hi Hung,
Thanks, I had missed that it's possible to pass several parameters with
the same name. I'll include the changes below in the next changeset to
fix this.
/ Johan
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
@@ -159,6 +159,18 @@ def _collect_full_transaction(ccb_id):
return out
+
+class AdminOperationParameter:
+ ''' This class represents an admin operation parameter '''
+
+ def __init__(self, name, param_type, value):
+ ''' Creates an instance of an admin operation parameter '''
+
+ self.name = name
+ self.type = param_type
+ self.value = value
+
+
# Set up callbacks
def admin_operation(oi_handle, c_invocation_id, c_name,
c_operation_id, c_params):
''' Callback for administrative operations '''
@@ -178,7 +190,9 @@ def admin_operation(oi_handle, c_invocat
value = saImm.unmarshalSaImmValue(paramBuffer, paramType)
- params.append(value)
+ parameter = AdminOperationParameter(paramName, paramType, value)
+
+ params.append(parameter)
# Invoke the operation
result = implementer_instance.admin_operation(operation_id, name,
params)
@@ -569,7 +589,6 @@ class Constraints:
current_children = get_children_with_classname(parent_name,
all_instances,
mo.class_name)
-
# Validate the number of children of the specific class to
the given parent
lower, upper = self.cardinality[(parent_class, mo.class_name)]
diff --git a/python/samples/interface-handler-inheritance-version
b/python/samples/interface-handler-inheritance-version
--- a/python/samples/interface-handler-inheritance-version
+++ b/python/samples/interface-handler-inheritance-version
@@ -92,7 +92,7 @@ class InterfaceImplementer(Implementer):
pass
# Go through existing objects
- for mo in InstanceIterator('InterfaceRO'):
+ for mo in InstanceIterator('InterfaceRO01'):
interface_name =
self.get_interface_name_from_dn(mo.dn)
# Remove objects for deleted interfaces
diff --git a/python/samples/ping-pong b/python/samples/ping-pong
--- a/python/samples/ping-pong
+++ b/python/samples/ping-pong
@@ -14,13 +14,24 @@ class_name = "PingPong"
dn = "pingPongId=1"
+def print_admin_operation_info(dn, arguments):
+ print "INFO: I am %s" % dn
+
+ if arguments:
+ print "INFO: Received arguments"
+
+ for argument in arguments:
+ print " - %s: %s (%s)" % \
+ (argument.name, argument.value, argument.type)
+
+
def ping(dn, arguments):
print
print
print "Pong!"
print
- print "INFO: I am %s, received arguments %s" % (dn, arguments)
+ print_admin_operation_info(dn, arguments)
return eSaAisErrorT.SA_AIS_OK
@@ -31,7 +42,7 @@ def pong(dn, arguments):
print "Ping!"
print
- print "INFO: I am %s, received arguments %s" % (dn, arguments)
+ print_admin_operation_info(dn, arguments)
return eSaAisErrorT.SA_AIS_OK
diff --git a/python/samples/ping-pong-inheritance-impl
b/python/samples/ping-pong-inheritance-impl
--- a/python/samples/ping-pong-inheritance-impl
+++ b/python/samples/ping-pong-inheritance-impl
@@ -24,7 +24,8 @@ class PingPong(Implementer):
print
print "Pong!"
print
- print "INFO: I am %s, received arguments %s" % (dn, arguments)
+
+ self.print_admin_operation_info(dn, arguments)
@AdminOperation(class_name, 1)
def pong(self, dn, arguments):
@@ -32,8 +33,18 @@ class PingPong(Implementer):
print
print "Ping!"
print
- print "INFO: I am %s, received arguments %s" % (dn, arguments)
+ self.print_admin_operation_info(dn, arguments)
+
+ def print_admin_operation_info(self, dn, arguments):
+ print "INFO: I am %s" % dn
+
+ if arguments:
+ print "INFO: Received arguments"
+
+ for argument in arguments:
+ print " - %s: %s (%s)" % \
+ (argument.name, argument.value, argument.type)
if __name__ == '__main__':
On 09/15/2015 09:57 AM, Hung Nguyen wrote:
> Hi Johan,
>
> 'interface-handler-inheritance-version' still has that 'InterfaceRO'
> problem :)
> for mo in InstanceIterator('InterfaceRO'):
>
>
>
> One more thing about the ping-pong application.
> I see that only a list of values of the parameters is passed to the
> application.
>
> root@SC1:~# immadm -o 0 -p paramName:SA_STRING_T:paramValue pingPongId=1
>
> Pong!
>
> INFO: I am pingPongId=1, received arguments ['paramValue']
>
>
> I think paramName and paramType should also be passed to application.
> IMM services supports multiple parameters for admin-operation, those
> parameters can even have the same paramName.
>
>
> Best Regards,
> Hùng Nguyễn - DEK Technologies
>
>
>
> ------------------------------------------------------------------------
>
> *From:* Johan Martensson
> *Sent:* Monday, September 14, 2015 9:31PM
> *To:* Hans Nordeback, Mathivanan Naickan, Hung Nguyen, Srikanth
> Revanuru ([email protected])
> *Cc:* Opensaf-devel
> *Subject:* [PATCH 15 of 15] pyosaf: Correct sample applications and
> add help text [#1406]
>
> python/samples/caps | 9 +++++++++
> python/samples/caps-inheritance-impl | 9 +++++++++
> python/samples/interface-handler | 16 ++++++++++++----
> python/samples/interface-handler-inheritance-version | 13 ++++++++++---
> python/samples/ping-pong | 8 ++++++++
> python/samples/ping-pong-inheritance-impl | 8 ++++++++
> python/samples/time-reporter | 12 ++++++++++--
> python/samples/time-reporter-inheritance-impl | 14 +++++++++++---
> python/samples/users | 11 ++++++++++-
> python/samples/users-inheritance-impl | 11 ++++++++++-
> 10 files changed, 97 insertions(+), 14 deletions(-)
>
>
> Correct mistakes in the sample applications and add proper help text to all.
>
> diff --git a/python/samples/caps b/python/samples/caps
> --- a/python/samples/caps
> +++ b/python/samples/caps
> @@ -1,6 +1,7 @@
> #!/usr/bin/env python
>
> import itertools
> +import argparse
>
> from pyosaf.saAis import eSaAisErrorT
>
> @@ -31,6 +32,14 @@ def handle_validate(all_instances, updat
>
> if __name__ == "__main__":
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Validates that the lowerCaps and upperCaps attributes
> +of instances of the CapsSample class can only contain
> +lower case and upper case text respectively.')
> +
> + parser.parse_args()
> +
> # Create the implementer
> classes = [caps_class_name]
>
> diff --git a/python/samples/caps-inheritance-impl
> b/python/samples/caps-inheritance-impl
> --- a/python/samples/caps-inheritance-impl
> +++ b/python/samples/caps-inheritance-impl
> @@ -1,6 +1,7 @@
> #!/usr/bin/env python
>
> import itertools
> +import argparse
>
> from pyosaf.saAis import eSaAisErrorT
>
> @@ -42,6 +43,14 @@ class Caps(Implementer):
>
> if __name__ == "__main__":
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Validates that the lowerCaps and upperCaps attributes
> +of instances of the CapsSample class can only contain
> +lower case and upper case text respectively.')
> +
> + parser.parse_args()
> +
> # Create the implementer
> caps_implementer = Caps()
>
> diff --git a/python/samples/interface-handler
> b/python/samples/interface-handler
> --- a/python/samples/interface-handler
> +++ b/python/samples/interface-handler
> @@ -61,7 +61,7 @@ def create_rt_object_for_interface(imple
> implementer.create(mo)
>
> def select_loop(implementer):
> -
> + print 'select loop'
> # Get selection object for the implementer
> selection_object = implementer.get_selection_object()
>
> @@ -82,16 +82,18 @@ def select_loop(implementer):
>
> # Add objects for new interfaces
> for interface in interfaces:
> - if not immoi.get_object_no_runtime('interfaceId=%s' %
> interface,
> -
> class_name=interface_class_name):
> +
> + try:
> create_rt_object_for_interface(implementer, interface)
> + except Exception as err:
> + pass
>
> # Go through existing objects
> for mo in InstanceIterator('InterfaceRO01'):
> interface_name = get_interface_name_from_dn(mo.dn)
>
> # Remove objects for deleted interfaces
> - if not mo.dn in interfaces:
> + if not mo.interfaceId.split('=')[1] in interfaces:
> implementer.delete(mo.dn)
>
> continue
> @@ -115,6 +117,12 @@ def select_loop(implementer):
>
> if __name__ == "__main__":
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Creates a runtime object per network interface on the
> machine and populates the ipv4Addresses and ipv6Addresses attributes.')
> +
> + parser.parse_args()
> +
> # Create the implementer instance
> interface_implementer = Implementer(name="InterfaceImplementer")
>
> diff --git a/python/samples/interface-handler-inheritance-version
> b/python/samples/interface-handler-inheritance-version
> --- a/python/samples/interface-handler-inheritance-version
> +++ b/python/samples/interface-handler-inheritance-version
> @@ -86,16 +86,17 @@ class InterfaceImplementer(Implementer):
>
> # Add objects for new interfaces
> for interface in interfaces:
> - if not immoi.get_object_no_runtime('interfaceId=%s' %
> interface,
> -
> class_name=interface_class_name):
> + try:
> self.create_rt_object_for_interface(interface)
> + except Exception as err:
> + pass
>
> # Go through existing objects
> for mo in InstanceIterator('InterfaceRO'):
> interface_name = self.get_interface_name_from_dn(mo.dn)
>
> # Remove objects for deleted interfaces
> - if not mo.dn in interfaces:
> + if not mo.interfaceId.split('=')[1] in interfaces:
> self.delete(mo.dn)
>
> continue
> @@ -119,6 +120,12 @@ class InterfaceImplementer(Implementer):
>
> if __name__ == "__main__":
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Creates a runtime object per network interface on the
> machine and populates the ipv4Addresses and ipv6Addresses attributes.')
> +
> + parser.parse_args()
> +
> # Create the implementer
> interface_implementer = InterfaceImplementer()
>
> diff --git a/python/samples/ping-pong b/python/samples/ping-pong
> --- a/python/samples/ping-pong
> +++ b/python/samples/ping-pong
> @@ -1,6 +1,7 @@
> #!/usr/bin/env python
>
> import select
> +import argparse
>
> from pyosaf.saAis import eSaAisErrorT
>
> @@ -37,6 +38,13 @@ def pong(dn, arguments):
>
> if __name__ == '__main__':
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Logs and replies to admin operations 0 and 1 towards
> %s,'
> + ' and replies' % dn)
> +
> + parser.parse_args()
> +
> # Create the ping-pong instance if it doesn't exist
> if not immom.get(dn):
>
> diff --git a/python/samples/ping-pong-inheritance-impl
> b/python/samples/ping-pong-inheritance-impl
> --- a/python/samples/ping-pong-inheritance-impl
> +++ b/python/samples/ping-pong-inheritance-impl
> @@ -1,6 +1,7 @@
> #!/usr/bin/env python
>
> import select
> +import argparse
>
> from pyosaf.saAis import eSaAisErrorT
>
> @@ -36,6 +37,13 @@ class PingPong(Implementer):
>
> if __name__ == '__main__':
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Logs and replies to admin operations 0 and 1 towards
> %s,'
> + ' and replies' % dn)
> +
> + parser.parse_args()
> +
> # Create the ping-pong instance if it doesn't exist
> if not immom.get(dn):
>
> diff --git a/python/samples/time-reporter b/python/samples/time-reporter
> --- a/python/samples/time-reporter
> +++ b/python/samples/time-reporter
> @@ -2,6 +2,7 @@
>
> import select
> import datetime
> +import argparse
>
> from pyosaf.utils import immom, immoi
> from pyosaf.utils.immoi.implementer import Implementer
> @@ -45,6 +46,12 @@ def select_loop(implementer):
>
> if __name__ == '__main__':
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Keeps the %s object updated with the current time' % dn)
> +
> + parser.parse_args()
> +
> # Create the implementer instance
> time_implementer = Implementer(name="TimeReporter")
>
> @@ -52,8 +59,7 @@ if __name__ == '__main__':
> (hours, minutes, seconds) = get_time()
>
> # Create the time instance if it doesn't exist
> - if not immoi.get_object_no_runtime(dn):
> -
> + try:
> obj = ImmObject(class_name=class_name, dn=dn)
>
> obj.hours = hours
> @@ -62,6 +68,8 @@ if __name__ == '__main__':
> obj.timeId = "timeId=1"
>
> time_implementer.create(obj)
> + except Exception as err:
> + pass
>
> # Start dispatch and time update loop
> select_loop(time_implementer)
> diff --git a/python/samples/time-reporter-inheritance-impl
> b/python/samples/time-reporter-inheritance-impl
> --- a/python/samples/time-reporter-inheritance-impl
> +++ b/python/samples/time-reporter-inheritance-impl
> @@ -2,6 +2,7 @@
>
> import select
> import datetime
> +import argparse
>
> from pyosaf.utils import immom, immoi
> from pyosaf.utils.immoi.implementer import Implementer
> @@ -28,8 +29,7 @@ class TimeReporter(Implementer):
> # Create the time instance if it doesn't exist
> dn = "timeId=%s" % self.time_id
>
> - if not immoi.get_object_no_runtime(dn):
> -
> + try:
> now = datetime.datetime.now()
>
> obj = ImmObject(class_name=class_name, dn=dn)
> @@ -39,7 +39,9 @@ class TimeReporter(Implementer):
> obj.seconds = now.second
> obj.timeId = "timeId=%" % self.time_id
>
> - time_implementer.create(obj)
> + self.create(obj)
> + except Exception as err:
> + pass
>
> def enter_dispatch_loop(self):
> '''
> @@ -74,6 +76,12 @@ class TimeReporter(Implementer):
>
> if __name__ == '__main__':
>
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Keeps the %s object updated with the current time' % dn)
> +
> + parser.parse_args()
> +
> # Create the implementer instance
> time_implementer = TimeReporter(time_id=1)
>
> diff --git a/python/samples/users b/python/samples/users
> --- a/python/samples/users
> +++ b/python/samples/users
> @@ -6,6 +6,7 @@ from pyosaf.utils.immom.object import Im
> from pyosaf.utils.immoi.implementer import Implementer
>
> import psutil
> +import argparse
>
> class_name='UsersSampleClass'
>
> @@ -13,7 +14,15 @@ def on_attribute_update(*args):
> return list(set(map(lambda x: x.name, psutil.get_users())))
>
> if __name__ == '__main__':
> -
> +
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Creates the usersId=1 object and updates its users '
> + 'attribute with the current list of logged in users when it\' read '
> + 'in IMM.')
> +
> + parser.parse_args()
> +
> users_implementer =
> Implementer(on_runtime_values_get=on_attribute_update,
> name='UsersImplementer')
>
> diff --git a/python/samples/users-inheritance-impl
> b/python/samples/users-inheritance-impl
> --- a/python/samples/users-inheritance-impl
> +++ b/python/samples/users-inheritance-impl
> @@ -6,6 +6,7 @@ from pyosaf.utils.immom.object import Im
> from pyosaf.utils.immoi.implementer import Implementer
>
> import psutil
> +import argparse
>
> class_name='UsersSampleClass'
>
> @@ -18,7 +19,15 @@ class UsersImplementer(Implementer):
> return list(set(map(lambda x: x.name, psutil.get_users())))
>
> if __name__ == '__main__':
> -
> +
> + # Parse command line arguments
> + parser = argparse.ArgumentParser(
> + description='Creates the usersId=1 object and updates its users '
> + 'attribute with the current list of logged in users when it\' read '
> + 'in IMM.')
> +
> + parser.parse_args()
> +
> users_implementer = UsersImplementer()
>
> try:
>
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel