package at.ac.tuwien.dsg.rSybl.client; /** * 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 */ import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.logging.Level; import java.util.logging.Logger; import javax.ws.rs.Path; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; public class SYBLControlClient { protected static String REST_API_URL = "http://localhost:8280/rSYBL/restWS"; protected String compRules; public SYBLControlClient(String rsyblurl) { REST_API_URL = rsyblurl; } public static void main(String[] args) { try { String applicationID = "SCAN"; String tosca = readFile("Application_SCAN.tosca", Charset.defaultCharset()); String deployment = readFile("deployment_SCAN.xml", Charset.defaultCharset()); SYBLControlClient sYBLControlClient = new SYBLControlClient(REST_API_URL); sYBLControlClient.prepareControl(applicationID); sYBLControlClient.setApplicationDescription(applicationID, tosca); sYBLControlClient.setApplicationDeployment(applicationID, deployment); // sYBLControlClient.startTest(applicationID); // sYBLControlClient.testElasticityCapability(applicationID, "Master", "attachDisk"); // sYBLControlClient.testElasticityCapability(applicationID, "Master", "dettachDisk"); sYBLControlClient.prepareControl(applicationID); sYBLControlClient.setApplicationDescription(applicationID, tosca); sYBLControlClient.setApplicationDeployment(applicationID, deployment); sYBLControlClient.startApplication(applicationID); } catch (IOException ex) { Logger.getLogger(SYBLControlClient.class.getName()).log(Level.SEVERE, null, ex); } } static String readFile(String path, Charset encoding) throws IOException { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); } public void modifyAppDescription(String applicationID, String newAppDescription, String appDeployment, String effects) { stopApplication(applicationID); initialInstantiationLifecycle(applicationID, newAppDescription, appDeployment, effects, compRules); } public void initialInstantiationLifecycle(String applicationID, String appDescription, String appDeployment, String effects, String compRules) { this.compRules = compRules; prepareControl(applicationID); setApplicationDescription(applicationID, appDescription); setApplicationDeployment(applicationID, appDeployment); setElasticityCapabilitiesEffects(applicationID, effects); setMetricsCompositionRules(applicationID, compRules); startApplication(applicationID); } public void setApplicationDescription(String applicationID, String appDescription) { callPUT(appDescription, applicationID + "/description/tosca"); } public void testElasticityCapability(String applicationID, String componentID, String elasticityCapability) { callPUT("", applicationID + "/" + componentID + "/testElasticityCapability/" + elasticityCapability); } public void startTest(String applicationID) { callPUT("", applicationID + "/startTEST"); } public void testElasticityCapabilityWithPlugin(String applicationID, String componentID, String pluginID, String elasticityCapability) { callPUT("", applicationID + "/" + componentID + "/testElasticityCapability/" + pluginID + "/" + elasticityCapability); } public void setApplicationDeployment(String applicationID, String appDescription) { callPUT(appDescription, applicationID + "/deployment"); } public void prepareControl(String id) { callPUT(id, id + "/prepareControl"); } public void setMetricsCompositionRules(String id, String rules) { callPUT(rules, id + "/metricsCompositionRules"); } private void callPUT(String body, String methodName) { Client c = Client.create(); c.getProperties().put( ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); WebResource r = c.resource(REST_API_URL + "/" + methodName); r.accept( MediaType.APPLICATION_XML_TYPE). header("Content-Type", "application/xml; charset=utf-8"). header("Accept", "application/xml, multipart/related"). put(String.class, body); } private void callPOST(String body, String methodName) { Client c = Client.create(); c.getProperties().put( ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); WebResource r = c.resource(REST_API_URL + "/" + methodName); r.accept( MediaType.APPLICATION_XML_TYPE). header("Content-Type", "application/xml; charset=utf-8"). header("Accept", "application/xml, multipart/related"). post(String.class, body); } public void startApplication(String applicationID) { callPUT("", applicationID + "/startControl"); } public void stopApplication(String applicationID) { callPUT("", applicationID + "/stopControl"); } public void setElasticityCapabilitiesEffects(String id, String effects) { callPUT(effects, id + "/elasticityCapabilitiesEffects"); } }