package org.openstack.atlas.api.mgmt.resources; import org.openstack.atlas.docs.loadbalancers.api.management.v1.RateLimit; import org.openstack.atlas.service.domain.entities.LoadBalancer; import org.openstack.atlas.service.domain.management.operations.EsbRequest; import org.openstack.atlas.service.domain.operations.Operation; import org.openstack.atlas.api.faults.HttpResponseBuilder; import org.openstack.atlas.api.helpers.ResponseFactory; import org.openstack.atlas.api.mgmt.repository.ValidatorRepository; import org.openstack.atlas.api.mgmt.resources.providers.ManagementDependencyProvider; import org.openstack.atlas.api.validation.context.HttpRequestType; import org.openstack.atlas.api.validation.results.ValidatorResult; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.text.ParseException; public class RateLimitResource extends ManagementDependencyProvider { private int loadbalancerId; public void setLoadbalancerId(int loadbalancerId) { this.loadbalancerId = loadbalancerId; } public int getLoadbalancerId() { return loadbalancerId; } @GET public Response getRateLimitDetails() throws ParseException { if (!isUserInRole("cp,ops,support")) { return ResponseFactory.accessDenied(); } org.openstack.atlas.service.domain.entities.RateLimit domainRateLimit; RateLimit apiRateLimit; try { domainRateLimit = rateLimitingService.get(loadbalancerId); apiRateLimit = getDozerMapper().map(domainRateLimit, RateLimit.class); return Response.status(200).entity(apiRateLimit).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @POST @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response createRateLimit(RateLimit rateLimit) { if (!isUserInRole("cp,ops")) { return ResponseFactory.accessDenied(); } ValidatorResult result = ValidatorRepository.getValidatorFor(RateLimit.class).validate(rateLimit, HttpRequestType.POST); if (!result.passedValidation()) { return Response.status(400).entity(HttpResponseBuilder.buildBadRequestResponse("Validation fault", result.getValidationErrorMessages())).build(); } try { org.openstack.atlas.docs.loadbalancers.api.management.v1.LoadBalancer apiLb = new org.openstack.atlas.docs.loadbalancers.api.management.v1.LoadBalancer(); apiLb.setRateLimit(rateLimit); LoadBalancer domainLb = getDozerMapper().map(apiLb, LoadBalancer.class); domainLb.setId(loadbalancerId); EsbRequest request = new EsbRequest(); request.setLoadBalancer(domainLb); rateLimitingService.create(domainLb); getManagementAsyncService().callAsyncLoadBalancingOperation(Operation.CREATE_RATE_LIMIT, request); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @PUT @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response appendRateLimit(RateLimit rateLimit) { if (!isUserInRole("cp,ops")) { return ResponseFactory.accessDenied(); } ValidatorResult result = ValidatorRepository.getValidatorFor(RateLimit.class).validate(rateLimit, HttpRequestType.PUT); if (!result.passedValidation()) { return Response.status(400).entity(HttpResponseBuilder.buildBadRequestResponse("Validation fault", result.getValidationErrorMessages())).build(); } try { org.openstack.atlas.docs.loadbalancers.api.management.v1.LoadBalancer apiLb = new org.openstack.atlas.docs.loadbalancers.api.management.v1.LoadBalancer(); apiLb.setRateLimit(rateLimit); LoadBalancer domainLb = getDozerMapper().map(apiLb, LoadBalancer.class); domainLb.setId(loadbalancerId); EsbRequest request = new EsbRequest(); request.setLoadBalancer(domainLb); rateLimitingService.update(domainLb); getManagementAsyncService().callAsyncLoadBalancingOperation(Operation.UPDATE_RATE_LIMIT, request); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @DELETE public Response deleteRateLimit() { if (!isUserInRole("cp,ops")) { return ResponseFactory.accessDenied(); } try { LoadBalancer domainLb = new LoadBalancer(); domainLb.setId(loadbalancerId); EsbRequest request = new EsbRequest(); request.setLoadBalancer(domainLb); rateLimitingService.delete(domainLb); getManagementAsyncService().callAsyncLoadBalancingOperation(Operation.DELETE_RATE_LIMIT, request); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } }