package com.indeed.proctor.webapp.controllers;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.indeed.proctor.common.model.TestDefinition;
import com.indeed.proctor.common.model.TestMatrixVersion;
import com.indeed.proctor.store.ProctorStore;
import com.indeed.proctor.store.Revision;
import com.indeed.proctor.store.StoreException;
import com.indeed.proctor.webapp.db.Environment;
import com.indeed.proctor.webapp.model.WebappConfiguration;
import com.indeed.proctor.webapp.views.JsonView;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.View;
import java.util.List;
@Controller
@RequestMapping({"/api/v1", "/proctor/api/v1"})
public class TestMatrixApiController extends AbstractController {
private static final Logger LOGGER = Logger.getLogger(TestMatrixApiController.class);
@Autowired
public TestMatrixApiController(final WebappConfiguration configuration,
@Qualifier("trunk") final ProctorStore trunkStore,
@Qualifier("qa") final ProctorStore qaStore,
@Qualifier("production") final ProctorStore productionStore) {
super(configuration, trunkStore, qaStore, productionStore);
}
@RequestMapping(value = "/{branchOrRevision}/matrix", method = RequestMethod.GET)
public JsonView getTestMatrix(
@PathVariable final String branchOrRevision
) throws StoreException {
final TestMatrixVersion testMatrixVersion = queryMatrixFromBranchOrRevision(branchOrRevision);
Preconditions.checkNotNull(testMatrixVersion, String.format("Branch or revision %s not correct", branchOrRevision));
return new JsonView(testMatrixVersion);
}
@RequestMapping(value = "/{branch}/matrix/history", method = RequestMethod.GET)
public JsonView getTestMatrixHistory(
@PathVariable final String branch,
@RequestParam(required = false, value = "start", defaultValue = "0") final int start,
@RequestParam(required = false, value = "limit", defaultValue = "32") final int limit
) throws StoreException {
final Environment environment = Environment.fromName(branch);
Preconditions.checkNotNull(environment, String.format("Branch %s not correct", branch));
return new JsonView(queryMatrixHistory(environment, start, limit));
}
@RequestMapping(value = "/{branchOrRevision}/definition/{testName}", method = RequestMethod.GET)
public JsonView getTestDefinition(
@PathVariable final String branchOrRevision,
@PathVariable final String testName
) throws StoreException {
final TestDefinition testDefinition = queryTestDefinition(branchOrRevision, testName);
Preconditions.checkNotNull(testDefinition,
String.format("Branch or revision %s not correct, or test %s not found", branchOrRevision, testName));
return new JsonView(testDefinition);
}
@RequestMapping(value = "/{branchOrRevision}/definition/{testName}/history", method = RequestMethod.GET)
public JsonView getTestDefinitionHistory(
@PathVariable final String branchOrRevision,
@PathVariable final String testName,
@RequestParam(required = false, value = "start", defaultValue = "0") final int start,
@RequestParam(required = false, value = "limit", defaultValue = "32") final int limit
) throws StoreException {
final List<Revision> revisions = queryTestDefinitionHistory(branchOrRevision, testName, start, limit);
Preconditions.checkState(!revisions.isEmpty(), String.format("Branch or revision %s not correct, or test %s not found", branchOrRevision, testName));
return new JsonView(revisions);
}
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = {Exception.class})
public View handleStoreException(final Exception e) {
LOGGER.error(e);
return new JsonView(ImmutableMap.of("error", e.getLocalizedMessage()));
}
}