Gunnar

mikronova/draupnir

examples/youki_smoke.rs

//! Single-threaded smoke driver for the daemon-less youki path — used to isolate
//! whether the rootless run works outside the multi-threaded cargo-test harness.
//! `cargo run --example youki_smoke --features backend-youki`
#[cfg(feature = "backend-youki")]
fn main() {
    use draupnir::youki::{YoukiRuntime, YoukiSpec};
    use std::path::PathBuf;
    use std::time::Duration;

    let _ = tracing_subscriber::fmt()
        .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
        .with_writer(std::io::stderr)
        .try_init();

    let bundle = std::env::temp_dir().join(format!("youki-smoke-{}", std::process::id()));
    let _ = std::fs::remove_dir_all(&bundle);
    let rootfs = bundle.join("rootfs");
    for d in ["bin", "proc", "dev", "sys", "signal", "tmp"] {
        std::fs::create_dir_all(rootfs.join(d)).unwrap();
    }
    std::fs::copy("/usr/bin/busybox", rootfs.join("bin/busybox")).unwrap();
    use std::os::unix::fs::PermissionsExt;
    std::fs::set_permissions(
        rootfs.join("bin/busybox"),
        std::fs::Permissions::from_mode(0o755),
    )
    .unwrap();
    let host_signal = bundle.join("signal-host");
    std::fs::create_dir_all(&host_signal).unwrap();

    let spec = YoukiSpec::new([
        "/bin/busybox",
        "sh",
        "-c",
        "echo CONTAINER-READY > /signal/ready; sleep 2",
    ])
    .with_bind(host_signal.clone(), "/signal", false);
    YoukiRuntime::write_bundle_config(&bundle, &spec).unwrap();

    let sentinel: PathBuf = host_signal.join("ready");
    let probe = sentinel.clone();
    let rt = YoukiRuntime::new();
    let r = rt.run_until_ready(
        &format!("youki-smoke-{}", std::process::id()),
        &bundle,
        Duration::from_secs(15),
        move || {
            std::fs::read_to_string(&probe)
                .map(|s| s.contains("CONTAINER-READY"))
                .unwrap_or(false)
        },
    );
    println!("run_until_ready => {r:?}");
    println!(
        "sentinel => {:?}",
        std::fs::read_to_string(&sentinel).unwrap_or_default()
    );
    let _ = std::fs::remove_dir_all(&bundle);
    if r.is_err() {
        std::process::exit(1);
    }
}

#[cfg(not(feature = "backend-youki"))]
fn main() {
    eprintln!("build with --features backend-youki");
}