dora_message/
coordinator_to_cli.rs

1use std::{
2    collections::{BTreeMap, BTreeSet},
3    net::IpAddr,
4};
5
6use uuid::Uuid;
7
8pub use crate::common::{LogLevel, LogMessage, NodeError, NodeErrorCause, NodeExitStatus};
9use crate::{common::DaemonId, id::NodeId, BuildId};
10
11#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
12pub enum ControlRequestReply {
13    Error(String),
14    CoordinatorStopped,
15    DataflowBuildTriggered {
16        build_id: BuildId,
17    },
18    DataflowBuildFinished {
19        build_id: BuildId,
20        result: Result<(), String>,
21    },
22    DataflowStartTriggered {
23        uuid: Uuid,
24    },
25    DataflowSpawned {
26        uuid: Uuid,
27    },
28    DataflowReloaded {
29        uuid: Uuid,
30    },
31    DataflowStopped {
32        uuid: Uuid,
33        result: DataflowResult,
34    },
35    DataflowList(DataflowList),
36    DestroyOk,
37    DaemonConnected(bool),
38    ConnectedDaemons(BTreeSet<DaemonId>),
39    Logs(Vec<u8>),
40    CliAndDefaultDaemonIps {
41        default_daemon: Option<IpAddr>,
42        cli: Option<IpAddr>,
43    },
44}
45
46#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
47pub struct DataflowResult {
48    pub uuid: Uuid,
49    pub timestamp: uhlc::Timestamp,
50    pub node_results: BTreeMap<NodeId, Result<(), NodeError>>,
51}
52
53impl DataflowResult {
54    pub fn ok_empty(uuid: Uuid, timestamp: uhlc::Timestamp) -> Self {
55        Self {
56            uuid,
57            timestamp,
58            node_results: Default::default(),
59        }
60    }
61
62    pub fn is_ok(&self) -> bool {
63        self.node_results.values().all(|r| r.is_ok())
64    }
65}
66
67#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
68pub struct DataflowList(pub Vec<DataflowListEntry>);
69
70impl DataflowList {
71    pub fn get_active(&self) -> Vec<DataflowIdAndName> {
72        self.0
73            .iter()
74            .filter(|d| d.status == DataflowStatus::Running)
75            .map(|d| d.id.clone())
76            .collect()
77    }
78}
79
80#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
81pub struct DataflowListEntry {
82    pub id: DataflowIdAndName,
83    pub status: DataflowStatus,
84}
85
86#[derive(Debug, Clone, Copy, serde::Deserialize, serde::Serialize, PartialEq, Eq)]
87pub enum DataflowStatus {
88    Running,
89    Finished,
90    Failed,
91}
92
93#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
94pub struct DataflowIdAndName {
95    pub uuid: Uuid,
96    pub name: Option<String>,
97}
98
99impl std::fmt::Display for DataflowIdAndName {
100    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
101        if let Some(name) = &self.name {
102            write!(f, "[{name}] {}", self.uuid)
103        } else {
104            write!(f, "[<unnamed>] {}", self.uuid)
105        }
106    }
107}