/** * 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()+"] }"); } }