package com.hubspot.singularity.resources;
import static com.hubspot.singularity.WebExceptions.checkNotFound;
import org.apache.curator.framework.recipes.leader.LeaderLatch;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Optional;
import com.hubspot.singularity.SingularityAuthorizationScope;
import com.hubspot.singularity.SingularityDeploy;
import com.hubspot.singularity.SingularityDeployMarker;
import com.hubspot.singularity.SingularityPendingDeploy;
import com.hubspot.singularity.SingularityRequest;
import com.hubspot.singularity.SingularityRequestDeployState;
import com.hubspot.singularity.SingularityRequestParent;
import com.hubspot.singularity.SingularityRequestWithState;
import com.hubspot.singularity.SingularityUser;
import com.hubspot.singularity.auth.SingularityAuthorizationHelper;
import com.hubspot.singularity.data.DeployManager;
import com.hubspot.singularity.data.RequestManager;
import com.hubspot.singularity.data.SingularityValidator;
import com.ning.http.client.AsyncHttpClient;
public class AbstractRequestResource extends AbstractLeaderAwareResource {
protected final RequestManager requestManager;
protected final DeployManager deployManager;
protected final Optional<SingularityUser> user;
protected final SingularityValidator validator;
protected final SingularityAuthorizationHelper authorizationHelper;
public AbstractRequestResource(RequestManager requestManager, DeployManager deployManager, Optional<SingularityUser> user, SingularityValidator validator, SingularityAuthorizationHelper authorizationHelper,
AsyncHttpClient httpClient, LeaderLatch leaderLatch, ObjectMapper objectMapper) {
super(httpClient, leaderLatch, objectMapper);
this.requestManager = requestManager;
this.deployManager = deployManager;
this.user = user;
this.validator = validator;
this.authorizationHelper = authorizationHelper;
}
protected SingularityRequestWithState fetchRequestWithState(String requestId) {
return fetchRequestWithState(requestId, false);
}
protected SingularityRequestWithState fetchRequestWithState(String requestId, boolean useWebCache) {
Optional<SingularityRequestWithState> request = requestManager.getRequest(requestId, useWebCache);
checkNotFound(request.isPresent(), "Couldn't find request with id %s", requestId);
authorizationHelper.checkForAuthorization(request.get().getRequest(), user, SingularityAuthorizationScope.READ);
return request.get();
}
protected SingularityRequestParent fillEntireRequest(SingularityRequestWithState requestWithState) {
return fillEntireRequest(requestWithState, Optional.<SingularityRequest>absent());
}
protected SingularityRequestParent fillEntireRequest(SingularityRequestWithState requestWithState, Optional<SingularityRequest> newRequestData) {
final String requestId = requestWithState.getRequest().getId();
final Optional<SingularityRequestDeployState> requestDeployState = deployManager.getRequestDeployState(requestId);
Optional<SingularityDeploy> activeDeploy = Optional.absent();
Optional<SingularityDeploy> pendingDeploy = Optional.absent();
if (requestDeployState.isPresent()) {
activeDeploy = fillDeploy(requestDeployState.get().getActiveDeploy());
pendingDeploy = fillDeploy(requestDeployState.get().getPendingDeploy());
}
Optional<SingularityPendingDeploy> pendingDeployState = deployManager.getPendingDeploy(requestId);
return new SingularityRequestParent(newRequestData.or(requestWithState.getRequest()), requestWithState.getState(), requestDeployState, activeDeploy, pendingDeploy, pendingDeployState,
requestManager.getExpiringBounce(requestId), requestManager.getExpiringPause(requestId), requestManager.getExpiringScale(requestId),
requestManager.getExpiringSkipHealthchecks(requestId));
}
protected Optional<SingularityDeploy> fillDeploy(Optional<SingularityDeployMarker> deployMarker) {
if (!deployMarker.isPresent()) {
return Optional.absent();
}
return deployManager.getDeploy(deployMarker.get().getRequestId(), deployMarker.get().getDeployId());
}
}