Example #1
0
 def _send_command(self, s: ClientObjectSocket):
     s.send_object(
         Message(
             self.id,
             self.current_server_id,
             -1,
             ClientRequest(self.id, self.current_cmd),
         ))
Example #2
0
def test_send_object_across():
    port = random.randint(20000, 30000)
    server = ClientObjectSocket.get_cosserver(port)
    client = ClientObjectSocket.get_cosclient(port)

    client.send_object("hello")
    client.send_object("hello2")
    (sclient, _) = server.accept()
    assert sclient.recv_object() == "hello"
    assert sclient.recv_object() == "hello2"
Example #3
0
 def __init__(self, port, id, answers, sleeps):
     self.id = id
     self.socket = ClientObjectSocket.get_cosserver(port)
     self.running = True
     self.answers = answers
     self.sleeps = sleeps
     self.answer_idx = 0
Example #4
0
    def startReceiving(self):
        """Start the server socket and listening on it.

        On every incoming connection, retrieve all objects from the connection.  These
        objects are put in the recvQueue.
        """
        self.logger.info(f"Start receiving on {self.id}")
        server = ClientObjectSocket.get_cosserver(self.config[self.id]["port"])

        def listen_on_connection(s):
            # if the listensocket closes or has error, just drop it
            try:
                while self._isRunning("listen_on_connection"):
                    try:
                        received_object = s.recv_object()
                        # store socket to client to be able to reply
                        if isinstance(received_object.payload, ClientRequest):
                            self.clientsockets[received_object.sender_id] = s
                        self.recvQueue.put(received_object, block=False)
                    except socket.timeout:
                        continue  # expected timeout; needed to check if recvRunning is still true
                    except queue.Full:
                        self.logger.debug(
                            f"RaftServer({self.id}): recvQueue is full dropping message {received_object}."
                        )
                    self.logger.debug(
                        f"Server {self.id} received object {received_object}")
            except COSConnectionClosed as e:
                s.close()
                self.logger.debug("listening socket closed")
            except Exception as e:
                self.logger.debug(
                    f"Server {self.id}: Unexpected exception in listedn_on_connection_fn: {e}."
                )
                raise

        def listen_for_connections():
            while self._isRunning("listen_for_connections"):
                try:
                    (client, addr) = server.accept()
                    self.logger.debug("Connection from %s", addr)
                    threading.Thread(
                        target=listen_on_connection,
                        args=(client, ),
                        name=f"RaftServer({self.id}): listen_on_connection",
                    ).start()
                except socket.timeout:
                    continue  # expected timeout; needed to check if sendRunning is still true
                except:
                    self.logger.debug(
                        "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
                    )

        self.listening_thread = threading.Thread(
            target=listen_for_connections,
            name=f"RaftServer({self.id}): listen_for_connections.",
        )
        self.listening_thread.start()
        self.logger.info("Started server thread for server %d", self.id)
Example #5
0
def client(config, message, to_server):
    with open(config) as f:
        config = YAML().load(f)
    if not to_server in config.keys():
        print("You are trying to send to a server that does not exit.")
        sys.exit(1)
    socket = ClientObjectSocket.get_cosclient(config[to_server]["port"])
    socket.send_object(Message(message, 666, to_server))
Example #6
0
def test_to_and_from_bytes():
    x = 9
    assert x == ClientObjectSocket.object_from_bytes(
        ClientObjectSocket.object_to_bytes(x)
    )

    h = Hello("howdy")
    h_new = ClientObjectSocket.object_from_bytes(ClientObjectSocket.object_to_bytes(h))
    assert h == h_new

    with pytest.raises(COSocketDecodeError):
        ClientObjectSocket.object_from_bytes(ClientObjectSocket.object_to_bytes(h)[:30])
Example #7
0
def test_send_object():
    mocksock = Mock()
    bs = ClientObjectSocket.object_to_bytes(Hello("howdy"))

    mocksock.send.side_effect = [len(bs)]
    cos = ClientObjectSocket(mocksock)
    cos.send_object(Hello("howdy"))
    assert mocksock.send.call_count == 1
    assert mocksock.send.call_args == call(bs)

    mocksock.send.reset_mock()
    mocksock.send.side_effect = [25, len(bs) - 25]
    cos.send_object(Hello("howdy"))
    assert mocksock.send.call_count == 2
    assert mocksock.send.call_args_list == [call(bs), call(bs[25:])]
Example #8
0
def test_recv_object():
    mocksock = Mock()
    bs = ClientObjectSocket.object_to_bytes(Hello("howdy"))

    # receive object once in one chunk
    mocksock.recv.side_effect = [bs]
    cos = ClientObjectSocket(mocksock)
    o = cos.recv_object()
    assert Hello("howdy") == o

    # receive object twice in bits
    mocksock.recv.side_effect = [bs[:10], bs[10:] + bs[:25], bs[25:]]
    o = cos.recv_object()
    assert Hello("howdy") == o
    o = cos.recv_object()
    assert Hello("howdy") == o
Example #9
0
 def sendfn():
     while self._isRunning("sendfn"):
         try:
             message = self.sendQueue.get(timeout=1)
             self.logger.debug(
                 "Server %d send %s to %d",
                 message.sender_id,
                 repr(message),
                 message.recver_id,
             )
             # only open sockets for other servers not for clients
             if (self.clientsockets.get(message.recver_id) is None
                     and message.recver_id in self.config.keys()):
                 self.clientsockets[
                     message.
                     recver_id] = ClientObjectSocket.get_cosclient(
                         self.config[message.recver_id]["port"])
             self.clientsockets[message.recver_id].send_object(message)
         except BrokenPipeError as e:
             self.logger.debug(
                 f"Dropping message {message} to {message.recver_id}; connection was closed: {e}."
             )
             self.clientsockets[dest].close()
             del self.clientsockets[dest]
         except ConnectionRefusedError as e:
             self.logger.debug(
                 f"Dropping message {message} to {message.recver_id}; connection was refused: {e}."
             )
         except queue.Empty:
             continue  # expected empty; keep checking the queue
         except socket.timeout:
             continue  # expected timeout; needed to check if sendRunning is still true
         except:
             self.logger.debug(
                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
             )
Example #10
0
 def _get_socket(self):
     return ClientObjectSocket.get_cosclient(
         self.cluster_config[self.current_server_id]["port"])