diff --git a/config_api.json b/config_api.json index 9136b29..fe911ce 100644 --- a/config_api.json +++ b/config_api.json @@ -1,13 +1,31 @@ -{ - "endpoints" : [ - { - "url" : "http://127.0.0.1:8081/ping", - "method" : "GET" - }, - { - "url" : "http://127.0.0.1:8081/", - "method" : "GET" - } - ], - "delay" : 5 -} \ No newline at end of file +{ + "id" : 1 , + "template" : + [{ + "id" :"mock_api_1", + "name" : "Mock / ", + "url" : "http://127.0.0.1:8081/", + "method" : "GET", + "measure" : + [ + "operation", "response", "empty_field" + ] + }, + { + "id" :"mock_api_2", + "name" : "Mock /ping ", + "url" : "http://127.0.0.1:8081/ping", + "method" : "GET", + "measure" : + [ + "operation", "response", "empty_field" + ] + } + ], + "ip_address" : "127.0.0.1:8081", + "login" : "", + "pass" : "" , + "api_key" : "908c709827bd40n98r7209837x98273", + "period" : 10, + "timeout" : 2 +} diff --git a/crates/api-grub/src/config.rs b/crates/api-grub/src/config.rs index 9a30354..f68e77e 100644 --- a/crates/api-grub/src/config.rs +++ b/crates/api-grub/src/config.rs @@ -1,7 +1,7 @@ // mod to communicate with api-grub config file // 1) check changes in unix-socket // 2) save changes in local config file -use integr_structs::api::ApiConfig; +use integr_structs::api::{ApiConfig, ApiConfigV2}; use anyhow::{Error, Ok, Result}; use log::{info, warn, error}; use std::{fs, path::Path}; @@ -15,7 +15,7 @@ const CONFIG_PATH: &str = "config_api.json"; const SOCKET_PATH: &str = "api-grub.sock"; // todo! rewrite to use current_exe -pub async fn pull_local_config() -> Result { +pub async fn pull_local_config() -> Result { // let conf_path = std::env::current_exe()?; let path = Path::new(CONFIG_PATH); // return match conf_path.parent() { @@ -28,7 +28,7 @@ pub async fn pull_local_config() -> Result { // None => Err(Error::msg("No local conf was found")) // } if path.exists() && path.is_file() { - let config: ApiConfig = from_str( + let config: ApiConfigV2 = from_str( &fs::read_to_string(CONFIG_PATH)? )?; Ok(config) @@ -39,7 +39,7 @@ pub async fn pull_local_config() -> Result { // for config pulling // ++++ reader to channel -pub async fn init_config_grub_mechanism(tx: &Sender) -> Result<()> { +pub async fn init_config_grub_mechanism(tx: &Sender) -> Result<()> { info!("Initializing Unix-Socket listening for pulling new configs..."); let server = init_unix_listener().await?; // @@ -51,7 +51,7 @@ pub async fn init_config_grub_mechanism(tx: &Sender) -> Result<()> { if let Err(er) = stream.read_to_string(&mut buffer).await { warn!("Cannot read config from stream due to {}", er); } else { - let config: Result = from_str(&buffer); + let config: Result = from_str(&buffer); if let stdOk(conf) = config { info!("New config was pulled from Unix-Stream. Saving it locally and sharing with API-grub module..."); if let Err(er) = save_new_config(&buffer).await { @@ -97,13 +97,13 @@ mod config_unittests { #[test] async fn check_save_new_config() { use std::fs; - use integr_structs::api::ApiConfig; + use integr_structs::api::ApiConfigV2; use serde_json::to_string; let test_config_path = "test_config_api.json"; // config gen - let config = to_string::(&ApiConfig::default()); + let config = to_string::(&ApiConfigV2::default()); assert!(config.is_ok()); let config = config.unwrap(); diff --git a/crates/api-grub/src/main.rs b/crates/api-grub/src/main.rs index bbd48ba..2fe4a95 100644 --- a/crates/api-grub/src/main.rs +++ b/crates/api-grub/src/main.rs @@ -3,7 +3,7 @@ mod net; mod logger; use anyhow::Result; -use integr_structs::api::ApiConfig; +use integr_structs::api::ApiConfigV2; use logger::setup_logger; use log::{info, warn}; use config::{pull_local_config, init_config_grub_mechanism}; @@ -19,7 +19,7 @@ async fn main() -> Result<()>{ setup_logger().await?; let config = get_config().await; // config update channel - let (tx, mut rx) = mpsc::channel::(1); + let (tx, mut rx) = mpsc::channel::(1); // futures // todo : rewrite with spawn let config_fut = init_config_grub_mechanism(&tx); @@ -30,7 +30,7 @@ async fn main() -> Result<()>{ Ok(()) } -async fn get_config() -> ApiConfig { +async fn get_config() -> ApiConfigV2 { return match pull_local_config().await { Ok(conf) => { info!("Local config was loaded"); @@ -38,7 +38,7 @@ async fn get_config() -> ApiConfig { }, Err(er) => { warn!("Cannot get local config due to {}", er); - ApiConfig::default() + ApiConfigV2::default() } } } \ No newline at end of file diff --git a/crates/api-grub/src/net.rs b/crates/api-grub/src/net.rs index 62ddb5c..0c6f3bd 100644 --- a/crates/api-grub/src/net.rs +++ b/crates/api-grub/src/net.rs @@ -1,6 +1,6 @@ // module to handle unix-socket connection + pulling info from api use anyhow::{Error, Result}; -use integr_structs::api::ApiConfig; +use integr_structs::api::{ApiConfig, ApiConfigV2, Template}; use log::{error, info}; use tokio::sync::mpsc::Receiver; use tokio::time::{sleep, Duration}; @@ -15,33 +15,37 @@ impl RestMethod { "patch" => Method::PATCH, "put" => Method::PUT, "delete" => Method::DELETE, + "head" => Method::HEAD, + "trace" => Method::TRACE, + "options" => Method::OPTIONS, + "connect" => Method::CONNECT, "get" | _ => Method::GET } } } struct ApiPoll<'a> { - config : &'a mut ApiConfig, + config : &'a mut ApiConfigV2, client : Client, } impl<'a> ApiPoll<'a> { - pub async fn new(poll_cfg : &'a mut ApiConfig) -> Self { + pub async fn new(poll_cfg : &'a mut ApiConfigV2) -> Self { Self { config : poll_cfg, client : Client::new(), } } // can be weak and with bug test needed - pub async fn change_config(&mut self, conf: ApiConfig) { + pub async fn change_config(&mut self, conf: ApiConfigV2) { *self.config = conf; } pub async fn is_default(&self) -> bool { - self.config.endpoints.len() == 0 + self.config.template.len() == 0 } pub async fn process_polling(&self) -> Result> { let mut buffer: Vec = vec![]; // TODO: rewrite nextly to async - for point in &self.config.endpoints { + for point in &self.config.template { // let a = self.client.get(&point.url).send().await.unwrap(); // a.text().await.unwrap(); match self.client.request(RestMethod::from_str(&point.method).await, &point.url).send().await { @@ -51,14 +55,13 @@ impl<'a> ApiPoll<'a> { continue; } if let Ok(text) = resp.text().await { - info!("{}: {} - Successfull grubbing info", &point.method.to_uppercase(), &point.url); buffer.push(text); } else { error!("{}: {} - Error with extracting text field from Response", &point.method.to_uppercase(), &point.url); } }, Err(er) => { - error!("{}: {} - Query crushed due to {}", &point.method.to_uppercase(), &point.url, er); + error!("{}: {} endpoint is unreachable", &point.method.to_uppercase(), &point.url); }, } } @@ -68,12 +71,12 @@ impl<'a> ApiPoll<'a> { } } pub async fn get_delay(&self) -> u32 { - self.config.delay + self.config.timeout } } // for api info pulling -pub async fn init_api_grub_mechanism(config: ApiConfig, rx: &mut Receiver) -> Result<()> { +pub async fn init_api_grub_mechanism(config: ApiConfigV2, rx: &mut Receiver) -> Result<()> { info!("Initializing API-info grubbing mechanism..."); let mut config = config; let mut poller = ApiPoll::new(&mut config).await; @@ -111,16 +114,16 @@ mod net_unittests { } #[test] async fn check_api_poll_change_config() { - let mut conf1 = ApiConfig::default(); - let conf2 = ApiConfig { endpoints : vec![], delay : 10, }; + let mut conf1 = ApiConfigV2::default(); + let conf2 = ApiConfigV2::pattern(); let mut poll = ApiPoll::new(&mut conf1).await; poll.change_config(conf2).await; - assert_eq!(poll.config.delay, 10) + assert_eq!(poll.config.timeout, 1) } #[test] async fn check_api_poll_is_default() { - let mut conf1 = ApiConfig::default(); + let mut conf1 = ApiConfigV2::default(); let poll = ApiPoll::new(&mut conf1).await; assert!(poll.is_default().await) } @@ -130,15 +133,8 @@ mod net_unittests { use log::{set_max_level, LevelFilter}; set_max_level(LevelFilter::Off); - let mut conf1 = ApiConfig { - endpoints : vec![ - ApiEndpoint { - url : String::from("https://dummy-json.mock.beeceptor.com/countries"), - method: String::from("get"), - }], - delay : 10, - }; - let conf2 = ApiConfig::default(); + let mut conf1 = ApiConfigV2::pattern(); + let conf2 = ApiConfigV2::default(); let mut poll = ApiPoll::new(&mut conf1).await; assert!(poll.process_polling().await.is_ok()); diff --git a/crates/config-delivery/src/delivery.rs b/crates/config-delivery/src/delivery.rs index c75bbf9..6226764 100644 --- a/crates/config-delivery/src/delivery.rs +++ b/crates/config-delivery/src/delivery.rs @@ -2,7 +2,7 @@ // using Unix-Socket Client use anyhow::{Error, Result}; -use integr_structs::api::ApiConfig; +use integr_structs::api::ApiConfigV2; use tokio::time::{sleep, Duration}; use tokio::net::UnixStream; use std::env; @@ -18,7 +18,7 @@ enum UnixSocketConsumer { // to create us-client struct UnixSocketClient; // to catch new configs from integr submod -type ConfigGateway = Receiver; +type ConfigGateway = Receiver; pub async fn init_delivery_mech(rx: ConfigGateway) -> Result<()> { let mut rx = rx; diff --git a/crates/config-delivery/src/integration.rs b/crates/config-delivery/src/integration.rs index b2b9f55..bf883a7 100644 --- a/crates/config-delivery/src/integration.rs +++ b/crates/config-delivery/src/integration.rs @@ -1,18 +1,18 @@ use std::sync::Arc; use tokio::sync::mpsc::Sender; -use integr_structs::api::ApiConfig; +use integr_structs::api::ApiConfigV2; use anyhow::Result; use tokio::time::{sleep, Duration}; // mock -type Worker = Arc>; +type Worker = Arc>; #[allow(dead_code, unused_variables)] pub async fn init_integration_mech(tx: Worker) -> Result<()> { loop { sleep(Duration::from_secs(5)).await; - let conf = ApiConfig::default(); + let conf = ApiConfigV2::default(); tx.send(conf).await?; } // Ok(()) diff --git a/crates/config-delivery/src/main.rs b/crates/config-delivery/src/main.rs index 7f8803b..e5955b7 100644 --- a/crates/config-delivery/src/main.rs +++ b/crates/config-delivery/src/main.rs @@ -2,7 +2,7 @@ mod delivery; mod integration; mod logger; -use integr_structs::api::ApiConfig; +use integr_structs::api::ApiConfigV2; use logger::setup_logger; use dotenv::dotenv; use anyhow::Result; @@ -23,7 +23,7 @@ async fn main() -> Result<()> { info!("Pulling env vars from .env file if exists ..."); dotenv().ok(); - let (tx, rx) = mpsc::channel::(1); + let (tx, rx) = mpsc::channel::(1); let tx = Arc::new(tx); let integr_jh = tokio::spawn( async move { diff --git a/crates/integr-structs/src/api.rs b/crates/integr-structs/src/api.rs index b061f71..4365f3f 100644 --- a/crates/integr-structs/src/api.rs +++ b/crates/integr-structs/src/api.rs @@ -29,24 +29,87 @@ impl Default for ApiConfig { // v2 #[derive(Serialize, Deserialize, Debug)] pub struct ApiConfigV2 { - id : u64, + pub id : u64, #[serde(default)] - template : Vec