From 74db555e6c5d39f0aed7d3b45ac5ca8ffa4764fa Mon Sep 17 00:00:00 2001 From: Alexis Mousset Date: Thu, 31 Dec 2020 10:11:13 +0100 Subject: [PATCH] Work in progress --- relay/sources/relayd/src/api/shared_files.rs | 4 +- .../sources/relayd/src/configuration/main.rs | 58 +++++++++++++------ relay/sources/relayd/src/data/node.rs | 4 ++ relay/sources/relayd/src/lib.rs | 7 ++- .../relayd/tests/files/config/main.conf | 3 +- relay/sources/relayd/tools/config/main.conf | 3 +- 6 files changed, 55 insertions(+), 24 deletions(-) diff --git a/relay/sources/relayd/src/api/shared_files.rs b/relay/sources/relayd/src/api/shared_files.rs index f30e4a4a55..fa43cdf3bc 100644 --- a/relay/sources/relayd/src/api/shared_files.rs +++ b/relay/sources/relayd/src/api/shared_files.rs @@ -147,7 +147,7 @@ pub async fn put( if job_config.nodes.read().await.is_subnode(&file.target_id) { put_local(file, params, job_config, body).await - } else if job_config.cfg.general.node_id == "root" { + } else if job_config.nodes.read().await.my_id() == "root" { Err(RudderError::UnknownNode(file.target_id).into()) } else { put_forward(file, params, job_config, body).await @@ -292,7 +292,7 @@ pub async fn head( if job_config.nodes.read().await.is_subnode(&file.target_id) { head_local(file, params, job_config).await - } else if job_config.cfg.general.node_id == "root" { + } else if job_config.nodes.read().await.my_id() == "root" { Err(RudderError::UnknownNode(file.target_id).into()) } else { head_forward(file, params, job_config).await diff --git a/relay/sources/relayd/src/configuration/main.rs b/relay/sources/relayd/src/configuration/main.rs index ed2c059e39..ba2106b17d 100644 --- a/relay/sources/relayd/src/configuration/main.rs +++ b/relay/sources/relayd/src/configuration/main.rs @@ -17,6 +17,7 @@ use std::{ time::Duration, }; use tracing::debug; +use tracing::warn; pub type BaseDirectory = PathBuf; pub type WatchedDirectory = PathBuf; @@ -60,7 +61,7 @@ where #[derive(Deserialize, Debug, PartialEq, Eq, Clone)] // Default can be implemented in serde using the Default trait pub struct Configuration { - // general section is mandatory + #[serde(default)] pub general: GeneralConfig, #[serde(default)] pub processing: ProcessingConfig, @@ -82,6 +83,18 @@ impl Configuration { } res } + + /// Read current node_id, and handle override by node_id + /// Can be removed once node_id is removed + pub fn read_node_id(&self) -> Result { + Ok(match &self.general.node_id { + Some(id) => { + warn!("node_id setting is deprecated, use node_id_file instead"); + id.clone() + } + None => read_to_string(&self.general.node_id_file)?, + }) + } } impl FromStr for Configuration { @@ -103,8 +116,11 @@ pub struct GeneralConfig { pub nodes_list_file: NodesListFile, #[serde(default = "GeneralConfig::default_nodes_certs_file")] pub nodes_certs_file: NodesCertsFile, - /// No possible sane default value - pub node_id: NodeId, + #[serde(default = "GeneralConfig::default_node_id_file")] + node_id_file: PathBuf, + /// DEPRECATED: Has priority over node_id_file, use the + /// `Configuration::node_id()` method to get correct value + node_id: Option, #[serde(default = "GeneralConfig::default_listen")] pub listen: String, /// None means using the number of available CPUs @@ -129,6 +145,10 @@ impl GeneralConfig { fn default_listen() -> String { "127.0.0.1:3030".to_string() } + + fn default_node_id_file() -> PathBuf { + PathBuf::from("/opt/rudder/etc/uuid.hive") + } } #[derive(Deserialize, Debug, PartialEq, Eq, Copy, Clone)] @@ -456,10 +476,11 @@ mod tests { use super::*; #[test] - fn it_fails_with_empty_config() { - let empty = ""; - let config = empty.parse::(); - assert!(config.is_err()); + fn it_parses_deprecated_node_id() { + let default = "[general]\n\ + node_id = \"test\"\n"; + let config = default.parse::().unwrap(); + assert_eq!(config.read_node_id().unwrap(), "test".to_string()); } #[test] @@ -467,21 +488,20 @@ mod tests { let default = "[general]\n\ node_id = \"root\"\n\ listen = \"relayd:3030\""; - let config = default.parse::().unwrap(); - dbg!(&config); + let _ = default.parse::().unwrap(); } #[test] - fn it_parses_main_configuration_with_defaults() { - let default = "[general]\n\ - node_id = \"root\""; - let config = default.parse::(); + fn it_parses_empty_main_configuration() { + let empty = ""; + let config = empty.parse::().unwrap(); let reference = Configuration { general: GeneralConfig { nodes_list_file: PathBuf::from("/var/rudder/lib/relay/nodeslist.json"), nodes_certs_file: PathBuf::from("/var/rudder/lib/ssl/allnodescerts.pem"), - node_id: "root".to_string(), + node_id: None, + node_id_file: PathBuf::from("/opt/rudder/etc/uuid.hive"), listen: "127.0.0.1:3030".parse().unwrap(), core_threads: None, max_threads: None, @@ -540,7 +560,7 @@ mod tests { }, }; - assert_eq!(config.unwrap(), reference); + assert_eq!(config, reference); } #[test] @@ -563,13 +583,14 @@ mod tests { #[test] fn it_parses_main_configuration() { - let config = Configuration::new("tests/files/config/"); + let config = Configuration::new("tests/files/config/").unwrap(); let reference = Configuration { general: GeneralConfig { nodes_list_file: PathBuf::from("tests/files/nodeslist.json"), nodes_certs_file: PathBuf::from("tests/files/keys/nodescerts.pem"), - node_id: "root".to_string(), + node_id: None, + node_id_file: PathBuf::from("tests/files/config/uuid.hive"), listen: "127.0.0.1:3030".parse().unwrap(), core_threads: None, max_threads: Some(512), @@ -627,6 +648,7 @@ mod tests { path: PathBuf::from("tests/api_shared_folder"), }, }; - assert_eq!(config.unwrap(), reference); + assert_eq!(config, reference); + assert_eq!(config.read_node_id().unwrap(), "root".to_string()); } } diff --git a/relay/sources/relayd/src/data/node.rs b/relay/sources/relayd/src/data/node.rs index 3f443d7f6f..73ec0d2848 100644 --- a/relay/sources/relayd/src/data/node.rs +++ b/relay/sources/relayd/src/data/node.rs @@ -172,6 +172,10 @@ impl NodesList { .and_then(|node| node.certificates.as_ref()) } + pub fn my_id(&self) -> &str { + &self.my_id + } + fn id_from_cert(cert: &X509) -> Result { Ok(cert .subject_name() diff --git a/relay/sources/relayd/src/lib.rs b/relay/sources/relayd/src/lib.rs index 7b726727bd..c36f1824b0 100644 --- a/relay/sources/relayd/src/lib.rs +++ b/relay/sources/relayd/src/lib.rs @@ -22,6 +22,7 @@ use crate::{ logging::LogConfig, main::{Configuration, InventoryOutputSelect, OutputSelect, ReportingOutputSelect}, }, + data::node::NodeId, data::node::NodesList, metrics::{MANAGED_NODES, SUB_NODES}, output::database::{pg_pool, PgPool}, @@ -29,6 +30,7 @@ use crate::{ }; use anyhow::Error; use reqwest::Client; +use std::fs::read_to_string; use std::{fs::create_dir_all, path::Path, process::exit, string::ToString, sync::Arc}; use structopt::clap::crate_version; use tokio::{ @@ -255,7 +257,7 @@ impl JobConfig { .build()?; let nodes = RwLock::new(NodesList::new( - cfg.general.node_id.to_string(), + cfg.read_node_id()?, &cfg.general.nodes_list_file, Some(&cfg.general.nodes_certs_file), )?); @@ -273,7 +275,8 @@ impl JobConfig { async fn reload_nodeslist(&self) -> Result<(), Error> { let mut nodes = self.nodes.write().await; *nodes = NodesList::new( - self.cfg.general.node_id.to_string(), + // Reload node_id too + self.cfg.read_node_id()?, &self.cfg.general.nodes_list_file, Some(&self.cfg.general.nodes_certs_file), )?; diff --git a/relay/sources/relayd/tests/files/config/main.conf b/relay/sources/relayd/tests/files/config/main.conf index 0012a48137..7ad8888442 100644 --- a/relay/sources/relayd/tests/files/config/main.conf +++ b/relay/sources/relayd/tests/files/config/main.conf @@ -1,7 +1,8 @@ [general] nodes_list_file = "tests/files/nodeslist.json" nodes_certs_file = "tests/files/keys/nodescerts.pem" -node_id = "root" +node_id_file = "tests/files/config/uuid.hive" + listen = "127.0.0.1:3030" # By default, the number of CPUs diff --git a/relay/sources/relayd/tools/config/main.conf b/relay/sources/relayd/tools/config/main.conf index 5a35c47f74..dd4955baa3 100644 --- a/relay/sources/relayd/tools/config/main.conf +++ b/relay/sources/relayd/tools/config/main.conf @@ -5,7 +5,8 @@ nodes_list_file = "/var/rudder/lib/relay/nodeslist.json" nodes_certs_file = "/var/rudder/lib/ssl/nodescerts.pem" -node_id = "UNKNOWN" +node_id_file = "/opt/rudder/etc/uuid.hive" + listen = "127.0.0.1:3030" # By default, the number of CPUs