package com.hubspot.blazar.visitor.modulebuild;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hubspot.blazar.base.DependencyGraph;
import com.hubspot.blazar.base.ModuleBuild;
import com.hubspot.blazar.base.RepositoryBuild;
import com.hubspot.blazar.base.visitor.AbstractModuleBuildVisitor;
import com.hubspot.blazar.data.service.ModuleBuildService;
import com.hubspot.blazar.data.service.RepositoryBuildService;
@Singleton
public class DownstreamModuleBuildCanceller extends AbstractModuleBuildVisitor {
private static final Logger LOG = LoggerFactory.getLogger(DownstreamModuleBuildCanceller.class);
private final RepositoryBuildService repositoryBuildService;
private final ModuleBuildService moduleBuildService;
@Inject
public DownstreamModuleBuildCanceller(RepositoryBuildService repositoryBuildService,
ModuleBuildService moduleBuildService) {
this.repositoryBuildService = repositoryBuildService;
this.moduleBuildService = moduleBuildService;
}
@Override
protected void visitCancelled(ModuleBuild build) throws Exception {
LOG.debug("Module build {} has been cancelled looking for downstream module builds that need to be cancelled",
build.getId().get());
cancelDownstreamModuleBuilds(build);
}
@Override
protected void visitFailed(ModuleBuild build) throws Exception {
cancelDownstreamModuleBuilds(build);
}
private void cancelDownstreamModuleBuilds(ModuleBuild cancelledModuleBuild) {
RepositoryBuild repositoryBuild = repositoryBuildService.get(cancelledModuleBuild.getRepoBuildId()).get();
DependencyGraph dependencyGraph = repositoryBuild.getDependencyGraph().get();
Set<Integer> downstreamModules = dependencyGraph.outgoingVertices(cancelledModuleBuild.getModuleId());
for (ModuleBuild moduleBuildInRepoBuild : moduleBuildService.getByRepositoryBuild(cancelledModuleBuild.getRepoBuildId())) {
LOG.debug("Checking if module build {} is downstream to cancelled module build {} (and has not completed) in order to cancel it.",
moduleBuildInRepoBuild, cancelledModuleBuild.getId().get());
if (downstreamModules.contains(moduleBuildInRepoBuild.getModuleId()) && !moduleBuildInRepoBuild.getState().isComplete()) {
moduleBuildService.cancel(moduleBuildInRepoBuild);
LOG.debug("Downstream module build {}->{} was cancelled.", cancelledModuleBuild.getId().get(),
moduleBuildInRepoBuild.getId().get());
}
}
}
}