public void addRedFlagWarning(String name, Warning warning) { _warnings.computeIfAbsent(name, n -> new Warnings()).getRedFlagWarnings().add(warning); }
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()); }); } }
@Override public void exitNull_as_path_regex(Null_as_path_regexContext ctx) { _w.redFlag("as-path regexes this complicated are not supported yet"); }
public void addUnimplementedWarning(String name, Warning warning) { _warnings.computeIfAbsent(name, n -> new Warnings()).getUnimplementedWarnings().add(warning); }
private void processGroup(String groupName, boolean clusterGroup, boolean removeApplyLine) { try { List<ParseTree> applyGroupsLines = _hierarchy.getApplyGroupsLines( groupName, _currentPath, _configurationContext, clusterGroup); int insertionIndex = _newConfigurationLines.indexOf(_currentSetLine); _newConfigurationLines.addAll(insertionIndex, applyGroupsLines); } catch (PartialGroupMatchException e) { _w.pedantic(applyGroupsExceptionMessage(groupName, e)); } catch (UndefinedGroupBatfishException e) { String message = String.format( "apply-groups statement at %s refers to non-existent group: '%s'\n", pathString(), groupName); _w.redFlag(message); } catch (BatfishException e) { _w.redFlag(applyGroupsExceptionMessage(groupName, e)); } if (removeApplyLine) { _newConfigurationLines.remove(_currentSetLine); } _changed = true; }
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)); } }
@Override public ConvertConfigurationAnswerElement loadConvertConfigurationAnswerElementOrReparse() { ConvertConfigurationAnswerElement ccae = new ConvertConfigurationAnswerElement(); Warnings warnings1 = new Warnings(true, true, true); warnings1.unimplemented("unimplemented1"); Warnings warnings2 = new Warnings(true, true, true); warnings2.redFlag("redflag2"); ccae.setWarnings(ImmutableSortedMap.of("node1", warnings1, "node2", warnings2)); return ccae; } }
@Override public void visitErrorNode(ErrorNode errorNode) { Token token = errorNode.getSymbol(); int line = token.getLine(); String lineText = errorNode.getText().replace("\n", "").replace("\r", "").trim(); _configuration.setUnrecognized(true); if (token instanceof UnrecognizedLineToken) { UnrecognizedLineToken unrecToken = (UnrecognizedLineToken) token; _w.getParseWarnings() .add( new ParseWarning( line, lineText, unrecToken.getParserContext(), "This syntax is unrecognized")); } else { String msg = String.format("Unrecognized Line: %d: %s", line, lineText); _w.redFlag(msg + " SUBSEQUENT LINES MAY NOT BE PROCESSED CORRECTLY"); } } }
@Override public ParseVendorConfigurationAnswerElement loadParseVendorConfigurationAnswerElement() { ParseVendorConfigurationAnswerElement pvcae = new ParseVendorConfigurationAnswerElement(); Warnings warnings = new Warnings(); warnings.getParseWarnings().add(new ParseWarning(3, "text", "ctx", "comment")); pvcae.setWarnings(ImmutableSortedMap.of("nowarnings", new Warnings(), "f", warnings)); return pvcae; } }
@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; } }
/** @see #addWarning(ParserRuleContext, String, BatfishCombinedParser, String) */ public void todo( @Nonnull ParserRuleContext ctx, @Nonnull String line, @Nonnull BatfishCombinedParser<?, ?> parser) { addWarning(ctx, line, parser, "This feature is not currently supported"); }
public IncrementalBdpAnswerElement() { _bgpBestPathRibRoutesByIteration = new TreeMap<>(); _bgpMultipathRibRoutesByIteration = new TreeMap<>(); _mainRibRoutesByIteration = new TreeMap<>(); _warnings = new Warnings(); }
@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; }
_warnings.redFlag("Empty file: '" + _filename + "'\n"); return new ParseVendorConfigurationResult( System.currentTimeMillis() - startTime, _warnings.pedantic("Ignored file: '" + _filename + "'\n"); return new ParseVendorConfigurationResult( System.currentTimeMillis() - startTime, _warnings.pedantic( String.format( "Flattening: '%s' on-the-fly; line-numbers reported for this file will be spurious\n", new BatfishException(unsupportedError)); } else { _warnings.unimplemented(unsupportedError); return new ParseVendorConfigurationResult( System.currentTimeMillis() - startTime, new BatfishException(unknownError)); } else { _warnings.unimplemented(unknownError); return new ParseVendorConfigurationResult( System.currentTimeMillis() - startTime, vc.setFilename(_filename); if (vc.getHostname() == null) { _warnings.redFlag("No hostname set in file: '" + _filename.replace("\\", "/") + "'\n"); String guessedHostname = Paths.get(_filename).getFileName().toString().replaceAll("\\.(cfg|conf)$", "");
switch (format) { case EMPTY: _warnings.redFlag("Empty file: '" + currentPath + "'\n"); elapsedTime = System.currentTimeMillis() - startTime; return new ParseEnvironmentBgpTableResult( elapsedTime, _logger.getHistory(), _file, new BatfishException(unknownError)); } else { _warnings.unimplemented(unknownError); elapsedTime = System.currentTimeMillis() - startTime; return new ParseEnvironmentBgpTableResult( elapsedTime, _logger.getHistory(), _file, new BatfishException(unsupportedError)); } else { _warnings.unimplemented(unsupportedError); elapsedTime = System.currentTimeMillis() - startTime; return new ParseEnvironmentBgpTableResult(
private void exitEigrpProcess(ParserRuleContext ctx) { _w.addWarning(ctx, getFullText(ctx), _parser, "No EIGRP process available"); return; _w.addWarning(ctx, getFullText(ctx), _parser, "No EIGRP ASN configured"); return; boolean duplicate = eigrpProcesses.containsKey(proc.getAsn()); if (duplicate) { _w.redFlag("Duplicate EIGRP router ASN"); } else { eigrpProcesses.put(proc.getAsn(), proc);
w.unimplemented( String.format("Rib name conversion: %s address family is not supported", addressFamily)); return null;
@Nonnull @VisibleForTesting // triplet -> filename -> lines static Map<WarningTriplet, Map<String, SortedSet<Integer>>> aggregateDuplicateWarnings( Map<String, Warnings> fileWarnings) { Map<WarningTriplet, Map<String, SortedSet<Integer>>> map = new HashMap<>(); fileWarnings.forEach( (filename, warnings) -> { for (ParseWarning w : warnings.getParseWarnings()) { WarningTriplet triplet = new WarningTriplet(w); map.computeIfAbsent(triplet, k -> new HashMap<>()) .computeIfAbsent(filename, k -> new TreeSet<>()) .add(w.getLine()); } }); return map; }
public void pedantic(String msg) { if (!_pedanticRecord) { return; } pedantic(msg, TAG_PEDANTIC); }
@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(); }