#[cfg(all(target_os = "linux", target_arch = "x86_64"))]
fn main() {
use std::time::Duration;
let dir = std::env::args()
.nth(1)
.expect("usage: kvm_api <image_dir-with-metadata.json>");
let image = supermachine::Image::from_snapshot(&dir).expect("Image::from_snapshot");
eprintln!("=== loaded KVM image from {dir}; starting VM via public API ===");
let vm = image
.start(&supermachine::VmConfig::new())
.expect("Image::start");
std::thread::sleep(Duration::from_millis(6000));
let out = vm
.exec_builder()
.argv(["/bin/busybox", "echo", "API_EXEC_OK"])
.output()
.expect("Vm::exec output");
eprintln!(
"=== [start] EXEC: success={} stdout={:?} ===",
out.success(),
String::from_utf8_lossy(&out.stdout).trim_end()
);
vm.stop().expect("Vm::stop");
eprintln!("=== [start] VM stopped cleanly ===");
{
let pooled = image.acquire().expect("Image::acquire");
std::thread::sleep(Duration::from_millis(6000));
let out = pooled
.exec_builder()
.argv(["/bin/busybox", "echo", "ACQUIRE_OK"])
.output()
.expect("acquire exec");
eprintln!(
"=== [acquire] EXEC: success={} stdout={:?} ===",
out.success(),
String::from_utf8_lossy(&out.stdout).trim_end()
);
}
eprintln!("=== [acquire] PooledVm dropped ===");
{
let pool = image.pool().build().expect("PoolBuilder::build");
let pooled = pool.acquire().expect("Pool::acquire");
std::thread::sleep(Duration::from_millis(6000));
let out = pooled
.exec_builder()
.argv(["/bin/busybox", "echo", "POOL_OK"])
.output()
.expect("pool exec");
eprintln!(
"=== [pool] EXEC: success={} stdout={:?} ===",
out.success(),
String::from_utf8_lossy(&out.stdout).trim_end()
);
drop(pooled);
pool.shutdown();
}
eprintln!("=== [pool] done ===");
{
let vm = image
.start(&supermachine::VmConfig::new())
.expect("start for snapshot");
std::thread::sleep(Duration::from_millis(6000));
let snap_dir = format!("{dir}/snap2");
let image2 = vm.snapshot(&snap_dir).expect("Vm::snapshot"); eprintln!("=== [snapshot] captured restorable Image at {snap_dir} ===");
let vm2 = image2
.start(&supermachine::VmConfig::new())
.expect("start restored image");
std::thread::sleep(Duration::from_millis(2000));
let out = vm2
.exec_builder()
.argv(["/bin/busybox", "echo", "RESTORE_OK"])
.output()
.expect("restored exec");
eprintln!(
"=== [snapshot] restored EXEC: success={} stdout={:?} ===",
out.success(),
String::from_utf8_lossy(&out.stdout).trim_end()
);
vm2.stop().expect("stop restored");
}
eprintln!("=== all public-API paths (start/acquire/pool/snapshot) exercised on KVM ===");
}
#[cfg(not(all(target_os = "linux", target_arch = "x86_64")))]
fn main() {
eprintln!("kvm_api is Linux/x86_64 only");
}