lava_api/
worker.rs

1//! Retrieve workers
2
3use serde::Deserialize;
4use serde_with::DeserializeFromStr;
5use strum::{Display, EnumString};
6
7/// The current usage of a worker
8#[derive(Copy, Clone, Debug, DeserializeFromStr, Display, EnumString, PartialEq, Eq)]
9pub enum Health {
10    Active,
11    Maintenance,
12    Retired,
13}
14
15/// The online status of a worker
16#[derive(Copy, Clone, Debug, DeserializeFromStr, Display, EnumString, PartialEq, Eq)]
17pub enum State {
18    Online,
19    Offline,
20}
21
22/// A subset of the available data for a worker from LAVA
23#[derive(Clone, Deserialize, Debug)]
24pub struct Worker {
25    pub hostname: String,
26    pub state: State,
27    pub health: Health,
28}
29
30#[cfg(test)]
31mod tests {
32    use crate::Lava;
33    use boulder::{Buildable, Builder};
34    use futures::TryStreamExt;
35    use lava_api_mock::{LavaMock, PaginationLimits, PopulationParams, SharedState, State, Worker};
36    use persian_rug::Accessor;
37    use std::collections::BTreeMap;
38    use test_log::test;
39
40    /// Stream 51 workers with a page limit of 2 from the server
41    #[test(tokio::test)]
42    async fn test_basic() {
43        let state =
44            SharedState::new_populated(PopulationParams::builder().workers(51usize).build());
45        let server = LavaMock::new(
46            state.clone(),
47            PaginationLimits::builder().workers(Some(2)).build(),
48        )
49        .await;
50
51        let mut map = BTreeMap::new();
52        let start = state.access();
53        for d in start.get_iter::<Worker<State>>() {
54            map.insert(d.hostname.clone(), d.clone());
55        }
56
57        let lava = Lava::new(&server.uri(), None).expect("failed to make lava server");
58
59        let mut lw = lava.workers();
60
61        let mut seen = BTreeMap::new();
62        while let Some(worker) = lw.try_next().await.expect("failed to get worker") {
63            assert!(!seen.contains_key(&worker.hostname));
64            assert!(map.contains_key(&worker.hostname));
65            let wk = map.get(&worker.hostname).unwrap();
66            assert_eq!(worker.hostname, wk.hostname);
67            assert_eq!(worker.state.to_string(), wk.state.to_string());
68            assert_eq!(worker.health.to_string(), wk.health.to_string());
69
70            seen.insert(worker.hostname.clone(), worker.clone());
71        }
72        assert_eq!(seen.len(), 51);
73    }
74}