From ed83b5b0e2081dccbf20ad47aea61a2758d6962c Mon Sep 17 00:00:00 2001 From: Mat Wood Date: Thu, 14 Oct 2021 00:08:45 +0000 Subject: [PATCH] Updating to jsonrpsee 0.4.1 Updating to pick-up a [fix](https://github.com/paritytech/jsonrpsee/pull/446) for empty JSON req as no params so that `bgpd show routes advertised` (and `learned`) works without specifying a peer. --- Cargo.lock | 140 ++++++++++++--------------------------------- Cargo.toml | 4 +- src/api/handler.rs | 72 ++++++++++++----------- src/api/rpc.rs | 15 ++--- src/cli/mod.rs | 4 +- src/main.rs | 4 +- 6 files changed, 88 insertions(+), 151 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa6ebf0..051cd8d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,16 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - [[package]] name = "aho-corasick" version = "0.7.18" @@ -30,6 +20,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "anyhow" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" + [[package]] name = "arrayref" version = "0.3.6" @@ -42,6 +38,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + [[package]] name = "async-trait" version = "0.1.51" @@ -70,19 +72,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "bae" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107f431ee3d8a8e45e6dd117adab769556ef463959e77bf6a4888d5fd500cf" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2 1.0.29", - "quote 1.0.9", - "syn 1.0.78", -] - [[package]] name = "base64" version = "0.13.0" @@ -110,7 +99,7 @@ dependencies = [ [[package]] name = "bgpd-rs" -version = "0.2.2" +version = "0.2.3" dependencies = [ "async-trait", "bgp-rs", @@ -149,7 +138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.5.2", "constant_time_eq", ] @@ -714,9 +703,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b8db4bfd89717e10039fbde2a7f1c0e6315d0469c9d1776581310de9e004bc" +checksum = "6373a33d987866ccfe1af4bc11b089dce941764313f9fd8b7cf13fcb51b72dc5" dependencies = [ "jsonrpsee-http-client", "jsonrpsee-http-server", @@ -729,13 +718,12 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa96aee30f40b97f1831e6ab7ba63d65b73d73ae418e1437bae2a47bbdf3aff6" +checksum = "20d31e34e000acb80fae4e36dacb63e458b10ad44c37cd9a46e782994c32c806" dependencies = [ "async-trait", "fnv", - "futures", "hyper", "hyper-rustls", "jsonrpsee-types", @@ -750,9 +738,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-server" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45fafdedf74971437bfb2919aa3f239810333b1ef77cbdc3ab39c9e8d49d8fda" +checksum = "f54d354f93197e6b0f396ea396d918061e1ea521f4e21cf36f953355c72c73b6" dependencies = [ "futures-channel", "futures-util", @@ -762,22 +750,19 @@ dependencies = [ "jsonrpsee-utils", "lazy_static", "log", - "serde", "serde_json", "socket2", - "thiserror", "tokio", "unicase", ] [[package]] name = "jsonrpsee-proc-macros" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8edb341d35279b59c79d7fe9e060a51aec29d45af99cc7c72ea7caa350fa71a4" +checksum = "d802063f7a3c867456955f9d2f15eb3ee0edb5ec9ec2b5526324756759221c0f" dependencies = [ - "Inflector", - "bae", + "log", "proc-macro-crate", "proc-macro2 1.0.29", "quote 1.0.9", @@ -786,10 +771,11 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc738fd55b676ada3271ef7c383a14a0867a2a88b0fa941311bf5fc0a29d498" +checksum = "62f778cf245158fbd8f5d50823a2e9e4c708a40be164766bd35e9fb1d86715b2" dependencies = [ + "anyhow", "async-trait", "beef", "futures-channel", @@ -804,10 +790,12 @@ dependencies = [ [[package]] name = "jsonrpsee-utils" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d674f0eafa768a66c5cd3ad3131c5d966b1425a475bc87be84acc6dc48321b01" +checksum = "0109c4f972058f3b1925b73a17210aff7b63b65967264d0045d15ee88fe84f0c" dependencies = [ + "arrayvec 0.7.1", + "beef", "futures-channel", "futures-util", "hyper", @@ -823,17 +811,18 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9841352dbecf4c2ed5dc71698df9f1660262ae4e0b610e968602529bdbcf7b30" +checksum = "559aa56fc402af206c00fc913dc2be1d9d788dcde045d14df141a535245d35ef" dependencies = [ + "arrayvec 0.7.1", "async-trait", "fnv", "futures", + "http", "jsonrpsee-types", "log", "pin-project", - "rustls", "rustls-native-certs", "serde", "serde_json", @@ -842,27 +831,22 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-util", - "url", ] [[package]] name = "jsonrpsee-ws-server" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec5f1392e5d38b2e8e20eaef5ad864e965738643b7e9bc4d09afcf2dc1bd7f1a" +checksum = "541e8ec2b2a7a7fcf5bb9191f8a9105aa47f7658db058a304331e94b234cd5df" dependencies = [ "futures-channel", "futures-util", "jsonrpsee-types", "jsonrpsee-utils", "log", - "rustc-hash", - "serde", "serde_json", "soketto", - "thiserror", "tokio", - "tokio-stream", "tokio-util", ] @@ -1090,32 +1074,6 @@ dependencies = [ "toml", ] -[[package]] -name = "proc-macro-error" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18f33027081eba0a6d8aba6d1b1c3a3be58cbb12106341c2d5759fcd9b5277e7" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2 1.0.29", - "quote 1.0.9", - "syn 1.0.78", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a5b4b77fdb63c1eca72173d68d24501c54ab1269409f6b672c85deb18af69de" -dependencies = [ - "proc-macro2 1.0.29", - "quote 1.0.9", - "syn 1.0.78", - "syn-mid", - "version_check", -] - [[package]] name = "proc-macro-hack" version = "0.5.19" @@ -1459,9 +1417,9 @@ dependencies = [ [[package]] name = "soketto" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a74e48087dbeed4833785c2f3352b59140095dc192dce966a3bfc155020a439f" +checksum = "083624472e8817d44d02c0e55df043737ff11f279af924abdf93845717c2b75c" dependencies = [ "base64", "bytes", @@ -1528,17 +1486,6 @@ dependencies = [ "unicode-xid 0.2.2", ] -[[package]] -name = "syn-mid" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa8e7560a164edb1621a55d18a0c59abf49d360f47aa7b821061dd7eea7fac9" -dependencies = [ - "proc-macro2 1.0.29", - "quote 1.0.9", - "syn 1.0.78", -] - [[package]] name = "term" version = "0.5.2" @@ -1652,17 +1599,6 @@ dependencies = [ "webpki", ] -[[package]] -name = "tokio-stream" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.6.8" diff --git a/Cargo.toml b/Cargo.toml index 7078150..5d88af3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bgpd-rs" -version = "0.2.2" +version = "0.2.3" authors = ["Mat Wood "] edition = "2018" license = "MIT" @@ -29,7 +29,7 @@ colored = { version = "1.8", optional = true } env_logger = "0.6.1" ipnetwork = "^0.16" itertools = "^0.8.1" -jsonrpsee = { version = "0.3.1", features = [ "client", "http-server", "macros", "server" ] } +jsonrpsee = { version = "0.4.1", features = [ "client", "http-server", "macros", "server" ] } futures = { version = "^0.3" } log = "0.4.6" net2 = "0.2.33" diff --git a/src/api/handler.rs b/src/api/handler.rs index 305d323..d573a5a 100644 --- a/src/api/handler.rs +++ b/src/api/handler.rs @@ -1,7 +1,10 @@ use std::net::SocketAddr; use ipnetwork::IpNetwork; -use jsonrpsee::http_server::HttpServerBuilder; +use jsonrpsee::{ + http_server::{HttpServerBuilder, HttpStopHandle}, + types::error::Error as RPCError, +}; use log::info; use super::peers::{peer_to_detail, peer_to_summary}; @@ -13,7 +16,7 @@ use crate::utils::{get_host_address, parse_flow_spec, parse_route_spec}; #[async_trait::async_trait] impl ApiServer for Server { - async fn show_peers(&self) -> Vec { + async fn show_peers(&self) -> Result, RPCError> { let mut output: Vec = vec![]; let sessions = self.inner.sessions.read().await; let configs = sessions.get_peer_configs(); @@ -42,10 +45,10 @@ impl ApiServer for Server { }) .collect::>(); output.extend(idle_summaries); - output + Ok(output) } - async fn show_peer_detail(&self) -> Vec { + async fn show_peer_detail(&self) -> Result, RPCError> { let mut output: Vec = vec![]; let sessions = self.inner.sessions.read().await; let configs = sessions.get_peer_configs(); @@ -74,10 +77,13 @@ impl ApiServer for Server { }) .collect(); output.extend(idle_details); - output + Ok(output) } - async fn show_routes_learned(&self, from_peer: Option) -> Vec { + async fn show_routes_learned( + &self, + from_peer: Option, + ) -> Result, RPCError> { let mut output: Vec = vec![]; let entries = { let rib = self.inner.rib.read().await; @@ -98,10 +104,13 @@ impl ApiServer for Server { }; let routes: Vec<_> = entries.into_iter().map(entry_to_route).collect(); output.extend(routes); - output + Ok(output) } - async fn show_routes_advertised(&self, to_peer: Option) -> Vec { + async fn show_routes_advertised( + &self, + to_peer: Option, + ) -> Result, RPCError> { let mut output: Vec = vec![]; let sessions = self.inner.sessions.read().await; let active_sessions = sessions.sessions.read().await; @@ -125,44 +134,33 @@ impl ApiServer for Server { .flatten() .collect(); output.extend(routes); - output + Ok(output) } - async fn advertise_route(&self, route: RouteSpec) -> Result { - match parse_route_spec(&route) { - Ok(update) => { - let (family, attributes, nlri) = update; - let mut rib = self.inner.rib.write().await; - let entry = rib.insert_from_api(family, attributes, nlri); - Ok(entry_to_route(entry)) - } - Err(err) => Err(err.to_string()), - } + async fn advertise_route(&self, route: RouteSpec) -> Result { + let update = parse_route_spec(&route).map_err(|e| RPCError::Request(e.to_string()))?; + let (family, attributes, nlri) = update; + let mut rib = self.inner.rib.write().await; + let entry = rib.insert_from_api(family, attributes, nlri); + Ok(entry_to_route(entry)) } - async fn advertise_flow(&self, flow: FlowSpec) -> Result { - match parse_flow_spec(&flow) { - Ok(update) => { - let (family, attributes, nlri) = update; - let mut rib = self.inner.rib.write().await; - let entry = rib.insert_from_api(family, attributes, nlri); - Ok(entry_to_route(entry)) - } - Err(err) => Err(err.to_string()), - } + async fn advertise_flow(&self, flow: FlowSpec) -> Result { + let update = parse_flow_spec(&flow).map_err(|e| RPCError::Request(e.to_string()))?; + let (family, attributes, nlri) = update; + let mut rib = self.inner.rib.write().await; + let entry = rib.insert_from_api(family, attributes, nlri); + Ok(entry_to_route(entry)) } } impl Server { - pub fn serve_rpc_api(&self, socket: SocketAddr) { + pub async fn serve_rpc_api(&self, socket: SocketAddr) -> Result { let server = self.clone(); info!("Starting JSON-RPC server on {}...", socket); - tokio::task::spawn(async move { - HttpServerBuilder::default() - .build(socket) - .unwrap() - .start(server.into_rpc()) - .await - }); + let handle = HttpServerBuilder::default() + .build(socket)? + .start(server.into_rpc())?; + Ok(handle) } } diff --git a/src/api/rpc.rs b/src/api/rpc.rs index 2c1ecc5..0a21b6f 100644 --- a/src/api/rpc.rs +++ b/src/api/rpc.rs @@ -2,22 +2,23 @@ use ipnetwork::IpNetwork; use std::net::IpAddr; +use jsonrpsee::{types::error::Error as RPCError, proc_macros::rpc}; use serde::{self, Deserialize, Serialize}; -#[jsonrpsee::proc_macros::rpc(client, server)] +#[rpc(client, server)] pub trait Api { #[method(name = "show_peers")] - async fn show_peers(&self) -> Vec; + async fn show_peers(&self) -> Result, RPCError>; #[method(name = "show_peer_detail")] - async fn show_peer_detail(&self) -> Vec; + async fn show_peer_detail(&self) -> Result, RPCError>; #[method(name = "show_routes_learned")] - async fn show_routes_learned(&self, from_peer: Option) -> Vec; + async fn show_routes_learned(&self, from_peer: Option) -> Result, RPCError>; #[method(name = "show_routes_advertised")] - async fn show_routes_advertised(&self, to_peer: Option) -> Vec; + async fn show_routes_advertised(&self, to_peer: Option) -> Result, RPCError>; #[method(name = "advertise_route")] - async fn advertise_route(&self, route: RouteSpec) -> Result; + async fn advertise_route(&self, route: RouteSpec) -> Result; #[method(name = "advertise_flow")] - async fn advertise_flow(&self, flow: FlowSpec) -> Result; + async fn advertise_flow(&self, flow: FlowSpec) -> Result; } #[derive(Debug, Deserialize, Serialize)] diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 5b96ad2..4d47f33 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -485,7 +485,7 @@ async fn run_cmd(args: &Args) -> Result<(), Box> { .map(|comm| comm.to_string()) .collect(); } - match client.advertise_route(spec).await? { + match client.advertise_route(spec).await { Ok(advertised) => { println!("Added route to RIB for announcement:"); let mut table = table::OutputTable::new(); @@ -524,7 +524,7 @@ async fn run_cmd(args: &Args) -> Result<(), Box> { .map(|comm| comm.to_string()) .collect(); } - match client.advertise_flow(spec).await? { + match client.advertise_flow(spec).await { Ok(advertised) => { println!("Added flow to RIB for announcement:"); let mut table = table::OutputTable::new(); diff --git a/src/main.rs b/src/main.rs index 2250e3e..909102c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,7 +40,9 @@ async fn main() -> Result<(), Box> { let bgp_listener = TcpListener::bind(&config.bgp_socket).await?; let mut bgp_server = Server::new(config.clone(), bgp_listener, config_rx)?; // Setup JSON RPC Server - bgp_server.serve_rpc_api(args.api.unwrap_or(config.api_socket)); + let _api_handle = bgp_server + .serve_rpc_api(args.api.unwrap_or(config.api_socket)) + .await?; let signals = Signals::new(&[SIGHUP])?; std::thread::spawn(move || {