def parse_routing_info(cls, records): """ Parse the records returned from a getServers call and return a new RoutingTable instance. """ if len(records) != 1: raise ProtocolError("Expected exactly one record") record = records[0] routers = [] readers = [] writers = [] try: servers = record["servers"] for server in servers: role = server["role"] addresses = [] for address in server["addresses"]: addresses.extend(resolve(SocketAddress.parse(address, DEFAULT_PORT))) if role == "ROUTE": routers.extend(addresses) elif role == "READ": readers.extend(addresses) elif role == "WRITE": writers.extend(addresses) ttl = record["ttl"] except (KeyError, TypeError): raise ProtocolError("Cannot parse routing info") else: return cls(routers, readers, writers, ttl)
def test_should_fail_on_non_numeric_port(self): with self.assertRaises(ValueError): _ = SocketAddress.parse("127.0.0.1:X")
def test_should_parse_ipv6_address_and_port(self): parsed = SocketAddress.parse("[::1]:7687") assert parsed == ("::1", 7687, 0, 0)
def test_should_parse_host_name_and_port(self): parsed = SocketAddress.parse("localhost:7687") assert parsed == ("localhost", 7687)
def test_should_parse_ipv4_address_and_port(self): parsed = SocketAddress.parse("127.0.0.1:7687") assert parsed == ("127.0.0.1", 7687)