72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
from components.logs import logger
|
|
from components.models.cluster import LocalPeer, RemotePeer
|
|
from components.utils import ensure_list
|
|
|
|
|
|
class Peers:
|
|
def __init__(self, peers):
|
|
self.remotes = dict()
|
|
|
|
for peer in peers:
|
|
if not peer.get("is_self", False):
|
|
_peer = RemotePeer(**peer)
|
|
self.remotes[_peer.name] = _peer
|
|
|
|
self.local = LocalPeer(**next(peer for peer in peers if peer.get("is_self")))
|
|
self._peers = peers
|
|
|
|
def get_offline_peers(self):
|
|
return [p for p in self.remotes if p not in self.get_established()]
|
|
|
|
def get_established(self, names_only: bool = True, include_local: bool = False):
|
|
peers = []
|
|
for peer, peer_data in self.remotes.items():
|
|
if peer_data._fully_established == True:
|
|
if names_only:
|
|
peers.append(peer_data.name)
|
|
else:
|
|
peers.append(peer_data)
|
|
|
|
if include_local:
|
|
if names_only:
|
|
peers.append(self.local.name)
|
|
else:
|
|
peers.append(self.local)
|
|
|
|
if names_only:
|
|
return sorted(peers)
|
|
return sorted(peers, key=lambda peer: peer.name)
|
|
|
|
def get_remote_peer_ip(
|
|
self, name: str, ip_version: str | list = ["ip4", "ip6", "nat_ip4"]
|
|
):
|
|
def _select_best_ip(peer):
|
|
return (
|
|
str(getattr(peer, "ip4"))
|
|
or str(getattr(peer, "ip6"))
|
|
or str(getattr(peer, "nat_ip4"))
|
|
)
|
|
|
|
def _get_ips(peer, ip_version):
|
|
return [
|
|
str(ip) for key in ensure_list(ip_version) if (ip := getattr(peer, key))
|
|
]
|
|
|
|
peer = self.remotes.get(name)
|
|
if peer:
|
|
if ip_version == "best":
|
|
return _select_best_ip(peer)
|
|
return _get_ips(peer, ip_version)
|
|
|
|
def remote_ips(self):
|
|
for name in self.remotes:
|
|
for ip in self.get_remote_peer_ip(
|
|
name=name, ip_version=["ip4", "ip6", "nat_ip4"]
|
|
):
|
|
yield ip
|
|
|
|
def get_remote_peer_name(self, ip):
|
|
for peer_data in self.remotes.values():
|
|
if ip in peer_data._all_ips_as_str:
|
|
return peer_data.name
|