Update peer store interface

This commit is contained in:
NIC619
2019-11-25 17:16:47 +08:00
parent e49de15227
commit 8b4022328d
4 changed files with 172 additions and 16 deletions

View File

@ -7,9 +7,6 @@ from .id import ID
class IAddrBook(ABC): class IAddrBook(ABC):
def __init__(self) -> None:
pass
@abstractmethod @abstractmethod
def add_addr(self, peer_id: ID, addr: Multiaddr, ttl: int) -> None: def add_addr(self, peer_id: ID, addr: Multiaddr, ttl: int) -> None:
""" """

View File

@ -5,9 +5,6 @@ from .id import ID
class IPeerMetadata(ABC): class IPeerMetadata(ABC):
def __init__(self) -> None:
pass
@abstractmethod @abstractmethod
def get(self, peer_id: ID, key: str) -> Any: def get(self, peer_id: ID, key: str) -> Any:
""" """

View File

@ -17,7 +17,6 @@ class PeerStore(IPeerStore):
peer_data_map: Dict[ID, PeerData] peer_data_map: Dict[ID, PeerData]
def __init__(self) -> None: def __init__(self) -> None:
IPeerStore.__init__(self)
self.peer_pubkey_map = {} self.peer_pubkey_map = {}
self.peer_privkey_map = {} self.peer_privkey_map = {}
self.peer_data_map = {} self.peer_data_map = {}
@ -37,28 +36,54 @@ class PeerStore(IPeerStore):
return self.peer_data_map[peer_id] return self.peer_data_map[peer_id]
def peer_info(self, peer_id: ID) -> Optional[PeerInfo]: def peer_info(self, peer_id: ID) -> Optional[PeerInfo]:
"""
:param peer_id: peer ID to get info for
:return: peer info object
"""
if peer_id in self.peer_data_map: if peer_id in self.peer_data_map:
peer_data = self.peer_data_map[peer_id] peer_data = self.peer_data_map[peer_id]
return PeerInfo(peer_id, peer_data.addrs) return PeerInfo(peer_id, peer_data.addrs)
return None return None
def get_protocols(self, peer_id: ID) -> List[str]: def get_protocols(self, peer_id: ID) -> List[str]:
"""
:param peer_id: peer ID to get protocols for
:return: protocols (as list of strings)
:raise PeerStoreError: if peer ID not found
"""
if peer_id in self.peer_data_map: if peer_id in self.peer_data_map:
return self.peer_data_map[peer_id].get_protocols() return self.peer_data_map[peer_id].get_protocols()
raise PeerStoreError("peer ID not found") raise PeerStoreError("peer ID not found")
def add_protocols(self, peer_id: ID, protocols: Sequence[str]) -> None: def add_protocols(self, peer_id: ID, protocols: Sequence[str]) -> None:
"""
:param peer_id: peer ID to add protocols for
:param protocols: protocols to add
"""
peer = self.__create_or_get_peer(peer_id) peer = self.__create_or_get_peer(peer_id)
peer.add_protocols(list(protocols)) peer.add_protocols(list(protocols))
def set_protocols(self, peer_id: ID, protocols: Sequence[str]) -> None: def set_protocols(self, peer_id: ID, protocols: Sequence[str]) -> None:
"""
:param peer_id: peer ID to set protocols for
:param protocols: protocols to set
"""
peer = self.__create_or_get_peer(peer_id) peer = self.__create_or_get_peer(peer_id)
peer.set_protocols(list(protocols)) peer.set_protocols(list(protocols))
def peer_ids(self) -> List[ID]: def peer_ids(self) -> List[ID]:
"""
:return: all of the peer IDs stored in peer store
"""
return list(self.peer_data_map.keys()) return list(self.peer_data_map.keys())
def get(self, peer_id: ID, key: str) -> Any: def get(self, peer_id: ID, key: str) -> Any:
"""
:param peer_id: peer ID to get peer data for
:param key: the key to search value for
:return: value corresponding to the key
:raise PeerStoreError: if peer ID or value not found
"""
if peer_id in self.peer_data_map: if peer_id in self.peer_data_map:
try: try:
val = self.peer_data_map[peer_id].get_metadata(key) val = self.peer_data_map[peer_id].get_metadata(key)
@ -68,30 +93,56 @@ class PeerStore(IPeerStore):
raise PeerStoreError("peer ID not found") raise PeerStoreError("peer ID not found")
def put(self, peer_id: ID, key: str, val: Any) -> None: def put(self, peer_id: ID, key: str, val: Any) -> None:
"""
:param peer_id: peer ID to put peer data for
:param key:
:param value:
"""
# <<?>> # <<?>>
# This can output an error, not sure what the possible errors are # This can output an error, not sure what the possible errors are
peer = self.__create_or_get_peer(peer_id) peer = self.__create_or_get_peer(peer_id)
peer.put_metadata(key, val) peer.put_metadata(key, val)
def add_addr(self, peer_id: ID, addr: Multiaddr, ttl: int) -> None: def add_addr(self, peer_id: ID, addr: Multiaddr, ttl: int) -> None:
"""
:param peer_id: peer ID to add address for
:param addr:
:param ttl: time-to-live for the this record
"""
self.add_addrs(peer_id, [addr], ttl) self.add_addrs(peer_id, [addr], ttl)
def add_addrs(self, peer_id: ID, addrs: Sequence[Multiaddr], ttl: int) -> None: def add_addrs(self, peer_id: ID, addrs: Sequence[Multiaddr], ttl: int) -> None:
"""
:param peer_id: peer ID to add address for
:param addrs:
:param ttl: time-to-live for the this record
"""
# Ignore ttl for now # Ignore ttl for now
peer = self.__create_or_get_peer(peer_id) peer = self.__create_or_get_peer(peer_id)
peer.add_addrs(list(addrs)) peer.add_addrs(list(addrs))
def addrs(self, peer_id: ID) -> List[Multiaddr]: def addrs(self, peer_id: ID) -> List[Multiaddr]:
"""
:param peer_id: peer ID to get addrs for
:return: list of addrs
:raise PeerStoreError: if peer ID not found
"""
if peer_id in self.peer_data_map: if peer_id in self.peer_data_map:
return self.peer_data_map[peer_id].get_addrs() return self.peer_data_map[peer_id].get_addrs()
raise PeerStoreError("peer ID not found") raise PeerStoreError("peer ID not found")
def clear_addrs(self, peer_id: ID) -> None: def clear_addrs(self, peer_id: ID) -> None:
"""
:param peer_id: peer ID to clear addrs for
"""
# Only clear addresses if the peer is in peer map # Only clear addresses if the peer is in peer map
if peer_id in self.peer_data_map: if peer_id in self.peer_data_map:
self.peer_data_map[peer_id].clear_addrs() self.peer_data_map[peer_id].clear_addrs()
def peers_with_addrs(self) -> List[ID]: def peers_with_addrs(self) -> List[ID]:
"""
:return: all of the peer IDs which has addrs stored in peer store
"""
# Add all peers with addrs at least 1 to output # Add all peers with addrs at least 1 to output
output: List[ID] = [] output: List[ID] = []
@ -101,26 +152,49 @@ class PeerStore(IPeerStore):
return output return output
def add_pubkey(self, peer_id: ID, pubkey: PublicKey) -> None: def add_pubkey(self, peer_id: ID, pubkey: PublicKey) -> None:
"""
:param peer_id: peer ID to add public key for
:param pubkey:
:raise PeerStoreError: if peer ID already has pubkey set
"""
if peer_id in self.peer_pubkey_map: if peer_id in self.peer_pubkey_map:
raise PeerStoreError(f"peer ID already has pubkey: {self.peer_pubkey_map[peer_id]}") raise PeerStoreError(f"peer ID already has pubkey: {self.peer_pubkey_map[peer_id]}")
self.peer_pubkey_map[peer_id] = pubkey self.peer_pubkey_map[peer_id] = pubkey
def pubkey(self, peer_id: ID) -> PublicKey: def pubkey(self, peer_id: ID) -> PublicKey:
"""
:param peer_id: peer ID to get public key for
:return: public key of the peer
:raise PeerStoreError: if peer ID not found
"""
if peer_id in self.peer_pubkey_map: if peer_id in self.peer_pubkey_map:
return self.peer_pubkey_map[peer_id] return self.peer_pubkey_map[peer_id]
raise PeerStoreError("peer ID not found") raise PeerStoreError("peer ID not found")
def add_privkey(self, peer_id: ID, privkey: PrivateKey) -> None: def add_privkey(self, peer_id: ID, privkey: PrivateKey) -> None:
"""
:param peer_id: peer ID to add private key for
:param privkey:
:raise PeerStoreError: if peer ID already has privkey set
"""
if peer_id in self.peer_privkey_map: if peer_id in self.peer_privkey_map:
raise PeerStoreError(f"peer ID already has privkey: {self.peer_privkey_map[peer_id]}") raise PeerStoreError(f"peer ID already has privkey: {self.peer_privkey_map[peer_id]}")
self.peer_privkey_map[peer_id] = privkey self.peer_privkey_map[peer_id] = privkey
def privkey(self, peer_id: ID) -> PrivateKey: def privkey(self, peer_id: ID) -> PrivateKey:
"""
:param peer_id: peer ID to get private key for
:return: private key of the peer
:raise PeerStoreError: if peer ID not found
"""
if peer_id in self.peer_pubkey_map: if peer_id in self.peer_pubkey_map:
return self.peer_privkey_map[peer_id] return self.peer_privkey_map[peer_id]
raise PeerStoreError("peer ID not found") raise PeerStoreError("peer ID not found")
def peers_with_keys(self) -> Tuple[ID]: def peers_with_keys(self) -> Tuple[ID]:
"""
:return: all of the peer IDs which has pubkey/privkey stored in peer store
"""
return set(self.peer_pubkey_map.keys()).union(self.peer_privkey_map.keys()) return set(self.peer_pubkey_map.keys()).union(self.peer_privkey_map.keys())

View File

@ -1,5 +1,9 @@
from abc import abstractmethod from abc import abstractmethod
from typing import List, Sequence from typing import Any, List, Sequence, Tuple
from multiaddr import Multiaddr
from libp2p.crypto.keys import PrivateKey, PublicKey
from .addrbook_interface import IAddrBook from .addrbook_interface import IAddrBook
from .id import ID from .id import ID
@ -8,10 +12,6 @@ from .peermetadata_interface import IPeerMetadata
class IPeerStore(IAddrBook, IPeerMetadata): class IPeerStore(IAddrBook, IPeerMetadata):
def __init__(self) -> None:
IPeerMetadata.__init__(self)
IAddrBook.__init__(self)
@abstractmethod @abstractmethod
def peer_info(self, peer_id: ID) -> PeerInfo: def peer_info(self, peer_id: ID) -> PeerInfo:
""" """
@ -23,8 +23,8 @@ class IPeerStore(IAddrBook, IPeerMetadata):
def get_protocols(self, peer_id: ID) -> List[str]: def get_protocols(self, peer_id: ID) -> List[str]:
""" """
:param peer_id: peer ID to get protocols for :param peer_id: peer ID to get protocols for
:return: protocols (as strings) :return: protocols (as list of strings)
:raise Exception: peer ID not found exception :raise PeerStoreError: if peer ID not found
""" """
@abstractmethod @abstractmethod
@ -32,7 +32,6 @@ class IPeerStore(IAddrBook, IPeerMetadata):
""" """
:param peer_id: peer ID to add protocols for :param peer_id: peer ID to add protocols for
:param protocols: protocols to add :param protocols: protocols to add
:raise Exception: peer ID not found
""" """
@abstractmethod @abstractmethod
@ -40,7 +39,6 @@ class IPeerStore(IAddrBook, IPeerMetadata):
""" """
:param peer_id: peer ID to set protocols for :param peer_id: peer ID to set protocols for
:param protocols: protocols to set :param protocols: protocols to set
:raise Exception: peer ID not found
""" """
@abstractmethod @abstractmethod
@ -48,3 +46,93 @@ class IPeerStore(IAddrBook, IPeerMetadata):
""" """
:return: all of the peer IDs stored in peer store :return: all of the peer IDs stored in peer store
""" """
@abstractmethod
def get(self, peer_id: ID, key: str) -> Any:
"""
:param peer_id: peer ID to get peer data for
:param key: the key to search value for
:return: value corresponding to the key
:raise PeerStoreError: if peer ID or value not found
"""
@abstractmethod
def put(self, peer_id: ID, key: str, val: Any) -> None:
"""
:param peer_id: peer ID to put peer data for
:param key:
:param value:
"""
@abstractmethod
def add_addr(self, peer_id: ID, addr: Multiaddr, ttl: int) -> None:
"""
:param peer_id: peer ID to add address for
:param addr:
:param ttl: time-to-live for the this record
"""
@abstractmethod
def add_addrs(self, peer_id: ID, addrs: Sequence[Multiaddr], ttl: int) -> None:
"""
:param peer_id: peer ID to add address for
:param addrs:
:param ttl: time-to-live for the this record
"""
@abstractmethod
def addrs(self, peer_id: ID) -> List[Multiaddr]:
"""
:param peer_id: peer ID to get addrs for
:return: list of addrs
"""
@abstractmethod
def clear_addrs(self, peer_id: ID) -> None:
"""
:param peer_id: peer ID to clear addrs for
"""
@abstractmethod
def peers_with_addrs(self) -> List[ID]:
"""
:return: all of the peer IDs which has addrs stored in peer store
"""
@abstractmethod
def add_pubkey(self, peer_id: ID, pubkey: PublicKey) -> None:
"""
:param peer_id: peer ID to add public key for
:param pubkey:
:raise PeerStoreError: if peer ID already has pubkey set
"""
@abstractmethod
def pubkey(self, peer_id: ID) -> PublicKey:
"""
:param peer_id: peer ID to get public key for
:return: public key of the peer
:raise PeerStoreError: if peer ID not found
"""
@abstractmethod
def add_privkey(self, peer_id: ID, privkey: PrivateKey) -> None:
"""
:param peer_id: peer ID to add private key for
:param privkey:
:raise PeerStoreError: if peer ID already has privkey set
"""
@abstractmethod
def privkey(self, peer_id: ID) -> PrivateKey:
"""
:param peer_id: peer ID to get private key for
:return: private key of the peer
:raise PeerStoreError: if peer ID not found
"""
@abstractmethod
def peers_with_keys(self) -> Tuple[ID]:
"""
:return: all of the peer IDs which has pubkey/privkey stored in peer store
"""