#!/usr/bin/python # # Copyright (c) 2016 NEC Corporation and others # All rights reserved. # # This program and the accompanying materials are made available under the # terms of the Eclipse Public License v1.0 which accompanies this # distribution, and is available at http://www.eclipse.org/legal/epl-v10.html # import requests import json import sys import re # response code to check the rest calls RESP_GET_SUCCESS = 200 RESP_NOT_FOUND = 404 con_header = {'Accept': 'application/json', 'content-type': 'application/json'} authentication = ('admin', 'admin') def validate_cluster(ipaddress): """ method to check the cluster status Args: ipaddress(str): ip address of the ODL controller """ url = "http://" + ipaddress + ":8181/jolokia/read/akka:type=Cluster" try: resp = requests.get(url, headers=con_header, auth=authentication) except requests.exceptions.RequestException: print ("controller is unreachable") sys.exit(1) if resp.status_code == RESP_NOT_FOUND: print ("jolokia not installed, resp code", resp.status_code) print ("Problem with accessing jolokia") sys.exit(1) elif resp.status_code != RESP_GET_SUCCESS: print ("error in getting response, resp code", resp.status_code) sys.exit(1) data = json.loads(resp.content) cluster_status = data['value']['ClusterStatus'] status = json.loads(cluster_status) members = status['members'] member_list = [] entity_owner_list = [] for member in members: # spliting the ip address of the node from json object # sample json data # "akka.tcp://opendaylight-cluster-data@10.106.138.137:2550" ip = re.search('@(.+?):', member['address']).group(1) node_status = ip + "-" + member['status'] member_list.append(node_status) url1 = "http://" + ip +\ ":8181/jolokia/read/org.opendaylight.controller:"\ "Category=ShardManager,name=shard-manager-operational,"\ "type=DistributedOperationalDatastore" resp1 = requests.get(url1, headers=con_header, auth=authentication) if resp1.status_code != RESP_GET_SUCCESS: print ("error in getting response for the node", ip) print ("response content", resp1.content) continue data2 = json.loads(resp1.content) member_role = data2['value']['MemberName'] entity_owner_list.append(ip + ":" + member_role) leader = data['value']['Leader'] leaderNode = leader[leader.index('@') + 1:leader.rindex(':')] for leader_node in member_list: address = leader_node.split('-') if address[0] == leaderNode: print ("=================== Leader Node ======================\n") print (leader_node) member_list.remove(leader_node) print ("=================== Follower Node ====================\n") print (member_list) list_entity_owners(ipaddress, entity_owner_list) def list_entity_owners(ipaddress, entity_owner_list): """ method to list the entity owners Args: ipaddress(str): ip address of the ODL controller entity_owner_list(list): list of member role in cluster """ entity = ":8181/restconf/operational/entity-owners:entity-owners" url = "http://" + ipaddress + entity resp = requests.get(url, headers=con_header, auth=authentication) if resp.status_code != RESP_GET_SUCCESS: print ("controller is down, resp_code", resp.status_code) print ("response content", resp.content) sys.exit(1) data = json.loads(resp.content) ovsdb = data['entity-owners']['entity-type'] print ("\n\n=================== Entity Details ===================\n") for e_type in ovsdb: entities = e_type['entity'] for entity in entities: id = entity['id'] if len(entity['owner']) > 0: print ("NODE ID", str(id[id.rindex('=') + 2:len(id) - 2])) print ("OWNER", str(entity['owner'])) for owner in entity_owner_list: owner_role = owner.split(':') if entity['owner'] == owner_role[1]: print ("IP Address", str(owner_role[0])) print ("\n") # Main Block if __name__ == '__main__': print ('*****Cluster Status******') ipaddress = raw_input("Please enter ipaddress to find Leader Node : ") validate_cluster(ipaddress) else: print ("Cluster checker loaded as Module")