def fetch_routing_table(self, address):
new_routing_info = self.fetch_routing_info(address)<EOL>if new_routing_info is None:<EOL><INDENT>return None<EOL><DEDENT>new_routing_table = RoutingTable.parse_routing_info(new_routing_info)<EOL>num_routers = len(new_routing_table.routers)<EOL>num_readers = len(new_routing_table.readers)<EOL>num_writers = len(new_routing_table.writers)<EOL>self.missing_writer = (num_writers == <NUM_LIT:0>)<EOL>if num_routers == <NUM_LIT:0>:<EOL><INDENT>raise RoutingProtocolError("<STR_LIT>" % (address,))<EOL><DEDENT>if num_readers == <NUM_LIT:0>:<EOL><INDENT>raise RoutingProtocolError("<STR_LIT>" % (address,))<EOL><DEDENT>return new_routing_table<EOL>
Fetch a routing table from a given router address.

        :param address: router address
        :return: a new RoutingTable instance or None if the given router is
                 currently unable to provide routing information
        :raise ServiceUnavailable: if no writers are available
        :raise ProtocolError: if the routing information received is unusable