RPC Admin namespace implementation (#685)

* AdminApi first draft

* Implement add_trusted_peer and remove_trusted_peer

* Fix tests

* Refactoring NetworkHandle peer related methods

* Refactoring add_discovered_node in PeersManager

* Change record type from String to NodeRecord

* Adding NetworkHandleMessage::RemovePeer command
This commit is contained in:
Aurélien
2023-01-03 14:02:05 +01:00
committed by GitHub
parent debf21d34e
commit 65bc3cb7b8
11 changed files with 141 additions and 38 deletions

View File

@ -403,9 +403,23 @@ impl PeersManager {
/// Called for a newly discovered peer.
///
/// If the peer already exists, then the address will be updated. If the addresses differ, the
/// old address is returned
pub(crate) fn add_discovered_node(&mut self, peer_id: PeerId, addr: SocketAddr) {
/// If the peer already exists, then the address and kind will be updated.
pub(crate) fn add_peer(&mut self, peer_id: PeerId, addr: SocketAddr) {
self.add_peer_kind(peer_id, PeerKind::Basic, addr)
}
/// Called for a newly discovered trusted peer.
///
/// If the peer already exists, then the address and kind will be updated.
#[allow(dead_code)]
pub(crate) fn add_trusted_peer(&mut self, peer_id: PeerId, addr: SocketAddr) {
self.add_peer_kind(peer_id, PeerKind::Trusted, addr)
}
/// Called for a newly discovered peer.
///
/// If the peer already exists, then the address and kind will be updated.
pub(crate) fn add_peer_kind(&mut self, peer_id: PeerId, kind: PeerKind, addr: SocketAddr) {
if self.ban_list.is_banned(&peer_id, &addr.ip()) {
return
}
@ -413,12 +427,13 @@ impl PeersManager {
match self.peers.entry(peer_id) {
Entry::Occupied(mut entry) => {
let node = entry.get_mut();
node.kind = kind;
node.addr = addr;
return
}
Entry::Vacant(entry) => {
trace!(target : "net::peers", ?peer_id, ?addr, "discovered new node");
entry.insert(Peer::new(addr));
entry.insert(Peer::with_kind(addr, kind));
self.queued_actions.push_back(PeerAction::PeerAdded(peer_id));
}
}
@ -427,7 +442,7 @@ impl PeersManager {
}
/// Removes the tracked node from the set.
pub(crate) fn remove_discovered_node(&mut self, peer_id: PeerId) {
pub(crate) fn remove_peer(&mut self, peer_id: PeerId) {
let Entry::Occupied(entry) = self.peers.entry(peer_id) else { return };
if entry.get().is_trusted() {
return
@ -453,6 +468,18 @@ impl PeersManager {
}
}
/// Removes the tracked node from the trusted set.
pub(crate) fn remove_peer_from_trusted_set(&mut self, peer_id: PeerId) {
let Entry::Occupied(mut entry) = self.peers.entry(peer_id) else { return };
if !entry.get().is_trusted() {
return
}
let peer = entry.get_mut();
peer.kind = PeerKind::Basic;
}
/// Returns the idle peer with the highest reputation.
///
/// Peers that are `trusted`, see [PeerKind], are prioritized as long as they're not currently
@ -539,9 +566,9 @@ impl PeersManager {
while let Poll::Ready(Some(cmd)) = self.handle_rx.poll_next_unpin(cx) {
match cmd {
PeerCommand::Add(peer_id, addr) => {
self.add_discovered_node(peer_id, addr);
self.add_peer(peer_id, addr);
}
PeerCommand::Remove(peer) => self.remove_discovered_node(peer),
PeerCommand::Remove(peer) => self.remove_peer(peer),
PeerCommand::ReputationChange(peer_id, rep) => {
self.apply_reputation_change(&peer_id, rep)
}
@ -679,6 +706,10 @@ impl Peer {
}
}
fn with_kind(addr: SocketAddr, kind: PeerKind) -> Self {
Self { kind, ..Self::new(addr) }
}
/// Applies a reputation change to the peer and returns what action should be taken.
fn apply_reputation(&mut self, reputation: i32) -> ReputationChangeOutcome {
let previous = self.reputation;
@ -778,7 +809,7 @@ impl PeerConnectionState {
/// Represents the kind of peer
#[derive(Debug, Clone, Copy, Default, Eq, PartialEq)]
enum PeerKind {
pub enum PeerKind {
/// Basic peer kind.
#[default]
Basic,
@ -979,7 +1010,7 @@ mod test {
let peer = PeerId::random();
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
let mut peers = PeersManager::default();
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1002,7 +1033,7 @@ mod test {
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
let mut peers = PeersManager::default();
peers.ban_peer(peer);
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::BanPeer { peer_id } => {
@ -1026,7 +1057,7 @@ mod test {
let backoff_duration = Duration::from_secs(3);
let config = PeersConfig { backoff_duration, ..Default::default() };
let mut peers = PeersManager::new(config);
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1089,7 +1120,7 @@ mod test {
let backoff_duration = Duration::from_secs(3);
let config = PeersConfig { backoff_duration, ..Default::default() };
let mut peers = PeersManager::new(config);
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1149,7 +1180,7 @@ mod test {
let peer = PeerId::random();
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
let mut peers = PeersManager::default();
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1205,7 +1236,7 @@ mod test {
let peer = PeerId::random();
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
let mut peers = PeersManager::default();
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1317,7 +1348,7 @@ mod test {
let peer = PeerId::random();
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
let mut peers = PeersManager::default();
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1361,7 +1392,7 @@ mod test {
let peer = PeerId::random();
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
let mut peers = PeersManager::default();
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1380,7 +1411,7 @@ mod test {
let p = peers.peers.get(&peer).unwrap();
assert_eq!(p.state, PeerConnectionState::Out);
peers.remove_discovered_node(peer);
peers.remove_peer(peer);
match event!(peers) {
PeerAction::PeerRemoved(peer_id) => {
@ -1398,7 +1429,7 @@ mod test {
let p = peers.peers.get(&peer).unwrap();
assert_eq!(p.state, PeerConnectionState::DisconnectingOut);
peers.add_discovered_node(peer, socket_addr);
peers.add_peer(peer, socket_addr);
let p = peers.peers.get(&peer).unwrap();
assert_eq!(p.state, PeerConnectionState::DisconnectingOut);
@ -1413,7 +1444,7 @@ mod test {
let ban_list = BanList::new(HashSet::new(), vec![ip]);
let config = PeersConfig::default().with_ban_list(ban_list);
let mut peer_manager = PeersManager::new(config);
peer_manager.add_discovered_node(H512::default(), socket_addr);
peer_manager.add_peer(H512::default(), socket_addr);
assert!(peer_manager.peers.is_empty());
}
@ -1505,7 +1536,7 @@ mod test {
let basic_peer = PeerId::random();
let basic_sock = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8009);
peers.add_discovered_node(basic_peer, basic_sock);
peers.add_peer(basic_peer, basic_sock);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {
@ -1545,7 +1576,7 @@ mod test {
let basic_peer = PeerId::random();
let basic_sock = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8009);
peers.add_discovered_node(basic_peer, basic_sock);
peers.add_peer(basic_peer, basic_sock);
match event!(peers) {
PeerAction::PeerAdded(peer_id) => {