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");
}