summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-01-15 23:08:47 +0100
committerMatthias Beyer <mail@beyermatthias.de>2021-01-15 23:08:47 +0100
commit952fa0bee9f57e8650cafd94ff7da0cd2cbd6cb1 (patch)
treed4101e330a8a3178ded6f1acef30538b1adecab6 /src
parentd7d86b67efe088e4412efd975c316a149b52a50a (diff)
parentb49ccfb80215bf34b83ff7222e6526c6b4c88272 (diff)
Merge branch 'filter-jobs'
Diffstat (limited to 'src')
-rw-r--r--src/cli.rs10
-rw-r--r--src/commands/build.rs8
-rw-r--r--src/commands/db.rs40
-rw-r--r--src/util/env.rs13
-rw-r--r--src/util/mod.rs1
5 files changed, 51 insertions, 21 deletions
diff --git a/src/cli.rs b/src/cli.rs
index c58ba1a..7f82994 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -176,6 +176,16 @@ pub fn cli<'a>() -> App<'a> {
.value_name("UUID")
.about("Only list jobs of a certain submit")
)
+
+ .arg(Arg::new("env_filter")
+ .required(false)
+ .multiple(false)
+ .long("env")
+ .short('E')
+ .takes_value(true)
+ .value_name("KV")
+ .about("Filter for this \"key=value\" environment variable")
+ )
)
.subcommand(App::new("job")
diff --git a/src/commands/build.rs b/src/commands/build.rs
index 419f661..75831a6 100644
--- a/src/commands/build.rs
+++ b/src/commands/build.rs
@@ -117,13 +117,7 @@ pub async fn build(repo_root: &Path,
let additional_env = matches.values_of("env")
.unwrap_or_default()
- .map(|s| {
- let v = s.split("=").collect::<Vec<_>>();
- Ok((
- EnvironmentVariableName::from(*v.get(0).ok_or_else(|| anyhow!("Environment variable has no key: {}", s))?),
- String::from(*v.get(1).ok_or_else(|| anyhow!("Environment variable has no key: {}", s))?)
- ))
- })
+ .map(crate::util::env::parse_to_env)
.collect::<Result<Vec<(EnvironmentVariableName, String)>>>()?;
let packages = if let Some(pvers) = pvers {
diff --git a/src/commands/db.rs b/src/commands/db.rs
index 38e1de5..38fd4b3 100644
--- a/src/commands/db.rs
+++ b/src/commands/db.rs
@@ -245,42 +245,54 @@ fn jobs(conn_cfg: DbConnectionConfig, matches: &ArgMatches) -> Result<()> {
use crate::schema::jobs::dsl;
let csv = matches.is_present("csv");
- let hdrs = mk_header(vec!["id", "submit uuid", "job uuid", "time", "endpoint", "success", "package", "version"]);
+ let hdrs = mk_header(vec!["id", "submit uuid", "job uuid", "time", "endpoint", "success", "package", "version", "Env Name", "Env Value"]);
let conn = crate::db::establish_connection(conn_cfg)?;
let jobs = matches.value_of("submit_uuid")
.map(uuid::Uuid::parse_str)
.transpose()?
.map(|submit_uuid| {
- let submit = models::Submit::with_id(&conn, &submit_uuid)?;
-
- models::Job::belonging_to(&submit)
+ let sel = schema::jobs::table
.inner_join(schema::submits::table)
.inner_join(schema::endpoints::table)
.inner_join(schema::packages::table)
- .load::<(models::Job, models::Submit, models::Endpoint, models::Package)>(&conn)
- .map_err(Error::from)
+ .left_outer_join(schema::job_envs::table.inner_join(schema::envvars::table))
+ .filter(schema::submits::uuid.eq(&submit_uuid));
+
+ if let Some((env_name, env_value)) = matches.value_of("filter_env").map(crate::util::env::parse_to_env).transpose()? {
+ sel.filter({
+ use crate::diesel::BoolExpressionMethods;
+
+ schema::envvars::dsl::name
+ .eq(env_name.as_ref())
+ .and(schema::envvars::dsl::value.eq(env_value))
+ })
+ .load::<(models::Job, models::Submit, models::Endpoint, models::Package, Option<(models::JobEnv, models::EnvVar)>)>(&conn)
+ .map_err(Error::from)
+ } else {
+ sel.load::<(models::Job, models::Submit, models::Endpoint, models::Package, Option<(models::JobEnv, models::EnvVar)>)>(&conn)
+ .map_err(Error::from)
+ }
})
.unwrap_or_else(|| {
dsl::jobs
.inner_join(crate::schema::submits::table)
.inner_join(crate::schema::endpoints::table)
.inner_join(crate::schema::packages::table)
- .load::<(models::Job, models::Submit, models::Endpoint, models::Package)>(&conn)
+ .left_outer_join(schema::job_envs::table.inner_join(schema::envvars::table))
+ .load::<(models::Job, models::Submit, models::Endpoint, models::Package, Option<(models::JobEnv, models::EnvVar)>)>(&conn)
.map_err(Error::from)
})?;
let data = jobs.into_iter()
- .map(|(job, submit, ep, package)| {
+ .map(|(job, submit, ep, package, o_env)| {
let success = crate::log::ParsedLog::build_from(&job.log_text)?
.is_successfull()
- .map(|b| if b {
- String::from("yes")
- } else {
- String::from("no")
- })
+ .map(|b| if b { "yes" } else { "no" })
+ .map(String::from)
.unwrap_or_else(|| String::from("unknown"));
- Ok(vec![format!("{}", job.id), submit.uuid.to_string(), job.uuid.to_string(), submit.submit_time.to_string(), ep.name, success, package.name, package.version])
+ let env = o_env.map(|tpl| (tpl.1.name, tpl.1.value)).unwrap_or_default();
+ Ok(vec![format!("{}", job.id), submit.uuid.to_string(), job.uuid.to_string(), submit.submit_time.to_string(), ep.name, success, package.name, package.version, env.0, env.1])
})
.collect::<Result<Vec<_>>>()?;
diff --git a/src/util/env.rs b/src/util/env.rs
new file mode 100644
index 0000000..e210b37
--- /dev/null
+++ b/src/util/env.rs
@@ -0,0 +1,13 @@
+use anyhow::Result;
+use anyhow::anyhow;
+
+use crate::util::EnvironmentVariableName;
+
+pub fn parse_to_env(s: &str) -> Result<(EnvironmentVariableName, String)> {
+ let v = s.split("=").collect::<Vec<_>>();
+ Ok((
+ EnvironmentVariableName::from(*v.get(0).ok_or_else(|| anyhow!("Environment variable has no key: {}", s))?),
+ String::from(*v.get(1).ok_or_else(|| anyhow!("Environment variable has no key: {}", s))?)
+ ))
+}
+
diff --git a/src/util/mod.rs b/src/util/mod.rs
index 7077f47..539919a 100644
--- a/src/util/mod.rs
+++ b/src/util/mod.rs
@@ -29,6 +29,7 @@ impl AsRef<str> for EnvironmentVariableName {
}
pub mod docker;
+pub mod env;
pub mod filters;
pub mod git;
pub mod parser;