package com.hubspot.blazar.client;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.base.Optional;
import com.hubspot.blazar.base.BuildOptions;
import com.hubspot.blazar.base.GitInfo;
import com.hubspot.blazar.base.Module;
import com.hubspot.blazar.base.ModuleBuild;
import com.hubspot.blazar.base.RepositoryBuild;
import com.hubspot.horizon.HttpClient;
import com.hubspot.horizon.HttpRequest;
import com.hubspot.horizon.HttpRequest.Method;
import com.hubspot.horizon.HttpResponse;
public class BlazarClient {
private static final String GET_ALL_GIT_INFO_PATH = "/branches";
private static final String GET_GIT_INFO_PATH = "/branches/%s";
private static final String TRIGGER_REPOSITORY_BUILD_PATH = "/branches/builds/branch/%s";
private static final String GET_REPOSITORY_BUILD_PATH = "/branches/builds/%s";
private static final String MODULE_BUILD_PATH = "/modules/builds";
private static final String BRANCHES_MODULES_PATH = "/branches/%s/modules";
private static final String GET_MODULE_BUILD_PATH = MODULE_BUILD_PATH + "/%s";
private static final String START_MODULE_BUILD_PATH = MODULE_BUILD_PATH + "/%s/start";
private static final String COMPLETE_MODULE_BUILD_SUCCESS_PATH = MODULE_BUILD_PATH + "/%s/success";
private static final String COMPLETE_MODULE_BUILD_FAILURE_PATH = MODULE_BUILD_PATH + "/%s/failure";
private final HttpClient httpClient;
private final String baseUrl;
// Create via BlazarClientConfig
BlazarClient(HttpClient httpClient, String baseUrl) {
this.httpClient = httpClient;
this.baseUrl = baseUrl;
}
public Set<GitInfo> getAllGitInfo() {
String url = baseUrl + GET_ALL_GIT_INFO_PATH;
HttpRequest request = HttpRequest.newBuilder().setMethod(Method.GET).setUrl(url).build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() == 200) {
return response.getAs(new TypeReference<Set<GitInfo>>() {});
} else {
throw toException(response);
}
}
public Optional<GitInfo> getGitInfo(long branchId) {
String url = String.format(baseUrl + GET_GIT_INFO_PATH, branchId);
HttpRequest request = HttpRequest.newBuilder().setMethod(Method.GET).setUrl(url).build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() == 404) {
return Optional.absent();
} else if (response.getStatusCode() == 200) {
return Optional.of(response.getAs(GitInfo.class));
} else {
throw toException(response);
}
}
public List<Module> getModules(long branchId) {
String url = String.format(baseUrl + BRANCHES_MODULES_PATH, branchId);
HttpRequest request = HttpRequest.newBuilder().setMethod(Method.GET).setUrl(url).build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() == 404) {
return Collections.emptyList();
} else if (response.getStatusCode() == 200) {
return response.getAs(new TypeReference<List<Module>>() {
});
} else {
throw toException(response);
}
}
public Optional<Module> getModule(long branchId, int moduleId) {
List<Module> modules = getModules(branchId);
for (Module each : modules) {
if (each.getId().get() == moduleId) {
return Optional.of(each);
}
}
throw new RuntimeException(String.format("Module id not found %d", moduleId)); // todo better exception type
}
public RepositoryBuild triggerRepositoryBuild(int branchId, BuildOptions buildOptions, String username) {
String url = String.format(baseUrl + TRIGGER_REPOSITORY_BUILD_PATH, branchId);
HttpRequest request = HttpRequest.newBuilder()
.setMethod(Method.POST)
.setUrl(url)
.setBody(buildOptions)
.setQueryParam("username").to(username)
.build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() == 200) {
return response.getAs(RepositoryBuild.class);
} else {
throw toException(response);
}
}
public Optional<RepositoryBuild> getRepositoryBuild(long repositoryBuildId) {
String url = String.format(baseUrl + GET_REPOSITORY_BUILD_PATH, repositoryBuildId);
HttpRequest request = HttpRequest.newBuilder().setMethod(Method.GET).setUrl(url).build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() == 404) {
return Optional.absent();
} else if (response.getStatusCode() == 200) {
return Optional.of(response.getAs(RepositoryBuild.class));
} else {
throw toException(response);
}
}
public Optional<ModuleBuild> getModuleBuild(long moduleBuildId) {
String url = String.format(baseUrl + GET_MODULE_BUILD_PATH, moduleBuildId);
HttpRequest request = HttpRequest.newBuilder().setMethod(Method.GET).setUrl(url).build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() == 404) {
return Optional.absent();
} else if (response.getStatusCode() == 200) {
return Optional.of(response.getAs(ModuleBuild.class));
} else {
throw toException(response);
}
}
public void startModuleBuild(long moduleBuildId, String taskId) {
String url = String.format(baseUrl + START_MODULE_BUILD_PATH, moduleBuildId);
HttpRequest request = HttpRequest.newBuilder()
.setMethod(Method.PUT)
.setUrl(url)
.setQueryParam("taskId").to(taskId)
.build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() != 200) {
throw toException(response);
}
}
public void completeModuleBuildSuccess(long moduleBuildId) {
String url = String.format(baseUrl + COMPLETE_MODULE_BUILD_SUCCESS_PATH, moduleBuildId);
HttpRequest request = HttpRequest.newBuilder().setMethod(Method.PUT).setUrl(url).build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() != 200) {
throw toException(response);
}
}
public void completeModuleBuildFailure(long moduleBuildId) {
String url = String.format(baseUrl + COMPLETE_MODULE_BUILD_FAILURE_PATH, moduleBuildId);
HttpRequest request = HttpRequest.newBuilder().setMethod(Method.PUT).setUrl(url).build();
HttpResponse response = httpClient.execute(request);
if (response.getStatusCode() != 200) {
throw toException(response);
}
}
private BlazarClientException toException(HttpResponse response) {
String messageFormat = "Error hitting URL %s, status code: %s, response: %s";
String message = String.format(messageFormat, response.getRequest().getUrl(), response.getStatusCode(), response.getAsString());
throw new BlazarClientException(message);
}
}