use std::time::Instant;
use anyhow::Result;
use serde::Deserialize;
use tracing::{event, Level};
use crate::resmoke::external_cmd::run_command;
#[derive(Debug, Clone, Deserialize)]
pub struct DiscoveredTask {
pub task_name: String,
pub test_list: Vec<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DiscoveredTaskList {
pub discovered_tasks: Vec<DiscoveredTask>,
}
pub trait BurnInDiscovery: Send + Sync {
fn discover_tasks(&self, build_variant: &str) -> Result<Vec<DiscoveredTask>>;
}
pub struct BurnInProxy {
burn_in_tests_cmd: String,
burn_in_tests_script: Vec<String>,
}
impl BurnInProxy {
pub fn new(burn_in_tests_cmd: &str) -> Self {
let cmd_parts: Vec<_> = burn_in_tests_cmd.split(' ').collect();
let cmd = cmd_parts[0];
let script = cmd_parts[1..].iter().map(|s| s.to_string()).collect();
Self {
burn_in_tests_cmd: cmd.to_string(),
burn_in_tests_script: script,
}
}
}
impl BurnInDiscovery for BurnInProxy {
fn discover_tasks(&self, build_variant: &str) -> Result<Vec<DiscoveredTask>> {
let mut cmd = vec![self.burn_in_tests_cmd.as_str()];
cmd.append(
&mut self
.burn_in_tests_script
.iter()
.map(|s| s.as_str())
.collect(),
);
cmd.append(&mut vec!["--build-variant", build_variant, "--yaml"]);
let start = Instant::now();
let cmd_output = run_command(&cmd)?;
event!(
Level::INFO,
duration_ms = start.elapsed().as_millis() as u64,
"Burn In Discovery Finished"
);
let output: DiscoveredTaskList = serde_yaml::from_str(&cmd_output)?;
Ok(output.discovered_tasks)
}
}