diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-09-17 18:34:35 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-09-17 21:27:22 +0200 |
commit | fef7265a2d0b3ca12f8d1c2c892c45cdd7e31781 (patch) | |
tree | 841377808fb5f3d180f0063765590aed86418ba5 | |
parent | 843bbec317ce4ad148535183b9d973915cdd04ab (diff) | |
download | rebel-fef7265a2d0b3ca12f8d1c2c892c45cdd7e31781.tar rebel-fef7265a2d0b3ca12f8d1c2c892c45cdd7e31781.zip |
runc: pack the outputs configured in the recipe
-rw-r--r-- | src/executor.rs | 6 | ||||
-rw-r--r-- | src/runner/mod.rs | 3 | ||||
-rw-r--r-- | src/runner/runc.rs | 9 | ||||
-rw-r--r-- | src/runner/runc/run.rs | 36 |
4 files changed, 40 insertions, 14 deletions
diff --git a/src/executor.rs b/src/executor.rs index d9cde15..b663713 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -190,6 +190,7 @@ impl<'a> Executor<'a> { input_hash, inherit: inherit_chain.clone(), depends: task_deps.clone(), + output: task_def.output.clone(), env, }; @@ -200,10 +201,7 @@ impl<'a> Executor<'a> { inherit: inherit_chain, depends: task_deps, input_hash, - output: output - .into_iter() - .map(|output| ("default".to_string(), output)) - .collect(), + output, }; meta.save()?; diff --git a/src/runner/mod.rs b/src/runner/mod.rs index b7bd831..700dce7 100644 --- a/src/runner/mod.rs +++ b/src/runner/mod.rs @@ -12,9 +12,10 @@ pub struct Task { pub input_hash: InputHash, pub inherit: Vec<InputHash>, pub depends: HashMap<DependencyHash, Dependency>, + pub output: HashMap<String, Output>, pub env: HashMap<String, String>, } pub trait Runner { - fn run(&self, task: &Task) -> Result<Option<ArchiveHash>>; + fn run(&self, task: &Task) -> Result<HashMap<String, ArchiveHash>>; } diff --git a/src/runner/runc.rs b/src/runner/runc.rs index 464f217..2989e56 100644 --- a/src/runner/runc.rs +++ b/src/runner/runc.rs @@ -2,7 +2,7 @@ mod init; mod run; mod spec; -use std::process; +use std::{collections::HashMap, process}; use ipc_channel::ipc; use nix::{ @@ -20,7 +20,10 @@ use crate::{ }; #[derive(Debug, Deserialize, Serialize)] -struct Request(runner::Task, ipc::IpcSender<Result<Option<ArchiveHash>>>); +struct Request( + runner::Task, + ipc::IpcSender<Result<HashMap<String, ArchiveHash>>>, +); fn runner(idmap_finished: ipc::IpcReceiver<()>, channel: ipc::IpcReceiver<Request>) -> ! { idmap_finished @@ -95,7 +98,7 @@ impl RuncRunner { } impl super::Runner for RuncRunner { - fn run(&self, task: &runner::Task) -> Result<Option<ArchiveHash>> { + fn run(&self, task: &runner::Task) -> Result<HashMap<String, ArchiveHash>> { let (reply_tx, reply_rx) = ipc::channel().expect("IPC channel creation failed"); self.channel diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs index da5f13c..460884f 100644 --- a/src/runner/runc/run.rs +++ b/src/runner/runc/run.rs @@ -1,4 +1,8 @@ -use std::{path::Path, process}; +use std::{ + collections::HashMap, + path::{Path, PathBuf}, + process, +}; use nix::mount::{self, MsFlags}; use sha2::Digest; @@ -160,12 +164,15 @@ fn unpack_dependencies(task: &runner::Task) -> Result<()> { Ok(()) } -fn collect_output(task: &runner::Task) -> Result<Option<ArchiveHash>> { - let source = paths::join(&[ +fn collect_one_output(task: &runner::Task, path: &str) -> Result<Option<ArchiveHash>> { + let source: PathBuf = [ &paths::task_tmp_dir(&task.input_hash), paths::TASK_TMP_DEST_SUBDIR, - ]); - if !Path::new(&source).is_dir() { + path, + ] + .iter() + .collect(); + if !source.is_dir() { return Ok(None); } @@ -190,7 +197,24 @@ fn collect_output(task: &runner::Task) -> Result<Option<ArchiveHash>> { Ok(Some(hash)) } -pub fn handle_task(task: runner::Task) -> Result<Option<ArchiveHash>> { +fn collect_output(task: &runner::Task) -> Result<HashMap<String, ArchiveHash>> { + let mut ret = HashMap::new(); + + for (name, output) in &task.output { + let path = if let Some(path) = &output.path { + path + } else { + "." + }; + if let Some(hash) = collect_one_output(task, path)? { + ret.insert(name.clone(), hash); + } + } + + Ok(ret) +} + +pub fn handle_task(task: runner::Task) -> Result<HashMap<String, ArchiveHash>> { init_task(&task).context("Failed to initialize task")?; unpack_dependencies(&task).context("Failed to unpack dependencies")?; init_task_rootfs(&task).context("Failed to initialize task rootfs")?; |