Esempio n. 1
0
    async def _handle_ping_request_message(self, msg, client_addr):
        LOG.trace("Handling PING-REQ (%d): target=%s", msg.seq, msg.node)

        # get a sequence number for the ping
        next_seq = self._probe_seq.increment()

        # start waiting for probe result
        waiter = self._wait_for_probe(next_seq)

        # create PingMessage
        ping = messages.PingMessage(next_seq,
                                    target=msg.node,
                                    sender=self.local_node_name,
                                    sender_addr=messages.InternetAddress(self.local_node_address,
                                                                         self.local_node_port))

        LOG.debug("Sending PING (%d) to %s in response to PING-REQ (%d)", next_seq, msg.node_addr, msg.seq)
        await self._send_udp_message(msg.node_addr.address, msg.node_addr.port, ping)

        # wait for probe result or timeout
        try:
            result = await waiter
        except asyncio.TimeoutError:
            LOG.debug("Timeout waiting for ACK %d", next_seq)
            # TODO: send nack
            # await self._forward_indirect_probe_timeout(msg)
        else:
            await self._forward_indirect_probe_result(msg)
Esempio n. 2
0
    def test_encode_encryption(self):

        key = os.urandom(16)

        orig = messages.PingMessage(1, "test")
        buf = messages.MessageSerializer.encode(orig, encryption=key)
        self.assertEqual(
            orig, messages.MessageSerializer.decode(buf, encryption=[key]))
Esempio n. 3
0
    async def _probe_node(self, target_node: state.Node):
        LOG.debug("Probing node: %s", target_node)

        # get a sequence number for the ping
        next_seq = self._probe_seq.increment()

        # start waiting for probe result
        waiter = self._wait_for_probe(next_seq)

        # send ping message
        ping = messages.PingMessage(next_seq,
                                    target=target_node.name,
                                    sender=self.local_node_name,
                                    sender_addr=messages.InternetAddress(self.local_node_address,
                                                                         self.local_node_port))
        LOG.debug("Sending PING (seq=%d) to %s", ping.seq, target_node.name)
        await self._send_udp_message(target_node.host, target_node.port, ping)

        # wait for probe result or timeout
        result = False
        try:
            result = await waiter
        except asyncio.TimeoutError:
            await self._handle_probe_timeout(target_node)
        else:
            await self._handle_probe_result(target_node, result)

        # if probe was successful no need to send indirect probe
        if result:
            return

        # if probe failed, send indirect probe
        try:
            result = await self._probe_node_indirect(target_node, self.config.probe_indirect_nodes)
        except Exception:
            LOG.exception("Error running indirect probe")
Esempio n. 4
0
    def test_message_equals(self):
        msg1 = messages.PingMessage(1, 'test')
        msg2 = messages.PingMessage(1, 'test')

        self.assertEqual(msg1, msg2)
Esempio n. 5
0
 def test_encode(self):
     orig = messages.PingMessage(1, "test")
     buf = messages.MessageSerializer.encode(orig)
     self.assertEqual(orig, messages.MessageSerializer.decode(buf))
Esempio n. 6
0
    def test_message_hash(self):
        msg1 = messages.PingMessage(1, 'test')
        msg2 = messages.PingMessage(2, 'test')
        msg3 = messages.PingMessage(2, 'test')

        self.assertEqual(len({msg1, msg2, msg3}), 2)