1use serde::Deserialize;
4use serde_with::DeserializeFromStr;
5use strum::{Display, EnumString};
6
7#[derive(Copy, Clone, Debug, DeserializeFromStr, Display, EnumString, PartialEq, Eq)]
9pub enum Health {
10 Active,
11 Maintenance,
12 Retired,
13}
14
15#[derive(Copy, Clone, Debug, DeserializeFromStr, Display, EnumString, PartialEq, Eq)]
17pub enum State {
18 Online,
19 Offline,
20}
21
22#[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 #[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}