package org.openstack.atlas.api.mgmt.resources; import org.openstack.atlas.service.domain.entities.LoadBalancer; import org.openstack.atlas.service.domain.entities.LoadBalancerStatus; import org.openstack.atlas.service.domain.entities.SslTermination; import org.openstack.atlas.service.domain.exceptions.BadRequestException; import org.openstack.atlas.service.domain.operations.Operation; import org.openstack.atlas.service.domain.pojos.MessageDataContainer; import org.openstack.atlas.api.helpers.ResponseFactory; import org.openstack.atlas.api.mgmt.resources.providers.ManagementDependencyProvider; import javax.ws.rs.PUT; import javax.ws.rs.core.Response; import org.openstack.atlas.docs.loadbalancers.api.v1.faults.BadRequest; import org.openstack.atlas.docs.loadbalancers.api.v1.faults.ValidationErrors; import org.openstack.atlas.util.ca.zeus.ZeusCrtFile; import org.openstack.atlas.util.ca.zeus.ZeusUtils; import static org.openstack.atlas.service.domain.entities.LoadBalancerStatus.PENDING_UPDATE; public class SyncResource extends ManagementDependencyProvider { private static final String SSLTERMBREAK = "SyncCall will result in this loadbalancer going into error status as the sslTermination is invalid. Consider deleting the ssltermination on this Lb before attempting to sync."; private static final ZeusUtils zeusUtils; private int loadBalancerId; static { zeusUtils = new ZeusUtils(); } @PUT public Response sync() { if (!isUserInRole("cp,ops,support")) { return ResponseFactory.accessDenied(); } try { //create requestObject MessageDataContainer mdc = new MessageDataContainer(); mdc.setLoadBalancerId(loadBalancerId); LoadBalancer lb = loadBalancerService.get(loadBalancerId); mdc.setAccountId(lb.getAccountId()); mdc.setLoadBalancerStatus(lb.getStatus()); SslTermination sslTerm = lb.getSslTermination(); if (sslTerm != null) { // Verify sslTerm won't break the LB during sync attempt String crt = sslTerm.getCertificate(); String key = sslTerm.getPrivatekey(); String imd = sslTerm.getIntermediateCertificate(); ZeusCrtFile zcf = zeusUtils.buildZeusCrtFileLbassValidation(key, crt, imd); if (zcf.hasFatalErrors()) { BadRequest sslFault = new BadRequest(); sslFault.setValidationErrors(new ValidationErrors()); sslFault.getValidationErrors().getMessages().add(SSLTERMBREAK); // Complain about SSL borkage sslFault.getValidationErrors().getMessages().addAll(zcf.getFatalErrorList()); return Response.status(Response.Status.BAD_REQUEST).entity(sslFault).build(); } } if (lb.getStatus().equals(LoadBalancerStatus.SUSPENDED)) { BadRequestException bre = new BadRequestException("Cannot Sync a Suspended Load Balancer, Please Check With Operations For Further Information..."); return ResponseFactory.getErrorResponse(bre, null, null); } loadBalancerService.setStatus(lb, PENDING_UPDATE); getManagementAsyncService().callAsyncLoadBalancingOperation(Operation.SYNC, mdc); return Response.status(Response.Status.ACCEPTED).build(); } catch (Exception e) { return ResponseFactory.getErrorResponse(e, null, null); } } public void setLoadBalancerId(int id) { this.loadBalancerId = id; } }