From 0253d2d90b381d49e44b654904bb32782ce2660a Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 10 Aug 2023 21:26:57 +0200 Subject: [PATCH] Add /runner/:name endpoint --- src/server/runners.rs | 5 +++++ src/server/web.rs | 2 ++ src/server/web/runner.rs | 42 ++++++++++++++++++++++++++++++++++++++++ src/shared.rs | 16 +++++++-------- static/base.css | 26 ++++++++----------------- templates/runner.html | 14 ++++++++++++++ 6 files changed, 79 insertions(+), 26 deletions(-) create mode 100644 src/server/web/runner.rs create mode 100644 templates/runner.html diff --git a/src/server/runners.rs b/src/server/runners.rs index 1680efe..1196dee 100644 --- a/src/server/runners.rs +++ b/src/server/runners.rs @@ -5,6 +5,7 @@ use time::OffsetDateTime; use crate::{config::Config, shared::RunnerStatus}; +#[derive(Clone)] pub struct RunnerInfo { pub secret: String, pub last_seen: OffsetDateTime, @@ -81,4 +82,8 @@ impl Runners { .find(|hash| !covered.contains(hash)) .map(|hash| hash as &str) } + + pub fn get(&self, name: &str) -> Option { + self.runners.get(name).cloned() + } } diff --git a/src/server/web.rs b/src/server/web.rs index 005f8aa..0b021a6 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -2,6 +2,7 @@ mod api; mod commit; mod index; mod queue; +mod runner; mod r#static; use axum::{routing::get, Router}; @@ -44,6 +45,7 @@ pub async fn run(server: Server) -> somehow::Result<()> { let app = Router::new() .route("/", get(index::get)) .route("/commit/:hash", get(commit::get)) + .route("/runner/:name", get(runner::get)) .route("/queue/", get(queue::get)) .route("/queue/table", get(queue::get_table)) .merge(api::router(&server)) diff --git a/src/server/web/runner.rs b/src/server/web/runner.rs new file mode 100644 index 0000000..0c1da68 --- /dev/null +++ b/src/server/web/runner.rs @@ -0,0 +1,42 @@ +use std::sync::{Arc, Mutex}; + +use askama::Template; +use axum::{ + extract::{Path, State}, + http::StatusCode, + response::{IntoResponse, Response}, +}; + +use crate::{ + config::Config, + server::{runners::Runners, util}, + somehow, +}; + +use super::{Base, Tab}; + +#[derive(Template)] +#[template(path = "runner.html")] +struct RunnerTemplate { + base: Base, + name: String, + last_seen: String, + // TODO Status +} + +pub async fn get( + Path(name): Path, + State(config): State<&'static Config>, + State(runners): State>>, +) -> somehow::Result { + let Some(info) = runners.lock().unwrap().get(&name) else { + return Ok(StatusCode::NOT_FOUND.into_response()); + }; + + Ok(RunnerTemplate { + base: Base::new(config, Tab::Commit), + name, + last_seen: util::format_time(info.last_seen), + } + .into_response()) +} diff --git a/src/shared.rs b/src/shared.rs index 20acd8c..262229a 100644 --- a/src/shared.rs +++ b/src/shared.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; use time::OffsetDateTime; -#[derive(Serialize_repr, Deserialize_repr)] +#[derive(Clone, Serialize_repr, Deserialize_repr)] #[repr(i8)] pub enum Direction { LessIsBetter = -1, @@ -14,7 +14,7 @@ pub enum Direction { MoreIsBetter = 1, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] pub struct Measurement { pub value: f64, pub stddev: Option, @@ -22,7 +22,7 @@ pub struct Measurement { pub direction: Option, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] #[serde(rename = "snake_case")] #[serde(tag = "type")] pub enum Line { @@ -30,7 +30,7 @@ pub enum Line { Stderr(String), } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] pub struct FinishedRun { pub id: String, pub start: OffsetDateTime, @@ -40,7 +40,7 @@ pub struct FinishedRun { pub measurements: HashMap, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] #[serde(rename = "snake_case")] #[serde(tag = "type")] pub enum RunnerStatus { @@ -57,7 +57,7 @@ pub enum RunnerStatus { }, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] pub struct RunnerRequest { /// Additional free-form info about the runner. /// @@ -80,7 +80,7 @@ pub struct RunnerRequest { pub submit_work: Option, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] #[serde(rename = "snake_case")] #[serde(tag = "type")] pub enum BenchMethod { @@ -90,7 +90,7 @@ pub enum BenchMethod { BenchRepo { hash: String }, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] pub struct Work { /// Hash of commit to benchmark. pub hash: String, diff --git a/static/base.css b/static/base.css index c02fc02..cd15a4f 100644 --- a/static/base.css +++ b/static/base.css @@ -21,6 +21,12 @@ a:hover { font-weight: bold; } +dl { + display: grid; + grid: auto-flow / min-content 1fr; + column-gap: 1ch; +} + dd { margin-left: 4ch; } @@ -116,34 +122,18 @@ nav a:hover { font-weight: bold; } -.commit dl { - display: grid; - grid: auto-flow / min-content 1fr; - column-gap: 1ch; -} - .commit pre { margin: 1em 0ch 1em 4ch; white-space: pre-wrap; } -/* Task */ +/* Runner */ -.task * { - margin: 0; -} - -.task .id { +.runner .name { color: #380; font-weight: bold; } -.task dl { - display: grid; - grid: auto-flow / min-content 1fr; - column-gap: 1ch; -} - /* Queue */ .queue td:nth-child(2), diff --git a/templates/runner.html b/templates/runner.html new file mode 100644 index 0000000..16234ad --- /dev/null +++ b/templates/runner.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ name }}{% endblock %} + +{% block body %} +

Runner

+
+ runner {{ name }} +
+
Last seen:
+
{{ last_seen }}
+
+
+{% endblock %}