lightswitch_metadata/
system_metadata.rs1use crate::types::{MetadataLabel, SystemMetadataProvider, SystemMetadataProviderError};
2
3use anyhow::Result;
4use nix::sys::utsname;
5
6pub struct SystemMetadata {}
7
8impl SystemMetadataProvider for SystemMetadata {
9 fn get_metadata(&self) -> Result<Vec<MetadataLabel>, SystemMetadataProviderError> {
10 let uname = utsname::uname().map_err(|e| {
11 SystemMetadataProviderError::ErrorRetrievingMetadata(e.desc().to_string())
12 })?;
13 let kernel_release_label = MetadataLabel::from_string_value(
14 "kernel.release".into(),
15 uname.release().to_string_lossy().to_string(),
16 );
17 let architecture_label = MetadataLabel::from_string_value(
18 "kernel.architecture".into(),
19 uname.machine().to_string_lossy().to_string(),
20 );
21 let hostname_label = MetadataLabel::from_string_value(
22 "hostname".into(),
23 uname.nodename().to_string_lossy().to_string(),
24 );
25 Ok(vec![
26 kernel_release_label,
27 architecture_label,
28 hostname_label,
29 ])
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use crate::system_metadata::*;
36 use crate::types::MetadataLabelValue;
37
38 #[test]
39 fn test_get_system_metadata() {
40 let system_metadata = SystemMetadata {};
42 let expected = utsname::uname().unwrap();
43
44 let result = system_metadata.get_metadata();
46
47 assert!(result.is_ok());
49 let labels = result.unwrap();
50
51 assert_eq!(labels.len(), 3);
52 let kernel_release = &labels[0];
53 let machine = &labels[1];
54 let hostname = &labels[2];
55
56 assert_eq!(kernel_release.key, "kernel.release");
57 assert_eq!(
58 kernel_release.value,
59 MetadataLabelValue::String(expected.release().to_string_lossy().to_string())
60 );
61
62 assert_eq!(machine.key, "kernel.architecture");
63 assert_eq!(
64 machine.value,
65 MetadataLabelValue::String(expected.machine().to_string_lossy().to_string())
66 );
67
68 assert_eq!(hostname.key, "hostname");
69 assert_eq!(
70 hostname.value,
71 MetadataLabelValue::String(expected.nodename().to_string_lossy().to_string())
72 );
73 }
74}