mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 10:14:35 +00:00
add verbose cli mode; add list foreign network (#156)
This commit is contained in:
@@ -81,10 +81,20 @@ message DumpRouteRequest {}
|
|||||||
|
|
||||||
message DumpRouteResponse { string result = 1; }
|
message DumpRouteResponse { string result = 1; }
|
||||||
|
|
||||||
|
message ListForeignNetworkRequest {}
|
||||||
|
|
||||||
|
message ForeignNetworkEntryPb { repeated PeerInfo peers = 1; }
|
||||||
|
|
||||||
|
message ListForeignNetworkResponse {
|
||||||
|
map<string, ForeignNetworkEntryPb> foreign_networks = 1;
|
||||||
|
}
|
||||||
|
|
||||||
service PeerManageRpc {
|
service PeerManageRpc {
|
||||||
rpc ListPeer(ListPeerRequest) returns (ListPeerResponse);
|
rpc ListPeer(ListPeerRequest) returns (ListPeerResponse);
|
||||||
rpc ListRoute(ListRouteRequest) returns (ListRouteResponse);
|
rpc ListRoute(ListRouteRequest) returns (ListRouteResponse);
|
||||||
rpc DumpRoute(DumpRouteRequest) returns (DumpRouteResponse);
|
rpc DumpRoute(DumpRouteRequest) returns (DumpRouteResponse);
|
||||||
|
rpc ListForeignNetwork(ListForeignNetworkRequest)
|
||||||
|
returns (ListForeignNetworkResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ConnectorStatus {
|
enum ConnectorStatus {
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ struct Cli {
|
|||||||
#[arg(short = 'p', long, default_value = "127.0.0.1:15888")]
|
#[arg(short = 'p', long, default_value = "127.0.0.1:15888")]
|
||||||
rpc_portal: SocketAddr,
|
rpc_portal: SocketAddr,
|
||||||
|
|
||||||
|
#[arg(short, long, default_value = "false", help = "verbose output")]
|
||||||
|
verbose: bool,
|
||||||
|
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
sub_command: SubCommand,
|
sub_command: SubCommand,
|
||||||
}
|
}
|
||||||
@@ -49,12 +52,6 @@ enum SubCommand {
|
|||||||
|
|
||||||
#[derive(Args, Debug)]
|
#[derive(Args, Debug)]
|
||||||
struct PeerArgs {
|
struct PeerArgs {
|
||||||
#[arg(short, long)]
|
|
||||||
ipv4: Option<String>,
|
|
||||||
|
|
||||||
#[arg(short, long)]
|
|
||||||
peers: Vec<String>,
|
|
||||||
|
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
sub_command: Option<PeerSubCommand>,
|
sub_command: Option<PeerSubCommand>,
|
||||||
}
|
}
|
||||||
@@ -70,6 +67,7 @@ enum PeerSubCommand {
|
|||||||
Add,
|
Add,
|
||||||
Remove,
|
Remove,
|
||||||
List(PeerListArgs),
|
List(PeerListArgs),
|
||||||
|
ListForeign,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Args, Debug)]
|
#[derive(Args, Debug)]
|
||||||
@@ -113,6 +111,7 @@ enum Error {
|
|||||||
|
|
||||||
struct CommandHandler {
|
struct CommandHandler {
|
||||||
addr: String,
|
addr: String,
|
||||||
|
verbose: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CommandHandler {
|
impl CommandHandler {
|
||||||
@@ -204,6 +203,11 @@ impl CommandHandler {
|
|||||||
|
|
||||||
let mut items: Vec<PeerTableItem> = vec![];
|
let mut items: Vec<PeerTableItem> = vec![];
|
||||||
let peer_routes = self.list_peer_route_pair().await?;
|
let peer_routes = self.list_peer_route_pair().await?;
|
||||||
|
if self.verbose {
|
||||||
|
println!("{:#?}", peer_routes);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
for p in peer_routes {
|
for p in peer_routes {
|
||||||
items.push(p.into());
|
items.push(p.into());
|
||||||
}
|
}
|
||||||
@@ -224,6 +228,46 @@ impl CommandHandler {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn handle_foreign_network_list(&self) -> Result<(), Error> {
|
||||||
|
let mut client = self.get_peer_manager_client().await?;
|
||||||
|
let request = tonic::Request::new(ListForeignNetworkRequest::default());
|
||||||
|
let response = client.list_foreign_network(request).await?;
|
||||||
|
let network_map = response.into_inner();
|
||||||
|
if self.verbose {
|
||||||
|
println!("{:#?}", network_map);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx, (k, v)) in network_map.foreign_networks.iter().enumerate() {
|
||||||
|
println!("{} Network Name: {}", idx + 1, k);
|
||||||
|
for peer in v.peers.iter() {
|
||||||
|
println!(
|
||||||
|
" peer_id: {}, peer_conn_count: {}, conns: [ {} ]",
|
||||||
|
peer.peer_id,
|
||||||
|
peer.conns.len(),
|
||||||
|
peer.conns
|
||||||
|
.iter()
|
||||||
|
.map(|conn| format!(
|
||||||
|
"remote_addr: {}, rx_bytes: {}, tx_bytes: {}, latency_us: {}",
|
||||||
|
conn.tunnel
|
||||||
|
.as_ref()
|
||||||
|
.map(|t| t.remote_addr.clone())
|
||||||
|
.unwrap_or_default(),
|
||||||
|
conn.stats.as_ref().map(|s| s.rx_bytes).unwrap_or_default(),
|
||||||
|
conn.stats.as_ref().map(|s| s.tx_bytes).unwrap_or_default(),
|
||||||
|
conn.stats
|
||||||
|
.as_ref()
|
||||||
|
.map(|s| s.latency_us)
|
||||||
|
.unwrap_or_default(),
|
||||||
|
))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join("; ")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
async fn handle_route_list(&self) -> Result<(), Error> {
|
async fn handle_route_list(&self) -> Result<(), Error> {
|
||||||
#[derive(tabled::Tabled)]
|
#[derive(tabled::Tabled)]
|
||||||
struct RouteTableItem {
|
struct RouteTableItem {
|
||||||
@@ -292,6 +336,7 @@ async fn main() -> Result<(), Error> {
|
|||||||
let cli = Cli::parse();
|
let cli = Cli::parse();
|
||||||
let handler = CommandHandler {
|
let handler = CommandHandler {
|
||||||
addr: format!("http://{}:{}", cli.rpc_portal.ip(), cli.rpc_portal.port()),
|
addr: format!("http://{}:{}", cli.rpc_portal.ip(), cli.rpc_portal.port()),
|
||||||
|
verbose: cli.verbose,
|
||||||
};
|
};
|
||||||
|
|
||||||
match cli.sub_command {
|
match cli.sub_command {
|
||||||
@@ -309,6 +354,9 @@ async fn main() -> Result<(), Error> {
|
|||||||
handler.handle_peer_list(&peer_args).await?;
|
handler.handle_peer_list(&peer_args).await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some(PeerSubCommand::ListForeign) => {
|
||||||
|
handler.handle_foreign_network_list().await?;
|
||||||
|
}
|
||||||
None => {
|
None => {
|
||||||
handler.handle_peer_list(&peer_args).await?;
|
handler.handle_peer_list(&peer_args).await?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ use crate::{
|
|||||||
global_ctx::{ArcGlobalCtx, GlobalCtxEvent, NetworkIdentity},
|
global_ctx::{ArcGlobalCtx, GlobalCtxEvent, NetworkIdentity},
|
||||||
PeerId,
|
PeerId,
|
||||||
},
|
},
|
||||||
|
rpc::{ForeignNetworkEntryPb, ListForeignNetworkResponse, PeerInfo},
|
||||||
tunnel::packet_def::{PacketType, ZCPacket},
|
tunnel::packet_def::{PacketType, ZCPacket},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -306,15 +307,16 @@ impl ForeignNetworkManager {
|
|||||||
self.register_peer_rpc_service().await;
|
self.register_peer_rpc_service().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn list_foreign_networks(&self) -> DashMap<String, Vec<PeerId>> {
|
pub async fn list_foreign_networks(&self) -> ListForeignNetworkResponse {
|
||||||
let ret = DashMap::new();
|
let mut ret = ListForeignNetworkResponse::default();
|
||||||
for item in self.data.network_peer_maps.iter() {
|
let networks = self
|
||||||
let network_name = item.key().clone();
|
.data
|
||||||
ret.insert(network_name, vec![]);
|
.network_peer_maps
|
||||||
}
|
.iter()
|
||||||
|
.map(|v| v.key().clone())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
for mut n in ret.iter_mut() {
|
for network_name in networks {
|
||||||
let network_name = n.key().clone();
|
|
||||||
let Some(item) = self
|
let Some(item) = self
|
||||||
.data
|
.data
|
||||||
.network_peer_maps
|
.network_peer_maps
|
||||||
@@ -323,7 +325,16 @@ impl ForeignNetworkManager {
|
|||||||
else {
|
else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
n.value_mut().extend(item.peer_map.list_peers().await);
|
|
||||||
|
let mut entry = ForeignNetworkEntryPb::default();
|
||||||
|
for peer in item.peer_map.list_peers().await {
|
||||||
|
let mut peer_info = PeerInfo::default();
|
||||||
|
peer_info.peer_id = peer;
|
||||||
|
peer_info.conns = item.peer_map.list_peer_conns(peer).await.unwrap_or(vec![]);
|
||||||
|
entry.peers.push(peer_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret.foreign_networks.insert(network_name, entry);
|
||||||
}
|
}
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
@@ -379,6 +390,13 @@ mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(1, pma_net1.list_routes().await.len());
|
assert_eq!(1, pma_net1.list_routes().await.len());
|
||||||
assert_eq!(1, pmb_net1.list_routes().await.len());
|
assert_eq!(1, pmb_net1.list_routes().await.len());
|
||||||
|
|
||||||
|
let rpc_resp = pm_center
|
||||||
|
.get_foreign_network_manager()
|
||||||
|
.list_foreign_networks()
|
||||||
|
.await;
|
||||||
|
assert_eq!(1, rpc_resp.foreign_networks.len());
|
||||||
|
assert_eq!(2, rpc_resp.foreign_networks["net1"].peers.len());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
@@ -484,6 +502,14 @@ mod tests {
|
|||||||
.len()
|
.len()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let rpc_resp = pm_center
|
||||||
|
.get_foreign_network_manager()
|
||||||
|
.list_foreign_networks()
|
||||||
|
.await;
|
||||||
|
assert_eq!(2, rpc_resp.foreign_networks.len());
|
||||||
|
assert_eq!(3, rpc_resp.foreign_networks["net1"].peers.len());
|
||||||
|
assert_eq!(2, rpc_resp.foreign_networks["net2"].peers.len());
|
||||||
|
|
||||||
drop(pmb_net2);
|
drop(pmb_net2);
|
||||||
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ use std::sync::Arc;
|
|||||||
|
|
||||||
use crate::rpc::{
|
use crate::rpc::{
|
||||||
cli::PeerInfo, peer_manage_rpc_server::PeerManageRpc, DumpRouteRequest, DumpRouteResponse,
|
cli::PeerInfo, peer_manage_rpc_server::PeerManageRpc, DumpRouteRequest, DumpRouteResponse,
|
||||||
ListPeerRequest, ListPeerResponse, ListRouteRequest, ListRouteResponse,
|
ListForeignNetworkRequest, ListForeignNetworkResponse, ListPeerRequest, ListPeerResponse,
|
||||||
|
ListRouteRequest, ListRouteResponse,
|
||||||
};
|
};
|
||||||
use tonic::{Request, Response, Status};
|
use tonic::{Request, Response, Status};
|
||||||
|
|
||||||
@@ -68,4 +69,16 @@ impl PeerManageRpc for PeerManagerRpcService {
|
|||||||
reply.result = self.peer_manager.dump_route().await;
|
reply.result = self.peer_manager.dump_route().await;
|
||||||
Ok(Response::new(reply))
|
Ok(Response::new(reply))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn list_foreign_network(
|
||||||
|
&self,
|
||||||
|
_request: Request<ListForeignNetworkRequest>, // Accept request of type HelloRequest
|
||||||
|
) -> Result<Response<ListForeignNetworkResponse>, Status> {
|
||||||
|
let reply = self
|
||||||
|
.peer_manager
|
||||||
|
.get_foreign_network_manager()
|
||||||
|
.list_foreign_networks()
|
||||||
|
.await;
|
||||||
|
Ok(Response::new(reply))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user