package com.hubspot.blazar.util;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.hubspot.blazar.base.ModuleBuild;
import com.hubspot.blazar.config.BlazarConfiguration;
import com.hubspot.blazar.data.service.BranchService;
import com.hubspot.blazar.data.service.ModuleBuildService;
import com.hubspot.blazar.data.service.ModuleService;
import com.hubspot.blazar.exception.BuildClusterException;
import com.hubspot.blazar.externalservice.BuildClusterHealthChecker;
import com.hubspot.blazar.externalservice.BuildClusterService;
import com.hubspot.horizon.AsyncHttpClient;
import com.hubspot.singularity.client.SingularityClient;
@Singleton
public class TestBuildClusterService extends BuildClusterService {
private static final Logger LOG = LoggerFactory.getLogger(TestBuildClusterService.class);
private final ModuleBuildService moduleBuildService;
private Set<Integer> failingModules;
@Inject
public TestBuildClusterService(Map<String, SingularityClient> singularityClusterClients,
BlazarConfiguration blazarConfiguration,
ModuleService moduleService,
ModuleBuildService moduleBuildService,
BranchService branchService,
BuildClusterHealthChecker buildClusterHealthChecker,
AsyncHttpClient asyncHttpClient) {
super(singularityClusterClients, blazarConfiguration, moduleService, moduleBuildService, branchService, buildClusterHealthChecker, asyncHttpClient);
this.moduleBuildService = moduleBuildService;
this.failingModules = ImmutableSet.of();
}
public void clearModulesToFail() {
failingModules = ImmutableSet.of();
}
public void setModulesToFail(Set<Integer> modules) {
failingModules = ImmutableSet.copyOf(modules);
}
@Override
public synchronized String launchBuildContainer(ModuleBuild moduleBuild) throws BuildClusterException {
String buildClusterToUse = "SingularityCluster1";
moduleBuild = moduleBuildService.get(moduleBuild.getId().get()).get();
moduleBuildService.updateBuildClusterName(moduleBuild.getModuleId(), buildClusterToUse);
if (moduleBuild.getState().isWaiting()) {
return buildClusterToUse;
}
if (failingModules.contains(moduleBuild.getModuleId())) {
failBuild(moduleBuild);
} else {
passBuild(moduleBuild);
}
return buildClusterToUse;
}
private void failBuild(ModuleBuild build) {
LOG.info("Pretending to launch {} calling start", build);
ModuleBuild inProgress = moduleBuildService.setStateToLaunching(build.getId().get(), build.toString());
LOG.info("Build {} now in progress, publishing failure", inProgress);
ModuleBuild failure = moduleBuildService.setStateToFailed(inProgress.getId().get());
LOG.info("Build {} Failed", failure);
}
private void passBuild(ModuleBuild build) {
LOG.info("Pretending to launch {} calling start", build);
ModuleBuild inProgress = moduleBuildService.setStateToLaunching(build.getId().get(), build.toString());
LOG.info("Build {} now in progress, publishing success", inProgress);
ModuleBuild success = moduleBuildService.setStateToSucceded(inProgress.getId().get());
LOG.info("Build {} succeed", success);
}
}