diff --git a/frontend/src/pages/workers/index.vue b/frontend/src/pages/workers/index.vue index eaceac2..4bcd6db 100644 --- a/frontend/src/pages/workers/index.vue +++ b/frontend/src/pages/workers/index.vue @@ -38,6 +38,13 @@
Last seen {{ new TimeAgo('en-US').format(new Date((item as Worker).last_heartbeat_time)) }} +
+
+ Running job + + # {{ (item as Worker).running_job_id }} + +
@@ -71,6 +78,7 @@ logical_cores: number; memory_bytes: number; disk_free_space_bytes: number; + running_job_id: number; } export default { diff --git a/server/src/routes/worker.rs b/server/src/routes/worker.rs index b5b8a1e..da11e53 100644 --- a/server/src/routes/worker.rs +++ b/server/src/routes/worker.rs @@ -18,7 +18,7 @@ use common::{ WorkerPollResponse, }; -use diesel::BoolExpressionMethods; +use diesel::{BoolExpressionMethods, JoinOnDsl, NullableExpressionMethods}; use diesel::{Connection, ExpressionMethods, OptionalExtension, QueryDsl, RunQueryDsl}; use octocrab::models::CheckRunId; use octocrab::params::checks::CheckRunConclusion; @@ -46,6 +46,8 @@ pub struct WorkerListResponseItem { disk_free_space_bytes: i64, is_live: bool, last_heartbeat_time: DateTime, + // status + running_job_id: Option, } #[derive(Serialize)] @@ -71,18 +73,28 @@ pub async fn worker_list( let workers = if query.items_per_page == -1 { crate::schema::workers::dsl::workers .order_by(crate::schema::workers::dsl::arch) - .load::(conn)? + .left_join( + crate::schema::jobs::dsl::jobs + .on(crate::schema::jobs::dsl::assigned_worker_id + .eq(crate::schema::workers::dsl::id.nullable())), + ) + .load::<(Worker, Option)>(conn)? } else { crate::schema::workers::dsl::workers .order_by(crate::schema::workers::dsl::arch) .offset((query.page - 1) * query.items_per_page) .limit(query.items_per_page) - .load::(conn)? + .left_join( + crate::schema::jobs::dsl::jobs + .on(crate::schema::jobs::dsl::assigned_worker_id + .eq(crate::schema::workers::dsl::id.nullable())), + ) + .load::<(Worker, Option)>(conn)? }; let mut items = vec![]; let deadline = Utc::now() - chrono::Duration::try_seconds(300).unwrap(); - for worker in workers { + for (worker, job) in workers { items.push(WorkerListResponseItem { id: worker.id, hostname: worker.hostname, @@ -92,6 +104,7 @@ pub async fn worker_list( disk_free_space_bytes: worker.disk_free_space_bytes, is_live: worker.last_heartbeat_time > deadline, last_heartbeat_time: worker.last_heartbeat_time, + running_job_id: job.map(|job| job.id), }); }