def releaseServer(self, serveraddress): ''' REST Endpoint for a client to release the server. Decrements the load count on server ''' if (serveraddress not in self.servers): return json.dumps({ "response": "failure", "message": "No server with address %s found" % (serveraddress) }) if (self.servers[serveraddress] == 0): return json.dumps({ "response": "failure", "message": "No load on %s" % (serveraddress) }) self.mutex.acquire() try: self.servers[serveraddress] -= 1 r = requests.get("http://" + serveraddress + "/unregisterClient") utils.check_response_for_failure(r.text) finally: self.mutex.release() return json.dumps({"response": "success"})
def passElection(self, *args): ''' An API for the first pass in the ring. Every server pushes it's load. :param args: :return: ''' if not self.servers: self.get_info() sz = len(args) ids = [args[x] for x in range(sz / 2)] loads = [int(args[x]) for x in range(sz / 2, sz)] if self.id in ids: # Time to find and elect leader minm = min(loads) indices = [i for i, x in enumerate(loads) if x == minm] subset_ids = [ids[i] for i in indices] leader_addr = min(subset_ids) r = requests.get('http://' + self.disp_addr + '/releaseLeaderElectionLock') utils.check_response_for_failure(r.text) self.coordinatorMessage(leader_addr) else: # Pass on the message ids.append(self.id) loads.append(str(self.get_load())) arg = '/'.join(ids) + '/' + '/'.join([str(load) for load in loads]) r = requests.get('http://' + self.next_server + '/passElection/%s' % (arg)) obj = utils.check_response_for_failure(r.text) return json.dumps({"response": "success"})
def getServer(self): ''' REST endpoint for getting server. Returns the address to server and increments the load count ''' self.mutex.acquire() # Cannot use reader writer locks because following code requires # both reader and writer lock are required. Hence, using threading.RLock. try: minload = sys.maxint minload_server = None for server in self.servers: if minload > self.servers[server]: minload = self.servers[server] minload_server = server assert (minload != sys.maxint and minload_server != None) self.servers[minload_server] += 1 finally: self.mutex.release() if (minload_server == None): return json.dumps({ "response": "failure", "message": "Failed to get server, try again" }) r = requests.get("http://" + minload_server + "/registerClient") utils.check_response_for_failure(r.text) return json.dumps({"response": "success", "server": minload_server})
def releaseServer(self): ''' Release Server. ''' if (self.server_address == ""): print "Server not registered" return r = requests.get(self.dispatcher_address + '/releaseServer/' + self.server_address) utils.check_response_for_failure(r.text) self.server_address = ""
def set_slave_times(self, average_time): ''' Set the time of the slaves. :param average_time: :return: ''' for addr in self.server_addresses: r = requests.get("http://" + addr + "/setClock/" + str(average_time)) utils.check_response_for_failure(r.text) print "All slaves changed with offset", average_time
def newElection(self): ''' Start a new leader. :return: ''' print "newelection next_server", self.next_server r = requests.get('http://' + self.next_server + '/passElection/%s/%d' % (self.id, self.get_load())) obj = utils.check_response_for_failure(r.text)
def get_clock_from_address(self, address): ''' Get signed clock offset from given address ''' assert (self.is_leader()) r = requests.get("http://" + address + "/getClock/%d" % (self.get_current_time_offset())) obj = utils.check_response_for_failure(r.text) return int(obj.clock)
def __raffle_thread_func(self): while self.__raffle_running: time.sleep(config.RAFFLE_TIME) r = requests.get('http://' + self.servers.keys()[0] + '/chooseRaffleWinner/%f' % (random())) obj = utils.check_response_for_failure(r.text) print "Winner of Raffle is", obj.winner for server in self.servers.keys(): r = requests.get('http://' + server + "/clearReqQueue")
def getServer(self): ''' The front-end server,which cacofonix should call. ''' if (self.server_address != ""): return print "Getting server" r = requests.get(self.dispatcher_address + '/getServer') obj = utils.check_response_for_failure(r.text) self.server_address = obj.server print "Server Address obtained", self.server_address
def getServer(self): ''' Query the dispatcher about the front-end server that this client needs to connect with. :return: ''' if (self.server_address != ""): return print "Getting server" r = requests.get(self.dispatcher_address + '/getServer') obj = utils.check_response_for_failure(r.text) self.server_address = "http://" + obj.server print "Server Address obtained", self.server_address
def incrementMedalTally(self, team, medalType, authID=config.AUTH_ID, to_print=True): self.getServer() if team not in utils.teams: raise Exception("Invalid Team Name '%s'" % team) if medalType not in utils.medals: raise Exception("Invalid medal type '%s'" % medalType) r = requests.get("http://" + self.server_address + '/incrementMedalTally/%s/%s/%s' % (team, medalType, authID)) obj = utils.check_response_for_failure(r.text) if (to_print): print "Operation Successful" return obj
def parse_getmedaltally_response(self, response, to_print): """ Parses server's response to the GET API and prints only in debug mode. """ obj = utils.check_response_for_failure(response) if to_print: print "Medals and Timestamps:" for medal in utils.medals: print medal, "= ", getattr( obj.medals, medal), "last updated at", time.ctime( float(getattr(obj.time, medal))) return obj
def perpetual_election(self): ''' Runs on a thread perpetually. Purpose: Start Election. :return: ''' while self.__do_leader_election: # TODO time.sleep(config.ELECTION_SNOOZE) if self.__do_leader_election: if not self.servers: self.get_info() r = requests.get('http://' + self.disp_addr + '/getLeaderElectionLock') obj = utils.check_response_for_failure(r.text) if obj.can_lock: print "start new election ", self.id self.newElection()
def parse_getscore_response(self, response, to_print): """ Parses server's response to the GET API and prints only in debug mode. """ obj = utils.check_response_for_failure(response) if to_print: print "Score:" for team in utils.teams: if hasattr(obj.scores, team): print team, ":", getattr( obj.scores, team), "last updated at", time.ctime( float((getattr(obj.time, team)))) return obj
def setScore(self, eventType, romeScore, gaulScore, authID=config.AUTH_ID, to_print=True): self.getServer() if not romeScore.isdigit(): raise Exception("Rome Score '%s' is not a positive integer" % (romeScore)) if not gaulScore.isdigit(): raise Exception("Gaul Score '%s' is not a positive integer" % (gaulScore)) if eventType not in utils.games: raise Exception("Invalid team name '%s'" % eventType) r = requests.get( "http://" + self.server_address + '/setScore/%s/%s/%s/%s' % (eventType, romeScore, gaulScore, authID)) obj = utils.check_response_for_failure(r.text) if to_print: print "Operation Successful" return obj
def get_all_front_end_servers(self): r = requests.get( 'http://' + self.disp_addr + '/getAllFrontEndServers/') print r.text obj = utils.check_response_for_failure(r.text) return obj.servers
def get_all_servers(self): print "get all servers " + self.disp_addr r = requests.get('http://' + self.disp_addr + '/getAllServers/') obj = utils.check_response_for_failure(r.text) return obj.servers