use crate::model::ContainerSpec;
#[derive(Clone, Debug)]
pub struct Checkpoint {
pub image_ref: String,
pub spec: ContainerSpec,
}
pub(crate) fn generate_image_ref() -> String {
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
static COUNTER: AtomicU64 = AtomicU64::new(0);
let seq = COUNTER.fetch_add(1, Ordering::SeqCst) as u128;
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos())
.unwrap_or(0);
let pid = std::process::id() as u128;
let mixed = nanos
.wrapping_mul(0x9E37_79B9_7F4A_7C15)
.wrapping_add(pid)
.wrapping_add(seq);
let low48 = (mixed & 0xFFFF_FFFF_FFFF) as u64;
format!("rightsize/checkpoint:{low48:012x}")
}
#[cfg(test)]
mod tests {
use super::*;
fn is_twelve_lowercase_hex(s: &str) -> bool {
s.len() == 12
&& s.chars()
.all(|c| c.is_ascii_hexdigit() && !c.is_ascii_uppercase())
}
#[test]
fn generate_image_ref_has_the_pinned_repo_and_a_twelve_hex_tag() {
let r = generate_image_ref();
let tag = r
.strip_prefix("rightsize/checkpoint:")
.unwrap_or_else(|| panic!("expected the rightsize/checkpoint: prefix, got {r}"));
assert!(is_twelve_lowercase_hex(tag), "{r}");
}
#[test]
fn generate_image_ref_differs_across_back_to_back_calls() {
let a = generate_image_ref();
let b = generate_image_ref();
assert_ne!(a, b, "two checkpoints must never share an image ref");
}
}