Skip to content

Commit

Permalink
Merge pull request #181 from CJSCommonPlatform/fix-failure-status-of-…
Browse files Browse the repository at this point in the history
…verify-catchup

Status of VERIFY_CATCHUP command now correctly set to COMMAND_FAILED …
  • Loading branch information
allanmckenzie committed Oct 18, 2019
2 parents dbcb1ff + 97b4432 commit d2c4492
Show file tree
Hide file tree
Showing 30 changed files with 717 additions and 84 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to

## [Unreleased]

## [2.2.1] - 2019-10-18
### Fixed
- VERIFY_CATCHUP now correctly marks its status as COMMAND_FAILED if any of
the verification steps fail. Verification warnings are considered successful

## [2.2.0] - 2019-10-15
### Added
- New table in System database 'system_command_status' for storing state of commands
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package uk.gov.justice.services.eventstore.management.validation.commands;

import static uk.gov.justice.services.jmx.api.domain.CommandState.COMMAND_COMPLETE;
import static uk.gov.justice.services.jmx.api.domain.CommandState.COMMAND_FAILED;

import uk.gov.justice.services.jmx.api.domain.CommandState;

import java.util.Objects;
import java.util.UUID;

public class VerificationCommandResult {

private final UUID commandId;
private final String message;
private final CommandState commandState;

private VerificationCommandResult(final UUID commandId, final String message, final CommandState commandState) {
this.commandId = commandId;
this.message = message;
this.commandState = commandState;
}

public static VerificationCommandResult success(final UUID commandId, final String message) {
return new VerificationCommandResult(
commandId,
message,
COMMAND_COMPLETE
);
}

public static VerificationCommandResult failure(final UUID commandId, final String message) {
return new VerificationCommandResult(
commandId,
message,
COMMAND_FAILED
);
}

public UUID getCommandId() {
return commandId;
}

public String getMessage() {
return message;
}

public CommandState getCommandState() {
return commandState;
}

@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (!(o instanceof VerificationCommandResult)) return false;
final VerificationCommandResult that = (VerificationCommandResult) o;
return Objects.equals(commandId, that.commandId) &&
Objects.equals(message, that.message) &&
commandState == that.commandState;
}

@Override
public int hashCode() {
return Objects.hash(commandId, message, commandState);
}

@Override
public String toString() {
return "VerificationResult{" +
"commandId=" + commandId +
", message='" + message + '\'' +
", commandState=" + commandState +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import static java.lang.String.format;
import static uk.gov.justice.services.jmx.api.command.VerifyCatchupCommand.VERIFY_CATCHUP;
import static uk.gov.justice.services.jmx.api.domain.CommandState.COMMAND_COMPLETE;
import static uk.gov.justice.services.jmx.api.domain.CommandState.COMMAND_FAILED;
import static uk.gov.justice.services.jmx.api.domain.CommandState.COMMAND_IN_PROGRESS;

Expand Down Expand Up @@ -50,14 +49,14 @@ public void validateCatchup(final VerifyCatchupCommand verifyCatchupCommand, fin
));

try {
catchupVerificationProcess.runVerification();
final VerificationCommandResult verificationCommandResult = catchupVerificationProcess.runVerification(commandId);

systemCommandStateChangedEventFirer.fire(new SystemCommandStateChangedEvent(
commandId,
verifyCatchupCommand,
COMMAND_COMPLETE,
verificationCommandResult.getCommandState(),
clock.now(),
"Verification of catchup complete"
verificationCommandResult.getMessage()
));
} catch (final Exception e) {
final String message = format("Verification of catchup failed: %s: %s", e.getClass().getSimpleName(), e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,45 @@
package uk.gov.justice.services.eventstore.management.validation.process;

import static java.lang.String.format;
import static java.util.stream.Collectors.toList;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.VerificationResultType.ERROR;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.VerificationResultType.SUCCESS;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.VerificationResultType.WARNING;
import uk.gov.justice.services.eventstore.management.validation.commands.VerificationCommandResult;

import java.util.Collection;
import java.util.List;
import java.util.UUID;

import javax.inject.Inject;

import org.slf4j.Logger;

public class CatchupVerificationProcess {

@Inject
private Logger logger;
private VerificationRunner verificationRunner;

@Inject
private VerifierProvider verifierProvider;
private VerificationResultFilter verificationResultFilter;

public void runVerification() {
@Inject
private VerificationResultsLogger verificationResultsLogger;

final List<VerificationResult> verificationResults = verifierProvider.getVerifiers().stream()
.map(Verifier::verify)
.flatMap(Collection::stream)
.collect(toList());
@Inject
private CommandResultGenerator commandResultGenerator;

final List<VerificationResult> errorResults = filter(verificationResults, ERROR);
final List<VerificationResult> warningResults = filter(verificationResults, WARNING);
final List<VerificationResult> successfulResults = filter(verificationResults, SUCCESS);
public VerificationCommandResult runVerification(final UUID commandId) {

logger.info(format("Verification of Catchup completed with %d Errors, %d Warnings and %d Successes", errorResults.size(), warningResults.size(), successfulResults.size()));
final List<VerificationResult> verificationResults = verificationRunner.runVerifiers();

errorResults.forEach(verificationResult -> logger.error("ERROR: " + verificationResult.getMessage()));
warningResults.forEach(verificationResult -> logger.warn("WARNING: " + verificationResult.getMessage()));
successfulResults.forEach(verificationResult -> logger.info("SUCCESS: " + verificationResult.getMessage()));
}
final List<VerificationResult> successResults = verificationResultFilter.findSuccesses(verificationResults);
final List<VerificationResult> warningResults = verificationResultFilter.findWarnings(verificationResults);
final List<VerificationResult> errorResults = verificationResultFilter.findErrors(verificationResults);

private List<VerificationResult> filter(
final List<VerificationResult> verificationResults,
final VerificationResult.VerificationResultType verificationResultType) {
verificationResultsLogger.logResults(
successResults,
warningResults,
errorResults
);

return verificationResults.stream()
.filter(verificationResult -> verificationResult.getVerificationResultType() == verificationResultType)
.collect(toList());
return commandResultGenerator.createCommandResult(
commandId,
successResults,
warningResults,
errorResults
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package uk.gov.justice.services.eventstore.management.validation.process;

import static java.lang.String.format;
import static uk.gov.justice.services.eventstore.management.validation.commands.VerificationCommandResult.failure;
import static uk.gov.justice.services.eventstore.management.validation.commands.VerificationCommandResult.success;

import uk.gov.justice.services.eventstore.management.validation.commands.VerificationCommandResult;

import java.util.List;
import java.util.UUID;

public class CommandResultGenerator {

public VerificationCommandResult createCommandResult(
final UUID commandId,
final List<VerificationResult> successfulResults,
final List<VerificationResult> warningResults,
final List<VerificationResult> errorResults) {


if (errorResults.isEmpty()) {
final String message = format(
"Verification of Catchup completed successfully with %d Error(s), %d Warning(s) and %d Success(es)",
errorResults.size(),
warningResults.size(),
successfulResults.size());

return success(commandId, message);
}

final String message = format(
"Verification of Catchup failed with %d Error(s), %d Warning(s) and %d Success(es)",
errorResults.size(),
warningResults.size(),
successfulResults.size());

return failure(
commandId,
message
);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public class VerificationResult {

enum VerificationResultType {
public enum VerificationResultType {
SUCCESS,
WARNING,
ERROR
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package uk.gov.justice.services.eventstore.management.validation.process;

import static java.util.stream.Collectors.toList;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.VerificationResultType.ERROR;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.VerificationResultType.SUCCESS;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.VerificationResultType.WARNING;

import java.util.List;

public class VerificationResultFilter {

public List<VerificationResult> findSuccesses(final List<VerificationResult> verificationResults) {
return filter(SUCCESS, verificationResults);
}

public List<VerificationResult> findWarnings(final List<VerificationResult> verificationResults) {
return filter(WARNING, verificationResults);
}

public List<VerificationResult> findErrors(final List<VerificationResult> verificationResults) {
return filter(ERROR, verificationResults);
}

private List<VerificationResult> filter(
final VerificationResult.VerificationResultType verificationResultType,
final List<VerificationResult> verificationResults) {

return verificationResults.stream()
.filter(verificationResult -> verificationResult.getVerificationResultType() == verificationResultType)
.collect(toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package uk.gov.justice.services.eventstore.management.validation.process;

import static java.lang.String.format;

import java.util.List;

import javax.inject.Inject;

import org.slf4j.Logger;

public class VerificationResultsLogger {

@Inject
private Logger logger;

public void logResults(
final List<VerificationResult> successfulResults,
final List<VerificationResult> warningResults,
final List<VerificationResult> errorResults) {

logger.info(format("Verification of Catchup completed with %d Errors, %d Warnings and %d Successes", errorResults.size(), warningResults.size(), successfulResults.size()));

errorResults.forEach(verificationResult -> logger.error("ERROR: " + verificationResult.getMessage()));
warningResults.forEach(verificationResult -> logger.warn("WARNING: " + verificationResult.getMessage()));
successfulResults.forEach(verificationResult -> logger.info("SUCCESS: " + verificationResult.getMessage()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package uk.gov.justice.services.eventstore.management.validation.process;

import static java.util.stream.Collectors.toList;

import java.util.Collection;
import java.util.List;

import javax.inject.Inject;

public class VerificationRunner {

@Inject
private VerifierProvider verifierProvider;

public List<VerificationResult> runVerifiers() {

return verifierProvider.getVerifiers().stream()
.map(Verifier::verify)
.flatMap(Collection::stream)
.collect(toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

import static java.util.Arrays.asList;

import uk.gov.justice.services.eventstore.management.validation.process.verifiers.ProcessedEventCountVerifier;
import uk.gov.justice.services.eventstore.management.validation.process.verifiers.ProcessedEventLinkVerifier;
import uk.gov.justice.services.eventstore.management.validation.process.verifiers.PublishedEventCountVerifier;
import uk.gov.justice.services.eventstore.management.validation.process.verifiers.PublishedEventLinkVerifier;
import uk.gov.justice.services.eventstore.management.validation.process.verifiers.StreamBufferEmptyVerifier;

import java.util.List;

import javax.inject.Inject;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package uk.gov.justice.services.eventstore.management.validation.process;
package uk.gov.justice.services.eventstore.management.validation.process.verifiers;

import static java.lang.String.format;
import static java.util.Collections.singletonList;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.error;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.success;

import uk.gov.justice.services.eventsourcing.source.core.EventStoreDataSourceProvider;
import uk.gov.justice.services.eventstore.management.validation.process.TableRowCounter;
import uk.gov.justice.services.eventstore.management.validation.process.VerificationResult;
import uk.gov.justice.services.eventstore.management.validation.process.Verifier;
import uk.gov.justice.services.jdbc.persistence.ViewStoreJdbcDataSourceProvider;

import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package uk.gov.justice.services.eventstore.management.validation.process;
package uk.gov.justice.services.eventstore.management.validation.process.verifiers;

import uk.gov.justice.services.eventstore.management.validation.process.EventLinkageChecker;
import uk.gov.justice.services.eventstore.management.validation.process.VerificationResult;
import uk.gov.justice.services.eventstore.management.validation.process.Verifier;
import uk.gov.justice.services.jdbc.persistence.ViewStoreJdbcDataSourceProvider;

import java.util.List;
Expand All @@ -8,7 +11,7 @@

import org.slf4j.Logger;

public class ProcessedEventLinkVerifier implements Verifier{
public class ProcessedEventLinkVerifier implements Verifier {

@Inject
private ViewStoreJdbcDataSourceProvider viewStoreJdbcDataSourceProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package uk.gov.justice.services.eventstore.management.validation.process;
package uk.gov.justice.services.eventstore.management.validation.process.verifiers;

import static java.lang.String.format;
import static java.util.Collections.singletonList;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.error;
import static uk.gov.justice.services.eventstore.management.validation.process.VerificationResult.success;

import uk.gov.justice.services.eventsourcing.source.core.EventStoreDataSourceProvider;
import uk.gov.justice.services.eventstore.management.validation.process.EventLogActiveEventRowCounter;
import uk.gov.justice.services.eventstore.management.validation.process.TableRowCounter;
import uk.gov.justice.services.eventstore.management.validation.process.VerificationResult;
import uk.gov.justice.services.eventstore.management.validation.process.Verifier;

import java.util.List;

Expand All @@ -14,7 +18,7 @@

import org.slf4j.Logger;

public class PublishedEventCountVerifier implements Verifier{
public class PublishedEventCountVerifier implements Verifier {

private static final String PUBLISHED_EVENT_TABLE_NAME = "published_event";

Expand Down
Loading

0 comments on commit d2c4492

Please sign in to comment.