Good comment, thanks.

/ Johan

-----Original Message-----
From: Srikanth Revanuru [mailto:[email protected]] 
Sent: den 11 augusti 2015 08:07
To: Johan Mårtensson O; Hans Nordebäck; [email protected]; Hung Nguyen D
Cc: [email protected]
Subject: Re: [PATCH 1 of 1] pyosaf: Add decorated Python bindings for CLM 
together with basic sample application [#1441]

Johan,

  Quick comment : Changes pertaining to packaging the files as part of rpm ( 
.i.e adding Makefile.am ) are missing.

/ Srikanth

On 08/10/2015 04:56 PM, Johan Mårtensson wrote:
>   python/pyosaf/utils/clm/__init__.py |  103 
> ++++++++++++++++++++++++++++++++++++
>   python/samples/clm-listener         |   38 +++++++++++++
>   2 files changed, 141 insertions(+), 0 deletions(-)
>
>
> Add decorated functions for the raw saClm* Python functions like the IMM 
> bindings. The decorated functions are in pyosaf/utils/clm.
>
> Also add a basic sample application that tracks when nodes join or leaves the 
> cluster.
>
> diff --git a/python/pyosaf/utils/clm/__init__.py 
> b/python/pyosaf/utils/clm/__init__.py
> new file mode 100644
> --- /dev/null
> +++ b/python/pyosaf/utils/clm/__init__.py
> @@ -0,0 +1,103 @@
> +#####################################################################
> +#######
> +#
> +# (C) Copyright 2015 The OpenSAF Foundation # # This program is 
> +distributed in the hope that it will be useful, but # WITHOUT ANY 
> +WARRANTY; without even the implied warranty of MERCHANTABILITY # or 
> +FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed 
> +# under the GNU Lesser General Public License Version 2.1, February 1999.
> +# The complete license can be accessed from the following location:
> +# http://opensource.org/licenses/lgpl-license.php
> +# See the Copying file included with the OpenSAF distribution for 
> +full # licensing terms.
> +#
> +# Author(s): Ericsson
> +#
> +#####################################################################
> +#######
> +'''
> +    CLM common utilitites
> +'''
> +
> +from pyosaf import saClm, saAis
> +
> +from pyosaf.utils import 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)
> +saClmSelectionObjectGet        = decorate(saClm.saClmSelectionObjectGet)
> +saClmDispatch                  = decorate(saClm.saClmDispatch)
> +saClmFinalize                  = decorate(saClm.saClmFinalize)
> +saClmClusterTrack              = decorate(saClm.saClmClusterTrack)
> +saClmClusterNodeGet            = decorate(saClm.saClmClusterNodeGet)
> +saClmClusterNotificationFree   = decorate(saClm.saClmClusterNotificationFree)
> +saClmClusterTrack_4            = decorate(saClm.saClmClusterTrack_4)
> +saClmClusterTrackStop          = decorate(saClm.saClmClusterTrackStop)
> +saClmClusterNotificationFree_4 = 
> decorate(saClm.saClmClusterNotificationFree_4)
> +saClmClusterNodeGet_4          = decorate(saClm.saClmClusterNodeGet_4)
> +saClmClusterNodeGetAsync       = decorate(saClm.saClmClusterNodeGetAsync)
> +saClmResponse_4                = decorate(saClm.saClmResponse_4)
> +
> +# Create the handle
> +HANDLE  = saClm.SaClmHandleT()
> +
> +track_function = None
> +
> +def track_callback(c_notification_buffer, c_number_of_members,
> +                   c_invocation_id, c_root_cause_entity,
> +                   c_correlation_ids, c_step,
> +                   c_time_supervision, c_error):
> +
> +    if track_function:
> +        added   = []
> +        removed = []
> +        changed = []
> +        all     = []
> +
> +        step = c_step
> +
> +        if step == saClm.eSaClmChangeStepT.SA_CLM_CHANGE_COMPLETED:
> +            notification_buffer = c_notification_buffer.contents
> +
> +            i = 0
> +            for notification in notification_buffer.notification:
> +
> +                if i == notification_buffer.numberOfItems:
> +                    break
> +                else:
> +                    i = i + 1
> +
> +                node_name = notification.clusterNode.nodeName
> +
> +                if notification.clusterChange == 
> saClm.eSaClmClusterChangesT.SA_CLM_NODE_JOINED:
> +                    added.append(node_name)
> +
> +                elif notification.clusterChange == 
> saClm.eSaClmClusterChangesT.SA_CLM_NODE_LEFT:
> +                    removed.append(node_name)
> +
> +        track_function(all, added, removed, changed)
> +
> +def node_get_callback(*args):
> +    pass
> +
> +def initialize(track_fn=None):
> +
> +    global track_function
> +
> +    track_function = track_fn
> +
> +    # Set up callbacks for the member tracking
> +    callbacks = saClm.SaClmCallbacksT_4()
> +
> +    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)
> +
> +def track(flags=saAis.saAis.SA_TRACK_CHANGES_ONLY):
> +    saClm.saClmClusterTrackCallbackT_4(HANDLE, flags, None)
> diff --git a/python/samples/clm-listener b/python/samples/clm-listener 
> new file mode 100644
> --- /dev/null
> +++ b/python/samples/clm-listener
> @@ -0,0 +1,38 @@
> +#!/usr/bin/env python
> +
> +from subprocess import Popen, PIPE
> +
> +from pyosaf import saAis, saClm, saImm
> +
> +from pyosaf.utils import immoi, clm
> +
> +def dn_to_vm_name(vm_dn):
> +    return vm_dn.split(',')[0].split('=')[1]
> +
> +def membership_change(all, added, removed, changed):
> +    print "Info: Received cluster membership update"
> +
> +    for vm_dn in added:
> +        vm_name = dn_to_vm_name(vm_dn)
> +
> +        print "INFO: % joined the cluster" % vm_name
> +
> +    for vm_dn in removed:
> +        vm_name = dn_to_vm_name(vm_dn):
> +
> +        print "INFO: %s left the cluster" % vm_name
> +
> +
> +if __name__ == "__main__":
> +
> +    # Initialize the CLM service
> +    clm.initialize(track_fn=membership_change)
> +
> +    # Start tracking
> +    clm.track()
> +
> +    print "INFO: Initialized CLM and started tracking"
> +
> +    # Do dispatch forever
> +    while True:
> +        clm.saClmDispatch(handle, 
> + saAis.eSaDispatchFlagsT.SA_DISPATCH_BLOCKING)


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to