1 __author__ = "Basheeruddin Ahmed"
2 __copyright__ = "Copyright(c) 2014, Cisco Systems, Inc."
3 __license__ = "New-style BSD"
4 __email__ = "syedbahm@cisco.com"
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}
19 def getClusterRoles(shardName,numOfShards=3,numOfTries=3,sleepBetweenRetriesInSecs=1,port=8181,*ips):
25 while i <= numOfShards:
26 shardMemberName = "member-"+str(i)+"-"+shardName;
29 while j <= numOfTries:
30 print "Try number "+str(j)
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)
36 if(resp.status_code != 200):
38 data = json.loads(resp.text)
40 dataValue = data['value']
41 if(dataValue['RaftState']=='Follower'):
44 elif(dataValue['RaftState']=='Leader'):
48 print "Try"+str(j)+":An error occurred when finding leader on"+ip+" for shardName:" +shardMemberName
50 sleep(sleepBetweenRetriesInSecs)
62 #Given a shardname (e.g. shard-inventory-config), number of shards and an ip
63 #determines if its a leader
66 def isLeader(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress):
67 ip = getClusterRoles(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress)
69 if( ip[ipAddress] == 'Leader'):
75 # Returns the leader of the shard given a set of IPs
78 def getLeader(shardName,numOfShards=3,numOfTries=3,sleepBetweenRetriesInSecs=1,port=8181,*ips):
79 dict = getClusterRoles(shardName,numOfShards,numOfTries,sleepBetweenRetriesInSecs,port,*ips)
80 for ip in dict.keys():
81 if(dict[ip]=='Leader'):
87 # Returns the follower list of a shard given a set of IPs
90 def getFollowers (shardName,numOfShards=3,numOfTries=3,sleepBetweenRetriesInSecs=1,port=8181,*ips):
91 dict = getClusterRoles(shardName,numOfShards,numOfTries,sleepBetweenRetriesInSecs,port,*ips)
94 for ip in dict.keys():
95 if(dict[ip]=='Follower'):
100 #Given a shardname (e.g. shard-inventory-config), number of shards and an ip
101 #determines if its a leader
104 def isFollower(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress):
105 ip = getClusterRoles(shardName,numOfShards,numOfRetries,sleepFor,port,ipAddress)
107 if( ip[ipAddress] == 'Follower'):
113 def testGetClusterRoles():
114 dict = getClusterRoles("shard-inventory-config",3,1,1,8181,"10.194.126.116","10.194.126.117","10.194.126.118")
117 for ip in dict.keys():
118 if(isLeader("shard-inventory-config",3,1,1,8181,ip)):
119 print ( ip + " is Leader")
120 elif (isFollower("shard-inventory-config",3,1,1,8181,ip)):
121 print (ip + " is follower")
123 print (ip + " seems to have value "+ str(dict[ip]))
125 def testGetLeader ():
126 leader = getLeader("shard-inventory-config",3,1,1,8181,"10.194.126.116","10.194.126.117","10.194.126.118")
130 def testGetFollowers():
131 followers = getFollowers("shard-inventory-config",3,1,1,8181,"10.194.126.116","10.194.126.117","10.194.126.118")
135 #testGetClusterRoles()