/** * Copyright 2013 Technische Universitat Wien (TUW), Distributed SystemsGroup * E184. * * This work was partially supported by the European Commission in terms of the * CELAR FP7 project (FP7-ICT-2011-8 #317790). * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ /** * Author : Georgiana Copil - e.copil@dsg.tuwien.ac.at */ package at.ac.tuwien.dsg.rSybl.analysisEngine.webAPI; import java.rmi.RemoteException; import java.util.logging.Logger; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import com.sun.jersey.spi.resource.Singleton; import at.ac.tuwien.dsg.csdg.elasticityInformation.elasticityRequirements.SYBLAnnotation; import at.ac.tuwien.dsg.rSybl.analysisEngine.main.ControlCoordination; import at.ac.tuwien.dsg.rSybl.analysisEngine.main.ControlService; import at.ac.tuwien.dsg.rSybl.analysisEngine.main.ControlServiceFactory; import at.ac.tuwien.dsg.rSybl.analysisEngine.utils.AnalysisLogger; import com.sun.jersey.api.client.ClientResponse; import javax.ws.rs.DELETE; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; @Singleton @Path("/") public class SyblControlWS { @Context private UriInfo context; private ControlCoordination controlCoordination; public SyblControlWS() { controlCoordination = new ControlCoordination(); } @GET @Path("/test") @Produces(MediaType.TEXT_PLAIN) public String test() { return "Test working"; } @PUT @Path("/{id}/onDemandControl/unhealthy") @Consumes("plain/txt") public Response checkUnhealthyState(String servicePartID, @PathParam("id") String id) { try { controlCoordination.triggerHealthFixServicePart(servicePartID, servicePartID); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/processAnotation") @Consumes("application/xml") public Response processAnnotation(String serviceId, String entity, SYBLAnnotation annotation) { try { controlCoordination.processAnnotation(serviceId, entity, annotation); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/descriptionInternalModel") @Consumes("application/xml") public Response setApplicationDescriptionInfoInternalModel(String applicationDescriptionXML, String elasticityRequirementsXML, String deploymentInfoXML) { try { controlCoordination.setApplicationDescriptionInfoInternalModel(applicationDescriptionXML, elasticityRequirementsXML, deploymentInfoXML); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/description/tosca") @Consumes("application/xml") public Response setApplicationDescriptionTOSCA(@PathParam("id") String cloudServiceId, String celar) { try { controlCoordination.setApplicationDescriptionInfoTOSCA(celar, cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/startTEST") @Consumes("application/xml") public Response startTest(@PathParam("id") String cloudServiceId) { try { controlCoordination.setTESTState(cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/{componentID}/testElasticityCapability/{capabilityID}") @Consumes("application/xml") public Response startElasticityCapability(@PathParam("id") String cloudServiceId, @PathParam("componentID") String componentID, @PathParam("capabilityID") String capabilityID) { try { if (controlCoordination.testEnforcementCapability(cloudServiceId, capabilityID, componentID)) { return Response.ok().build(); } else { return Response.status(ClientResponse.Status.CONFLICT).build(); } } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/{componentID}/testElasticityCapability/{pluginID}/{capabilityID}") @Consumes("application/xml") public Response startElasticityCapabilityWithPlugin(@PathParam("id") String cloudServiceId, @PathParam("componentID") String componentID, @PathParam("pluginID") String pluginID, @PathParam("capabilityID") String capabilityID) { try { if (controlCoordination.testEnforcementCapabilityOnPlugin(cloudServiceId, pluginID, capabilityID, componentID)) { return Response.ok().build(); } else { return Response.status(ClientResponse.Status.CONFLICT).build(); } } catch (Exception e) { return Response.serverError().entity(e).build(); } } @DELETE @Path("/{id}") @Consumes("application/xml") public Response undeployService(@PathParam("id") String cloudServiceId) { try { controlCoordination.undeployService(cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @DELETE @Path("/managedService/{id}") @Consumes("application/xml") public Response removeServiceFromControl(@PathParam("id") String cloudServiceId) { try { controlCoordination.removeService(cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/description") @Consumes("application/xml") public Response setApplicationDescriptionInfo(@PathParam("id") String cloudServiceId, String celar) { try { controlCoordination.setApplicationDescriptionInfo(cloudServiceId, celar); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @GET @Path("/{id}/description") @Produces("application/xml") public String getApplicationDescriptionInfo(@PathParam("id") String cloudServiceId) { return controlCoordination.getApplicationDescriptionInfo(cloudServiceId); } @PUT @Path("/{id}/elasticityCapabilitiesEffects") @Consumes("application/json") public Response setElasticityCapabilitiesEffects(@PathParam("id") String cloudServiceId, String effects) { try { controlCoordination.setElasticityCapabilitiesEffects(effects); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/compositionRules") @Consumes("application/xml") public Response setMetricsComposition(@PathParam("id") String cloudServiceId, String composition) { try { controlCoordination.setMetricComposition(cloudServiceId, composition); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/deployment") @Consumes("application/xml") public Response setApplicationDeploymentInfoCELAR(@PathParam("id") String cloudServiceId, String celar) { try { controlCoordination.setApplicationDeploymentDescription(cloudServiceId, celar); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @POST @Path("/{id}/deployment") @Consumes("application/xml") public Response setApplicationRefreshDeploymentInfo(@PathParam("id") String cloudServiceId, String description) { try { controlCoordination.refreshApplicationDeploymentDescription(description); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/prepareControl") @Consumes("application/xml") public Response prepareControl(@PathParam("id") String cloudServiceId) { try { controlCoordination.prepareControl(cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/startControl") @Consumes("application/xml") public Response startControl(@PathParam("id") String cloudServiceId) { try { controlCoordination.startControl(cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/startControlOnExisting") @Consumes("application/xml") public Response startControlOnExisting(@PathParam("id") String cloudServiceId) { try { controlCoordination.startControlOnExisting(cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @PUT @Path("/{id}/stopControl") @Consumes("application/xml") public Response stopControl(@PathParam("id") String cloudServiceId) { try { controlCoordination.stopControl(cloudServiceId); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @POST @Path("/{id}/description") @Consumes("application/xml") public Response replaceCloudService(@PathParam("id") String cloudServiceId, String cloudService) { try { controlCoordination.replaceCloudServiceWithRequirements(cloudServiceId, cloudService); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @POST @Path("/{id}/compositionRules") @Consumes("application/xml") public Response replaceCompositionRules(@PathParam("id") String cloudServiceId, String composition) { try { controlCoordination.replaceCompositionRules(cloudServiceId, composition); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @POST @Path("/{id}/elasticityRequirements/xml") @Consumes("application/xml") public Response replaceRequirements(@PathParam("id") String cloudServiceId, String requirements) { try { controlCoordination.replaceRequirements(cloudServiceId, requirements); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @GET @Path("/{id}/elasticityRequirements/xml") @Produces("application/xml") public String getXMLRequirements(@PathParam("id") String cloudServiceId) { return controlCoordination.getRequirements(cloudServiceId); } @GET @Path("/{id}/elasticityRequirements/plain") @Produces("text/plain") public String getSYBLRequirements(@PathParam("id") String cloudServiceId) { return controlCoordination.getSimpleRequirements(cloudServiceId); } @POST @Path("/{id}/elasticityCapabilitiesEffects") @Consumes("application/json") public Response replaceEffects(@PathParam("id") String id, String effects) { try { controlCoordination.replaceEffects(id, effects); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } @GET @Produces(MediaType.APPLICATION_JSON) @Path("/{id}/structuralData/json") public String getStructuralData(@PathParam("id") String id) { return controlCoordination.getJSONStructureOfService(id); } @GET @Produces(MediaType.TEXT_PLAIN) @Path("/elasticservices") public String getServices() { return controlCoordination.getServices(); } @POST @Consumes(MediaType.TEXT_PLAIN) @Path("/{id}/replaceRequirements/plain") public Response replaceRequirementsString(@PathParam("id") String id, String requirement) { try { controlCoordination.replaceRequirementsString(id, requirement); return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } public UriInfo getContext() { return context; } public Response setContext(UriInfo context) { try { this.context = context; return Response.ok().build(); } catch (Exception e) { return Response.serverError().entity(e).build(); } } }