From 3bfae9c0ad8ee4f4286acef9267fd965021d8d03 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 13 Aug 2023 22:53:37 +0200 Subject: [PATCH] Port worker page --- src/server/web.rs | 4 +- src/server/web/pages.rs | 1 + src/server/web/pages/worker.rs | 86 ++++++++++++++++++++++++++++++++++ src/server/web/worker.rs | 46 ------------------ src/server/workers.rs | 2 + templates/pages/worker.html | 31 ++++++++++++ templates/worker.html | 14 ------ 7 files changed, 121 insertions(+), 63 deletions(-) create mode 100644 src/server/web/pages/worker.rs delete mode 100644 src/server/web/worker.rs create mode 100644 templates/pages/worker.html delete mode 100644 templates/worker.html diff --git a/src/server/web.rs b/src/server/web.rs index 8ddd557..da8c19e 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -7,7 +7,6 @@ mod pages; pub mod paths; mod queue; mod r#static; -mod worker; use axum::{routing::get, Router}; use axum_extra::routing::RouterExt; @@ -21,9 +20,8 @@ use self::{ post_api_worker_status, }, index::get_index, - pages::{commit::get_commit_by_hash, run::get_run_by_id}, + pages::{commit::get_commit_by_hash, run::get_run_by_id, worker::get_worker_by_name}, queue::{get_queue, get_queue_inner}, - worker::get_worker_by_name, }; use super::Server; diff --git a/src/server/web/pages.rs b/src/server/web/pages.rs index af3cdf9..6f3956f 100644 --- a/src/server/web/pages.rs +++ b/src/server/web/pages.rs @@ -1,2 +1,3 @@ pub mod commit; pub mod run; +pub mod worker; diff --git a/src/server/web/pages/worker.rs b/src/server/web/pages/worker.rs new file mode 100644 index 0000000..276d907 --- /dev/null +++ b/src/server/web/pages/worker.rs @@ -0,0 +1,86 @@ +use std::sync::{Arc, Mutex}; + +use askama::Template; +use axum::{ + extract::State, + http::StatusCode, + response::{IntoResponse, Response}, +}; +use sqlx::SqlitePool; + +use crate::{ + config::Config, + server::{ + util, + web::{ + base::{Base, Tab}, + link::LinkRunShort, + paths::PathWorkerByName, + }, + workers::Workers, + }, + shared::WorkerStatus, + somehow, +}; + +enum Status { + Idle, + Busy, + Working { link: LinkRunShort, since: String }, +} + +#[derive(Template)] +#[template(path = "pages/worker.html")] +struct Page { + base: Base, + + name: String, + connected: String, + status: Status, +} + +async fn status(status: &WorkerStatus, db: &SqlitePool, base: &Base) -> somehow::Result { + Ok(match status { + WorkerStatus::Idle => Status::Idle, + WorkerStatus::Busy => Status::Busy, + WorkerStatus::Working(unfinished) => { + let message = sqlx::query_scalar!( + "SELECT message FROM commits WHERE hash = ?", + unfinished.run.hash + ) + .fetch_one(db) + .await?; + Status::Working { + link: LinkRunShort::new( + base, + unfinished.run.id.clone(), + &unfinished.run.hash, + &message, + ), + since: util::format_time(unfinished.run.start), + } + } + }) +} + +pub async fn get_worker_by_name( + path: PathWorkerByName, + State(config): State<&'static Config>, + State(db): State, + State(workers): State>>, +) -> somehow::Result { + let info = workers.lock().unwrap().clean().get(&path.name); + let Some(info) = info else { + return Ok(StatusCode::NOT_FOUND.into_response()); + }; + + let base = Base::new(config, Tab::None); + Ok(Page { + name: path.name, + connected: util::format_time(info.first_seen), + status: status(&info.status, &db, &base).await?, + + base, + } + .into_response()) +} diff --git a/src/server/web/worker.rs b/src/server/web/worker.rs deleted file mode 100644 index ef354ef..0000000 --- a/src/server/web/worker.rs +++ /dev/null @@ -1,46 +0,0 @@ -use std::sync::{Arc, Mutex}; - -use askama::Template; -use axum::{ - extract::State, - http::StatusCode, - response::{IntoResponse, Response}, -}; - -use crate::{ - config::Config, - server::{util, workers::Workers}, - somehow, -}; - -use super::{ - base::{Base, Tab}, - paths::PathWorkerByName, -}; - -#[derive(Template)] -#[template(path = "worker.html")] -struct WorkerTemplate { - base: Base, - name: String, - last_seen: String, - // TODO Status -} - -pub async fn get_worker_by_name( - path: PathWorkerByName, - State(config): State<&'static Config>, - State(workers): State>>, -) -> somehow::Result { - let info = workers.lock().unwrap().clean().get(&path.name); - let Some(info) = info else { - return Ok(StatusCode::NOT_FOUND.into_response()); - }; - - Ok(WorkerTemplate { - base: Base::new(config, Tab::None), - name: path.name, - last_seen: util::format_time(info.last_seen), - } - .into_response()) -} diff --git a/src/server/workers.rs b/src/server/workers.rs index 8249897..73f3187 100644 --- a/src/server/workers.rs +++ b/src/server/workers.rs @@ -11,6 +11,7 @@ use crate::{ #[derive(Clone)] pub struct WorkerInfo { pub secret: String, + pub first_seen: OffsetDateTime, pub last_seen: OffsetDateTime, pub status: WorkerStatus, } @@ -19,6 +20,7 @@ impl WorkerInfo { pub fn new(secret: String, last_seen: OffsetDateTime, status: WorkerStatus) -> Self { Self { secret, + first_seen: OffsetDateTime::now_utc(), last_seen, status, } diff --git a/templates/pages/worker.html b/templates/pages/worker.html new file mode 100644 index 0000000..77ba422 --- /dev/null +++ b/templates/pages/worker.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} + +{% block title %}{{ name }}{% endblock %} + +{% block body %} + +

Worker

+ +
+ worker {{ name }} +
+
Connected:
+
{{ connected }}
+ + {% match status %} + {% when Status::Idle %} +
Working on:
+
nothing
+ {% when Status::Busy %} +
Working on:
+
run for another server
+ {% when Status::Working with { link, since } %} +
Working on:
+
{{ link|safe }}
+
Working since:
+
{{ since }}
+ {% endmatch %} +
+
+ +{% endblock %} diff --git a/templates/worker.html b/templates/worker.html deleted file mode 100644 index 3b69aa0..0000000 --- a/templates/worker.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ name }}{% endblock %} - -{% block body %} -

Worker

-
- worker {{ name }} -
-
Last seen:
-
{{ last_seen }}
-
-
-{% endblock %}