@Override public boolean insertActions(Solution s, ReconfigurationPlan plan) { DurationEvaluators dev = rp.getDurationEvaluators(); // Only if the VM doesn't stay if (s.getIntVal(cSlice.getHoster()) != (s.getIntVal(dSlice.getHoster()))) { Action a; Node dst = rp.getNode(s.getIntVal(dSlice.getHoster())); // Migration if (s.getIntVal(doReinstantiation) == 0) { int st = s.getIntVal(getStart()); int ed = s.getIntVal(getEnd()); if (getBandwidth() != null) { a = new MigrateVM(vm, src, dst, st, ed, s.getIntVal(getBandwidth())); } else { a = new MigrateVM(vm, src, dst, st, ed); } plan.add(a); // Re-instantiation } else { VM newVM = rp.cloneVM(vm); if (newVM == null) { rp.getLogger().error("Unable to get a new int to plan the re-instantiate of VM {}", vm); return false; } org.btrplace.plan.event.ForgeVM fvm = new org.btrplace.plan.event.ForgeVM( newVM, s.getIntVal(dSlice.getStart()) - dev.evaluate(rp.getSourceModel(), org.btrplace.plan.event.ForgeVM.class, vm), s.getIntVal(dSlice.getStart())); // forge the new VM from a template plan.add(fvm); // Boot the new VM int endForging = fvm.getEnd(); org.btrplace.plan.event.BootVM boot = new org.btrplace.plan.event.BootVM( newVM, dst, endForging, endForging + dev.evaluate( rp.getSourceModel(), org.btrplace.plan.event.BootVM.class, newVM)); boot.addEvent(Action.Hook.PRE, new SubstitutedVMEvent(vm, newVM)); return plan.add(boot) && plan.add( new org.btrplace.plan.event.ShutdownVM( vm, src, boot.getEnd(), s.getIntVal(cSlice.getEnd()))); } } return true; }