#!/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")