summaryrefslogtreecommitdiffstats
path: root/src/job/runnable.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-11-04 15:36:30 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-11-04 17:05:34 +0100
commit2c79034534f720bdb60b8f93415e3a838019346f (patch)
tree02f9cf8e58e8eee527125cf13839a471ac7a658d /src/job/runnable.rs
parent786c9e5f9288f520f680ab4b00433afabbcf007c (diff)
Implement artifact finding
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/job/runnable.rs')
-rw-r--r--src/job/runnable.rs37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/job/runnable.rs b/src/job/runnable.rs
index 4377d27..0a2bcb2 100644
--- a/src/job/runnable.rs
+++ b/src/job/runnable.rs
@@ -1,6 +1,10 @@
use getset::Getters;
use uuid::Uuid;
+use anyhow::anyhow;
+use anyhow::Context;
+use anyhow::Error;
use anyhow::Result;
+use resiter::Map;
use crate::job::Job;
use crate::job::JobResource;
@@ -9,6 +13,8 @@ use crate::package::Script;
use crate::package::ScriptBuilder;
use crate::phase::PhaseName;
use crate::util::docker::ImageName;
+use crate::filestore::MergedStores;
+use crate::package::ParseDependency;
/// A job configuration that can be run. All inputs are clear here.
#[derive(Debug, Getters)]
@@ -29,15 +35,42 @@ pub struct RunnableJob {
}
impl RunnableJob {
- pub fn build_from_job(job: Job) -> Result<Self> {
+ pub fn build_from_job<'a>(job: Job, merged_stores: &'a MergedStores<'a>) -> Result<Self> {
let script = ScriptBuilder::new(&job.script_shebang)
.build(&job.package, &job.script_phases)?;
+ let resources = job.package()
+ .dependencies()
+ .build()
+ .into_iter()
+ .map(|runtime_dep| {
+ let (name, version) = runtime_dep.parse_as_name_and_version()?;
+ let mut a = merged_stores.get_artifact_by_name_and_version(&name, &version);
+
+ if a.is_empty() {
+ Err(anyhow!("Cannot find dependency: {:?} {:?}", name, version))
+ .context("Building a runnable job")
+ .map_err(Error::from)
+ } else {
+ a.sort();
+ let a_len = a.len();
+ let found_dependency = a.into_iter().next().unwrap(); // save by above check
+ if a_len > 1 {
+ warn!("Found more than one dependency for {:?} {:?}", name, version);
+ warn!("Using: {:?}", found_dependency);
+ warn!("Please investigate, this might be a BUG");
+ }
+
+ Ok(JobResource::Artifact(found_dependency.clone()))
+ }
+ })
+ .collect::<Result<Vec<JobResource>>>()?;
+
Ok(RunnableJob {
uuid: job.uuid,
package: job.package,
image: job.image,
- resources: job.resources,
+ resources: job.resources.into_iter().chain(resources.into_iter()).collect(),
script,
})