use std::time::Duration;
use supermachine::{Image, VmConfig};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let snap_path = std::env::args().nth(1).unwrap_or_else(|| {
format!(
"{}/.local/supermachine-snapshots/nginx_1_27-alpine",
std::env::var("HOME").unwrap()
)
});
let image = Image::from_snapshot(&snap_path)?;
println!("=== image.start() + write_file/read_file + timeout ===");
let vm = image.start(&VmConfig::new())?;
let out = vm
.exec_builder()
.argv(["echo", "hello from start()"])
.timeout(Duration::from_secs(5))
.output()?;
println!(
" echo: status={:?} duration={:?} stdout={:?}",
out.status.code(),
out.duration,
String::from_utf8_lossy(&out.stdout).trim_end()
);
vm.write_file("/tmp/v02-test.txt", b"v0.2 surface works\n")?;
let bytes = vm.read_file("/tmp/v02-test.txt")?;
println!(
" write/read round-trip: {:?}",
String::from_utf8_lossy(&bytes).trim_end()
);
let out = vm
.exec_builder()
.argv(["sh", "-c", "sleep 10; echo never"])
.timeout(Duration::from_millis(500))
.output()?;
println!(
" timeout: timed_out={} duration={:?} status={:?}",
out.timed_out,
out.duration,
out.status.code()
);
vm.stop()?;
println!("OK");
Ok(())
}