Java tutorial
/** * This file is part of CloudML [ http://cloudml.org ] * * Copyright (C) 2012 - SINTEF ICT * Contact: Franck Chauvel <franck.chauvel@sintef.no> * * Module: root * * CloudML is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * CloudML is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with CloudML. If not, see * <http://www.gnu.org/licenses/>. */ package org.cloudml.facade; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import com.amazonaws.util.StringInputStream; import org.apache.commons.io.FileUtils; import org.cloudml.core.*; import org.cloudml.codecs.JsonCodec; import org.cloudml.core.credentials.FileCredentials; import org.cloudml.core.credentials.MemoryCredentials; import org.cloudml.facade.commands.*; import org.cloudml.facade.events.ComponentList; import org.cloudml.facade.events.EventHandler; import org.cloudml.facade.events.Message; import org.cloudml.facade.util.WSClient; import org.cloudml.mrt.Coordinator; /** * Created by nicolasf on 17.02.15. */ public class RemoteFacade extends Facade { private static final Logger journal = Logger.getLogger(RemoteFacade.class.getName()); private WSClient wsClient; private Thread t; public RemoteFacade(String serverURI) { super(); try { wsClient = new WSClient(new URI(serverURI), this); t = new Thread(wsClient); t.start(); while (!wsClient.getConnected()) { Thread.sleep(2000); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } public void stop() { wsClient.close(); } @Override public void handle(StartComponent command) { wsClient.send("!extended { name: StartComponent, params: [" + command.getComponentId() + "] }"); } @Override public void handle(StopComponent command) { wsClient.send("!extended { name: StopComponent, params: [" + command.getComponentId() + "] }"); } @Override public void handle(LoadDeployment command) { wsClient.send("!extended { name : LoadDeployment }"); final File f = new File(command.getPathToModel()); try { String json = new String(Files.readAllBytes(f.toPath())); JsonCodec jc = new JsonCodec(); InputStream is = new StringInputStream(json); Deployment temp = (Deployment) jc.load(is); for (Provider p : temp.getProviders()) { if (p.getCredentials() instanceof FileCredentials) { String login = ""; String password = ""; if (p.getCredentials().getLogin() != null) login = p.getCredentials().getLogin(); if (p.getCredentials().getPassword() != null) password = p.getCredentials().getPassword(); MemoryCredentials mc = new MemoryCredentials(login, password); p.setCredentials(mc); } } for (VM v : temp.getComponents().onlyVMs()) { File file = new File(v.getPrivateKey()); if (file.exists() && !file.isDirectory()) { String contentKey = FileUtils.readFileToString(new File(v.getPrivateKey())); v.setPrivateKey(contentKey); } } JsonCodec jsonCodec = new JsonCodec(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); jsonCodec.save(temp, baos); wsClient.send("!additional json-string:" + baos.toString()); Thread.sleep(3000); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void handle(StoreDeployment command) { dispatch(new Message(command, Message.Category.INFORMATION, "Most relevant approach getSnapshot and then load using codec. Then you can fully exploit the whole model facilities offered by CloudML")); } @Override public void handle(Deploy command) { wsClient.send("!listenToAny"); wsClient.send("!extended { name : Deploy }"); } @Override public void handle(GetDeployment command) { wsClient.send("!getSnapshot\n" + " path : /"); } @Override public void handle(ListComponents command) { dispatch(new Message(command, Message.Category.INFORMATION, "Most relevant approach getSnapshot and then load using codec. Then you can fully exploit the whole model facilities offered by CloudML")); } @Override public void handle(ListComponentInstances command) { dispatch(new Message(command, Message.Category.INFORMATION, "Most relevant approach getSnapshot and then load using codec. Then you can fully exploit the whole model facilities offered by CloudML")); } @Override public void handle(ViewComponent command) { wsClient.send("!getSnapshot\n" + " path : /component[name='" + command.getComponentId() + "']"); } @Override public void handle(ViewComponentInstance command) { wsClient.send("!getSnapshot\n" + " path : /componentInstances[name='" + command.getComponentId() + "']"); } @Override public void handle(ShotImage command) { dispatch(new Message(command, Message.Category.INFORMATION, "Not relevant for remote server")); } @Override public void handle(Snapshot command) { wsClient.send("!extended { name: Snapshot, params: [" + command.getVmId() + "] }"); } @Override public void handle(ScaleOut command) { wsClient.send("!extended { name: ScaleOut, params: [" + command.getVmId() + "] }"); } @Override public void handle(Image command) { wsClient.send("!extended { name: Image, params: [" + command.getVmId() + "] }"); } @Override public void handle(Reset command) { wsClient.send("!extended { name : Reset }"); } @Override public void handle(ValidateCommand command) { dispatch(new Message(command, Message.Category.INFORMATION, "Not yet available for remote server")); } @Override public void handle(DebugMode command) { dispatch(new Message(command, Message.Category.INFORMATION, "Only available in Shell mode")); } @Override public void handle(Burst command) { wsClient.send( "!extended { name: Burst, params: [" + command.getEcId() + "," + command.getProviderID() + "] }"); } @Override public void handle(offlineMigration command) { wsClient.send("!extended { name: OfflineDataMigration, params: [" + command.getSource() + "," + command.getDestination() + "," + command.getNbThread() + "] }"); } @Override public void handle(onlineMigration command) { wsClient.send("!extended { name: OnlineDataMigration, params: [" + command.getSource() + "," + command.getDestination() + "," + command.getNbThread() + "," + command.getVdpSize() + "] }"); } }