add more job run details

This commit is contained in:
Stuart Axelbrooke 2025-10-14 19:54:03 -07:00
parent ea85af4d2b
commit d7fb2323d8

View file

@ -1,9 +1,9 @@
use crate::build_event_log::{BELStorage, MemoryBELStorage};
use crate::data_build_event::Event;
use crate::JobRunStatus;
use crate::{JobRunHeartbeatEventV1, JobRunStatus};
use std::error::Error;
use std::io::BufRead;
use std::process::Child;
use std::process::{Child, Command, Stdio};
use uuid::Uuid;
// TODO log to /var/log/databuild/jobruns/$JOB_RUN_ID/, and rotate over max size (e.g. only ever use 1GB for logs)
@ -11,8 +11,12 @@ use uuid::Uuid;
pub trait JobRun {
fn id(&self) -> Uuid;
/**
Visit is responsible for observing the state of the job run,
*/
fn visit(&mut self) -> Result<JobRunPollResult, Box<dyn Error>>;
fn cancel(&mut self) -> Result<(), Box<dyn Error>>;
fn run(&mut self) -> Result<JobRunHeartbeatEventV1, Box<dyn Error>>;
}
pub enum JobRunConfig {
@ -28,8 +32,11 @@ pub fn spawn_job_run(config: JobRunConfig) -> Result<Box<dyn JobRun>, Box<dyn Er
pub struct SubProcessJobRun {
pub job_run_id: Uuid,
pub process: Child,
pub process: Option<Child>,
pub storage: MemoryBELStorage,
pub running: bool,
pub entry_point: String,
pub args: Vec<String>,
}
impl JobRun for SubProcessJobRun {
@ -44,11 +51,28 @@ impl JobRun for SubProcessJobRun {
fn cancel(&mut self) -> Result<(), Box<dyn Error>> {
todo!()
}
fn run(&mut self) -> Result<JobRunHeartbeatEventV1, Box<dyn Error>> {
self.process = Some(Command::new(self.entry_point.clone())
.args(self.args.clone())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn()?);
self.running = true;
Ok(JobRunHeartbeatEventV1 { job_run_id: self.id().to_string() })
}
}
impl SubProcessJobRun {
pub fn spawn(entry_point: String, args: Vec<String>) -> Result<Box<dyn JobRun>, Box<dyn Error>> {
todo!()
Ok(Box::new(SubProcessJobRun {
job_run_id: Uuid::new_v4(),
process: None,
storage: MemoryBELStorage::default(),
running: false,
entry_point,
args,
}))
}
}
@ -58,5 +82,36 @@ pub struct JobRunPollResult {
}
mod tests {
/// Happy path - run that succeeds should emit a JobRunSuccessEventV1
#[test]
fn test_job_run_success_returns_job_run_success_event() {
todo!()
}
/// Job that runs for more than 1 heartbeat interval should emit a JobRunHeartbeatEventV1 event
#[test]
fn test_running_job_run_poll_returns_heartbeat() {
todo!()
}
/// Job run that fails should emit a JobRunFailureEventV1
#[test]
fn test_job_run_failure_returns_job_run_failure_event() {
todo!()
}
/// Canceling an event before it completes should result in it:
/// - Stop the actual subprocess (e.g. no output file should be written)
/// - Emitting a JobRunCancelEventV1 event
#[test]
fn test_job_run_cancel_returns_job_run_cancel_event() {
todo!()
}
/// Job run that fails and emits a recognized "dep miss" statement should emit a JobRunMissingDepsEventV1
#[test]
#[ignore]
fn test_job_run_fail_on_missing_deps_should_emit_missing_deps_event() {
todo!()
}
}