Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions crates/apollo_deployments/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"] }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
33 changes: 33 additions & 0 deletions crates/apollo_deployments/src/jsonnet_generation.rs
Original file line number Diff line number Diff line change
@@ -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")
}
Original file line number Diff line number Diff line change
@@ -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/<layout>.jsonnet` (the per-layout infra renderer) and returns its JSON.
fn eval_layout_infra(layout: &str) -> Value {
let state = jsonnet_state();
Expand All @@ -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 (`<layout>.rs`'s `get_component_configs`).
pub(crate) fn assert_infra_matches_rust<S>()
Expand Down Expand Up @@ -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<S>()
Expand Down
3 changes: 2 additions & 1 deletion crates/apollo_deployments/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading