@VisibleForTesting @Nonnull Answer processAnswerRows(String rawAnswerStr, AnswerRowsOptions options) { if (rawAnswerStr == null) { Answer answer = Answer.failureAnswer("Not found", null); answer.setStatus(AnswerStatus.NOTFOUND); return answer; } try { Answer rawAnswer = BatfishObjectMapper.mapper().readValue(rawAnswerStr, new TypeReference<Answer>() {}); // If the AnswerStatus is not SUCCESS, the answer cannot have any AnswerElements related to // actual answers (but, e.g., it might have a BatfishStackTrace). Return that as-is. if (rawAnswer.getStatus() != AnswerStatus.SUCCESS) { return rawAnswer; } TableAnswerElement rawTable = (TableAnswerElement) rawAnswer.getAnswerElements().get(0); Answer answer = new Answer(); answer.setStatus(rawAnswer.getStatus()); answer.addAnswerElement(processAnswerTable(rawTable, options)); return answer; } catch (Exception e) { _logger.errorf("Failed to convert answer string to Answer: %s", e.getMessage()); return Answer.failureAnswer(e.getMessage(), null); } }
public static Answer failureAnswer(String message, @Nullable Question question) { Answer answer = new Answer(); answer.setQuestion(question); answer.setStatus(AnswerStatus.FAILURE); answer.addAnswerElement(new StringAnswerElement(message)); return answer; }
private String getTestComparisonString(Answer answer, TestComparisonMode comparisonMode) throws JsonProcessingException { switch (comparisonMode) { case COMPAREANSWER: // Use an array rather than a list to serialize the answer elements; this preserves // the type information. See https://github.com/FasterXML/jackson-databind/issues/336, // though this is a different workaround. AnswerElement[] elements = answer.getAnswerElements().toArray(new AnswerElement[0]); return BatfishObjectMapper.writePrettyString(elements); case COMPAREALL: return BatfishObjectMapper.writePrettyString(answer); case COMPAREFAILURES: return BatfishObjectMapper.writePrettyString(answer.getSummary().getNumFailed()); case COMPARESUMMARY: return BatfishObjectMapper.writePrettyString(answer.getSummary()); default: throw new BatfishException("Unhandled TestComparisonMode: " + comparisonMode); } }
@Test public void testComputeAnswerMetadataInapplicable() throws IOException { String columnName = "col"; List<Integer> value = ImmutableList.of(5); Answer testAnswer = new Answer(); testAnswer.addAnswerElement( new TableAnswerElement( new TableMetadata( ImmutableList.of( new ColumnMetadata(columnName, Schema.list(Schema.INTEGER), "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value))); testAnswer.setStatus(AnswerStatus.SUCCESS); assertThat( AnswerMetadataUtil.computeAnswerMetadata(testAnswer, _logger), equalTo( AnswerMetadata.builder() .setMetrics(Metrics.builder().setNumRows(1).build()) .setStatus(AnswerStatus.SUCCESS) .build())); }
private Answer serializeEnvironmentBgpTables(Path inputPath, Path outputPath) { Answer answer = new Answer(); ParseEnvironmentBgpTablesAnswerElement answerElement = new ParseEnvironmentBgpTablesAnswerElement(); answerElement.setVersion(Version.getVersion()); answer.addAnswerElement(answerElement); SortedMap<String, BgpAdvertisementsByVrf> bgpTables = getEnvironmentBgpTables(inputPath, answerElement); serializeEnvironmentBgpTables(bgpTables, outputPath); serializeObject(answerElement, _testrigSettings.getParseEnvironmentBgpTablesAnswerPath()); return answer; }
BatfishObjectMapper.mapper() .readValue(_storage.loadAnswer(baseAnswerId), new TypeReference<Answer>() {}); TableAnswerElement oldTable = (TableAnswerElement) oldAnswer.getAnswerElements().get(0); TableMetadata tableMetadata = oldTable.getMetadata(); Set<String> issueColumns = Answer newAnswer = new Answer(); newAnswer.setStatus(AnswerStatus.SUCCESS); newAnswer.setQuestion(questionObj); newAnswer.setSummary(newTable.getSummary()); newAnswer.setAnswerElements(ImmutableList.of(newTable));
@Test public void testProcessAnswerRowsFailure() throws IOException { String columnName = "issue"; int maxRows = 1; int rowOffset = 0; AnswerRowsOptions options = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), maxRows, rowOffset, ImmutableList.of(new ColumnSortOption(columnName, true)), false); Answer badInput = new Answer(); badInput.setStatus(AnswerStatus.SUCCESS); String rawAnswerStr = BatfishObjectMapper.writePrettyString(badInput); Answer processedAnswer = _manager.processAnswerRows(rawAnswerStr, options); assertThat(processedAnswer.getStatus(), equalTo(AnswerStatus.FAILURE)); }
private Answer analyze() { try { Answer answer = new Answer(); AnswerSummary summary = new AnswerSummary(); AnalysisId analysisName = _settings.getAnalysisName(); if (currentAnswer.getQuestion() != null) { try { containerName, getTaskId(), currentAnswer.getSummary().getNumFailed() > 0 ? "failed" : "passed", currentAnswer.getQuestion().getDataPlane(), BatfishObjectMapper.writeString( currentAnswer.getQuestion().getInstance().getVariables())); } catch (JsonProcessingException e) { throw new BatfishException( ae.getAnswers().put(questionName, currentAnswer); } catch (Exception e) { Answer errorAnswer = new Answer(); errorAnswer.addAnswerElement( new BatfishStackTrace(new BatfishException("Failed to output answer", e))); ae.getAnswers().put(questionName, errorAnswer); summary.combine(currentAnswer.getSummary()); }); answer.addAnswerElement(ae); answer.setSummary(summary);
Answer answer = new Answer(); LoadQuestionAnswerElement ae = new LoadQuestionAnswerElement(); answer.addAnswerElement(ae); answerStringToPrint = answer.prettyPrint(); } else { try {
SnapshotId referenceSnapshotId = null; AnalysisId analysisId = null; Answer oldAnswer = new Answer(); String col = "Issue"; String major = "maj"; String minor = "min"; int newSeverity = 6; oldAnswer.setStatus(AnswerStatus.SUCCESS); TableAnswerElement oldTable = new TableAnswerElement( oldTable.addExcludedRow( Row.of(col, new Issue("blorp", 1, new Issue.Type(major, minor))), "exc"); oldAnswer.setAnswerElements(ImmutableList.of(oldTable)); AnswerMetadata oldAnswerMetadata = AnswerMetadataUtil.computeAnswerMetadata(oldAnswer, _manager.getLogger()); BatfishObjectMapper.mapper() .readValue(_storage.loadAnswer(finalAnswerId), new TypeReference<Answer>() {}); TableAnswerElement newTable = (TableAnswerElement) newAnswer.getAnswerElements().get(0);
null, analysisId); Answer answer1 = new Answer(); Answer answer2 = new Answer(); String answer1Text = "foo1"; String answer2Text = "foo2"; answer1.addAnswerElement(new StringAnswerElement(answer1Text)); answer2.addAnswerElement(new StringAnswerElement(answer2Text)); String answer1Str = BatfishObjectMapper.writeString(answer1); String answer2Str = BatfishObjectMapper.writeString(answer2); BatfishObjectMapper.mapper() .writeValueAsString( Answer.failureAnswer( "Could not convert raw question text [bogus] to JSON", null)))));
loadPlugins(); boolean action = false; Answer answer = new Answer(); Path testRigPath = _testrigSettings.getInputPath(); Path outputPath = _testrigSettings.getSerializeVendorPath(); answer.append(serializeVendorConfigs(testRigPath, outputPath)); action = true; answer.append(serializeIndependentConfigs(inputPath)); answer.addAnswerElement(initInfoAnswerElement); action = true; GlobalTracer.get().buildSpan("Getting answer to question").startActive()) { assert questionSpan != null; // avoid unused warning answer.append(answer()); action = true; answer.append(analyze()); action = true; answer.addAnswerElement(computeDataPlane()); action = true;
private void outputAnswer(Answer answer, boolean writeLog) { try { String answerString = BatfishObjectMapper.writePrettyString(answer) + '\n'; _logger.debug(answerString); @Nullable String logString = writeLog ? answerString : null; writeJsonAnswerWithLog(logString, answerString); } catch (Exception e) { BatfishException be = new BatfishException("Error in sending answer", e); try { Answer failureAnswer = Answer.failureAnswer(e.toString(), answer.getQuestion()); failureAnswer.addAnswerElement(be.getBatfishStackTrace()); String answerString = BatfishObjectMapper.writePrettyString(failureAnswer) + '\n'; _logger.error(answerString); @Nullable String logString = writeLog ? answerString : null; writeJsonAnswerWithLog(logString, answerString); } catch (Exception e1) { _logger.errorf( "Could not serialize failure answer. %s", Throwables.getStackTraceAsString(e1)); } throw be; } }
analysisId); if (!_storage.hasAnswerMetadata(baseAnswerId)) { Answer ans = Answer.failureAnswer("Not answered", null); ans.setStatus(AnswerStatus.NOTFOUND); return BatfishObjectMapper.writePrettyString(ans); analysis, Throwables.getStackTraceAsString(e)); Answer ans = Answer.failureAnswer(message, null); ans.setStatus(AnswerStatus.FAILURE); answer = BatfishObjectMapper.writePrettyString(ans); return answer;
public static @Nonnull AnswerMetadata computeAnswerMetadata( @Nonnull Answer answer, @Nonnull BatfishLogger logger) { try { return AnswerMetadata.builder() .setMetrics(computeMetrics(answer, logger)) .setStatus(answer.getStatus()) .build(); } catch (Exception e) { return AnswerMetadata.forStatus(AnswerStatus.FAILURE); } }
@VisibleForTesting static @Nullable Metrics computeMetrics(@Nonnull Answer answer, @Nonnull BatfishLogger logger) { if (answer.getAnswerElements().isEmpty()) { return null; AnswerElement ae = answer.getAnswerElements().get(0); if (!(ae instanceof TableAnswerElement)) { return null;
public void append(Answer answer) { if (answer._question != null) { _question = answer._question; } _answerElements.addAll(answer._answerElements); _status = answer._status; _summary.combine(answer.getSummary()); for (AnswerElement answerElement : answer._answerElements) { if (answerElement instanceof BatfishStackTrace) { BatfishException e = ((BatfishStackTrace) answerElement).getException(); throw new QuestionException("Exception answering question", e, this); } } }
public @Nonnull Map<String, String> getAnalysisAnswers( String network, String snapshot, String referenceSnapshot, String analysis, Set<String> analysisQuestions) throws JsonProcessingException, FileNotFoundException { Set<String> questions = analysisQuestions.isEmpty() ? listAnalysisQuestions(network, analysis) : analysisQuestions; ImmutableSortedMap.Builder<String, String> result = ImmutableSortedMap.naturalOrder(); for (String questionName : questions) { try { result.put( questionName, getAnswer(network, snapshot, questionName, referenceSnapshot, analysis)); } catch (Exception e) { _logger.errorf( "Got exception in getAnalysisAnswers: %s\n", Throwables.getStackTraceAsString(e)); result.put( questionName, BatfishObjectMapper.mapper() .writeValueAsString(Answer.failureAnswer(e.getMessage(), null))); } } return result.build(); }
@Override public String toString() { return prettyPrint(); } }