示例#1
0
        def run(self):
            s = socket(AF_INET, SOCK_STREAM)
            s.connect(('127.0.0.1', TESTING_PORT))
            s = JSONSocket(Socket(s))
            s.write(({
                'request': 'first-login',
                'id_name': self.idname,
                'shards': 1
            }))
            s.settimeout(20)

            while not self._terminating:
                try:
                    rd = s.read()
                except DataNotAvailable:
                    s.write({'shards': 1})
                    continue
                except ChannelClosed:
                    return

                # allocation request readed
                if self.fail:
                    s.write({'response': 'recess', 'gugid': rd['gugid']})
                else:
                    s.write({
                        'response': 'allocated',
                        'gugid': rd['gugid'],
                        'tcp-interface': 'a',
                        'udp-interface': 'b',
                        'tcp-port': 10,
                        'udp-port': 20
                    })
示例#2
0
    def test_two_lshardmgrs_single_request(self):
        """Tests how to server allocates if there's a request and admittant lshardmgr connected,
        and a failing lshardmgr connected.

        This test is not deterministic, if it fails try again.
        """
        self.LShardmgr('admit', fail=False).start()
        self.LShardmgr('faily', fail=True).start()
        sleep(0.01)

        for x in xrange(0, 20):
            s = socket(AF_INET, SOCK_STREAM)
            s.connect(('127.0.0.1', TESTING_PORT))
            s = JSONSocket(Socket(s))

            s.write({
                'request': 'allocate-shard',
                'gugid': 'trololo',
                'bpf_chunk': {
                    'map_name': 'Indianapolis',
                    'players': []
                }
            })

            rsp = s.read()
            self.assertEquals(rsp['response'], 'allocated')
            self.assertEquals(rsp['gugid'], 'trololo')

            s.close()
示例#3
0
    def test_no_lshardmgrs_single_request(self):
        """Tests how to server fails if there's a request and NO lshardmgrs connected"""

        s = socket(AF_INET, SOCK_STREAM)
        s.connect(('127.0.0.1', TESTING_PORT))
        s = JSONSocket(Socket(s))

        s.write({
            'request': 'allocate-shard',
            'gugid': 'trololo',
            'bpf_chunk': {
                'map_name': 'Indianapolis',
                'players': []
            }
        })

        rsp = s.read()
        self.assertEquals(rsp['response'], 'recess')
        self.assertEquals(rsp['gugid'], 'trololo')
示例#4
0
    def test_single_lshardmgrs_single_request(self):
        """Tests how to server allocates if there's a request and admittant lshardmgr connected"""
        self.LShardmgr('admit', fail=False).start()
        sleep(0.01)

        s = socket(AF_INET, SOCK_STREAM)
        s.connect(('127.0.0.1', TESTING_PORT))
        s = JSONSocket(Socket(s))

        s.write({
            'request': 'allocate-shard',
            'gugid': 'trololo',
            'bpf_chunk': {
                'map_name': 'Indianapolis',
                'players': []
            }
        })

        rsp = s.read()
        self.assertEquals(rsp['response'], 'allocated')
        self.assertEquals(rsp['gugid'], 'trololo')
示例#5
0
    def run(self):
        """Returns a tuple (IP, address) on success. Returns a string with
        error code on failure. Returns with False on silent errors"""

        print 'TRStartMatch(%s)' % self.alpha

        if self.alpha.invalid:
            return False  # cannot make a match - it's been invalidated
        self.pdb.alphas.remove(
            self.alpha)  # if alpha is valid then it's in the tables

        # Has everybody locked in? If no we need to forcibly lock them in
        if not self.alpha.has_everybody_locked_in():
            for notlocked in self.alpha.get_those_who_did_not_lock():
                # get applicable characters for player
                heroes = self.pdb.pdbhelper.get_available_heroes(notlocked)
                if len(heroes) == 0:  # NO HEROES FOR PLAYER ?!?!?!?!?!?
                    self._rollback()
                    return '%s has no heroes to play with'

                if TRHeroPick(self.pdb, notlocked,
                              choice(heroes)).start(slave=True) != None:
                    self._rollback()
                    return 'picking hero for %s failed'

        # ============= PRECONDITIONS SATISFIED. EVERYBODY ONLINE AND WITH A HERO PICKED

        # Sign off all players as entering PS_GAMMA
        for pid in self.alpha.team1 + self.alpha.team2:
            # sign off players as playing -> GAMMA
            pir = self.pdb.ensure(pid)
            pir.status = PS_GAMMA
            pir.alpha = None
            pir.queue = None

        # Ok, so let's examine the match...
        # Here we begin constructing tables
        players = []
        for pid in self.alpha.team1 + self.alpha.team2:
            team_no = 0 if pid in self.alpha.team1 else 1
            pd = {
                'login': self.pdb.ensure(pid).login,
                'password': self.pdb.pdbhelper.get_password_for_pid(pid),
                'character': self.alpha.whom_picked_pid(pid),
                'team': team_no
            }
            players.append(pd)

        bpf = {
            'players': players,
            'map_name': 'Town',
        }

        # Compute the GUGID
        gugid = '.'.join(
            map(str, self.alpha.team1) + map(str, self.alpha.team2))

        # ALLOCATE THE MATCH!!!
        s = socket(AF_INET, SOCK_STREAM)
        try:
            s.connect(self.pdb.cshardmgr_interface)
        except SocketError:
            self._rollback()
            return 'internal error: no cshard uplink'

        s = JSONSocket(Socket(s))
        s.settimeout(20)

        try:
            s.write({
                'request': 'allocate-shard',
                'gugid': gugid,
                'bpf_chunk': bpf
            })

            rsp = s.read()
        except (FatalException, NonfatalException):
            self._rollback()
            return 'internal error: cshard replica failure'

        if 'response' not in rsp:
            self._rollback()
            return 'internal error: malformed cshard replica'

        if rsp['response'] == 'recess':
            self._rollback()
            return 'shard overload'

        conntriple = (rsp['tcp-interface'], rsp['tcp-port'], rsp['udp-port'])

        # create BetaGamma object
        team1 = dict([(pid, self.alpha.whom_picked_pid(pid))
                      for pid in self.alpha.team1])
        team2 = dict([(pid, self.alpha.whom_picked_pid(pid))
                      for pid in self.alpha.team2])

        bg = BetaGamma(team1, team2, gugid, self.alpha.qname)

        self.pdb.betagammas.append(bg)

        # Set the target server for players
        for pid in self.alpha.team1 + self.alpha.team2:
            self.pdb.ensure(pid).conn_triple = conntriple
            self.pdb.ensure(pid).betagamma = bg

        return conntriple