Skip to main content

kanade_shared/
subject.rs

1pub const COMMANDS_ALL: &str = "commands.all";
2
3pub fn commands_group(name: &str) -> String {
4    format!("commands.group.{name}")
5}
6
7pub fn commands_pc(pc_id: &str) -> String {
8    format!("commands.pc.{pc_id}")
9}
10
11pub fn commands_deploy(job_id: &str) -> String {
12    format!("commands.deploy.{job_id}")
13}
14
15pub fn results(request_id: &str) -> String {
16    format!("results.{request_id}")
17}
18
19pub fn heartbeat(pc_id: &str) -> String {
20    format!("heartbeat.{pc_id}")
21}
22
23pub fn kill(job_id: &str) -> String {
24    format!("kill.{job_id}")
25}
26
27pub fn inventory(pc_id: &str, category: &str) -> String {
28    format!("inventory.{pc_id}.{category}")
29}
30
31pub const INVENTORY_HW: &str = "hw";
32pub const INVENTORY_SW: &str = "sw";
33pub const INVENTORY_NET: &str = "net";
34
35/// `logs.fetch.<pc_id>` — request/reply: operator (or backend) sends
36/// a `LogsRequest`; the addressed agent replies with the tail of its
37/// local log file. On-demand only, no stream.
38pub fn logs_fetch(pc_id: &str) -> String {
39    format!("logs.fetch.{pc_id}")
40}
41
42/// `inventory.request.<pc_id>` — request/reply: operator asks the
43/// addressed agent to collect WMI inventory NOW (out of band of its
44/// configured cadence) and publish it to `inventory.<pc_id>.hw`.
45/// The reply body is `"ok"` on success or `"error: <reason>"` on
46/// failure — useful for diagnosing WMI repository / permission
47/// issues without waiting for the next scheduled cycle.
48pub fn inventory_request(pc_id: &str) -> String {
49    format!("inventory.request.{pc_id}")
50}
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55
56    #[test]
57    fn commands_all_constant() {
58        assert_eq!(COMMANDS_ALL, "commands.all");
59    }
60
61    #[test]
62    fn commands_group_formats_name() {
63        assert_eq!(commands_group("canary"), "commands.group.canary");
64        assert_eq!(commands_group("wave1"), "commands.group.wave1");
65    }
66
67    #[test]
68    fn commands_pc_formats_id() {
69        assert_eq!(commands_pc("minipc"), "commands.pc.minipc");
70        assert_eq!(commands_pc("PC1234"), "commands.pc.PC1234");
71    }
72
73    #[test]
74    fn commands_deploy_formats_job_id() {
75        let job = "3c3c56b3-c83e-4c27-9fa9-4a75e1f5da6f";
76        assert_eq!(
77            commands_deploy(job),
78            "commands.deploy.3c3c56b3-c83e-4c27-9fa9-4a75e1f5da6f"
79        );
80    }
81
82    #[test]
83    fn results_formats_request_id() {
84        assert_eq!(results("req-1"), "results.req-1");
85    }
86
87    #[test]
88    fn heartbeat_formats_pc_id() {
89        assert_eq!(heartbeat("minipc"), "heartbeat.minipc");
90    }
91
92    #[test]
93    fn kill_formats_job_id() {
94        assert_eq!(kill("testjob1"), "kill.testjob1");
95    }
96
97    #[test]
98    fn logs_fetch_formats_pc_id() {
99        assert_eq!(logs_fetch("minipc"), "logs.fetch.minipc");
100    }
101
102    #[test]
103    fn inventory_formats_pc_id_and_category() {
104        assert_eq!(inventory("minipc", "hw"), "inventory.minipc.hw");
105        assert_eq!(inventory("minipc", INVENTORY_HW), "inventory.minipc.hw");
106        assert_eq!(inventory("minipc", INVENTORY_SW), "inventory.minipc.sw");
107        assert_eq!(inventory("minipc", INVENTORY_NET), "inventory.minipc.net");
108    }
109}