Skip to content

Commit 5d4f835

Browse files
feat(variabled): emit a warning instead of exiting (#1005)
1 parent 8380837 commit 5d4f835

File tree

5 files changed

+28
-53
lines changed

5 files changed

+28
-53
lines changed

agent-control/src/agent_type/definition.rs

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use crate::values::yaml_config::YAMLConfig;
1818
use opamp_client::operation::capabilities::Capabilities;
1919
use serde::{Deserialize, Deserializer};
2020
use std::{collections::HashMap, str::FromStr};
21+
use tracing::warn;
2122

2223
/// AgentTypeDefinition represents the definition of an [AgentType]. It defines the variables and runtime for any supported
2324
/// environment.
@@ -294,15 +295,16 @@ fn update_specs(
294295
values: HashMap<String, serde_yaml::Value>,
295296
agent_vars: &mut HashMap<String, VariableDefinitionTree>,
296297
) -> Result<(), AgentTypeError> {
297-
for (ref k, v) in values.into_iter() {
298-
let spec = agent_vars
299-
.get_mut(k)
300-
.ok_or_else(|| AgentTypeError::UnexpectedValueKey(k.clone()))?;
298+
for (ref key, value) in values.into_iter() {
299+
let Some(spec) = agent_vars.get_mut(key) else {
300+
warn!(%key, "Unexpected variable in the configuration");
301+
continue;
302+
};
301303

302304
match spec {
303-
VariableDefinitionTree::End(e) => e.merge_with_yaml_value(v)?,
305+
VariableDefinitionTree::End(e) => e.merge_with_yaml_value(value)?,
304306
VariableDefinitionTree::Mapping(m) => {
305-
let v: HashMap<String, serde_yaml::Value> = serde_yaml::from_value(v)?;
307+
let v: HashMap<String, serde_yaml::Value> = serde_yaml::from_value(value)?;
306308
update_specs(v, m)?
307309
}
308310
}
@@ -352,7 +354,8 @@ pub(crate) type Variables = HashMap<String, VariableDefinition>;
352354

353355
#[cfg(test)]
354356
pub mod tests {
355-
357+
use super::*;
358+
use crate::agent_type::runtime_config::Deployment;
356359
use crate::{
357360
agent_type::{
358361
environment::Environment,
@@ -362,9 +365,6 @@ pub mod tests {
362365
},
363366
sub_agent::effective_agents_assembler::build_agent_type,
364367
};
365-
366-
use super::*;
367-
use crate::agent_type::runtime_config::Deployment;
368368
use assert_matches::assert_matches;
369369
use serde_yaml::{Error, Number};
370370
use std::collections::HashMap as Map;
@@ -556,7 +556,6 @@ deployment:
556556
#[test]
557557
fn test_normalize_agent_spec() {
558558
// create AgentSpec
559-
560559
let given_agent = AgentType::build_for_testing(AGENT_GIVEN_YAML, &Environment::OnHost);
561560

562561
let expected_map: Map<String, VariableDefinition> = Map::from([(
@@ -718,8 +717,8 @@ deployment:
718717
args: TemplateableValue {
719718
value: Some(Args("--config config_path --plugin_dir integration_path --verbose true --logs trace".to_string())),
720719
template:
721-
"--config ${nr-var:config} --plugin_dir ${nr-var:integrations} --verbose ${nr-var:deployment.on_host.verbose} --logs ${nr-var:deployment.on_host.log_level}"
722-
.to_string(),
720+
"--config ${nr-var:config} --plugin_dir ${nr-var:integrations} --verbose ${nr-var:deployment.on_host.verbose} --logs ${nr-var:deployment.on_host.log_level}"
721+
.to_string(),
723722
},
724723
env: Env::default(),
725724
restart_policy: RestartPolicyConfig {
@@ -911,6 +910,7 @@ deployment:
911910
"#;
912911

913912
const GIVEN_NEWRELIC_INFRA_USER_CONFIG_YAML: &str = r#"
913+
unknown_variable: ignored
914914
config3:
915915
log_level: trace
916916
forward: "true"
@@ -1018,7 +1018,8 @@ status_server_port: 8004
10181018
.as_ref()
10191019
.unwrap()
10201020
.clone()
1021-
)
1021+
);
1022+
assert!(!filled_variables.contains_key("unknown_variable"))
10221023
}
10231024

10241025
const AGENT_TYPE_WITH_VARIANTS: &str = r#"
@@ -1055,16 +1056,9 @@ restart_policy:
10551056
fn test_variables_with_variants() {
10561057
let agent_type =
10571058
AgentType::build_for_testing(AGENT_TYPE_WITH_VARIANTS, &Environment::OnHost);
1058-
let values: YAMLConfig =
1059-
serde_yaml::from_str(VALUES_VALID_VARIANT).expect("Failed to parse user config");
10601059

10611060
// Valid variant
1062-
let filled_variables = agent_type
1063-
.variables
1064-
.clone()
1065-
.fill_with_values(values)
1066-
.unwrap()
1067-
.flatten();
1061+
let filled_variables = agent_type.fill_variables(VALUES_VALID_VARIANT);
10681062

10691063
let var = filled_variables.get("restart_policy.type").unwrap();
10701064
assert_eq!(
@@ -1086,12 +1080,7 @@ restart_policy:
10861080
);
10871081

10881082
// Default invalid variant is allowed
1089-
let filled_variables_default = agent_type
1090-
.variables
1091-
.clone()
1092-
.fill_with_values(YAMLConfig::default())
1093-
.unwrap()
1094-
.flatten();
1083+
let filled_variables_default = agent_type.fill_variables("");
10951084
let var = filled_variables_default.get("restart_policy.type").unwrap();
10961085
assert_eq!(
10971086
"exponential".to_string(),

agent-control/src/agent_type/error.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::sub_agent::persister::config_persister::PersistError;
2-
use std::io;
32
use thiserror::Error;
43

54
/// The different error types to be returned by operations involving the [`Agent`] type.
@@ -9,12 +8,8 @@ pub enum AgentTypeError {
98
SerdeYaml(#[from] serde_yaml::Error),
109
#[error("Missing value for key: `{0}`")]
1110
MissingValue(String),
12-
#[error("Unexpected key in agent type config values: {0}")]
13-
UnexpectedValueKey(String),
1411
#[error("Unexpected value for key: key({0}) val({1})")]
1512
UnexpectedValueForKey(String, String),
16-
#[error("I/O error: `{0}`")]
17-
IOError(#[from] io::Error),
1813
#[error("Missing required template key: `{0}`")]
1914
MissingTemplateKey(String),
2015
#[error("Missing default value for a non-required spec key")]

agent-control/src/agent_type/renderer.rs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -308,16 +308,12 @@ pub(crate) mod tests {
308308
fn test_render_with_persister() {
309309
let agent_id = AgentID::new("some-agent-id").unwrap();
310310
let agent_type = AgentType::build_for_testing(AGENT_TYPE_WITH_FILES, &Environment::OnHost);
311-
let values = testing_values(AGENT_VALUES_WITH_FILES);
311+
let values = AGENT_VALUES_WITH_FILES;
312312
let attributes = testing_agent_attributes(&agent_id);
313313
// The persister should receive filled variables with the path expanded.
314314
let path_as_string = test_data_dir().join(GENERATED_FOLDER_NAME).join(&agent_id);
315-
let filled_variables = agent_type
316-
.variables
317-
.clone()
318-
.fill_with_values(values.clone())
319-
.unwrap()
320-
.flatten();
315+
let filled_variables = agent_type.fill_variables(values);
316+
321317
let expanded_path_filled_variables =
322318
TemplateRenderer::<MockConfigurationPersisterMock>::extend_variables_file_path(
323319
path_as_string.clone(),
@@ -331,7 +327,7 @@ pub(crate) mod tests {
331327
let renderer = TemplateRenderer::default().with_config_persister(persister);
332328

333329
let runtime_config = renderer
334-
.render(&agent_id, agent_type, values, attributes)
330+
.render(&agent_id, agent_type, testing_values(values), attributes)
335331
.unwrap();
336332
assert_eq!(
337333
Args(format!(
@@ -379,14 +375,9 @@ pub(crate) mod tests {
379375
fn test_render_with_persister_persists_error() {
380376
let agent_id = AgentID::new("some-agent-id").unwrap();
381377
let agent_type = AgentType::build_for_testing(SIMPLE_AGENT_TYPE, &Environment::OnHost);
382-
let values = testing_values(SIMPLE_AGENT_VALUES);
378+
let values = SIMPLE_AGENT_VALUES;
383379
let attributes = testing_agent_attributes(&agent_id);
384-
let filled_variables = agent_type
385-
.variables
386-
.clone()
387-
.fill_with_values(values.clone())
388-
.unwrap()
389-
.flatten();
380+
let filled_variables = agent_type.fill_variables(values);
390381

391382
let mut persister = MockConfigurationPersisterMock::new();
392383
let err = PersistError::DirectoryError(DirectoryManagementError::ErrorDeletingDirectory(
@@ -398,7 +389,7 @@ pub(crate) mod tests {
398389
let renderer = TemplateRenderer::default().with_config_persister(persister);
399390

400391
let expected_error = renderer
401-
.render(&agent_id, agent_type, values, attributes)
392+
.render(&agent_id, agent_type, testing_values(values), attributes)
402393
.err()
403394
.unwrap();
404395
assert_matches!(

agent-control/src/sub_agent/on_host/builder.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,8 @@ mod tests {
215215
use super::*;
216216
use crate::agent_control::config::AgentTypeFQN;
217217
use crate::agent_control::defaults::{
218-
default_capabilities, default_sub_agent_custom_capabilities,
219-
OPAMP_AGENT_VERSION_ATTRIBUTE_KEY, OPAMP_SERVICE_NAME, OPAMP_SERVICE_NAMESPACE,
220-
OPAMP_SERVICE_VERSION, PARENT_AGENT_ID_ATTRIBUTE_KEY,
218+
default_capabilities, default_sub_agent_custom_capabilities, OPAMP_SERVICE_NAME,
219+
OPAMP_SERVICE_NAMESPACE, OPAMP_SERVICE_VERSION, PARENT_AGENT_ID_ATTRIBUTE_KEY,
221220
};
222221
use crate::agent_type::environment::Environment;
223222
use crate::agent_type::runtime_config::{Deployment, OnHost, Runtime};

agent-control/tests/on_host/scenarios/opamp.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,8 @@ fn onhost_opamp_sub_agent_wrong_remote_effective_config() {
502502
// When a new incorrect config is received from OpAMP
503503
opamp_server.set_config_response(
504504
sub_agent_instance_id.clone(),
505-
ConfigResponse::from("config_agent: aa"),
505+
// The configuration is invalid since a string is expected
506+
ConfigResponse::from("backoff_delay: 123"),
506507
);
507508

508509
retry(60, Duration::from_secs(1), || {

0 commit comments

Comments
 (0)