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