allow use prometheus service discovery files as params

This commit is contained in:
Robin Appelman 2020-01-25 17:33:16 +01:00
commit 5aae476618
5 changed files with 41 additions and 7 deletions

View file

@ -9,6 +9,12 @@ pub enum ParameterError {
MdnsError(#[error(source)] mdns::Error),
#[error(display = "requested mdns host not found")]
MdnsHostNotFound,
#[error(display = "error reading file: {}", _0)]
FilesystemError(#[error(source)] std::io::Error),
#[error(display = "malformed service file: {}", _0)]
Service(#[error(source)] serde_json::Error),
#[error(display = "requested service not found")]
ServiceNotFound,
}
#[derive(Debug, Clone, Deserialize)]
@ -22,6 +28,11 @@ pub enum Parameter {
Value {
value: String,
},
Service {
file: String,
key: String,
value: String,
},
}
impl Parameter {
@ -36,7 +47,19 @@ impl Parameter {
None => Err(ParameterError::MdnsHostNotFound)
}
}
Parameter::Value { value } => Ok(value.clone())
Parameter::Value { value } => Ok(value.clone()),
Parameter::Service {
file, key, value
} => {
let content = tokio::fs::read(file).await?;
let services: Vec<Service> = serde_json::from_slice(&content)?;
services.into_iter().find_map(|service| {
service.labels.get(key)
.filter(|val| *val == value)
.and_then(|_| service.targets.get(0))
.cloned()
}).ok_or(ParameterError::ServiceNotFound)
}
}
}
}
@ -82,4 +105,10 @@ pub enum Method {
Get,
Put,
Post,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Service {
targets: Vec<String>,
labels: HashMap<String, String>,
}

View file

@ -12,7 +12,10 @@ mod trigger;
async fn main() -> Result<(), MainError> {
env_logger::init();
if let Some(path) = std::env::args().nth(1) {
let mut args = std::env::args();
let bin = args.next().unwrap();
if let Some(path) = args.next() {
let mut file = File::open(path).await?;
let mut contents = vec![];
@ -22,7 +25,7 @@ async fn main() -> Result<(), MainError> {
Ok(trigger_manager.run_triggers().await?)
} else {
println!("Usage {} config.toml", std::env::args().next().unwrap());
println!("Usage {} config.toml", bin);
return Ok(());
}
}

View file

@ -6,7 +6,7 @@ use futures_util::future::try_join_all;
use std::time::{Duration, SystemTime};
use reqwest::Client;
use tokio::time::delay_for;
use log::{info, warn};
use log::{info, error};
use err_derive::Error;
pub struct TriggerManager {
@ -70,12 +70,12 @@ impl TriggerManager {
Ok(Some(new_edge)) if new_edge == edge => {
info!("[{}] Edge still valid, triggering", trigger.name);
if let Err(e) = run_action(&trigger.action, &self.http_client).await {
warn!("[{}]: {}", trigger.name, e);
error!("[{}]: {}", trigger.name, e);
}
delay_for(delay_duration).await;
}
Err(e) => {
warn!("[{}]: {}", trigger.name, e);
error!("[{}]: {}", trigger.name, e);
delay_for(error_delay).await;
}
_ => {
@ -88,7 +88,7 @@ impl TriggerManager {
delay_for(delay_duration).await;
}
Err(e) => {
warn!("[{}]: {}", trigger.name, e);
error!("[{}]: {}", trigger.name, e);
delay_for(error_delay).await;
}
}