hypha: implement basic container init

This commit is contained in:
Alex Zenla
2024-01-22 02:15:53 -08:00
parent db1ba23c8c
commit a412f6e823
10 changed files with 163 additions and 7 deletions

View File

@ -8,12 +8,17 @@ use uuid::Uuid;
pub struct ConfigBlock<'a> {
pub image_info: &'a ImageInfo,
pub config_bundle: Option<&'a str>,
pub file: PathBuf,
pub dir: PathBuf,
}
impl ConfigBlock<'_> {
pub fn new<'a>(uuid: &Uuid, image_info: &'a ImageInfo) -> Result<ConfigBlock<'a>> {
pub fn new<'a>(
uuid: &Uuid,
image_info: &'a ImageInfo,
config_bundle: Option<&'a str>,
) -> Result<ConfigBlock<'a>> {
let mut dir = std::env::temp_dir().clone();
dir.push(format!("hypha-cfg-{}", uuid));
fs::create_dir_all(&dir)?;
@ -21,12 +26,17 @@ impl ConfigBlock<'_> {
file.push("config.squashfs");
Ok(ConfigBlock {
image_info,
config_bundle,
file,
dir,
})
}
pub fn build(&self) -> Result<()> {
let config_bundle_content = match self.config_bundle {
None => None,
Some(path) => Some(fs::read(path)?),
};
let manifest = self.image_info.config.to_string()?;
let mut writer = FilesystemWriter::default();
writer.push_dir(
@ -48,6 +58,18 @@ impl ConfigBlock<'_> {
mtime: 0,
},
)?;
if let Some(config_bundle_content) = config_bundle_content.as_ref() {
writer.push_file(
config_bundle_content.as_slice(),
"/bundle",
NodeHeader {
permissions: 384,
uid: 0,
gid: 0,
mtime: 0,
},
)?;
}
let mut file = File::create(&self.file)?;
writer.write(&mut file)?;
Ok(())

View File

@ -63,6 +63,7 @@ impl Controller {
&mut self,
kernel_path: &str,
initrd_path: &str,
config_bundle_path: Option<&str>,
image: &str,
vcpus: u32,
mem: u64,
@ -70,7 +71,7 @@ impl Controller {
let uuid = Uuid::new_v4();
let name = format!("hypha-{uuid}");
let image_info = self.compile(image)?;
let cfgblk = ConfigBlock::new(&uuid, &image_info)?;
let cfgblk = ConfigBlock::new(&uuid, &image_info, config_bundle_path)?;
cfgblk.build()?;
let image_squashfs_path = image_info
@ -110,6 +111,7 @@ impl Controller {
writable: false,
},
],
filesystems: vec![],
extra_keys: vec![
("hypha/uuid".to_string(), uuid.to_string()),
(