From 5aee54fc1db7a4efac8cc8a6ddce6f9c460321d3 Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Wed, 5 Feb 2020 15:53:02 +0000 Subject: [PATCH] Stubs for validator configs --- validator/src/config/mod.rs | 193 +++++++++++++++++++++++++++++++ validator/src/config/template.rs | 39 +++++++ 2 files changed, 232 insertions(+) create mode 100644 validator/src/config/mod.rs create mode 100644 validator/src/config/template.rs diff --git a/validator/src/config/mod.rs b/validator/src/config/mod.rs new file mode 100644 index 0000000000..87af031006 --- /dev/null +++ b/validator/src/config/mod.rs @@ -0,0 +1,193 @@ +use crate::config::template::config_template; +use config::NymConfig; +use log::*; +use serde::{Deserialize, Serialize}; +use std::net::{IpAddr, SocketAddr}; +use std::path::PathBuf; +use std::str::FromStr; +use std::time; + +mod template; + +// 'DEBUG' +// where applicable, the below are defined in milliseconds +const DEFAULT_PRESENCE_SENDING_DELAY: u64 = 3000; + +#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Config { + validator: Validator, + + mix_mining: MixMining, + + tendermint: Tendermint, + + #[serde(default)] + logging: Logging, + #[serde(default)] + debug: Debug, +} + +impl NymConfig for Config { + fn template() -> &'static str { + config_template() + } + + fn config_file_name() -> String { + "config.toml".to_string() + } + + fn default_root_directory() -> PathBuf { + dirs::home_dir() + .expect("Failed to evaluate $HOME value") + .join(".nym") + .join("validators") + } + + fn root_directory(&self) -> PathBuf { + self.validator.nym_root_directory.clone() + } + + fn config_directory(&self) -> PathBuf { + self.validator + .nym_root_directory + .join(&self.validator.id) + .join("config") + } + + fn data_directory(&self) -> PathBuf { + self.validator + .nym_root_directory + .join(&self.validator.id) + .join("data") + } +} + +impl Config { + pub fn new>(id: S) -> Self { + Config::default().with_id(id) + } + + // builder methods + pub fn with_id>(mut self, id: S) -> Self { + let id = id.into(); + + // calls to any defaults requiring id (see: client, mixnode, provider): + + self.validator.id = id; + self + } + + pub fn with_custom_directory>(mut self, directory_server: S) -> Self { + let directory_server_string = directory_server.into(); + self.debug.presence_directory_server = directory_server_string.clone(); + self + } + + // getters + pub fn get_config_file_save_location(&self) -> PathBuf { + self.config_directory().join(Self::config_file_name()) + } +} + +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Validator { + /// ID specifies the human readable ID of this particular validator. + id: String, + + /// nym_home_directory specifies absolute path to the home nym MixNodes directory. + /// It is expected to use default value and hence .toml file should not redefine this field. + nym_root_directory: PathBuf, +} + +impl Validator {} + +impl Default for Validator { + fn default() -> Self { + Validator { + id: "".to_string(), + nym_root_directory: Config::default_root_directory(), + } + } +} + +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct MixMining {} + +impl Default for MixMining { + fn default() -> Self { + MixMining {} + } +} + +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Tendermint {} + +impl Default for Tendermint { + fn default() -> Self { + Tendermint {} + } +} + +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Logging {} + +impl Default for Logging { + fn default() -> Self { + Logging {} + } +} + +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Debug { + /// Directory server to which the server will be reporting their presence data. + presence_directory_server: String, + + /// Delay between each subsequent presence data being sent. + presence_sending_delay: u64, +} + +impl Debug { + fn default_directory_server() -> String { + #[cfg(feature = "qa")] + return "https://qa-directory.nymtech.net".to_string(); + #[cfg(feature = "local")] + return "http://localhost:8080".to_string(); + + "https://directory.nymtech.net".to_string() + } +} + +impl Default for Debug { + fn default() -> Self { + Debug { + presence_directory_server: Self::default_directory_server(), + presence_sending_delay: DEFAULT_PRESENCE_SENDING_DELAY, + } + } +} + +#[cfg(test)] +mod validator_config { + use super::*; + + #[test] + fn after_saving_default_config_the_loaded_one_is_identical() { + // need to figure out how to do something similar but without touching the disk + // or the file system at all... + let temp_location = tempfile::tempdir().unwrap().path().join("config.toml"); + let default_config = Config::default().with_id("foomp".to_string()); + default_config + .save_to_file(Some(temp_location.clone())) + .unwrap(); + + let loaded_config = Config::load_from_file(Some(temp_location), None).unwrap(); + + assert_eq!(default_config, loaded_config); + } +} diff --git a/validator/src/config/template.rs b/validator/src/config/template.rs new file mode 100644 index 0000000000..42fc0c2f19 --- /dev/null +++ b/validator/src/config/template.rs @@ -0,0 +1,39 @@ +pub(crate) fn config_template() -> &'static str { + // While using normal toml marshalling would have been way simpler with less overhead, + // I think it's useful to have comments attached to the saved config file to explain behaviour of + // particular fields. + // Note: any changes to the template must be reflected in the appropriate structs in mod.rs. + r#" +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +##### main base mixnode config options ##### + +[validator] +# Human readable ID of this particular validator. +id = "{{ provider.id }}" + + + +# nym_home_directory specifies absolute path to the home nym validators directory. +# It is expected to use default value and hence .toml file should not redefine this field. +nym_root_directory = "{{ validator.nym_root_directory }}" + + + +##### logging configuration options ##### + +[logging] + +# TODO + + +##### debug configuration options ##### +# The following options should not be modified unless you know EXACTLY what you are doing +# as if set incorrectly, they may impact your anonymity. + +[debug] + + +"# +}