Skip to main content

resource_tracker/collector/clouds/
upcloud.rs

1use crate::metrics::CloudInfo;
2use serde::Deserialize;
3
4use super::{imds_get, new_imds_agent};
5
6#[derive(Debug, Deserialize)]
7struct Metadata {
8    cloud_name: Option<String>,
9    region: Option<String>,
10}
11
12pub fn probe() -> Option<CloudInfo> {
13    let agent = new_imds_agent();
14    let body = imds_get(&agent, "http://169.254.169.254/metadata/v1.json")?;
15    let meta: Metadata = serde_json::from_str(&body).ok()?;
16    if meta.cloud_name.as_deref() != Some("upcloud") {
17        return None;
18    }
19
20    Some(CloudInfo {
21        cloud_vendor_id: Some("upcloud".to_string()),
22        cloud_account_id: None,
23        cloud_region_id: meta.region.filter(|s| !s.is_empty() && s != "unknown"),
24        cloud_zone_id: None,
25        cloud_instance_type: None,
26    })
27}