/*
* 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.plan.parser;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import entropy.configuration.Configuration;
import entropy.configuration.parser.ProtobufConfigurationSerializer;
import entropy.plan.DefaultTimedReconfigurationPlan;
import entropy.plan.TimedReconfigurationPlan;
import entropy.plan.action.Action;
import entropy.plan.action.Migration;
import entropy.plan.action.Pause;
import entropy.plan.action.Resume;
import entropy.plan.action.Run;
import entropy.plan.action.Shutdown;
import entropy.plan.action.Startup;
import entropy.plan.action.Stop;
import entropy.plan.action.Suspend;
import entropy.plan.action.UnPause;
/**
* @author Fabien Hermenier
*/
public class ProtobufTimedReconfigurationPlanSerializer extends FileTimedReconfigurationPlanSerializer {
private final static ProtobufTimedReconfigurationPlanSerializer instance = new ProtobufTimedReconfigurationPlanSerializer();
private PBTimedReconfigurationPlan.TimedReconfigurationPlan.Builder planBuilder;
private ProtobufTimedReconfigurationPlanSerializer() {
}
@Override
public TimedReconfigurationPlan unSerialize(InputStream in) throws IOException, TimedReconfigurationPlanSerializerException {
TimedReconfigurationPlan plan;
try {
PBTimedReconfigurationPlan.TimedReconfigurationPlan p = PBTimedReconfigurationPlan.TimedReconfigurationPlan.parseFrom(in);
Configuration cfg = ProtobufConfigurationSerializer.getInstance().convert(p.getSource());
plan = new DefaultTimedReconfigurationPlan(cfg);
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Migration m : p.getMigrationsList()) {
plan.add(convert(cfg, m));
}
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Stop m : p.getStopsList()) {
plan.add(convert(cfg, m));
}
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Startup m : p.getStartupsList()) {
plan.add(convert(cfg, m));
}
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Run m : p.getRunsList()) {
plan.add(convert(cfg, m));
}
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Resume m : p.getResumesList()) {
plan.add(convert(cfg, m));
}
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Suspend m : p.getSuspendsList()) {
plan.add(convert(cfg, m));
}
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Pause m : p.getPausesList()) {
plan.add(convert(cfg, m));
}
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Unpause m : p.getUnpausesList()) {
plan.add(convert(cfg, m));
}
//Ladt to prevent application failures due to a node currently hosting a VM
for (PBTimedReconfigurationPlan.TimedReconfigurationPlan.Shutdown m : p.getShutdownsList()) {
plan.add(convert(cfg, m));
}
} catch (Exception e) {
throw new TimedReconfigurationPlanSerializerException(e);
}
return plan;
}
@Override
public void serialize(TimedReconfigurationPlan plan, OutputStream out) throws IOException {
planBuilder = PBTimedReconfigurationPlan.TimedReconfigurationPlan.newBuilder();
planBuilder.setSource(ProtobufConfigurationSerializer.getInstance().convert(plan.getSource()));
for (Action a : plan) {
a.serialize(this);
}
planBuilder.build().writeTo(out);
}
private Migration convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Migration a) {
return new Migration(cfg.getAllVirtualMachines().get(a.getIdVm()),
cfg.getAllNodes().get(a.getIdSrc()),
cfg.getAllNodes().get(a.getIdDst()), a.getStart(), a.getEnd());
}
private Run convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Run a) {
return new Run(cfg.getAllVirtualMachines().get(a.getIdVm()),
cfg.getAllNodes().get(a.getIdN()), a.getStart(), a.getEnd());
}
private Stop convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Stop a) {
return new Stop(cfg.getAllVirtualMachines().get(a.getIdVm()),
cfg.getAllNodes().get(a.getIdN()), a.getStart(), a.getEnd());
}
private Startup convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Startup a) {
return new Startup(cfg.getAllNodes().get(a.getIdN()), a.getStart(), a.getEnd());
}
private Shutdown convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Shutdown a) {
return new Shutdown(cfg.getAllNodes().get(a.getIdN()), a.getStart(), a.getEnd());
}
private Suspend convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Suspend a) {
return new Suspend(cfg.getAllVirtualMachines().get(a.getIdVm()),
cfg.getAllNodes().get(a.getIdSrc()),
cfg.getAllNodes().get(a.getIdDst()), a.getStart(), a.getEnd());
}
private Resume convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Resume a) {
return new Resume(cfg.getAllVirtualMachines().get(a.getIdVm()),
cfg.getAllNodes().get(a.getIdSrc()),
cfg.getAllNodes().get(a.getIdDst()), a.getStart(), a.getEnd());
}
private Pause convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Pause a) {
return new Pause(cfg.getAllVirtualMachines().get(a.getIdVm()), cfg.getAllNodes().get(a.getIdN()), a.getStart(), a.getEnd());
}
private UnPause convert(Configuration cfg, PBTimedReconfigurationPlan.TimedReconfigurationPlan.Unpause a) {
return new UnPause(cfg.getAllVirtualMachines().get(a.getIdVm()), cfg.getAllNodes().get(a.getIdN()), a.getStart(), a.getEnd());
}
public static ProtobufTimedReconfigurationPlanSerializer getInstance() {
return instance;
}
@Override
public void serialize(Migration a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Migration.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Migration.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdVm(a.getVirtualMachine().getName())
.setIdSrc(a.getHost().getName())
.setIdDst(a.getDestination().getName());
planBuilder.addMigrations(b.build());
}
@Override
public void serialize(Run a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Run.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Run.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdVm(a.getVirtualMachine().getName())
.setIdN(a.getHost().getName());
planBuilder.addRuns(b.build());
}
@Override
public void serialize(Stop a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Stop.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Stop.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdVm(a.getVirtualMachine().getName())
.setIdN(a.getHost().getName());
planBuilder.addStops(b.build());
}
@Override
public void serialize(Suspend a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Suspend.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Suspend.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdVm(a.getVirtualMachine().getName())
.setIdSrc(a.getHost().getName())
.setIdDst(a.getDestination().getName());
planBuilder.addSuspends(b.build());
}
@Override
public void serialize(Resume a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Resume.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Resume.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdVm(a.getVirtualMachine().getName())
.setIdSrc(a.getHost().getName())
.setIdDst(a.getDestination().getName());
planBuilder.addResumes(b.build());
}
@Override
public void serialize(Startup a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Startup.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Startup.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdN(a.getNode().getName());
planBuilder.addStartups(b.build());
}
@Override
public void serialize(Shutdown a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Shutdown.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Shutdown.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdN(a.getNode().getName());
planBuilder.addShutdowns(b.build());
}
@Override
public void serialize(Pause a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Pause.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Pause.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdVm(a.getVirtualMachine().getName())
.setIdN(a.getHost().getName());
planBuilder.addPauses(b.build());
}
@Override
public void serialize(UnPause a) throws IOException {
PBTimedReconfigurationPlan.TimedReconfigurationPlan.Unpause.Builder b = PBTimedReconfigurationPlan.TimedReconfigurationPlan.Unpause.newBuilder();
b.setStart(a.getStartMoment()).setEnd(a.getFinishMoment())
.setIdVm(a.getVirtualMachine().getName())
.setIdN(a.getHost().getName());
planBuilder.addUnpauses(b.build());
}
}