public void addRedFlagWarning(String name, Warning warning) { _warnings.computeIfAbsent(name, n -> new Warnings()).getRedFlagWarnings().add(warning); }
@Override public String prettyPrint() { StringBuilder retString = new StringBuilder("Results of parsing vendor configurations\n"); for (String name : _warnings.keySet()) { retString.append("\n " + name + "[Parser warnings]\n"); for (Warning warning : _warnings.get(name).getRedFlagWarnings()) { retString.append(" RedFlag " + warning.getTag() + " : " + warning.getText() + "\n"); } for (Warning warning : _warnings.get(name).getUnimplementedWarnings()) { retString.append( " Unimplemented " + warning.getTag() + " : " + warning.getText() + "\n"); } for (Warning warning : _warnings.get(name).getPedanticWarnings()) { retString.append(" Pedantic " + warning.getTag() + " : " + warning.getText() + "\n"); } } for (String name : _errors.keySet()) { retString.append("\n " + name + "[Parser errors]\n"); for (String line : _errors.get(name).getLineMap()) { retString.append(" " + line + "\n"); } } for (String name : _parseTrees.keySet()) { retString.append("\n " + name + " [Parse trees]\n"); for (String sentence : _parseTrees.get(name).getSentences()) { retString.append(" ParseTreeSentence : " + sentence + "\n"); } } return retString.toString(); }
for (String name : _warnings.keySet()) { sb.append(" " + name + ":\n"); for (Warning warning : _warnings.get(name).getRedFlagWarnings()) { sb.append(" RedFlag " + warning.getTag() + " : " + warning.getText() + "\n"); redFlagCount++;
@Override protected boolean matchesSafely( ConvertConfigurationAnswerElement item, Description mismatchDescription) { Warnings warnings = item.getWarnings().get(_hostname); if (warnings == null) { mismatchDescription.appendText(String.format("No warnings for host '%s'", _hostname)); return false; } if (warnings.getRedFlagWarnings().stream() .map(Warning::getText) .noneMatch(_subMatcher::matches)) { mismatchDescription.appendText( String.format("No red-flag warnings for host '%s' match", _hostname)); return false; } return true; } }
private void mergeInitStepAnswer( InitInfoAnswerElement initInfoAnswerElement, InitStepAnswerElement initStepAnswerElement, boolean summary, boolean verboseError) { if (!summary) { if (verboseError) { SortedMap<String, List<BatfishStackTrace>> errors = initInfoAnswerElement.getErrors(); initStepAnswerElement .getErrors() .forEach( (hostname, initStepErrors) -> errors.computeIfAbsent(hostname, k -> new ArrayList<>()).add(initStepErrors)); } SortedMap<String, Warnings> warnings = initInfoAnswerElement.getWarnings(); initStepAnswerElement .getWarnings() .forEach( (hostname, initStepWarnings) -> { Warnings combined = warnings.computeIfAbsent(hostname, h -> buildWarnings(_settings)); combined.getParseWarnings().addAll(initStepWarnings.getParseWarnings()); combined.getPedanticWarnings().addAll(initStepWarnings.getPedanticWarnings()); combined.getRedFlagWarnings().addAll(initStepWarnings.getRedFlagWarnings()); combined .getUnimplementedWarnings() .addAll(initStepWarnings.getUnimplementedWarnings()); }); } }
/** Policy with actual circular reference as statement */ @Test public void testRoutingPolicyCircularReference() { String parentPolicyName = "parent"; _rpb.setName(parentPolicyName) .setStatements(ImmutableList.of(new CallStatement(parentPolicyName))) .build(); _c.computeRoutingPolicySources(_w); /* * A circular reference warning should be emitted containing the name of the circularly * referenced policy. */ assertThat(_w.getRedFlagWarnings(), not(empty())); assertThat( _w.getRedFlagWarnings().iterator().next().getText(), containsString(parentPolicyName)); }
(name, warnings) -> { sb.append("\n " + name + "[Conversion warnings]\n"); for (Warning warning : warnings.getRedFlagWarnings()) { sb.append(" RedFlag " + warning.getTag() + " : " + warning.getText() + "\n");
public static void logWarnings(BatfishLogger logger, Warnings warnings) { for (Warning warning : warnings.getRedFlagWarnings()) { logger.redflag(logWarningsHelper(warning)); } for (Warning warning : warnings.getUnimplementedWarnings()) { logger.unimplemented(logWarningsHelper(warning)); } for (Warning warning : warnings.getPedanticWarnings()) { logger.pedantic(logWarningsHelper(warning)); } }
/** Policy with actual circular reference as expr */ @Test public void testRoutingPolicyCircularReferenceExpr() { String parentPolicyName = "parent"; CallExpr callExpr = new CallExpr(parentPolicyName); If ifStatement = new If(); ifStatement.setGuard(callExpr); _rpb.setName(parentPolicyName).setStatements(ImmutableList.of(ifStatement)).build(); _c.computeRoutingPolicySources(_w); /* * A circular reference warning should be emitted containing the name of the circularly * referenced policy. */ assertThat(_w.getRedFlagWarnings(), not(empty())); assertThat( _w.getRedFlagWarnings().iterator().next().getText(), containsString(parentPolicyName)); }
@Override public TableAnswerElement answer() { ConvertConfigurationAnswerElement ccae = _batfish.loadConvertConfigurationAnswerElementOrReparse(); Map<String, Warnings> warnings = ccae.getWarnings(); Rows rows = new Rows(); warnings.forEach( (nodeName, nodeWarnings) -> { for (Warning w : nodeWarnings.getRedFlagWarnings()) { rows.add(getRow(nodeName, w)); } for (Warning w : nodeWarnings.getUnimplementedWarnings()) { rows.add(getRow(nodeName, w)); } }); TableAnswerElement answerElement = new TableAnswerElement(TABLE_METADATA); answerElement.postProcessAnswer(_question, rows.getData()); return answerElement; }
/** Policy with two copies of same call statement - should not contain circular reference */ @Test public void testRoutingPolicyTwoCopiesCallStatement() { RoutingPolicy calledPolicy = _rpb.build(); Statement callStatement = new CallStatement(calledPolicy.getName()); _rpb.setStatements(ImmutableList.of(callStatement, callStatement)).build(); _c.computeRoutingPolicySources(_w); // No circular reference warnings should be emitted assertThat(_w.getRedFlagWarnings(), empty()); }
/** * Policy with two different call statements for same policy - should not contain circular * reference */ @Test public void testRoutingPolicyTwoDifferentCallStatementsSamePolicy() { RoutingPolicy calledPolicy = _rpb.build(); Statement callStatement1 = new CallStatement(calledPolicy.getName()); Statement callStatement2 = new CallStatement(calledPolicy.getName()); _rpb.setStatements(ImmutableList.of(callStatement1, callStatement2)).build(); _c.computeRoutingPolicySources(_w); // No circular reference warnings should be emitted assertThat(_w.getRedFlagWarnings(), empty()); } }
assertThat(_w.getRedFlagWarnings(), not(empty())); assertThat( _w.getRedFlagWarnings().iterator().next().getText(), containsString(parentPolicyName));