/* * Copyright (c) Fabien Hermenier * * This file is part of Entropy. * * Entropy 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. * * Entropy 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 Entropy. If not, see <http://www.gnu.org/licenses/>. */ package entropy.configuration.parser; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import entropy.configuration.Configuration; import entropy.configuration.DefaultConfiguration; import entropy.configuration.DefaultNode; import entropy.configuration.DefaultVirtualMachine; import entropy.configuration.Node; import entropy.configuration.VirtualMachine; /** * Serialize and un-serialize a configuration from/to a binary format compatible with * Google Protocol buffers. * * @author Fabien Hermenier */ public final class ProtobufConfigurationSerializer extends FileConfigurationSerializer { /** * The instance of the singleton. */ private static final ProtobufConfigurationSerializer INSTANCE = new ProtobufConfigurationSerializer(); /** * Private constructor, managed by the singleton. */ private ProtobufConfigurationSerializer() { } /** * Get the unique instance. * * @return an instance */ public static ProtobufConfigurationSerializer getInstance() { return INSTANCE; } @Override public Configuration unSerialize(InputStream in) throws IOException, ConfigurationSerializerException { try { return convert(PBConfiguration.Configuration.parseFrom(in)); } catch (Exception e) { throw new ConfigurationSerializerException(e); } } private DefaultVirtualMachine convert(PBVirtualMachine.VirtualMachine pbVM) { DefaultVirtualMachine vm2 = new DefaultVirtualMachine(pbVM.getName(), pbVM.getNbOfCPUs(), pbVM.getCpuConsumption(), pbVM.getMemoryConsumption()); vm2.setCPUNeed(pbVM.getCpuDemand()); vm2.setMemoryNeed(pbVM.getMemoryDemand()); return vm2; } private DefaultNode convert(PBNode.Node pbNode) { return new DefaultNode(pbNode.getName(), pbNode.getNbOfCPUs(), pbNode.getCpuCapacity(), pbNode.getMemoryCapacity()); } private PBNode.Node convert(Node n) { PBNode.Node.Builder b2 = PBNode.Node.newBuilder(); b2.setName(n.getName()); b2.setNbOfCPUs(n.getNbOfCPUs()); b2.setCpuCapacity(n.getCPUCapacity()); b2.setMemoryCapacity(n.getMemoryCapacity()); return b2.build(); } private PBVirtualMachine.VirtualMachine convert(VirtualMachine vm) { PBVirtualMachine.VirtualMachine.Builder b2 = PBVirtualMachine.VirtualMachine.newBuilder(); b2.setName(vm.getName()); b2.setNbOfCPUs(vm.getNbOfCPUs()); b2.setCpuConsumption(vm.getCPUConsumption()); b2.setMemoryConsumption(vm.getMemoryConsumption()); b2.setCpuDemand(vm.getCPUDemand()); b2.setMemoryDemand(vm.getMemoryDemand()); return b2.build(); } @Override public void serialize(Configuration cfg, OutputStream out) throws IOException { PBConfiguration.Configuration b = convert(cfg); b.writeTo(out); } public Configuration convert(PBConfiguration.Configuration c) { Configuration cfg = new DefaultConfiguration(); for (PBNode.Node n : c.getOfflinesList()) { cfg.addOffline(convert(n)); } for (PBVirtualMachine.VirtualMachine vm : c.getWaitingsList()) { DefaultVirtualMachine vm2 = convert(vm); cfg.addWaiting(vm2); } for (PBConfiguration.Configuration.Hoster h : c.getOnlinesList()) { PBNode.Node n = h.getNode(); DefaultNode n2 = convert(n); cfg.addOnline(n2); for (PBConfiguration.Configuration.Hosted hosted : h.getHostedList()) { PBConfiguration.Configuration.HostedVMState st = hosted.getState(); PBVirtualMachine.VirtualMachine vm = hosted.getVm(); DefaultVirtualMachine vm2 = convert(vm); switch (st) { case RUNNING: cfg.setRunOn(vm2, n2); break; case SLEEPING: cfg.setSleepOn(vm2, n2); break; } } } return cfg; } public PBConfiguration.Configuration convert(Configuration cfg) { PBConfiguration.Configuration.Builder b = PBConfiguration.Configuration.newBuilder(); for (Node n : cfg.getOfflines()) { b.addOfflines(convert(n)); } for (VirtualMachine vm : cfg.getWaitings()) { b.addWaitings(convert(vm)); } for (Node n : cfg.getOnlines()) { PBNode.Node n2 = convert(n); PBConfiguration.Configuration.Hoster.Builder hoster = PBConfiguration.Configuration.Hoster.newBuilder(); hoster.setNode(n2); for (VirtualMachine vm : cfg.getRunnings(n)) { PBConfiguration.Configuration.Hosted.Builder hosted = PBConfiguration.Configuration.Hosted.newBuilder(); hosted.setState(PBConfiguration.Configuration.HostedVMState.RUNNING); PBVirtualMachine.VirtualMachine vm2 = convert(vm); hosted.setVm(vm2); hoster.addHosted(hosted.build()); } for (VirtualMachine vm : cfg.getSleepings(n)) { PBConfiguration.Configuration.Hosted.Builder hosted = PBConfiguration.Configuration.Hosted.newBuilder(); hosted.setState(PBConfiguration.Configuration.HostedVMState.SLEEPING); PBVirtualMachine.VirtualMachine vm2 = convert(vm); hosted.setVm(vm2); hoster.addHosted(hosted.build()); } b.addOnlines(hoster.build()); } return b.build(); } }