pub const ATHENA_MOUNTS_DIR: &str = "/athena/mounts";
pub const ATHENA_PVCS_DIR: &str = "/athena/pvcs";
pub const ATHENA_IN_DIR: &str = "/athena/artifacts/in";
pub const ATHENA_OUT_DIR: &str = "/athena/artifacts/out";
pub fn fnv_1a_64_hex(input: &str) -> String {
const FNV_OFFSET: u64 = 0xcbf29ce484222325;
const FNV_PRIME: u64 = 0x100000001b3;
let mut h = FNV_OFFSET;
for b in input.bytes() {
h ^= b as u64;
h = h.wrapping_mul(FNV_PRIME);
}
format!("{h:016x}")
}
pub fn kebab(s: &str) -> String {
let s = s.replace('_', "-").to_ascii_lowercase();
s.trim_matches('-').to_string()
}
pub fn version_tag(raw: &str) -> String {
let mut out = String::with_capacity(raw.len());
let mut prev_dash = true;
for c in raw.chars() {
let c = c.to_ascii_lowercase();
if c.is_ascii_lowercase() || c.is_ascii_digit() {
out.push(c);
prev_dash = false;
} else if !prev_dash {
out.push('-');
prev_dash = true;
}
}
while out.ends_with('-') {
out.pop();
}
out
}
pub const DEV_PREFIX: &str = "dev-";
pub fn channel_of(tag: &str) -> &'static str {
if tag.starts_with(DEV_PREFIX) {
"dev"
} else {
"release"
}
}
pub fn seal_tag(baked: Option<&str>, semver: &str) -> String {
baked
.map(version_tag)
.filter(|t| !t.is_empty())
.unwrap_or_else(|| version_tag(semver))
}
pub fn binary_key(pkg: &str, tag: &str, bin: &str) -> String {
format!("{pkg}/{tag}/{bin}.tar.gz")
}
pub const LABEL_PKG: &str = "cargo.athena/pkg";
pub const LABEL_VERSION: &str = "cargo.athena/version";
pub const LABEL_BIN: &str = "cargo.athena/bin";
pub const LABEL_TOOLCHAIN: &str = "cargo.athena/toolchain";
pub const LABEL_TAG: &str = "cargo.athena/tag";
pub const LABEL_CHANNEL: &str = "cargo.athena/channel";
pub const LABEL_COMMIT: &str = "cargo.athena/commit";
pub const LABEL_DIRTY: &str = "cargo.athena/dirty";
pub fn host_mount_path(host_path: &str) -> String {
format!("{ATHENA_MOUNTS_DIR}/{}", fnv_1a_64_hex(host_path))
}
pub fn host_volume_name(host_path: &str) -> String {
format!("host-{}", fnv_1a_64_hex(host_path))
}
pub fn pvc_mount_path(argo_name: &str) -> String {
format!("{ATHENA_PVCS_DIR}/{}", fnv_1a_64_hex(argo_name))
}
pub fn pvc_volume_name(argo_name: &str) -> String {
format!("pvc-{}", fnv_1a_64_hex(argo_name))
}
pub fn in_artifact_path(name: &str) -> String {
format!("{ATHENA_IN_DIR}/{name}")
}
pub fn out_artifact_path(name: &str) -> String {
format!("{ATHENA_OUT_DIR}/{name}")
}
pub fn secret_env_name(name: &str, key: &str) -> String {
let mut s = String::from("ATHENA_SEC_");
push_munged(&mut s, name);
s.push_str("__");
push_munged(&mut s, key);
s
}
fn push_munged(out: &mut String, input: &str) {
for c in input.chars() {
out.push(if c.is_ascii_alphanumeric() {
c.to_ascii_uppercase()
} else {
'_'
});
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fnv_pins_known_value() {
assert_eq!(fnv_1a_64_hex("/var/lib"), "5b8d11771a6f946b");
}
#[test]
fn fnv_no_canonicalization() {
assert_ne!(fnv_1a_64_hex("/var/lib"), fnv_1a_64_hex("//var/lib"));
assert_ne!(fnv_1a_64_hex("/var/lib"), fnv_1a_64_hex("/var/lib/"));
assert_ne!(fnv_1a_64_hex("/var/lib"), fnv_1a_64_hex("/var//lib"));
}
#[test]
fn fnv_hex_is_16_chars() {
for input in ["", "/", "x", "/very/deep/nested/path/that/keeps/going"] {
assert_eq!(fnv_1a_64_hex(input).len(), 16);
}
}
#[test]
fn host_volume_name_fits_dns_1123() {
for path in [
"/",
"/etc/myapp",
"/very/deeply/nested/path/that/keeps/going/forever/and/ever/and/ever",
"/has spaces and weird chars: !@#$%",
] {
let n = host_volume_name(path);
assert!(n.len() <= 63, "{n:?} exceeds DNS-1123 label limit");
assert_eq!(n.len(), 21); assert!(n.starts_with("host-"));
assert!(n.chars().next().unwrap().is_ascii_alphabetic());
assert!(
n.chars().all(|c| c.is_ascii_alphanumeric() || c == '-'),
"{n:?} contains non-DNS-1123 chars"
);
}
}
#[test]
fn host_mount_path_agrees_with_volume_name_suffix() {
for path in ["/", "/etc/myapp", "/var/lib"] {
let v = host_volume_name(path);
let m = host_mount_path(path);
let suffix = v.strip_prefix("host-").unwrap();
assert_eq!(
format!("{ATHENA_MOUNTS_DIR}/{suffix}"),
m,
"host-{path} volume + mount disagree on hash suffix"
);
}
}
#[test]
fn kebab_lowercases_and_hyphenates() {
assert_eq!(kebab("run_a_container"), "run-a-container");
assert_eq!(kebab("RunFoo"), "runfoo");
}
#[test]
fn kebab_preserves_digits() {
assert_eq!(kebab("fetch2"), "fetch2");
assert_eq!(kebab("step_1_of_3"), "step-1-of-3");
assert_eq!(kebab("v1_handler"), "v1-handler");
}
#[test]
fn kebab_trims_leading_and_trailing_underscores() {
assert_eq!(kebab("_unused"), "unused");
assert_eq!(kebab("foo_"), "foo");
}
#[test]
fn kebab_keeps_internal_double_underscore() {
assert_eq!(kebab("inner__bar"), "inner--bar");
}
#[test]
fn version_tag_pins_known_values() {
assert_eq!(version_tag("1.2.3"), "1-2-3");
assert_eq!(version_tag("0.0.0"), "0-0-0");
assert_eq!(version_tag("1.0.0-rc.1+build"), "1-0-0-rc-1-build");
assert_eq!(version_tag("dev-foo"), "dev-foo");
assert_eq!(version_tag("dev-a1b2c3d"), "dev-a1b2c3d");
}
#[test]
fn channel_of_keys_off_dev_prefix() {
assert_eq!(channel_of("dev-foo"), "dev");
assert_eq!(channel_of("dev-a1b2c3d"), "dev");
assert_eq!(channel_of("1-2-3"), "release");
assert_eq!(channel_of("0-0-0"), "release");
}
#[test]
fn seal_tag_normalizes_and_falls_back() {
assert_eq!(seal_tag(Some("dev-foo"), "9.9.9"), "dev-foo");
assert_eq!(seal_tag(Some("1.2.3"), "9.9.9"), "1-2-3");
assert_eq!(seal_tag(Some(""), "1.2.3"), "1-2-3");
assert_eq!(seal_tag(Some("+++"), "1.2.3"), "1-2-3");
assert_eq!(seal_tag(None, "1.2.3"), "1-2-3");
}
#[test]
fn binary_key_pins_the_layout() {
assert_eq!(
binary_key("myapp", "1-2-3", "app"),
"myapp/1-2-3/app.tar.gz"
);
assert_eq!(
binary_key("myapp", "dev-foo", "app"),
"myapp/dev-foo/app.tar.gz"
);
}
#[test]
fn version_tag_is_dns_1123_safe() {
for raw in ["1.2.3", "1.0.0-rc.1+build.5", "dev-Foo_Bar", " weird +.+ "] {
let t = version_tag(raw);
assert!(!t.is_empty(), "{raw:?} -> empty tag");
assert!(
t.chars()
.all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '-'),
"{t:?} contains non-DNS-1123 chars"
);
assert!(!t.starts_with('-') && !t.ends_with('-'), "{t:?} edge dash");
assert!(!t.contains("--"), "{t:?} has an uncollapsed run");
}
}
#[test]
fn secret_env_name_uppercases_and_separates() {
assert_eq!(
secret_env_name("github-creds", "token"),
"ATHENA_SEC_GITHUB_CREDS__TOKEN"
);
assert_eq!(
secret_env_name("my.secret-name", "api.key"),
"ATHENA_SEC_MY_SECRET_NAME__API_KEY"
);
}
#[test]
fn secret_env_name_is_valid_posix_env_var() {
let valid_env = |s: &str| {
let mut cs = s.chars();
cs.next()
.is_some_and(|c| c.is_ascii_alphabetic() || c == '_')
&& cs.all(|c| c.is_ascii_alphanumeric() || c == '_')
};
for (name, key) in [
("foo", "bar"),
("my-secret", "db.password"),
("name with spaces", "key/with/slashes"),
("-leading-dash", "trailing.dot."),
("123-numeric-start", "ok"),
] {
let env = secret_env_name(name, key);
assert!(valid_env(&env), "{env} is not a valid POSIX env var");
}
}
}