07f084635502c4ca4486a6fe07d4a6f5b7a1f447
[integration/test.git] / tools / clustering / cluster-tools / cluster_check.py
1 #!/usr/bin/python
2
3 #
4 # Copyright (c) 2016 NEC Corporation and others
5 # All rights reserved.
6 #
7 # This program and the accompanying materials are made available under the
8 # terms of the Eclipse Public License v1.0 which accompanies this
9 # distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
10 #
11
12 import requests
13 import json
14 import sys
15 import re
16
17
18 # response code to check the rest calls
19 RESP_GET_SUCCESS = 200
20 RESP_NOT_FOUND = 404
21
22
23 con_header = {"Accept": "application/json", "content-type": "application/json"}
24 authentication = ("admin", "admin")
25
26
27 def validate_cluster(ipaddress):
28     """ method to check the cluster status
29     Args:
30         ipaddress(str): ip address of the ODL controller
31     """
32     url = "http://" + ipaddress + ":8181/jolokia/read/akka:type=Cluster"
33     try:
34         resp = requests.get(url, headers=con_header, auth=authentication)
35     except requests.exceptions.RequestException:
36         print("controller is unreachable")
37         sys.exit(1)
38
39     if resp.status_code == RESP_NOT_FOUND:
40         print("jolokia not installed, resp code", resp.status_code)
41         print("Problem with accessing jolokia")
42         sys.exit(1)
43
44     elif resp.status_code != RESP_GET_SUCCESS:
45         print("error in getting response, resp code", resp.status_code)
46         sys.exit(1)
47
48     data = json.loads(resp.content)
49     cluster_status = data["value"]["ClusterStatus"]
50     status = json.loads(cluster_status)
51     members = status["members"]
52     member_list = []
53     entity_owner_list = []
54
55     for member in members:
56         # spliting the ip address of the node from json object
57         # sample json data
58         # "akka.tcp://opendaylight-cluster-data@10.106.138.137:2550"
59         ip = re.search("@(.+?):", member["address"]).group(1)
60         node_status = ip + "-" + member["status"]
61         member_list.append(node_status)
62         url1 = (
63             "http://" + ip + ":8181/jolokia/read/org.opendaylight.controller:"
64             "Category=ShardManager,name=shard-manager-operational,"
65             "type=DistributedOperationalDatastore"
66         )
67         resp1 = requests.get(url1, headers=con_header, auth=authentication)
68         if resp1.status_code != RESP_GET_SUCCESS:
69             print("error in getting response for the node", ip)
70             print("response content", resp1.content)
71             continue
72         data2 = json.loads(resp1.content)
73         member_role = data2["value"]["MemberName"]
74         entity_owner_list.append(ip + ":" + member_role)
75     leader = data["value"]["Leader"]
76
77     leaderNode = leader[leader.index("@") + 1 : leader.rindex(":")]
78     for leader_node in member_list:
79         address = leader_node.split("-")
80         if address[0] == leaderNode:
81             print("=================== Leader Node ======================\n")
82             print(leader_node)
83             member_list.remove(leader_node)
84             print("=================== Follower Node ====================\n")
85             print(member_list)
86     list_entity_owners(ipaddress, entity_owner_list)
87
88
89 def list_entity_owners(ipaddress, entity_owner_list):
90     """ method to list the entity owners
91     Args:
92         ipaddress(str): ip address of the ODL controller
93         entity_owner_list(list): list of member role in cluster
94     """
95     entity = ":8181/restconf/operational/entity-owners:entity-owners"
96     url = "http://" + ipaddress + entity
97     resp = requests.get(url, headers=con_header, auth=authentication)
98     if resp.status_code != RESP_GET_SUCCESS:
99         print("controller is down, resp_code", resp.status_code)
100         print("response content", resp.content)
101         sys.exit(1)
102     data = json.loads(resp.content)
103     ovsdb = data["entity-owners"]["entity-type"]
104     print("\n\n=================== Entity Details ===================\n")
105     for e_type in ovsdb:
106         entities = e_type["entity"]
107         for entity in entities:
108             id = entity["id"]
109             if len(entity["owner"]) > 0:
110                 print("NODE ID", str(id[id.rindex("=") + 2 : len(id) - 2]))
111                 print("OWNER", str(entity["owner"]))
112             for owner in entity_owner_list:
113                 owner_role = owner.split(":")
114                 if entity["owner"] == owner_role[1]:
115                     print("IP Address", str(owner_role[0]))
116                     print("\n")
117
118
119 # Main Block
120 if __name__ == "__main__":
121     print("*****Cluster Status******")
122     ipaddress = raw_input("Please enter ipaddress to find Leader Node : ")
123     validate_cluster(ipaddress)
124
125 else:
126     print("Cluster checker loaded as Module")