package org.openstack.atlas.api.resources; import org.apache.abdera.model.Feed; import org.openstack.atlas.api.atom.FeedType; 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.docs.loadbalancers.api.v1.Node; import org.openstack.atlas.docs.loadbalancers.api.v1.NodeType; import org.openstack.atlas.service.domain.entities.LoadBalancer; 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.util.*; import static javax.ws.rs.core.MediaType.*; public class NodeResource extends CommonDependencyProvider { private Integer id; private Integer accountId; private Integer loadBalancerId; private HttpHeaders requestHeaders; private NodeMetadataResource nodeMetadataResource; @GET @Produces({APPLICATION_XML, APPLICATION_JSON, APPLICATION_ATOM_XML}) public Response retrieveNode(@QueryParam("page") Integer page) { if (requestHeaders.getRequestHeader("Accept").get(0).equals(APPLICATION_ATOM_XML)) { return getFeedResponse(page); } org.openstack.atlas.service.domain.entities.Node dnode; org.openstack.atlas.docs.loadbalancers.api.v1.Node rnode; try { dnode = nodeService.getNodeByAccountIdLoadBalancerIdNodeId(accountId, loadBalancerId, id); rnode = dozerMapper.map(dnode, org.openstack.atlas.docs.loadbalancers.api.v1.Node.class); return Response.status(200).entity(rnode).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @PUT @Consumes({APPLICATION_XML, APPLICATION_JSON}) public Response updateNode(Node node) { ValidatorResult result = ValidatorRepository.getValidatorFor(Node.class).validate(node, HttpRequestType.PUT); if (!result.passedValidation()) { return getValidationFaultResponse(result); } try { node.setId(id); org.openstack.atlas.docs.loadbalancers.api.v1.LoadBalancer apiLb = new org.openstack.atlas.docs.loadbalancers.api.v1.LoadBalancer(); //BANDAIDed V1-D-10515: if (node.getType() == null) { node.setType(NodeType.valueOf( nodeService.getNodeByAccountIdLoadBalancerIdNodeId(accountId, loadBalancerId, id).getType().toString())); } apiLb.getNodes().add(node); LoadBalancer domainLb = dozerMapper.map(apiLb, LoadBalancer.class); domainLb.setId(loadBalancerId); domainLb.setAccountId(accountId); if (requestHeaders != null) { domainLb.setUserName(requestHeaders.getRequestHeader("X-PP-User").get(0)); } LoadBalancer dbLb = nodeService.updateNode(domainLb); asyncService.callAsyncLoadBalancingOperation(Operation.UPDATE_NODE, dbLb); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @DELETE public Response deleteNode() { try { LoadBalancer msgLb = new LoadBalancer(); Set<org.openstack.atlas.service.domain.entities.Node> nodes = new HashSet<org.openstack.atlas.service.domain.entities.Node>(); org.openstack.atlas.service.domain.entities.Node node = new org.openstack.atlas.service.domain.entities.Node(); node.setId(id); nodes.add(node); msgLb.setNodes(nodes); msgLb.setId(loadBalancerId); msgLb.setAccountId(accountId); if (requestHeaders != null) { msgLb.setUserName(requestHeaders.getRequestHeader("X-PP-User").get(0)); } LoadBalancer loadBalancer = nodeService.deleteNode(msgLb); asyncService.callAsyncLoadBalancingOperation(Operation.DELETE_NODE, loadBalancer); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } @Path("metadata") public NodeMetadataResource getNodeMetaDataResource() { nodeMetadataResource.setRequestHeaders(requestHeaders); nodeMetadataResource.setAccountId(accountId); nodeMetadataResource.setLoadbalancerId(loadBalancerId); nodeMetadataResource.setNodeId(id); return nodeMetadataResource; } private Response getFeedResponse(Integer page) { Map<String, Object> feedAttributes = new HashMap<String, Object>(); feedAttributes.put("feedType", FeedType.NODE_FEED); feedAttributes.put("accountId", accountId); feedAttributes.put("loadBalancerId", loadBalancerId); feedAttributes.put("nodeId", id); feedAttributes.put("page", page); Feed feed = atomFeedAdapter.getFeed(feedAttributes); if (feed.getEntries().isEmpty()) { try { nodeService.getNodeByAccountIdLoadBalancerIdNodeId(accountId, loadBalancerId, id); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } return Response.status(200).entity(feed).build(); } public void setId(Integer id) { this.id = id; } public Integer getId() { return id; } public Integer getAccountId() { return accountId; } public void setAccountId(Integer accountId) { this.accountId = accountId; } public Integer getLoadBalancerId() { return loadBalancerId; } public void setLoadBalancerId(Integer loadBalancerId) { this.loadBalancerId = loadBalancerId; } public void setRequestHeaders(HttpHeaders requestHeaders) { this.requestHeaders = requestHeaders; } public void setNodeMetadataResource(NodeMetadataResource nodeMetadataResource) { this.nodeMetadataResource = nodeMetadataResource; } }