From 8a149570a91e440469df1405a050ba2292a510a4 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Mar 2020 17:31:46 +0000 Subject: [PATCH 1/9] validator: adding Iron router --- Cargo.lock | 18 ++++++++++++++++++ validator/Cargo.toml | 1 + 2 files changed, 19 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 07341e2d34..ef8c03da0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1639,6 +1639,7 @@ dependencies = [ "iron", "log 0.4.8", "pretty_env_logger", + "router", "serde", "tempfile", "tokio 0.2.12", @@ -2249,6 +2250,23 @@ dependencies = [ "winreg", ] +[[package]] +name = "route-recognizer" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea509065eb0b3c446acdd0102f0d46567dc30902dc0be91d6552035d92b0f4f8" + +[[package]] +name = "router" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc63b6f3b8895b0d04e816b2b1aa58fdba2d5acca3cbb8f0ab8e017347d57397" +dependencies = [ + "iron", + "route-recognizer", + "url 1.7.2", +] + [[package]] name = "rust-argon2" version = "0.7.0" diff --git a/validator/Cargo.toml b/validator/Cargo.toml index 0abfa6c7d6..ec03206455 100644 --- a/validator/Cargo.toml +++ b/validator/Cargo.toml @@ -18,6 +18,7 @@ futures = "0.3.1" iron = "0.6.1" log = "0.4" pretty_env_logger = "0.3" +router = "0.6.0" serde = "1.0.104" tokio = { version = "0.2", features = ["full"] } From c4f15a3f973b734c2d420a7ad5844372d32bf43e Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Mar 2020 17:32:02 +0000 Subject: [PATCH 2/9] Adding a better-structured route for topology --- validator/src/network/rest/mod.rs | 14 ++++++++++++-- validator/src/network/rest/routes/mod.rs | 5 +++++ validator/src/network/rest/routes/topology.rs | 11 +++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 validator/src/network/rest/routes/mod.rs create mode 100644 validator/src/network/rest/routes/topology.rs diff --git a/validator/src/network/rest/mod.rs b/validator/src/network/rest/mod.rs index 30d94edc48..7aa81fc2d6 100644 --- a/validator/src/network/rest/mod.rs +++ b/validator/src/network/rest/mod.rs @@ -1,5 +1,7 @@ use iron::prelude::*; -use iron::status; +use router::Router; + +mod routes; pub struct Api {} @@ -11,8 +13,16 @@ impl Api { pub async fn run(self) { let port = 3000; println!("* starting REST API on localhost:{}", port); - Iron::new(|_: &mut Request| Ok(Response::with((status::Ok, "Hello World!")))) + + let router = self.setup_routes(); + Iron::new(router) .http(format!("localhost:{}", port)) .unwrap(); } + + pub fn setup_routes(&self) -> Router { + let mut router = Router::new(); + router.get("/topology", routes::topology::get, "topology_get"); + router + } } diff --git a/validator/src/network/rest/routes/mod.rs b/validator/src/network/rest/routes/mod.rs new file mode 100644 index 0000000000..9215120198 --- /dev/null +++ b/validator/src/network/rest/routes/mod.rs @@ -0,0 +1,5 @@ +use iron::prelude::*; +use iron::status; +use router::Router; + +pub mod topology; diff --git a/validator/src/network/rest/routes/topology.rs b/validator/src/network/rest/routes/topology.rs new file mode 100644 index 0000000000..83eba696c1 --- /dev/null +++ b/validator/src/network/rest/routes/topology.rs @@ -0,0 +1,11 @@ +use super::*; + +pub fn get(req: &mut Request) -> IronResult { + let ref query = req + .extensions + .get::() + .unwrap() + .find("query") + .unwrap_or("foomp"); + Ok(Response::with((status::Ok, *query))) +} From 4095f33fca00106e0390bd752da8134a95ebcae0 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Mar 2020 18:01:44 +0000 Subject: [PATCH 3/9] validator: adding json-handling functionality --- Cargo.lock | 2 ++ validator/Cargo.toml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index ef8c03da0b..233ea6123c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1641,6 +1641,8 @@ dependencies = [ "pretty_env_logger", "router", "serde", + "serde_derive", + "serde_json", "tempfile", "tokio 0.2.12", "topology", diff --git a/validator/Cargo.toml b/validator/Cargo.toml index ec03206455..2c18c23c89 100644 --- a/validator/Cargo.toml +++ b/validator/Cargo.toml @@ -20,6 +20,8 @@ log = "0.4" pretty_env_logger = "0.3" router = "0.6.0" serde = "1.0.104" +serde_derive = "1.0.104" +serde_json = "1.0.48" tokio = { version = "0.2", features = ["full"] } ## internal From fced1159cecbf81602cb46f299beca4759ee64e5 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Mar 2020 18:02:20 +0000 Subject: [PATCH 4/9] validator: returning empty topology json ready to be filled up from data --- validator/src/network/rest/mod.rs | 1 + validator/src/network/rest/models/mod.rs | 1 + validator/src/network/rest/models/presence.rs | 36 +++++++++++++++++++ validator/src/network/rest/routes/mod.rs | 1 - validator/src/network/rest/routes/topology.rs | 15 ++++---- 5 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 validator/src/network/rest/models/mod.rs create mode 100644 validator/src/network/rest/models/presence.rs diff --git a/validator/src/network/rest/mod.rs b/validator/src/network/rest/mod.rs index 7aa81fc2d6..17a87785b9 100644 --- a/validator/src/network/rest/mod.rs +++ b/validator/src/network/rest/mod.rs @@ -1,6 +1,7 @@ use iron::prelude::*; use router::Router; +mod models; mod routes; pub struct Api {} diff --git a/validator/src/network/rest/models/mod.rs b/validator/src/network/rest/models/mod.rs new file mode 100644 index 0000000000..bb4ee05c5c --- /dev/null +++ b/validator/src/network/rest/models/mod.rs @@ -0,0 +1 @@ +pub mod presence; diff --git a/validator/src/network/rest/models/presence.rs b/validator/src/network/rest/models/presence.rs new file mode 100644 index 0000000000..300e80ca6d --- /dev/null +++ b/validator/src/network/rest/models/presence.rs @@ -0,0 +1,36 @@ +use serde::{Deserialize, Serialize}; + +// Topology shows us the current state of the overall Nym network +#[derive(Serialize, Deserialize, Debug)] +pub struct Topology { + pub validators: Vec, + pub mix_nodes: Vec, + pub service_providers: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Validator { + host: String, + public_key: String, + version: String, + last_seen: u64, + location: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct MixNode { + host: String, + public_key: String, + version: String, + last_seen: u64, + location: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ServiceProvider { + host: String, + public_key: String, + version: String, + last_seen: u64, + location: String, +} diff --git a/validator/src/network/rest/routes/mod.rs b/validator/src/network/rest/routes/mod.rs index 9215120198..1265efcf40 100644 --- a/validator/src/network/rest/routes/mod.rs +++ b/validator/src/network/rest/routes/mod.rs @@ -1,5 +1,4 @@ use iron::prelude::*; use iron::status; -use router::Router; pub mod topology; diff --git a/validator/src/network/rest/routes/topology.rs b/validator/src/network/rest/routes/topology.rs index 83eba696c1..e2253c67d2 100644 --- a/validator/src/network/rest/routes/topology.rs +++ b/validator/src/network/rest/routes/topology.rs @@ -1,11 +1,12 @@ use super::*; +use crate::network::rest::models::presence; pub fn get(req: &mut Request) -> IronResult { - let ref query = req - .extensions - .get::() - .unwrap() - .find("query") - .unwrap_or("foomp"); - Ok(Response::with((status::Ok, *query))) + let topology = presence::Topology { + mix_nodes: Vec::::new(), + service_providers: Vec::::new(), + validators: Vec::::new(), + }; + let resp = serde_json::to_string_pretty(&topology).unwrap(); + Ok(Response::with((status::Ok, resp))) } From 2bd837a1e4357924f34ca0ef06ecef9596d02f26 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Mar 2020 18:05:21 +0000 Subject: [PATCH 5/9] validator: fixing unused variable and spelling warnings --- validator/src/network/rest/routes/topology.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/validator/src/network/rest/routes/topology.rs b/validator/src/network/rest/routes/topology.rs index e2253c67d2..8257f66a9a 100644 --- a/validator/src/network/rest/routes/topology.rs +++ b/validator/src/network/rest/routes/topology.rs @@ -1,12 +1,12 @@ use super::*; use crate::network::rest::models::presence; -pub fn get(req: &mut Request) -> IronResult { +pub fn get(_req: &mut Request) -> IronResult { let topology = presence::Topology { mix_nodes: Vec::::new(), service_providers: Vec::::new(), validators: Vec::::new(), }; - let resp = serde_json::to_string_pretty(&topology).unwrap(); - Ok(Response::with((status::Ok, resp))) + let response = serde_json::to_string_pretty(&topology).unwrap(); + Ok(Response::with((status::Ok, response))) } From 1b844292a971767b2eda871aaa0d66d7b7f3333d Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Mar 2020 18:09:15 +0000 Subject: [PATCH 6/9] validator: noted the need for some Tendermint startup tenderness and love --- validator/src/validator.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/validator/src/validator.rs b/validator/src/validator.rs index da14ac78ac..ae3f79f4d0 100644 --- a/validator/src/validator.rs +++ b/validator/src/validator.rs @@ -6,7 +6,6 @@ use crypto::identity::MixIdentityKeyPair; use healthcheck::HealthChecker; use tokio::runtime::Runtime; -// allow for a generic validator pub struct Validator { // when you re-introduce keys, check which ones you want: // MixIdentityKeyPair (like 'nym-client' ) <- probably that one (after maybe renaming to just identity::KeyPair) @@ -16,7 +15,6 @@ pub struct Validator { rest_api: rest::Api, } -// but for time being, since it's a dummy one, have it use dummy keys impl Validator { pub fn new(config: Config) -> Self { let dummy_healthcheck_keypair = MixIdentityKeyPair::new(); @@ -44,14 +42,15 @@ impl Validator { } } + // TODO: Fix Tendermint startup here, see https://github.com/nymtech/nym/issues/147 pub fn start(self) { let mut rt = Runtime::new().unwrap(); rt.spawn(self.health_check_runner.run()); rt.spawn(self.rest_api.run()); rt.spawn(self.tendermint_abci.run()); - println!("Validator startup complete."); // TODO: Not immensely important to me right now, but why doesn't this get hit? + println!("Validator startup complete."); rt.block_on(blocker()); } } -pub async fn blocker() {} +pub async fn blocker() {} // once Tendermint unblocks us, make this block forever. From bb235cb7f1422fa620913f8ef681aab6f0e81890 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Mar 2020 18:11:36 +0000 Subject: [PATCH 7/9] validator: noting async nature of spawn causes out of order messages --- validator/src/validator.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/validator/src/validator.rs b/validator/src/validator.rs index ae3f79f4d0..9c12cef95a 100644 --- a/validator/src/validator.rs +++ b/validator/src/validator.rs @@ -48,6 +48,8 @@ impl Validator { rt.spawn(self.health_check_runner.run()); rt.spawn(self.rest_api.run()); rt.spawn(self.tendermint_abci.run()); + + // TODO: this message is going to come out of order (if at all), as spawns are async println!("Validator startup complete."); rt.block_on(blocker()); } From e6ac9667577d9a72c19bf18e5913581775788e2f Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Tue, 17 Mar 2020 09:42:52 +0000 Subject: [PATCH 8/9] validator: using fully-qualified struct names to eliminate a bit of noise --- validator/src/network/rest/routes/topology.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/validator/src/network/rest/routes/topology.rs b/validator/src/network/rest/routes/topology.rs index 8257f66a9a..2b72ccad3f 100644 --- a/validator/src/network/rest/routes/topology.rs +++ b/validator/src/network/rest/routes/topology.rs @@ -1,11 +1,11 @@ use super::*; -use crate::network::rest::models::presence; +use crate::network::rest::models::presence::{MixNode, ServiceProvider, Topology, Validator}; pub fn get(_req: &mut Request) -> IronResult { - let topology = presence::Topology { - mix_nodes: Vec::::new(), - service_providers: Vec::::new(), - validators: Vec::::new(), + let topology = Topology { + mix_nodes: Vec::::new(), + service_providers: Vec::::new(), + validators: Vec::::new(), }; let response = serde_json::to_string_pretty(&topology).unwrap(); Ok(Response::with((status::Ok, response))) From 684f7a143257c288d35e1425b0c17b778453b807 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Tue, 17 Mar 2020 10:54:47 +0000 Subject: [PATCH 9/9] validator: removed unneeded serde_derive --- Cargo.lock | 1 - validator/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 233ea6123c..8e70bb3cfb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1641,7 +1641,6 @@ dependencies = [ "pretty_env_logger", "router", "serde", - "serde_derive", "serde_json", "tempfile", "tokio 0.2.12", diff --git a/validator/Cargo.toml b/validator/Cargo.toml index 2c18c23c89..f000bdb199 100644 --- a/validator/Cargo.toml +++ b/validator/Cargo.toml @@ -20,7 +20,6 @@ log = "0.4" pretty_env_logger = "0.3" router = "0.6.0" serde = "1.0.104" -serde_derive = "1.0.104" serde_json = "1.0.48" tokio = { version = "0.2", features = ["full"] }