package org.openstack.atlas.api.mgmt.resources;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.AccountLoadBalancerServiceEvents;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.Host;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.LoadBalancer;
import org.openstack.atlas.service.domain.entities.LoadBalancerStatus;
import org.openstack.atlas.service.domain.entities.Ticket;
import org.openstack.atlas.service.domain.entities.Usage;
import org.openstack.atlas.service.domain.exceptions.BadRequestException;
import org.openstack.atlas.service.domain.operations.Operation;
import org.openstack.atlas.api.helpers.ResponseFactory;
import org.openstack.atlas.api.mgmt.resources.providers.ManagementDependencyProvider;
import org.openstack.atlas.api.mapper.UsageMapper;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class LoadBalancerResource extends ManagementDependencyProvider {
private LoadBalancerSuspensionResource loadBalancerSuspensionResource;
private RateLimitResource rateLimitResource;
private LoadbalancerVipResource loadbalancerVipResource;
private HostsResource hostsResource;
private SyncResource syncResource;
private TicketsResource ticketsResource;
private int id;
private ErrorpageResource errorPageResource;
@GET
@Path("host")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getHost() {
if (!isUserInRole("cp,ops")) {
return ResponseFactory.accessDenied();
}
try {
Host rlb = new Host();
org.openstack.atlas.service.domain.entities.Host dlb = hostService.getHostsByLoadBalancerId(id);
if (dlb != null) {
rlb = getDozerMapper().map(dlb, Host.class);
}
return Response.status(200).entity(rlb).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@DELETE
@Path("suspended")
public Response deleteSuspendedLoadBalancer() {
if (!isUserInRole("cp,ops,support")) {
return ResponseFactory.accessDenied();
}
try {
getLoadBalancerRepository().getById(id); // Throw up an exception if this doesn't exist.
org.openstack.atlas.service.domain.entities.LoadBalancer domainLb = new org.openstack.atlas.service.domain.entities.LoadBalancer();
domainLb.setId(id);
esbService.callAsyncLoadBalancingOperation(Operation.DELETE_LOADBALANCER, loadBalancerService.prepareMgmtLoadBalancerDeletion(domainLb, LoadBalancerStatus.SUSPENDED));
return Response.status(Response.Status.ACCEPTED).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@DELETE
@Path("error")
public Response deleteErroredLoadBalancer() {
if (!isUserInRole("cp,ops")) {
return ResponseFactory.accessDenied();
}
try {
loadBalancerService.get(id); // Throw up an exception if this doesn't exist.
org.openstack.atlas.service.domain.entities.LoadBalancer domainLb = new org.openstack.atlas.service.domain.entities.LoadBalancer();
domainLb.setId(id);
esbService.callAsyncLoadBalancingOperation(Operation.DELETE_LOADBALANCER, loadBalancerService.prepareMgmtLoadBalancerDeletion(domainLb, LoadBalancerStatus.ERROR));
return Response.status(Response.Status.ACCEPTED).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@PUT
@Path("/setstatuspendingupdate")
public Response updateLbStatusPending(@PathParam("status") String statusStr) {
if (!isUserInRole("cp,ops,support")) {
return ResponseFactory.accessDenied();
}
String format;
String msg;
Response resp;
LoadBalancerStatus status;
boolean isStatusChanged;
Integer accountId;
status = LoadBalancerStatus.PENDING_UPDATE;
try {
org.openstack.atlas.service.domain.entities.LoadBalancer dLb = new org.openstack.atlas.service.domain.entities.LoadBalancer();
dLb = loadBalancerService.get(id);
accountId = dLb.getAccountId();
isStatusChanged = loadBalancerService.testAndSetStatusPending(accountId, id);
if (isStatusChanged) {
msg = "status was set to pending";
resp = ResponseFactory.getSuccessResponse(msg, 200);
} else {
msg = "Status was already pending";
resp = ResponseFactory.getSuccessResponse(msg, 200);
}
return resp;
} catch (Exception ex) {
resp = ResponseFactory.getErrorResponse(ex, null, null);
return resp;
}
}
@PUT
@Path("/setstatus/{status}")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response updateLbStatus(@PathParam("status") String statusStr) {
if (!isUserInRole("cp,ops,support")) {
return ResponseFactory.accessDenied();
}
String format;
String msg;
Response resp;
LoadBalancerStatus status;
try {
status = LoadBalancerStatus.valueOf(statusStr);
} catch (IllegalArgumentException ex) {
BadRequestException e = new BadRequestException();
format = "Invalid LoadBalancer Status '%s'";
msg = String.format(format, statusStr);
return ResponseFactory.getErrorResponse(e, msg, null);
}
try {
org.openstack.atlas.service.domain.entities.LoadBalancer dLb = new org.openstack.atlas.service.domain.entities.LoadBalancer();
loadBalancerService.get(id);
dLb.setId(id);
dLb.setStatus(status);
loadBalancerService.setLoadBalancerAttrs(dLb);
msg = String.format("Status is now %s", status);
resp = ResponseFactory.getSuccessResponse(msg, 200);
return resp;
} catch (Exception ex) {
resp = ResponseFactory.getErrorResponse(ex, null, null);
return resp;
}
}
@Path("sync")
public SyncResource retrieveSyncResource() {
syncResource.setLoadBalancerId(id);
return syncResource;
}
@Path("suspension")
public LoadBalancerSuspensionResource getLoadBalancerSuspensionResource() {
loadBalancerSuspensionResource.setLoadBalancerId(id);
return loadBalancerSuspensionResource;
}
@Path("sticky")
@PUT
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response updateSticky() {
// Undocumented Url assuming its just for ops
if (!isUserInRole("cp,ops")) {
return ResponseFactory.accessDenied();
}
try {
org.openstack.atlas.service.domain.entities.LoadBalancer dLb = new org.openstack.atlas.service.domain.entities.LoadBalancer();
dLb.setId(id);
hostService.updateLoadBalancerSticky(dLb);
return Response.status(Response.Status.ACCEPTED).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@Path("sticky")
@DELETE
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response makeUnsticky() {
// Undocumented Url assuming its just for ops
if (!isUserInRole("cp,ops")) {
return ResponseFactory.accessDenied();
}
try {
org.openstack.atlas.service.domain.entities.LoadBalancer dLb = new org.openstack.atlas.service.domain.entities.LoadBalancer();
dLb.setId(id);
hostService.deleteLoadBalancerSticky(dLb);
return Response.status(Response.Status.ACCEPTED).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@Path("ratelimit")
public RateLimitResource getRateLimitResource() {
rateLimitResource.setLoadbalancerId(id);
return rateLimitResource;
}
@Path("virtualips")
public LoadbalancerVipResource retrieveLoadBalancerVirtualIpsResource() {
loadbalancerVipResource.setLoadBalancerId(id);
return loadbalancerVipResource;
}
@Path("tickets")
public TicketsResource retrieveTicketsResource() {
ticketsResource.setLoadBalancerId(id);
return ticketsResource;
}
@GET
@Path("extendedview")
public Response getExtendedView(@QueryParam("startDate") String startDate, @QueryParam("endDate") String endDate) {
if (!isUserInRole("cp,ops,support")) {
return ResponseFactory.accessDenied();
}
org.openstack.atlas.service.domain.events.pojos.AccountLoadBalancerServiceEvents dEvents;
AccountLoadBalancerServiceEvents rEvents = new AccountLoadBalancerServiceEvents();
try {
org.openstack.atlas.service.domain.entities.LoadBalancer dlb = getLoadBalancerRepository().getById(id);
LoadBalancer rlb = getDozerMapper().map(dlb, LoadBalancer.class);
// Attach tickets
if (dlb.getTickets() != null && !dlb.getTickets().isEmpty()) {
rlb.setTickets(new ArrayList<org.openstack.atlas.docs.loadbalancers.api.management.v1.Ticket>());
for (Ticket ticket : dlb.getTickets()) {
rlb.getTickets().add(dozerMapper.map(ticket, org.openstack.atlas.docs.loadbalancers.api.management.v1.Ticket.class));
}
}
// Attach usage for last 24 hours
Calendar now = Calendar.getInstance();
Calendar nowYesterday = (Calendar) now.clone();
nowYesterday.add(Calendar.DAY_OF_MONTH, -1);
List<Usage> usage = getLoadBalancerRepository().getUsageByLbId(id, nowYesterday, now);
if (usage != null && !usage.isEmpty()) {
rlb.setLoadBalancerUsage(UsageMapper.toRestApiCurrentUsage(usage));
}
//Attach events for the past 24 hours
dEvents = getEventRepository().getRecentLoadBalancerServiceEventsByLbId(dlb, startDate, endDate);
rEvents = getDozerMapper().map(dEvents, rEvents.getClass());
rlb.setAccountLoadBalancerServiceEvents(rEvents);
if (usage != null && !usage.isEmpty()) {
rlb.setLoadBalancerUsage(UsageMapper.toRestApiCurrentUsage(usage));
}
return Response.status(200).entity(rlb).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
public void setSyncResource(SyncResource syncResource) {
this.syncResource = syncResource;
}
public void setLoadBalancerSuspensionResource(LoadBalancerSuspensionResource loadBalancerSuspensionResource) {
this.loadBalancerSuspensionResource = loadBalancerSuspensionResource;
}
public void setRateLimitResource(RateLimitResource rateLimitResource) {
this.rateLimitResource = rateLimitResource;
}
public void setLoadbalancerVipResource(LoadbalancerVipResource loadbalancerVipResource) {
this.loadbalancerVipResource = loadbalancerVipResource;
}
public void setHostsResource(HostsResource hostsResource) {
this.hostsResource = hostsResource;
}
public void setTicketsResource(TicketsResource ticketsResource) {
this.ticketsResource = ticketsResource;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setErrorPageResource(ErrorpageResource errorPageResource) {
this.errorPageResource = errorPageResource;
}
public ErrorpageResource getErrorPageResource() {
return errorPageResource;
}
}