#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Identity {
pub run_id: String,
pub instance: Option<String>,
pub uid: Option<String>,
pub namespace: Option<String>,
pub node: Option<String>,
}
impl Identity {
pub fn from_env(run_id: &str) -> Identity {
Identity {
run_id: run_id.to_string(),
instance: var("AGENT_POD_NAME").or_else(|| var("AGENTD_POD_NAME")),
uid: var("AGENT_POD_UID").or_else(|| var("AGENTD_POD_UID")),
namespace: var("AGENT_POD_NAMESPACE").or_else(|| var("AGENTD_POD_NAMESPACE")),
node: var("AGENT_NODE_NAME").or_else(|| var("AGENTD_NODE_NAME")),
}
}
}
fn var(key: &str) -> Option<String> {
std::env::var(key).ok().filter(|v| !v.is_empty())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_env_populates_when_set_and_none_when_absent() {
let all = [
"AGENT_POD_NAME",
"AGENT_POD_UID",
"AGENT_POD_NAMESPACE",
"AGENT_NODE_NAME",
"AGENTD_POD_NAME",
"AGENTD_POD_UID",
"AGENTD_POD_NAMESPACE",
"AGENTD_NODE_NAME",
];
for k in all {
unsafe { std::env::remove_var(k) };
}
let id = Identity::from_env("run-abc");
assert_eq!(id.run_id, "run-abc");
assert_eq!(id.instance, None);
assert_eq!(id.uid, None);
assert_eq!(id.namespace, None);
assert_eq!(id.node, None);
unsafe {
std::env::set_var("AGENTD_POD_NAME", "agent-pod-abc");
std::env::set_var("AGENTD_POD_UID", "f3c1-uid");
std::env::set_var("AGENTD_POD_NAMESPACE", "agents");
std::env::set_var("AGENTD_NODE_NAME", "node-3");
}
let id = Identity::from_env("run-xyz");
assert_eq!(id.run_id, "run-xyz");
assert_eq!(id.instance.as_deref(), Some("agent-pod-abc"));
assert_eq!(id.uid.as_deref(), Some("f3c1-uid"));
assert_eq!(id.namespace.as_deref(), Some("agents"));
assert_eq!(id.node.as_deref(), Some("node-3"));
for k in [
"AGENTD_POD_NAME",
"AGENTD_POD_UID",
"AGENTD_POD_NAMESPACE",
"AGENTD_NODE_NAME",
] {
unsafe { std::env::remove_var(k) };
}
unsafe {
std::env::set_var("AGENT_POD_NAME", "neutral-pod");
std::env::set_var("AGENT_POD_UID", "neutral-uid");
std::env::set_var("AGENT_POD_NAMESPACE", "neutral-ns");
std::env::set_var("AGENT_NODE_NAME", "neutral-node");
}
let id = Identity::from_env("r");
assert_eq!(id.instance.as_deref(), Some("neutral-pod"));
assert_eq!(id.uid.as_deref(), Some("neutral-uid"));
assert_eq!(id.namespace.as_deref(), Some("neutral-ns"));
assert_eq!(id.node.as_deref(), Some("neutral-node"));
unsafe { std::env::set_var("AGENTD_POD_NAME", "branded-pod") };
assert_eq!(
Identity::from_env("r").instance.as_deref(),
Some("neutral-pod")
);
unsafe { std::env::set_var("AGENT_POD_NAME", "") };
assert_eq!(
Identity::from_env("r").instance.as_deref(),
Some("branded-pod")
);
unsafe { std::env::remove_var("AGENTD_POD_NAME") };
assert_eq!(Identity::from_env("r").instance, None);
for k in all {
unsafe { std::env::remove_var(k) };
}
}
#[test]
fn run_id_is_always_present() {
let id = Identity::from_env("only-run-id");
assert_eq!(id.run_id, "only-run-id");
}
}