package org.openstack.atlas.api.resources; import org.apache.abdera.model.Feed; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openstack.atlas.api.atom.FeedType; import org.openstack.atlas.api.helpers.ConfigurationHelper; import org.openstack.atlas.api.helpers.LoadBalancerProperties; import org.openstack.atlas.api.helpers.ResponseFactory; import org.openstack.atlas.api.repository.ValidatorRepository; import org.openstack.atlas.api.resources.providers.CommonDependencyProvider; import org.openstack.atlas.api.validation.context.HttpRequestType; import org.openstack.atlas.api.validation.results.ValidatorResult; import org.openstack.atlas.cfg.PublicApiServiceConfigurationKeys; import org.openstack.atlas.docs.loadbalancers.api.v1.LoadBalancer; import org.openstack.atlas.service.domain.entities.LoadBalancerStatus; import org.openstack.atlas.service.domain.exceptions.ImmutableEntityException; import org.openstack.atlas.service.domain.operations.Operation; import javax.ws.rs.*; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import java.net.URI; import java.util.HashMap; import java.util.Map; import static javax.ws.rs.core.MediaType.*; public class LoadBalancerResource extends CommonDependencyProvider { private final Log LOG = LogFactory.getLog(LoadBalancerResource.class); private AccessListResource accessListResource; private ConnectionLoggingResource connectionLoggingResource; private ContentCachingResource contentCachingResource; private HealthMonitorResource healthMonitorResource; private LoadbalancerMetadataResource loadbalancerMetadataResource; private NodesResource nodesResource; private SessionPersistenceResource sessionPersistenceResource; private ConnectionThrottleResource connectionThrottleResource; private VirtualIpsResource virtualIpsResource; private UsageResource usageResource; private ErrorpageResource errorpageResource; private SslTerminationResource sslTerminationResource; private int id; private Integer accountId; private HttpHeaders requestHeaders; private NodeMetadataResource nodeMetadataResource; @GET @Produces({APPLICATION_XML, APPLICATION_JSON, APPLICATION_ATOM_XML}) public Response retrieveLoadBalancerDetail(@QueryParam("page") Integer page) { if (requestHeaders.getRequestHeader("Accept").get(0).equals(APPLICATION_ATOM_XML)) { return getFeedResponse(page); } try { org.openstack.atlas.service.domain.entities.LoadBalancer domainLb = loadBalancerService.get(id, accountId); domainLb.setNodes(LoadBalancerProperties.setWeightsforNodes(domainLb.getNodes())); LoadBalancer dataModelLb; if (domainLb.getStatus().equals(LoadBalancerStatus.DELETED)) { dataModelLb = dozerMapper.map(domainLb, LoadBalancer.class, "DELETED_LB"); } else { dataModelLb = dozerMapper.map(domainLb, LoadBalancer.class); } return Response.status(Response.Status.OK).entity(dataModelLb).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @DELETE public Response deleteLoadBalancer() { try { org.openstack.atlas.service.domain.entities.LoadBalancer domainLb = new org.openstack.atlas.service.domain.entities.LoadBalancer(); domainLb.setId(id); domainLb.setAccountId(accountId); if (requestHeaders != null) { if (requestHeaders.getRequestHeader("X-PP-User") != null && requestHeaders.getRequestHeader("X-PP-User").size() > 0) { domainLb.setUserName(requestHeaders.getRequestHeader("X-PP-User").get(0)); } } loadBalancerService.prepareForDelete(domainLb); org.openstack.atlas.service.domain.entities.LoadBalancer dbLb = loadBalancerService.get(domainLb.getId(), domainLb.getAccountId()); asyncService.callAsyncLoadBalancingOperation(Operation.DELETE_LOADBALANCER, dbLb); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @PUT @Consumes({APPLICATION_XML, APPLICATION_JSON}) public Response updateLoadBalancer(LoadBalancer loadBalancer) { ValidatorResult result = ValidatorRepository.getValidatorFor(LoadBalancer.class).validate(loadBalancer, HttpRequestType.PUT); org.openstack.atlas.service.domain.entities.LoadBalancer domainLb; if (!result.passedValidation()) { return getValidationFaultResponse(result); } try { loadBalancerService.get(id, accountId); domainLb = dozerMapper.map(loadBalancer, org.openstack.atlas.service.domain.entities.LoadBalancer.class); domainLb.setId(id); domainLb.setAccountId(accountId); if (requestHeaders != null) { domainLb.setUserName(requestHeaders.getRequestHeader("X-PP-User").get(0)); } loadBalancerService.prepareForUpdate(domainLb); org.openstack.atlas.service.domain.entities.LoadBalancer dbLb = loadBalancerService.get(domainLb.getId(), domainLb.getAccountId()); asyncService.callAsyncLoadBalancingOperation(Operation.UPDATE_LOADBALANCER, dbLb); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @GET @Path("stats") @Produces({APPLICATION_XML, APPLICATION_JSON, APPLICATION_ATOM_XML}) public Response retrieveLoadBalancerStats() { if (!ConfigurationHelper.isAllowed(restApiConfiguration, PublicApiServiceConfigurationKeys.stats)) return Response.status(Response.Status.BAD_REQUEST).build(); try { org.openstack.atlas.service.domain.entities.LoadBalancer loadBalancer = loadBalancerService.get(id, accountId); if (loadBalancer.getStatus() != LoadBalancerStatus.ACTIVE) { throw new ImmutableEntityException("The load balancer is not available to display statistics."); } org.openstack.atlas.docs.loadbalancers.api.v1.Stats stats; if (restApiConfiguration.getString(PublicApiServiceConfigurationKeys.adapter_soap_rest).equals("REST")) { stats = dozerMapper.map(reverseProxyLoadBalancerStmService.getVirtualServerStats(loadBalancer, new URI(restApiConfiguration.getString(PublicApiServiceConfigurationKeys .stingray_stats_base_uri))), org.openstack.atlas.docs.loadbalancers.api.v1.Stats.class); } else { stats = dozerMapper.map(reverseProxyLoadBalancerService.getLoadBalancerStats(loadBalancer), org.openstack.atlas.docs.loadbalancers.api.v1.Stats.class); } return Response.status(Response.Status.OK).entity(stats).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @Path("accesslist") public AccessListResource retrieveAccessListResource() { accessListResource.setRequestHeaders(requestHeaders); accessListResource.setAccountId(accountId); accessListResource.setLoadBalancerId(id); return accessListResource; } @Path("connectionlogging") public ConnectionLoggingResource retrieveConnectionLoggingResource() { connectionLoggingResource.setAccountId(accountId); connectionLoggingResource.setLoadBalancerId(id); return connectionLoggingResource; } @Path("contentcaching") public ContentCachingResource retrieveContentCachingResource() { contentCachingResource.setAccountId(accountId); contentCachingResource.setLoadBalancerId(id); return contentCachingResource; } @Path("connectionthrottle") public ConnectionThrottleResource retrieveConnectionThrottleResource() { connectionThrottleResource.setRequestHeaders(requestHeaders); connectionThrottleResource.setAccountId(accountId); connectionThrottleResource.setLoadBalancerId(id); return connectionThrottleResource; } @Path("errorpage") public ErrorpageResource retrieveErrorpageResource() { errorpageResource.setAccountId(accountId); errorpageResource.setLoadBalancerId(id); return errorpageResource; } @Path("healthmonitor") public HealthMonitorResource retrieveHealthMonitorResource() { healthMonitorResource.setRequestHeaders(requestHeaders); healthMonitorResource.setAccountId(accountId); healthMonitorResource.setLoadBalancerId(id); return healthMonitorResource; } @Path("metadata") public LoadbalancerMetadataResource retrieveMetadataResource() { loadbalancerMetadataResource.setRequestHeaders(requestHeaders); loadbalancerMetadataResource.setAccountId(accountId); loadbalancerMetadataResource.setLoadBalancerId(id); return loadbalancerMetadataResource; } @Path("nodes") public NodesResource retrieveNodesResource() { nodesResource.setRequestHeaders(requestHeaders); nodesResource.setAccountId(accountId); nodesResource.setLoadBalancerId(id); return nodesResource; } @Path("sessionpersistence") public SessionPersistenceResource retrieveSessionPersistenceResource() { sessionPersistenceResource.setRequestHeaders(requestHeaders); sessionPersistenceResource.setAccountId(accountId); sessionPersistenceResource.setLoadBalancerId(id); return sessionPersistenceResource; } @Path("ssltermination") public SslTerminationResource retrieveSslResource() { sslTerminationResource.setAccountId(accountId); sslTerminationResource.setLoadBalancerId(id); return sslTerminationResource; } @Path("usage") public UsageResource retrieveUsageResource() { usageResource.setAccountId(accountId); usageResource.setLoadBalancerId(id); return usageResource; } @Path("virtualips") public VirtualIpsResource retrieveVirtualIpsResource() { virtualIpsResource.setRequestHeaders(requestHeaders); virtualIpsResource.setAccountId(accountId); virtualIpsResource.setLoadBalancerId(id); return virtualIpsResource; } private Response getFeedResponse(Integer page) { Map<String, Object> feedAttributes = new HashMap<String, Object>(); feedAttributes.put("feedType", FeedType.LOADBALANCER_FEED); feedAttributes.put("accountId", accountId); feedAttributes.put("loadBalancerId", id); feedAttributes.put("page", page); Feed feed = atomFeedAdapter.getFeed(feedAttributes); if (feed.getEntries().isEmpty()) { try { loadBalancerService.get(id, accountId); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } return Response.status(200).entity(feed).build(); } public void setAccessListResource(AccessListResource accessListResource) { this.accessListResource = accessListResource; } public void setHealthMonitorResource(HealthMonitorResource healthMonitorResource) { this.healthMonitorResource = healthMonitorResource; } public void setLoadbalancerMetadataResource(LoadbalancerMetadataResource loadbalancerMetadataResource) { this.loadbalancerMetadataResource = loadbalancerMetadataResource; } public void setNodeMetadataResource(NodeMetadataResource nodeMetadataResource) { this.nodeMetadataResource = nodeMetadataResource; } public void setNodesResource(NodesResource nodesResource) { this.nodesResource = nodesResource; } public void setSessionPersistenceResource(SessionPersistenceResource sessionPersistenceResource) { this.sessionPersistenceResource = sessionPersistenceResource; } public void setConnectionThrottleResource(ConnectionThrottleResource connectionThrottleResource) { this.connectionThrottleResource = connectionThrottleResource; } public void setContentCachingResource(ContentCachingResource contentCachingResource) { this.contentCachingResource = contentCachingResource; } public void setVirtualIpsResource(VirtualIpsResource virtualIpsResource) { this.virtualIpsResource = virtualIpsResource; } public void setId(int id) { this.id = id; } public void setAccountId(Integer accountId) { this.accountId = accountId; } public void setUsageResource(UsageResource usageResource) { this.usageResource = usageResource; } public void setConnectionLoggingResource(ConnectionLoggingResource connectionLoggingResource) { this.connectionLoggingResource = connectionLoggingResource; } public void setRequestHeaders(HttpHeaders requestHeaders) { this.requestHeaders = requestHeaders; } public void setErrorpageResource(ErrorpageResource errorpageResource) { this.errorpageResource = errorpageResource; } public void setSslTerminationResource(SslTerminationResource sslTerminationResource) { this.sslTerminationResource = sslTerminationResource; } }