Beispiel #1
0
    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"})
Beispiel #2
0
    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"})
Beispiel #3
0
    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
Beispiel #6
0
 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)
Beispiel #8
0
    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
Beispiel #10
0
    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
Beispiel #12
0
    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
Beispiel #13
0
 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()
Beispiel #14
0
    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