diff --git a/container/Cargo.toml b/container/Cargo.toml index 8103f46..485dd70 100644 --- a/container/Cargo.toml +++ b/container/Cargo.toml @@ -25,8 +25,8 @@ features = ["process"] [dependencies.krata] path = "../shared" -[dependencies.xenevtchn] -path = "../libs/xen/xenevtchn" +[dependencies.xenstore] +path = "../libs/xen/xenstore" [lib] path = "src/lib.rs" diff --git a/container/src/background.rs b/container/src/background.rs index 5a4acf8..4ed4d11 100644 --- a/container/src/background.rs +++ b/container/src/background.rs @@ -4,6 +4,7 @@ use crate::childwait::{ChildEvent, ChildWait}; use anyhow::Result; use nix::{libc::c_int, unistd::Pid}; use tokio::{select, time::sleep}; +use xenstore::client::{XsdClient, XsdInterface}; pub struct ContainerBackground { child: Pid, @@ -40,8 +41,11 @@ impl ContainerBackground { } async fn death(&mut self, code: c_int) -> Result<()> { - println!("[krata] container process exited: status = {}", code); - println!("[krata] looping forever"); + let mut store = XsdClient::open().await?; + store + .write_string("krata/guest/exit-code", &code.to_string()) + .await?; + drop(store); loop { sleep(Duration::from_secs(1)).await; } diff --git a/controller/src/ctl/launch.rs b/controller/src/ctl/launch.rs index d200a9f..e76a53a 100644 --- a/controller/src/ctl/launch.rs +++ b/controller/src/ctl/launch.rs @@ -4,11 +4,10 @@ use advmac::MacAddr6; use anyhow::{anyhow, Result}; use ipnetwork::Ipv4Network; use krata::{ - LaunchChannels, LaunchInfo, LaunchNetwork, LaunchNetworkIpv4, LaunchNetworkIpv6, - LaunchNetworkResolver, + LaunchInfo, LaunchNetwork, LaunchNetworkIpv4, LaunchNetworkIpv6, LaunchNetworkResolver, }; use uuid::Uuid; -use xenclient::{DomainConfig, DomainDisk, DomainEventChannel, DomainNetworkInterface}; +use xenclient::{DomainConfig, DomainDisk, DomainNetworkInterface}; use xenstore::client::XsdInterface; use crate::image::{name::ImageName, ImageCompiler, ImageInfo}; @@ -76,9 +75,6 @@ impl ControllerLaunch<'_> { }), env: request.env, run: request.run, - channels: LaunchChannels { - exit: "krata-exit".to_string(), - }, }; let cfgblk = ConfigBlock::new(&uuid, &image_info)?; @@ -137,7 +133,7 @@ impl ControllerLaunch<'_> { script: None, }], filesystems: vec![], - event_channels: vec![DomainEventChannel { name: "krata-exit" }], + event_channels: vec![], extra_keys: vec![ ("krata/uuid".to_string(), uuid.to_string()), ( @@ -177,6 +173,7 @@ impl ControllerLaunch<'_> { gateway_mac_string.clone(), ), ], + extra_rw_paths: vec!["krata/guest".to_string()], }; match self.context.xen.create(&config).await { Ok(domid) => Ok((uuid, domid)), diff --git a/libs/xen/xenclient/examples/boot.rs b/libs/xen/xenclient/examples/boot.rs index e21d75d..dbd4142 100644 --- a/libs/xen/xenclient/examples/boot.rs +++ b/libs/xen/xenclient/examples/boot.rs @@ -27,6 +27,7 @@ async fn main() -> Result<()> { vifs: vec![], filesystems: vec![], extra_keys: vec![], + extra_rw_paths: vec![], event_channels: vec![], }; let domid = client.create(&config).await?; diff --git a/libs/xen/xenclient/src/lib.rs b/libs/xen/xenclient/src/lib.rs index 3860699..dcd5031 100644 --- a/libs/xen/xenclient/src/lib.rs +++ b/libs/xen/xenclient/src/lib.rs @@ -79,6 +79,7 @@ pub struct DomainConfig<'a> { pub filesystems: Vec>, pub event_channels: Vec>, pub extra_keys: Vec<(String, String)>, + pub extra_rw_paths: Vec, } impl XenClient { @@ -213,6 +214,11 @@ impl XenClient { .await?; } + for path in &config.extra_rw_paths { + tx.mknod(format!("{}/{}", dom_path, path).as_str(), rw_perm) + .await?; + } + tx.commit().await?; } diff --git a/shared/src/lib.rs b/shared/src/lib.rs index a35252c..8dae750 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -25,15 +25,9 @@ pub struct LaunchNetwork { pub resolver: LaunchNetworkResolver, } -#[derive(Serialize, Deserialize, Debug)] -pub struct LaunchChannels { - pub exit: String, -} - #[derive(Serialize, Deserialize, Debug)] pub struct LaunchInfo { pub network: Option, pub env: Option>, pub run: Option>, - pub channels: LaunchChannels, }