package com.hubspot.blazar.visitor.repositorybuild;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Optional;
import com.hubspot.blazar.base.RepositoryBuild;
import com.hubspot.blazar.base.visitor.AbstractRepositoryBuildVisitor;
import com.hubspot.blazar.data.service.RepositoryBuildService;
import com.hubspot.blazar.data.util.BuildNumbers;
import com.hubspot.blazar.util.RepositoryBuildLauncher;
@Singleton
public class QueuedRepositoryBuildVisitor extends AbstractRepositoryBuildVisitor {
private static final Logger LOG = LoggerFactory.getLogger(QueuedRepositoryBuildVisitor.class);
private final RepositoryBuildService repositoryBuildService;
private final RepositoryBuildLauncher buildLauncher;
@Inject
public QueuedRepositoryBuildVisitor(RepositoryBuildService repositoryBuildService,
RepositoryBuildLauncher buildLauncher) {
this.repositoryBuildService = repositoryBuildService;
this.buildLauncher = buildLauncher;
}
@Override
protected void visitQueued(RepositoryBuild build) throws Exception {
BuildNumbers buildNumbers = repositoryBuildService.getBuildNumbers(build.getBranchId());
int pendingBuildNumber = buildNumbers.getPendingBuildNumber().or(-1);
int inProgressBuildNumber = buildNumbers.getInProgressBuildNumber().or(-1);
if (build.getBuildNumber() != pendingBuildNumber) {
// now that we allow multiple queued builds this will get hit
LOG.info("Queued Repository Build {} is not marked as the pending build for branch {}, will not launch it yet. The currently pending build is {}.",
build.getId().get(), build.getBranchId(), pendingBuildNumber);
} else if (buildNumbers.getInProgressBuildId().isPresent()) {
LOG.info("Queued repository build {} (build# {}) is the next pending build for branch {} but repository build {} (build# {}) is in progress, will not launch queued build yet",
build.getId().get(), build.getBuildNumber(), build.getBranchId(), buildNumbers.getInProgressBuildId().get(), inProgressBuildNumber);
} else {
LOG.info("Queued Repository Build {} (build# {}) is marked as the next pending build for branch {} and no other build is currently in progress, will launch this build now.",
build.getId().get(), build.getBuildNumber(), build.getBranchId());
final Optional<RepositoryBuild> previous;
if (buildNumbers.getLastBuildId().isPresent()) {
previous = Optional.of(repositoryBuildService.get(buildNumbers.getLastBuildId().get()).get());
} else {
previous = Optional.absent();
}
buildLauncher.launch(build, previous);
}
}
}