in guard/src/commands/validate/cfn_reporter.rs [113:175]
fn report(&self,
writer: &mut dyn Write,
rules_file_name: &str,
data_file_name: &str,
by_resource_name: HashMap<String, Vec<NameInfo<'_>>>,
passed: HashSet<String>,
skipped: HashSet<String>,
longest_rule_len: usize) -> crate::rules::Result<()> {
writeln!(writer, "Evaluation of rules {} for template {}, number of resource failures = {}",
rules_file_name, data_file_name, by_resource_name.len())?;
if !by_resource_name.is_empty() {
writeln!(writer, "--");
}
//
// Agreed on text
// Resource [NewVolume2] property [Properties.Encrypted] in template [template.json] is not compliant with [sg.guard/aws_ec2_volume_checks] because provided value [false] does not match with expected value [true]. Error Message [[EC2-008] : EC2 volumes should be encrypted]
//
for (resource, info) in by_resource_name.iter() {
super::common::print_name_info(
writer, &info, longest_rule_len, rules_file_name, data_file_name,
|_, _, info| {
Ok(format!("Resource [{}] traversed until [{}] for template [{}] wasn't compliant with [{}/{}] due to retrieval error. Error Message [{}]",
resource,
info.path,
data_file_name,
rules_file_name,
info.rule,
info.message.replace("\n", ";")
))
},
|_, _, op_msg, info| {
Ok(format!("Resource [{resource}] property [{property}] in template [{template}] is not compliant with [{rules}/{rule}] because needed value at [{provided}] {op_msg}. Error message [{msg}]",
resource=resource,
property=info.path,
provided=info.provided.as_ref().map_or(&serde_json::Value::Null, std::convert::identity),
op_msg=op_msg,
template=data_file_name,
rules=rules_file_name,
rule=info.rule,
msg=info.message.replace("\n", ";")
))
},
|_, _, msg, info| {
Ok(format!("Resource [{resource}] property [{property}] in template [{template}] is not compliant with [{rules}/{rule}] because provided value [{provided}] {op_msg} match with expected value [{expected}]. Error message [{msg}]",
resource=resource,
property=info.path,
provided=info.provided.as_ref().map_or(&serde_json::Value::Null, std::convert::identity),
op_msg=msg,
expected=info.expected.as_ref().map_or(&serde_json::Value::Null, std::convert::identity),
template=data_file_name,
rules=rules_file_name,
rule=info.rule,
msg=info.message.replace("\n", ";")
))
}
)?;
}
super::common::print_compliant_skipped_info(writer, &passed, &skipped, rules_file_name, data_file_name)?;
writeln!(writer, "--")?;
Ok(())
}