diff --git a/crates/apollo_deployments/Cargo.toml b/crates/apollo_deployments/Cargo.toml index 5e8de4ce2e8..ca4b676559f 100644 --- a/crates/apollo_deployments/Cargo.toml +++ b/crates/apollo_deployments/Cargo.toml @@ -14,6 +14,8 @@ apollo_config.workspace = true apollo_infra.workspace = true apollo_infra_utils.workspace = true apollo_node_config.workspace = true +jrsonnet-evaluator = { workspace = true } +jrsonnet-stdlib = { workspace = true } phf = { workspace = true, features = ["macros"] } serde.workspace = true serde_json.workspace = true @@ -24,8 +26,6 @@ url.workspace = true [dev-dependencies] apollo_infra_utils = { workspace = true, features = ["testing"] } apollo_node_config = { workspace = true, features = ["testing"] } -jrsonnet-evaluator = { workspace = true } -jrsonnet-stdlib = { workspace = true } tempfile.workspace = true url = { workspace = true, features = ["serde"] } diff --git a/crates/apollo_deployments/src/deployment_definitions_test.rs b/crates/apollo_deployments/src/deployment_definitions_test.rs index d05f1ba6c9b..f1f7a572b01 100644 --- a/crates/apollo_deployments/src/deployment_definitions_test.rs +++ b/crates/apollo_deployments/src/deployment_definitions_test.rs @@ -13,7 +13,7 @@ use crate::deployment_definitions::ComponentConfigInService; use crate::deployments::consolidated::ConsolidatedNodeServiceName; use crate::deployments::distributed::DistributedNodeServiceName; use crate::deployments::hybrid::HybridNodeServiceName; -use crate::jsonnet::{ +use crate::jsonnet_test::{ assert_build_deserializes, assert_infra_matches_rust, test_applicative_matches_app_configs, diff --git a/crates/apollo_deployments/src/jsonnet_generation.rs b/crates/apollo_deployments/src/jsonnet_generation.rs new file mode 100644 index 00000000000..abf05afb40f --- /dev/null +++ b/crates/apollo_deployments/src/jsonnet_generation.rs @@ -0,0 +1,33 @@ +//! Production-capable jsonnet evaluation for assembling deployment config from +//! `build(layout, overrides)`. Shared by the deployment-config generator and the crate tests. + +use std::path::PathBuf; + +use jrsonnet_evaluator::trace::PathResolver; +use jrsonnet_evaluator::{FileImportResolver, State}; +use serde_json::Value; + +const JSONNET_DIR: &str = "crates/apollo_deployments/jsonnet"; + +/// A jrsonnet evaluator with the stdlib installed and file imports resolved relative to the jsonnet +/// dir (so the libraries' `std.*` calls and relative `import`s work). +pub(crate) fn jsonnet_state() -> State { + let mut builder = State::builder(); + builder.context_initializer(jrsonnet_stdlib::ContextInitializer::new(PathResolver::Absolute)); + builder.import_resolver(FileImportResolver::new(vec![PathBuf::from(JSONNET_DIR)])); + builder.build() +} + +/// Evaluates `build(layout, overrides)` and returns its JSON: a map from service name to that +/// service's fully-assembled config. +pub fn eval_build(layout: &str, overrides: &str) -> Value { + let state = jsonnet_state(); + let _guard = state.enter(); + let layout_literal = serde_json::to_string(layout).expect("layout is serializable"); + let snippet = + format!("(import 'lib/build.libsonnet').build({layout_literal}, import '{overrides}')"); + let val = state + .evaluate_snippet("build_entry.jsonnet", snippet) + .expect("build.libsonnet failed to evaluate"); + serde_json::to_value(&val).expect("build result is not serializable") +} diff --git a/crates/apollo_deployments/src/jsonnet.rs b/crates/apollo_deployments/src/jsonnet_test.rs similarity index 87% rename from crates/apollo_deployments/src/jsonnet.rs rename to crates/apollo_deployments/src/jsonnet_test.rs index e29d375d391..1af485f33a1 100644 --- a/crates/apollo_deployments/src/jsonnet.rs +++ b/crates/apollo_deployments/src/jsonnet_test.rs @@ -1,21 +1,17 @@ use std::collections::{BTreeMap, BTreeSet}; -use std::path::PathBuf; use apollo_config::dumping::SerializeConfig; use apollo_config::{FIELD_SEPARATOR, IS_NONE_MARK}; use apollo_node_config::config_utils::{config_to_preset, private_parameters}; use apollo_node_config::node_config::{SequencerNodeConfig, CONFIG_POINTERS}; -use jrsonnet_evaluator::trace::PathResolver; -use jrsonnet_evaluator::{FileImportResolver, State}; use serde_json::Value; use strum::IntoEnumIterator; use crate::deployment_definitions::BASE_APP_CONFIGS_DIR_PATH; +use crate::jsonnet_generation::{eval_build, jsonnet_state}; use crate::service::{GetComponentConfigs, NodeService, NodeType, KEYS_TO_BE_REPLACED}; use crate::test_utils::is_path_prefix; -const JSONNET_DIR: &str = "crates/apollo_deployments/jsonnet"; - /// Evaluates `services/.jsonnet` (the per-layout infra renderer) and returns its JSON. fn eval_layout_infra(layout: &str) -> Value { let state = jsonnet_state(); @@ -25,15 +21,6 @@ fn eval_layout_infra(layout: &str) -> Value { serde_json::to_value(&val).expect("infra config is not serializable") } -/// A jrsonnet evaluator with the stdlib installed and file imports resolved relative to the jsonnet -/// dir (so the libraries' `std.*` calls and relative `import`s work). -fn jsonnet_state() -> State { - let mut builder = State::builder(); - builder.context_initializer(jrsonnet_stdlib::ContextInitializer::new(PathResolver::Absolute)); - builder.import_resolver(FileImportResolver::new(vec![PathBuf::from(JSONNET_DIR)])); - builder.build() -} - /// Asserts the jsonnet-derived infra of every service of layout `S` matches the Rust source of /// truth (`.rs`'s `get_component_configs`). pub(crate) fn assert_infra_matches_rust() @@ -70,20 +57,6 @@ where } } -/// Evaluates `build(layout, overrides)` and returns its JSON: a map from service name to that -/// service's fully-assembled config. -fn eval_build(layout: &str, overrides: &str) -> Value { - let state = jsonnet_state(); - let _guard = state.enter(); - let layout_literal = serde_json::to_string(layout).expect("layout is serializable"); - let snippet = - format!("(import 'lib/build.libsonnet').build({layout_literal}, import '{overrides}')"); - let val = state - .evaluate_snippet("build_entry.jsonnet", snippet) - .expect("build.libsonnet failed to evaluate"); - serde_json::to_value(&val).expect("build result is not serializable") -} - /// Asserts that `build(layout, testing_overrides)` produces, for every service of layout `S`, an /// object that deserializes into `SequencerNodeConfig`. pub(crate) fn assert_build_deserializes() diff --git a/crates/apollo_deployments/src/lib.rs b/crates/apollo_deployments/src/lib.rs index bf0c0ed3a8d..0a6bb8d3b44 100644 --- a/crates/apollo_deployments/src/lib.rs +++ b/crates/apollo_deployments/src/lib.rs @@ -2,8 +2,9 @@ pub(crate) mod addresses; pub mod deployment_definitions; pub mod deployments; +pub mod jsonnet_generation; #[cfg(test)] -pub mod jsonnet; +pub mod jsonnet_test; pub(crate) mod replacers; pub(crate) mod scale_policy; pub mod service;