use anyhow::Result;
use monocore::{
config::{Group, GroupEnv, GroupVolume, Monocore, Service, VolumeMount},
orchestration::Orchestrator,
utils,
};
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::DEBUG)
.init();
let build_dir = format!("{}/build", env!("CARGO_MANIFEST_DIR"));
let oci_dir = format!("{}/oci", build_dir);
let rootfs_dir = format!("{}/rootfs", build_dir);
let image_ref = "library/alpine:latest";
let (_, _, rootfs_name) = utils::parse_image_ref(image_ref).unwrap();
let rootfs_dir = format!("{}/reference/{}", rootfs_dir, rootfs_name);
utils::pull_docker_image(&oci_dir, image_ref).await?;
utils::merge_image_layers(&oci_dir, &rootfs_dir, image_ref).await?;
let group = Group::builder()
.name("grouped")
.local_only(true)
.volumes(vec![GroupVolume::builder()
.name("ref_vols")
.path("/Users/steveakinyemi/Desktop/Personal/test2")
.build()])
.envs(vec![GroupEnv::builder()
.name("ref_envs")
.envs(vec!["REFERENCE=steve".parse()?])
.build()])
.build();
let service = Service::builder()
.name("example")
.base("library/alpine:latest")
.group("grouped")
.command("/bin/sh")
.args(vec![
"-c".into(),
"printenv; ls -la /test; ls -la /test2; ls -la /test3".into(),
])
.cpus(1)
.ram(256)
.volumes(vec![
"/Users/steveakinyemi/Desktop/Personal/test:/test".parse()?
])
.envs(vec!["OWNED=steve".parse()?])
.group_volumes(vec![VolumeMount::builder()
.name("ref_vols")
.mount("/Users/steveakinyemi/Desktop/Personal/test2:/test2".parse()?)
.build()])
.group_envs(vec!["ref_envs".into()])
.build();
let config = Monocore::builder()
.services(vec![service])
.groups(vec![group])
.build()?;
let supervisor_path = "../target/release/monokrun";
let mut orchestrator = Orchestrator::new(&build_dir, supervisor_path).await?;
orchestrator.up(config).await?;
Ok(())
}