package org.openstack.atlas.api.mgmt.resources;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openstack.atlas.api.helpers.ResponseFactory;
import org.openstack.atlas.api.mgmt.resources.providers.ManagementDependencyProvider;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.AccountLoadBalancer;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.AccountLoadBalancers;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.ExtendedAccountLoadbalancer;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.ExtendedAccountLoadbalancers;
import org.openstack.atlas.service.domain.entities.GroupRateLimit;
import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException;
import org.openstack.atlas.service.domain.pojos.ExtendedAccountLoadBalancer;
import org.openstack.atlas.util.debug.Debug;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
import javax.ws.rs.PUT;
import javax.ws.rs.Produces;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.AccountRecord;
import org.openstack.atlas.service.domain.entities.Account;
public class AccountResource extends ManagementDependencyProvider {
private LoadBalancersResource loadBalancersResource;
private int id;
@Path("loadbalancers")
public LoadBalancersResource getLoadBalancersResource() {
loadBalancersResource.setAccountId(id);
return loadBalancersResource;
}
@GET
@Path("loadbalancers")
// Implements Jira: SITESLB-220
public Response retrieveLoadBalancers() {
if (!isUserInRole("cp,ops,support,billing")) {
return ResponseFactory.accessDenied();
}
AccountLoadBalancer raccountLoadBalancer;
AccountLoadBalancers raccountLoadBalancers = new AccountLoadBalancers();
List<org.openstack.atlas.service.domain.pojos.AccountLoadBalancer> daccountLoadBalancers;
raccountLoadBalancers.setAccountId(id);
try {
daccountLoadBalancers = loadBalancerService.getAccountLoadBalancers(id);
for (org.openstack.atlas.service.domain.pojos.AccountLoadBalancer daccountLoadBalancer : daccountLoadBalancers) {
raccountLoadBalancer = getDozerMapper().map(daccountLoadBalancer, AccountLoadBalancer.class);
raccountLoadBalancers.getAccountLoadBalancers().add(raccountLoadBalancer);
}
return Response.status(200).entity(raccountLoadBalancers).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@GET
@Path("extendedloadbalancers")
// Implements V1-B-34873
public Response retrieveExtendedAccountLoadBalancers() {
if (!isUserInRole("cp,ops,support,billing")) {
return ResponseFactory.accessDenied();
}
ExtendedAccountLoadbalancer raccountLoadBalancer;
ExtendedAccountLoadbalancers raccountLoadBalancers = new ExtendedAccountLoadbalancers();
List<ExtendedAccountLoadBalancer> daccountLoadBalancerExtendedAccountLoadBalancers;
raccountLoadBalancers.setAccountId(id);
try {
daccountLoadBalancerExtendedAccountLoadBalancers = loadBalancerService.getExtendedAccountLoadBalancer(id);
for (ExtendedAccountLoadBalancer daccountLoadBalancerExtendedAccountLoadBalancer : daccountLoadBalancerExtendedAccountLoadBalancers) {
raccountLoadBalancer = getDozerMapper().map(daccountLoadBalancerExtendedAccountLoadBalancer, ExtendedAccountLoadbalancer.class, "SIMPLE_VIP_CPLB");
raccountLoadBalancers.getExtendedAccountLoadbalancers().add(raccountLoadBalancer);
}
return Response.status(200).entity(raccountLoadBalancers).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@GET
@Path("groups")
public Response retrieveGroups() {
if (!isUserInRole("cp,ops,support")) {
return ResponseFactory.accessDenied();
}
List<GroupRateLimit> rateLimit = null;
org.openstack.atlas.docs.loadbalancers.api.management.v1.GroupRateLimits lts = new org.openstack.atlas.docs.loadbalancers.api.management.v1.GroupRateLimits();
try {
rateLimit = groupRepository.getByAccountId(id);
for (org.openstack.atlas.service.domain.entities.GroupRateLimit domain : rateLimit) {
lts.getGroupRateLimits().add(getDozerMapper().map(domain, org.openstack.atlas.docs.loadbalancers.api.management.v1.GroupRateLimit.class));
}
return Response.status(200).entity(lts).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@DELETE
@Path("groups")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response deleteAccountGroup() {
if (!isUserInRole("cp,ops,support")) {
return ResponseFactory.accessDenied();
}
try {
//delete all groups for account
groupRepository.deleteAllForAccount(id);
return Response.status(Response.Status.ACCEPTED).build();
} catch (Exception e) {
return ResponseFactory.getErrorResponse(e, null, null);
}
}
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getAccountRecord() {
Account account;
if (!isUserInRole("ops,cp,support,billing")) {
return ResponseFactory.accessDenied();
}
try {
account = virtualIpService.getAccountRecord(id);
} catch (EntityNotFoundException ex) {
return ResponseFactory.getErrorResponse(ex, null, null);
}
AccountRecord ar = (AccountRecord) dozerMapper.map(account, AccountRecord.class);
return Response.status(200).entity(ar).build();
}
@DELETE
public Response removeAccountRecord() {
if (!isUserInRole("ops")) {
return ResponseFactory.accessDenied();
}
boolean deleted = virtualIpService.deleteAccountRecord(id);
if (!deleted) {
String msg = "account not deleted possibly because it wasn't in the table";
return ResponseFactory.getValidationFaultResponse(msg);
}
return ResponseFactory.getSuccessResponse("deleted account " + id + " from Account table", 200);
}
@PUT
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response updateOrCreateAccountRecord(AccountRecord apiAccount) {
if (!isUserInRole("ops")) {
return ResponseFactory.accessDenied();
}
apiAccount.setId(id); // Just incase the account on the URL doesn't match the account in the body
Account dbAccount;
dbAccount = (Account) dozerMapper.map(apiAccount, Account.class);
try {
dbAccount = virtualIpService.updateOrCreateAccountRecord(dbAccount);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(AccountResource.class.getName()).log(Level.SEVERE, null, ex);
} catch (EntityNotFoundException ex) {
return ResponseFactory.getErrorResponse(ex, "Exception:", Debug.getExtendedStackTrace(ex));
}
AccountRecord accountRecord = (AccountRecord) dozerMapper.map(dbAccount, AccountRecord.class);
return Response.status(200).entity(accountRecord).build();
}
public void setLoadBalancersResource(LoadBalancersResource loadBalancersResource) {
this.loadBalancersResource = loadBalancersResource;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}