mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-03 05:10:55 +00:00
container: implement exit code xenbus notification
This commit is contained in:
parent
79acf4e814
commit
496cdd37be
@ -25,8 +25,8 @@ features = ["process"]
|
|||||||
[dependencies.krata]
|
[dependencies.krata]
|
||||||
path = "../shared"
|
path = "../shared"
|
||||||
|
|
||||||
[dependencies.xenevtchn]
|
[dependencies.xenstore]
|
||||||
path = "../libs/xen/xenevtchn"
|
path = "../libs/xen/xenstore"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
|
@ -4,6 +4,7 @@ use crate::childwait::{ChildEvent, ChildWait};
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use nix::{libc::c_int, unistd::Pid};
|
use nix::{libc::c_int, unistd::Pid};
|
||||||
use tokio::{select, time::sleep};
|
use tokio::{select, time::sleep};
|
||||||
|
use xenstore::client::{XsdClient, XsdInterface};
|
||||||
|
|
||||||
pub struct ContainerBackground {
|
pub struct ContainerBackground {
|
||||||
child: Pid,
|
child: Pid,
|
||||||
@ -40,8 +41,11 @@ impl ContainerBackground {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn death(&mut self, code: c_int) -> Result<()> {
|
async fn death(&mut self, code: c_int) -> Result<()> {
|
||||||
println!("[krata] container process exited: status = {}", code);
|
let mut store = XsdClient::open().await?;
|
||||||
println!("[krata] looping forever");
|
store
|
||||||
|
.write_string("krata/guest/exit-code", &code.to_string())
|
||||||
|
.await?;
|
||||||
|
drop(store);
|
||||||
loop {
|
loop {
|
||||||
sleep(Duration::from_secs(1)).await;
|
sleep(Duration::from_secs(1)).await;
|
||||||
}
|
}
|
||||||
|
@ -4,11 +4,10 @@ use advmac::MacAddr6;
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
use ipnetwork::Ipv4Network;
|
use ipnetwork::Ipv4Network;
|
||||||
use krata::{
|
use krata::{
|
||||||
LaunchChannels, LaunchInfo, LaunchNetwork, LaunchNetworkIpv4, LaunchNetworkIpv6,
|
LaunchInfo, LaunchNetwork, LaunchNetworkIpv4, LaunchNetworkIpv6, LaunchNetworkResolver,
|
||||||
LaunchNetworkResolver,
|
|
||||||
};
|
};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
use xenclient::{DomainConfig, DomainDisk, DomainEventChannel, DomainNetworkInterface};
|
use xenclient::{DomainConfig, DomainDisk, DomainNetworkInterface};
|
||||||
use xenstore::client::XsdInterface;
|
use xenstore::client::XsdInterface;
|
||||||
|
|
||||||
use crate::image::{name::ImageName, ImageCompiler, ImageInfo};
|
use crate::image::{name::ImageName, ImageCompiler, ImageInfo};
|
||||||
@ -76,9 +75,6 @@ impl ControllerLaunch<'_> {
|
|||||||
}),
|
}),
|
||||||
env: request.env,
|
env: request.env,
|
||||||
run: request.run,
|
run: request.run,
|
||||||
channels: LaunchChannels {
|
|
||||||
exit: "krata-exit".to_string(),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let cfgblk = ConfigBlock::new(&uuid, &image_info)?;
|
let cfgblk = ConfigBlock::new(&uuid, &image_info)?;
|
||||||
@ -137,7 +133,7 @@ impl ControllerLaunch<'_> {
|
|||||||
script: None,
|
script: None,
|
||||||
}],
|
}],
|
||||||
filesystems: vec![],
|
filesystems: vec![],
|
||||||
event_channels: vec![DomainEventChannel { name: "krata-exit" }],
|
event_channels: vec![],
|
||||||
extra_keys: vec![
|
extra_keys: vec![
|
||||||
("krata/uuid".to_string(), uuid.to_string()),
|
("krata/uuid".to_string(), uuid.to_string()),
|
||||||
(
|
(
|
||||||
@ -177,6 +173,7 @@ impl ControllerLaunch<'_> {
|
|||||||
gateway_mac_string.clone(),
|
gateway_mac_string.clone(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
extra_rw_paths: vec!["krata/guest".to_string()],
|
||||||
};
|
};
|
||||||
match self.context.xen.create(&config).await {
|
match self.context.xen.create(&config).await {
|
||||||
Ok(domid) => Ok((uuid, domid)),
|
Ok(domid) => Ok((uuid, domid)),
|
||||||
|
@ -27,6 +27,7 @@ async fn main() -> Result<()> {
|
|||||||
vifs: vec![],
|
vifs: vec![],
|
||||||
filesystems: vec![],
|
filesystems: vec![],
|
||||||
extra_keys: vec![],
|
extra_keys: vec![],
|
||||||
|
extra_rw_paths: vec![],
|
||||||
event_channels: vec![],
|
event_channels: vec![],
|
||||||
};
|
};
|
||||||
let domid = client.create(&config).await?;
|
let domid = client.create(&config).await?;
|
||||||
|
@ -79,6 +79,7 @@ pub struct DomainConfig<'a> {
|
|||||||
pub filesystems: Vec<DomainFilesystem<'a>>,
|
pub filesystems: Vec<DomainFilesystem<'a>>,
|
||||||
pub event_channels: Vec<DomainEventChannel<'a>>,
|
pub event_channels: Vec<DomainEventChannel<'a>>,
|
||||||
pub extra_keys: Vec<(String, String)>,
|
pub extra_keys: Vec<(String, String)>,
|
||||||
|
pub extra_rw_paths: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XenClient {
|
impl XenClient {
|
||||||
@ -213,6 +214,11 @@ impl XenClient {
|
|||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for path in &config.extra_rw_paths {
|
||||||
|
tx.mknod(format!("{}/{}", dom_path, path).as_str(), rw_perm)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
|
||||||
tx.commit().await?;
|
tx.commit().await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,15 +25,9 @@ pub struct LaunchNetwork {
|
|||||||
pub resolver: LaunchNetworkResolver,
|
pub resolver: LaunchNetworkResolver,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
|
||||||
pub struct LaunchChannels {
|
|
||||||
pub exit: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct LaunchInfo {
|
pub struct LaunchInfo {
|
||||||
pub network: Option<LaunchNetwork>,
|
pub network: Option<LaunchNetwork>,
|
||||||
pub env: Option<Vec<String>>,
|
pub env: Option<Vec<String>>,
|
||||||
pub run: Option<Vec<String>>,
|
pub run: Option<Vec<String>>,
|
||||||
pub channels: LaunchChannels,
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user