python/pyosaf/utils/clm/__init__.py |  43 ++++++++++++++++++++++++++++++++++++-
 python/samples/clm-listener         |  39 ++++++++++++++++++++++++++++++---
 2 files changed, 77 insertions(+), 5 deletions(-)


Extend the clm-listener sample application with --snapshot and --listen 
arguments to show how to get the current members and how to track membership. 
Also extend the clm utils to support this. Verify like this:

./clm-listener --snapshot #Lists the current nodes

./clm-listener --listen   #Blocks and prints any changes to the cluster 
membership list

diff --git a/python/pyosaf/utils/clm/__init__.py 
b/python/pyosaf/utils/clm/__init__.py
--- a/python/pyosaf/utils/clm/__init__.py
+++ b/python/pyosaf/utils/clm/__init__.py
@@ -81,6 +81,23 @@ def track_callback(c_notification_buffer
 def node_get_callback(*args):
     pass
 
+class ClusterNode:
+
+    def __init__(self, node_id, node_address, node_name, execution_environment,
+                 member,
+                 boot_timestamp,
+                 initial_view_number):
+
+        self.node_id               = node_id
+        self.node_address_value    = node_address.value
+        self.node_address_family   = node_address.family
+        self.node_name             = node_name.value
+        self.execution_environment = execution_environment
+        self.member                = member
+        self.boot_timestamp        = boot_timestamp
+        self.initial_view_number   = initial_view_number
+
+
 def initialize(track_fn=None):
 
     global track_function
@@ -100,4 +117,28 @@ def initialize(track_fn=None):
     saClmInitialize_4(HANDLE, callbacks, version)
 
 def track(flags=saAis.saAis.SA_TRACK_CHANGES_ONLY):
-    saClm.saClmClusterTrackCallbackT_4(HANDLE, flags, None)
+    saClmClusterTrack_4(HANDLE, flags, None)
+
+def get_members():
+    notification_buffer = saClm.SaClmClusterNotificationBufferT_4()
+
+    saClmClusterTrack_4(HANDLE, saAis.saAis.SA_TRACK_CURRENT, 
+                        notification_buffer)
+
+    cluster_nodes = []
+
+    for i in range(notification_buffer.numberOfItems):
+        notification = notification_buffer.notification[i]
+        clusterNode  = notification.clusterNode
+
+        node = ClusterNode(node_id=clusterNode.nodeId,
+                           node_address=clusterNode.nodeAddress,
+                           node_name=clusterNode.nodeName,
+                           
execution_environment=clusterNode.executionEnvironment,
+                           member=clusterNode.member,
+                           boot_timestamp=clusterNode.bootTimestamp,
+                           initial_view_number=clusterNode.initialViewNumber)
+
+    cluster_nodes.append(node)
+
+    return cluster_nodes
diff --git a/python/samples/clm-listener b/python/samples/clm-listener
old mode 100644
new mode 100755
--- a/python/samples/clm-listener
+++ b/python/samples/clm-listener
@@ -1,5 +1,8 @@
 #!/usr/bin/env python
 
+import argparse
+import sys
+
 from subprocess import Popen, PIPE
 
 from pyosaf import saAis, saClm, saImm
@@ -9,6 +12,15 @@ from pyosaf.utils import immoi, clm
 def dn_to_vm_name(vm_dn):
     return vm_dn.split(',')[0].split('=')[1]
 
+def print_members(members):
+
+    for node in members:
+        if node.member:
+            vm_name    = dn_to_vm_name(node.node_name)
+            ip_address = node.node_address_value
+
+            print "  - %s  %s" % (vm_name, ip_address)
+
 def membership_change(all, added, removed, changed):
     print "Info: Received cluster membership update"
 
@@ -18,21 +30,40 @@ def membership_change(all, added, remove
         print "INFO: % joined the cluster" % vm_name
 
     for vm_dn in removed:
-        vm_name = dn_to_vm_name(vm_dn):
+        vm_name = dn_to_vm_name(vm_dn)
 
         print "INFO: %s left the cluster" % vm_name
 
 
 if __name__ == "__main__":
 
+    # Parse command line arguments
+    parser = argparse.ArgumentParser(
+        description='Listens to changes to objects of the given classes')
+
+    group = parser.add_mutually_exclusive_group(required=True)
+
+    group.add_argument('--snapshot', action="store_true",
+                        help='shows a snapshot of the current membership list')
+    group.add_argument('--listen', action="store_true", help='listens to 
changes to all classes')
+
+    args = parser.parse_args()
+
     # Initialize the CLM service
     clm.initialize(track_fn=membership_change)
 
+    if args.snapshot:
+        print "-" * 10 + " Members " + "-"*10
+
+        members = clm.get_members()
+
+        print_members(members)
+
+        sys.exit(0)
+
     # Start tracking
     clm.track()
 
-    print "INFO: Initialized CLM and started tracking"
-
     # Do dispatch forever
     while True:
-        clm.saClmDispatch(handle, saAis.eSaDispatchFlagsT.SA_DISPATCH_BLOCKING)
+        clm.saClmDispatch(clm.HANDLE, 
saAis.eSaDispatchFlagsT.SA_DISPATCH_BLOCKING)

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

Reply via email to