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.google.common.eventbus.EventBus; 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 DownstreamModuleBuildVisitor extends AbstractModuleBuildVisitor { private static final Logger LOG = LoggerFactory.getLogger(DownstreamModuleBuildVisitor.class); private final RepositoryBuildService repositoryBuildService; private final ModuleBuildService moduleBuildService; private final EventBus eventBus; @Inject public DownstreamModuleBuildVisitor(RepositoryBuildService repositoryBuildService, ModuleBuildService moduleBuildService, EventBus eventBus) { this.repositoryBuildService = repositoryBuildService; this.moduleBuildService = moduleBuildService; this.eventBus = eventBus; } @Override protected void visitSucceeded(ModuleBuild build) throws Exception { LOG.info("Checking for builds downstream of {}", build.getId().get()); RepositoryBuild repositoryBuild = repositoryBuildService.get(build.getRepoBuildId()).get(); DependencyGraph dependencyGraph = repositoryBuild.getDependencyGraph().get(); Set<Integer> downstreamModules = dependencyGraph.outgoingVertices(build.getModuleId()); if (!downstreamModules.isEmpty()) { Set<ModuleBuild> builds = moduleBuildService.getByRepositoryBuild(build.getRepoBuildId()); for (ModuleBuild maybeDownstream : builds) { if (downstreamModules.contains(maybeDownstream.getModuleId())) { ModuleBuild downstreamBuild = maybeDownstream; if (downstreamBuild.getState().isWaiting()) { LOG.info("Posting event for downstream build {}", downstreamBuild.getId().get()); eventBus.post(downstreamBuild); } else { LOG.info("Not launching downstream build {} because it is in state {} (Needs to be QUEUED)", downstreamBuild.getId().get(), downstreamBuild.getState()); } } } } } }