Enhancements to 3-node cluster tests
[integration/test.git] / test / csit / libraries / ClusterStateLibrary.py
1 __author__ = "Basheeruddin Ahmed"
2 __copyright__ = "Copyright(c) 2014, Cisco Systems, Inc."
3 __license__ = "New-style BSD"
4 __email__ = "syedbahm@cisco.com"
5
6 import SettingsLibrary
7 from time import sleep
8 import UtilLibrary
9 import json
10 import sys
11
12 #
13 # Given a shardname (e.g. shard-inventory-config), number of shards and bunch of ips
14 # determines what role each ip has in an Akka (Raft based) cluster
15 # result would look like
16 # {'10.194.126.118':'Leader', '10.194.126.118':'Follower', '10.194.126.117': None}
17 #
18
19 def getClusterRoles(shardName,numOfShards=3,numOfTries=3,sleepBetweenRetriesInSecs=1,port=8181,*ips):
20     dict={}
21     for ip in ips:
22       i=1
23       dict[ip]=None
24       bFollower = 0
25       while i <= numOfShards:
26         shardMemberName = "member-"+str(i)+"-"+shardName;
27         j=1
28
29         while j <= numOfTries:
30             print "Try number "+str(j)
31             try:
32                 print "finding if"+ ip +"is leader for shardName ="+shardMemberName
33                 url = SettingsLibrary.getJolokiaURL(ip,str(port),str(i),shardName)
34                 resp = UtilLibrary.get(url)
35                 print resp
36                 if(resp.status_code != 200):
37                     sleep(sleepBetweenRetriesInSecs)
38                     continue
39                 data = json.loads(resp.text)
40                 if('value' in data):
41                     dataValue = data['value']
42                     if(dataValue['RaftState']=='Follower'):
43                         dict[ip]='Follower'
44                         break;
45                     elif(dataValue['RaftState']=='Leader'):
46                         dict[ip]='Leader'
47             except:
48                 e = sys.exc_info()[0]
49                 print "Try"+str(j)+":An error occurred when finding leader on"+ip+" for shardName:" +shardMemberName
50                 print e
51                 sleep(sleepBetweenRetriesInSecs)
52                 continue
53             finally:
54                 j=j+1
55
56         if(dict[ip]!=None):
57             break;
58         i=i+1
59
60     return dict
61
62 #
63 #Given a shardname (e.g. shard-inventory-config), number of shards and an ip
64 #determines if its a leader
65 #
66 #
67 def isLeader(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress):
68     ip = getClusterRoles(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress)
69     print ip
70     if( ip[ipAddress] == 'Leader'):
71          return True
72
73     return False
74
75 #
76 # Returns the leader of the shard given a set of IPs
77 # Or None
78 #
79 def getLeader(shardName,numOfShards=3,numOfTries=3,sleepBetweenRetriesInSecs=1,port=8181,*ips):
80     for i in range(3): # Try 3 times to find a leader
81         dict = getClusterRoles(shardName,numOfShards,numOfTries,sleepBetweenRetriesInSecs,port,*ips)
82         for ip in dict.keys():
83             if(dict[ip]=='Leader'):
84                 return ip
85
86     return None
87
88 #
89 # Returns the follower list of a shard given a set of IPs
90 # Or []
91 #
92 def getFollowers (shardName,numOfShards=3,numOfTries=3,sleepBetweenRetriesInSecs=1,port=8181,*ips):
93     dict = getClusterRoles(shardName,numOfShards,numOfTries,sleepBetweenRetriesInSecs,port,*ips)
94     result = []
95
96     for ip in dict.keys():
97         if(dict[ip]=='Follower'):
98             result.append(ip)
99
100     return result
101 #
102 #Given a shardname (e.g. shard-inventory-config), number of shards and an ip
103 #determines if its a leader
104 #
105 #
106 def isFollower(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress):
107     ip = getClusterRoles(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress)
108     print ip
109     if( ip[ipAddress] == 'Follower'):
110         return True
111
112     return False
113
114
115 def testGetClusterRoles():
116     dict = getClusterRoles("shard-inventory-config",3,1,1,8181,"10.194.126.116","10.194.126.117","10.194.126.118")
117     print dict
118
119     for ip in dict.keys():
120         if(isLeader("shard-inventory-config",3,1,1,8181,ip)):
121             print ( ip + " is Leader")
122         elif (isFollower("shard-inventory-config",3,1,1,8181,ip)):
123             print (ip + " is follower")
124         else:
125             print (ip + " seems to have value "+ str(dict[ip]))
126
127 def testGetLeader ():
128   leader =  getLeader("shard-inventory-config",3,1,1,8181,"10.194.126.116","10.194.126.117","10.194.126.118")
129   print leader
130   return leader
131
132 def testGetFollowers():
133    followers = getFollowers("shard-inventory-config",3,1,1,8181,"10.194.126.116","10.194.126.117","10.194.126.118")
134    print followers
135    return followers
136
137 #testGetClusterRoles()
138 #testGetLeader()
139 #testGetFollowers()
140
141
142
143
144
145
146
147
148
149