package org.openstack.atlas.api.resources;
import org.openstack.atlas.cfg.PublicApiServiceConfigurationKeys;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.openstack.atlas.docs.loadbalancers.api.v1.AccessList;
import org.openstack.atlas.docs.loadbalancers.api.v1.ConnectionLogging;
import org.openstack.atlas.docs.loadbalancers.api.v1.ConnectionThrottle;
import org.openstack.atlas.docs.loadbalancers.api.v1.HealthMonitor;
import org.openstack.atlas.docs.loadbalancers.api.v1.LoadBalancer;
import org.openstack.atlas.docs.loadbalancers.api.v1.Node;
import org.openstack.atlas.docs.loadbalancers.api.v1.Nodes;
import org.openstack.atlas.docs.loadbalancers.api.v1.SessionPersistence;
import org.openstack.atlas.docs.loadbalancers.api.v1.Updated;
import org.openstack.atlas.docs.loadbalancers.api.v1.VirtualIp;
import org.openstack.atlas.docs.loadbalancers.api.v1.VirtualIps;
import org.openstack.atlas.docs.loadbalancers.api.v1.Errorpage;
import org.openstack.atlas.api.resources.providers.CommonDependencyProvider;
import org.openstack.atlas.api.validation.results.ValidatorResult;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.openstack.atlas.api.helpers.ConfigurationHelper;
import org.openstack.atlas.api.helpers.ResponseFactory;
import org.openstack.atlas.api.repository.ValidatorRepository;
import org.openstack.atlas.api.validation.context.HttpRequestType;
import org.openstack.atlas.docs.loadbalancers.api.v1.SslTermination;
import org.openstack.atlas.util.ca.zeus.ZeusCrtFile;
import org.openstack.atlas.util.ca.zeus.ZeusUtils;
// TODO: Remove this class resource when we go to production
public class BounceResource extends CommonDependencyProvider {
private static final ZeusUtils zeusUtils;
static {
zeusUtils = new ZeusUtils();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("loadbalancer")
public Response echoLoadBalancer(LoadBalancer lb) {
return Response.status(200).entity(lb).build();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("virtualip")
public Response echoVirtualIp(VirtualIp virtualIp) {
return Response.status(200).entity(virtualIp).build();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("virtualips")
public Response echoVirtualIps(VirtualIps virtualIps) {
return Response.status(200).entity(virtualIps).build();
}
@POST
@Path("connectionthrottle")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoConnectionThrottle(ConnectionThrottle ct) {
Response resp = Response.status(200).entity(ct).build();
return resp;
}
@POST
@Path("node")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoNode(Node node) {
Response resp = Response.status(200).entity(node).build();
return resp;
}
@POST
@Path("healthmonitor")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoHealthMonitor(HealthMonitor hm) {
Response resp = Response.status(200).entity(hm).build();
return resp;
}
@POST
@Path("sessionpersistence")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoSessionPersistence(SessionPersistence sp) {
Response resp = Response.status(200).entity(sp).build();
return resp;
}
@POST
@Path("connectionlogging")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoConnectionLogging(ConnectionLogging cl) {
Response resp = Response.status(200).entity(cl).build();
return resp;
}
@POST
@Path("nodes")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoNodes(Nodes nodes) {
Response resp = Response.status(200).entity(nodes).build();
return resp;
}
@POST
@Path("accesslist")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoAccessList(AccessList accessList) {
Response resp = Response.status(200).entity(accessList).build();
return resp;
}
@POST
@Path("updated")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response echoUpdated(Updated updated) {
Response resp = Response.status(200).entity(updated).build();
return resp;
}
@POST
@Path("errorpage")
public Response echoErrorpage(Errorpage errorpage) {
Errorpage errorpage_out = new Errorpage();
errorpage_out.setContent(errorpage.getContent());
Response resp = Response.status(200).entity(errorpage_out).build();
return resp;
}
@POST
@Path("ssltermination")
public Response SslTermination(SslTermination sslTerm) {
if (!ConfigurationHelper.isAllowed(restApiConfiguration, PublicApiServiceConfigurationKeys.ssl_termination)) {
return Response.status(Response.Status.BAD_REQUEST).build();
}
ValidatorResult result = ValidatorRepository.getValidatorFor(SslTermination.class).validate(sslTerm, HttpRequestType.PUT);
if (!result.passedValidation()) {
return getValidationFaultResponse(result);
}
String key = sslTerm.getPrivatekey();
String crt = sslTerm.getCertificate();
String chain = sslTerm.getIntermediateCertificate();
Response resp;
ZeusCrtFile zcf = zeusUtils.buildZeusCrtFileLbassValidation(key, crt, chain);
if (zcf.hasFatalErrors()) {
resp = getValidationFaultResponse(zcf.getFatalErrorList());
} else {
SslTermination sslOut = new SslTermination();
sslOut.setPrivatekey(zcf.getPrivate_key());
sslOut.setCertificate(zcf.getPublic_cert());
resp = Response.status(200).entity(sslOut).build();
}
return resp;
}
}