Skip to content
Merged
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
12 changes: 6 additions & 6 deletions crates/cli/src/server/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -971,19 +971,19 @@ impl PluginActivation {
.map_err(|error| CliError::Config(format!("invalid plugin config: {error}")))?,
None => PluginConfig::default(),
};
if let Some(error) = register_and_validate_plugin_components(&plugin_config)
.into_iter()
.next()
{
return Err(CliError::Config(error.to_string()));
}
plugin_config
.components
.extend(dynamic_plugins.iter().map(|plugin| PluginComponentSpec {
kind: plugin.plugin_id.clone(),
enabled: true,
config: plugin.config.clone(),
}));
if let Some(error) = register_and_validate_plugin_components(&plugin_config)
.into_iter()
.next()
{
return Err(CliError::Config(error.to_string()));
}
for plugin in &dynamic_plugins {
if let Some(snapshot) = plugin.activation_snapshot.as_ref() {
snapshot.verify_current()?;
Expand Down
32 changes: 28 additions & 4 deletions crates/cli/tests/coverage/shared/server_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1837,6 +1837,28 @@ async fn static_only_cli_configuration_keeps_the_legacy_lifecycle() {
let _ = deregister_plugin(GENERIC_TEST_PLUGIN_KIND);
}

#[test]
fn register_and_validate_plugin_components_rejects_legacy_switchyard_components() {
for enabled in [true, false] {
let config = PluginConfig {
components: vec![PluginComponentSpec {
kind: "switchyard".into(),
enabled,
config: Map::new(),
}],
..PluginConfig::default()
};

let errors = register_and_validate_plugin_components(&config);
assert!(
errors
.iter()
.any(|error| matches!(error, PluginComponentSetupError::RemovedSwitchyard)),
"legacy Switchyard components must be rejected when enabled is {enabled}"
);
}
}

#[test]
fn plugin_component_setup_errors_render_every_diagnostic_variant() {
let adaptive = PluginComponentSetupError::Adaptive("adaptive failure".into());
Expand Down Expand Up @@ -1905,17 +1927,19 @@ async fn plugin_activation_covers_empty_invalid_and_missing_manifest_paths() {
.expect("invalid config should fail activation");
assert!(invalid.to_string().contains("invalid plugin config"));

let native = PluginActivation::initialize(
let dynamic_switchyard = PluginActivation::initialize(
None,
vec![dynamic_component_without_manifest(
"acme.native-missing",
"switchyard",
DynamicPluginKind::RustDynamic,
)],
)
.await
.err()
.expect("native plugin without a manifest should fail activation");
assert!(native.to_string().contains("native dynamic plugin"));
.expect("dynamic Switchyard plugin without a manifest should reach dynamic activation");
let dynamic_switchyard = dynamic_switchyard.to_string();
assert!(dynamic_switchyard.contains("native dynamic plugin"));
assert!(!dynamic_switchyard.contains("removed in NeMo Relay 0.8"));

let worker = PluginActivation::initialize(
None,
Expand Down
Loading