From a0f5ae8c7f208e6b9fe0dbc46ae751a199663ff4 Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Sat, 18 May 2024 15:58:23 -0700 Subject: [PATCH] add core side interpolation to update --- Cargo.lock | 4 +-- Cargo.toml | 2 +- bin/core/src/api/execute/build.rs | 36 ++++++++++++++++++++---- bin/core/src/api/execute/deployment.rs | 38 ++++++++++++++++++++++---- 4 files changed, 65 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16b38fc48..3697c90ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3515,9 +3515,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "svi" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6136b927b6a7bd321e3ebfd1380d396a6952d4f5c14dcd0893724110d79a5c3b" +checksum = "ecfc625e6292e18db65d1a122cb1ea014dd909622ab0154f068a3990413ff017" dependencies = [ "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 7ce211787..880b12a64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ mongo_indexed = "0.3.0" resolver_api = "1.1.0" parse_csl = "0.1.0" mungos = "0.5.6" -svi = "1.0.0" +svi = "1.0.1" # ASYNC tokio = { version = "1.37.0", features = ["full"] } diff --git a/bin/core/src/api/execute/build.rs b/bin/core/src/api/execute/build.rs index 6e805896e..15fc14d30 100644 --- a/bin/core/src/api/execute/build.rs +++ b/bin/core/src/api/execute/build.rs @@ -184,17 +184,19 @@ impl Resolve for State { .cloned(); // Interpolate variables / secrets into build args - let mut replacers = HashSet::new(); + let mut global_replacers = HashSet::new(); + let mut secret_replacers = HashSet::new(); for arg in &mut build.config.build_args { - // first pass - global variables - don't need replacers. - let (res, _) = svi::interpolate_variables( + // first pass - global variables + let (res, more_replacers) = svi::interpolate_variables( &arg.value, &variables, svi::Interpolator::DoubleBrackets, false, ) .context("failed to interpolate global variables")?; - // second pass - core secrets - need replacers. + global_replacers.extend(more_replacers); + // second pass - core secrets let (res, more_replacers) = svi::interpolate_variables( &res, &core_config.secrets, @@ -202,16 +204,38 @@ impl Resolve for State { false, ) .context("failed to interpolate core secrets")?; - replacers.extend(more_replacers); + secret_replacers.extend(more_replacers); arg.value = res; } + // Show which variables were interpolated + if !global_replacers.is_empty() { + update.push_simple_log( + "interpolate global variables", + global_replacers + .into_iter() + .map(|(value, variable)| format!("{variable} => {value}")) + .collect::>() + .join("\n"), + ); + } + if !secret_replacers.is_empty() { + update.push_simple_log( + "interpolate core secrets", + secret_replacers + .iter() + .map(|(_, variable)| format!("replaced: {variable}")) + .collect::>() + .join("\n"), + ); + } + let res = tokio::select! { res = periphery .request(api::build::Build { build: build.clone(), docker_token, - replacers: replacers.into_iter().collect(), + replacers: secret_replacers.into_iter().collect(), }) => res.context("failed at call to periphery to build"), _ = cancel.cancelled() => { info!("build cancelled during build, cleaning up builder"); diff --git a/bin/core/src/api/execute/deployment.rs b/bin/core/src/api/execute/deployment.rs index ac9742047..cbeabd4f9 100644 --- a/bin/core/src/api/execute/deployment.rs +++ b/bin/core/src/api/execute/deployment.rs @@ -103,17 +103,19 @@ impl Resolve for State { let core_config = core_config(); // Interpolate variables into environment - let mut replacers = HashSet::new(); + let mut global_replacers = HashSet::new(); + let mut secret_replacers = HashSet::new(); for env in &mut deployment.config.environment { - // first pass - global variables - don't need replacers. - let (res, _) = svi::interpolate_variables( + // first pass - global variables + let (res, more_replacers) = svi::interpolate_variables( &env.value, &variables, svi::Interpolator::DoubleBrackets, false, ) .context("failed to interpolate global variables")?; - // second pass - core secrets - need replacers. + global_replacers.extend(more_replacers); + // second pass - core secrets let (res, more_replacers) = svi::interpolate_variables( &res, &core_config.secrets, @@ -121,7 +123,9 @@ impl Resolve for State { false, ) .context("failed to interpolate core secrets")?; - replacers.extend(more_replacers); + secret_replacers.extend(more_replacers); + + // set env value with the result env.value = res; } @@ -130,6 +134,28 @@ impl Resolve for State { update.in_progress(); update.version = version; + // Show which variables were interpolated + if !global_replacers.is_empty() { + update.push_simple_log( + "interpolate global variables", + global_replacers + .into_iter() + .map(|(value, variable)| format!("{variable} => {value}")) + .collect::>() + .join("\n"), + ); + } + if !secret_replacers.is_empty() { + update.push_simple_log( + "interpolate core secrets", + secret_replacers + .iter() + .map(|(_, variable)| format!("replaced: {variable}")) + .collect::>() + .join("\n"), + ); + } + update.id = add_update(update.clone()).await?; let docker_token = core_config @@ -143,7 +169,7 @@ impl Resolve for State { stop_signal, stop_time, docker_token, - replacers: replacers.into_iter().collect(), + replacers: secret_replacers.into_iter().collect(), }) .await {