Skip to main content

lightswitch_metadata/
system_metadata.rs

1use 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        // Given
41        let system_metadata = SystemMetadata {};
42        let expected = utsname::uname().unwrap();
43
44        // When
45        let result = system_metadata.get_metadata();
46
47        // Then
48        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}