summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-09-17 18:34:35 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-09-17 21:27:22 +0200
commitfef7265a2d0b3ca12f8d1c2c892c45cdd7e31781 (patch)
tree841377808fb5f3d180f0063765590aed86418ba5
parent843bbec317ce4ad148535183b9d973915cdd04ab (diff)
downloadrebel-fef7265a2d0b3ca12f8d1c2c892c45cdd7e31781.tar
rebel-fef7265a2d0b3ca12f8d1c2c892c45cdd7e31781.zip
runc: pack the outputs configured in the recipe
-rw-r--r--src/executor.rs6
-rw-r--r--src/runner/mod.rs3
-rw-r--r--src/runner/runc.rs9
-rw-r--r--src/runner/runc/run.rs36
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")?;