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),
});
}