@Test
  public void simpleTest() {
    OverbookSplitter splitter = new OverbookSplitter();

    List<Instance> instances = new ArrayList<>();
    Model m0 = new DefaultModel();
    Node n = m0.newNode(0);
    m0.getMapping().addOnlineNode(n);
    m0.getMapping().addOnlineNode(m0.newNode(1));

    Model m1 = new DefaultModel();
    m1.getMapping().addOnlineNode(m1.newNode(2));
    m1.getMapping().addOnlineNode(m1.newNode(3));

    instances.add(new Instance(m0, new ArrayList<>(), new MinMTTR()));
    instances.add(new Instance(m1, new ArrayList<>(), new MinMTTR()));

    Set<Node> all = new HashSet<>(m0.getMapping().getAllNodes());
    all.addAll(m1.getMapping().getAllNodes());

    TIntIntHashMap nodeIndex = Instances.makeNodeIndex(instances);
    // Only nodes in m0
    Overbook oSimple = new Overbook(n, "cpu", 2);
    Assert.assertTrue(splitter.split(oSimple, null, instances, new TIntIntHashMap(), nodeIndex));
    Assert.assertTrue(instances.get(0).getSatConstraints().contains(oSimple));
    Assert.assertFalse(instances.get(1).getSatConstraints().contains(oSimple));
  }
  /**
   * A VM try to come into the quarantine zone.
   *
   * @throws org.btrplace.scheduler.SchedulerException
   */
  @Test
  public void testWithNoSolution1() throws SchedulerException {
    Model mo = new DefaultModel();
    VM vm1 = mo.newVM();
    VM vm2 = mo.newVM();
    VM vm3 = mo.newVM();
    VM vm4 = mo.newVM();
    Node n1 = mo.newNode();
    Node n2 = mo.newNode();
    Node n3 = mo.newNode();

    Mapping map =
        new MappingFiller(mo.getMapping())
            .on(n1, n2, n3)
            .run(n1, vm1)
            .run(n2, vm2, vm3)
            .run(n3, vm4)
            .get();
    Quarantine q = new Quarantine(n1);
    List<SatConstraint> cstrs = new ArrayList<>();
    cstrs.add(q);
    cstrs.add(new Fence(vm4, Collections.singleton(n1)));
    ChocoScheduler cra = new DefaultChocoScheduler();
    ReconfigurationPlan p = cra.solve(mo, cstrs);
    Assert.assertNull(p);
  }
  @Test
  public void testContinuousIsSatisfied() {
    Model mo = new DefaultModel();
    List<VM> vms = Util.newVMs(mo, 5);
    List<Node> ns = Util.newNodes(mo, 5);
    Mapping map = mo.getMapping();
    map.addOnlineNode(ns.get(0));
    map.addOnlineNode(ns.get(1));
    map.addOnlineNode(ns.get(2));
    map.addRunningVM(vms.get(0), ns.get(0));
    map.addRunningVM(vms.get(1), ns.get(1));
    map.addReadyVM(vms.get(2));
    map.addRunningVM(vms.get(3), ns.get(2));

    Quarantine q = new Quarantine(ns.get(0));

    ReconfigurationPlan plan = new DefaultReconfigurationPlan(mo);
    Assert.assertEquals(q.isSatisfied(plan), true);
    plan.add(new ShutdownVM(vms.get(1), ns.get(1), 1, 2));
    Assert.assertEquals(q.isSatisfied(plan), true);

    plan.add(new BootVM(vms.get(2), ns.get(0), 0, 1));
    Assert.assertEquals(q.isSatisfied(plan), false);

    plan = new DefaultReconfigurationPlan(mo);
    plan.add(new BootVM(vms.get(2), ns.get(2), 0, 1));
    Assert.assertEquals(new Quarantine(ns.get(1)).isSatisfied(plan), true);
    plan.add(new MigrateVM(vms.get(3), ns.get(2), ns.get(1), 0, 1));
    Assert.assertEquals(new Quarantine(ns.get(1)).isSatisfied(plan), false);

    plan = new DefaultReconfigurationPlan(mo);
    plan.add(new MigrateVM(vms.get(1), ns.get(1), ns.get(0), 0, 1));
    Assert.assertEquals(q.isSatisfied(plan), false);
  }
 @Test
 public void testApply() {
   AllocateEvent na = new AllocateEvent(vms.get(0), "foo", 3);
   Model mo = new DefaultModel();
   Mapping map = mo.getMapping();
   map.addOnlineNode(ns.get(0));
   map.addRunningVM(vms.get(0), ns.get(0));
   Assert.assertFalse(na.apply(mo));
   ShareableResource rc = new ShareableResource("foo");
   mo.attach(rc);
   Assert.assertTrue(na.apply(mo));
   Assert.assertEquals(3, rc.getConsumption(vms.get(0)));
 }
 private boolean discreteCheck(Model mo) {
   Mapping map = mo.getMapping();
   for (VM vm : getVMs()) {
     if (map.isRunning(vm)) {
       Node host = map.getVMLocation(vm);
       Set<VM> on = map.getRunningVMs(host);
       // Check for other VMs on the node. If they are not in the constraint
       // it's a violation
       for (VM vm2 : on) {
         if (!vm2.equals(vm) && !getVMs().contains(vm2)) {
           return false;
         }
       }
     }
   }
   return true;
 }
 @Override
 public boolean startsWith(Model mo) {
   if (getConstraint().isContinuous()) {
     boolean ret = discreteCheck(mo);
     if (ret) {
       Mapping map = mo.getMapping();
       for (VM vm : getVMs()) {
         if (map.isRunning(vm)) {
           privateNodes.add(map.getVMLocation(vm));
         }
       }
       for (Node n : map.getOnlineNodes()) {
         if (map.getRunningVMs(n).isEmpty()) {
           idleNodes.add(n);
         }
       }
     }
     return ret;
   }
   return true;
 }
 @Test
 public void testWithSatisfiedModel() throws SchedulerException {
   Model mo = new DefaultModel();
   VM vm1 = mo.newVM();
   VM vm2 = mo.newVM();
   VM vm3 = mo.newVM();
   VM vm4 = mo.newVM();
   Node n1 = mo.newNode();
   Node n2 = mo.newNode();
   Node n3 = mo.newNode();
   Mapping map =
       new MappingFiller(mo.getMapping())
           .on(n1, n2, n3)
           .run(n1, vm1)
           .run(n2, vm2, vm3)
           .run(n3, vm4)
           .get();
   Quarantine q = new Quarantine(n2);
   ChocoScheduler cra = new DefaultChocoScheduler();
   ReconfigurationPlan p = cra.solve(mo, Collections.<SatConstraint>singleton(q));
   Assert.assertNotNull(p);
 }
/**
 * Unit tests for {@link AmongSplitter}.
 *
 * @author Fabien Hermenier
 */
public class AmongSplitterTest {

  public static final AmongSplitter splitter = new AmongSplitter();

  public static final Model mo = new DefaultModel();
  public static final VM vm1 = mo.newVM();
  public static final VM vm2 = mo.newVM();
  public static final VM vm3 = mo.newVM();
  public static final VM vm4 = mo.newVM();
  public static final VM vm5 = mo.newVM();

  public static final Node n1 = mo.newNode();
  public static final Node n2 = mo.newNode();
  public static final Node n3 = mo.newNode();
  public static final Node n4 = mo.newNode();
  public static final Node n5 = mo.newNode();

  public static final Mapping map =
      new MappingFiller(mo.getMapping())
          .on(n1, n2, n3, n4)
          .run(n1, vm1, vm2)
          .run(n2, vm3)
          .run(n3, vm4)
          .run(n4, vm5)
          .get();

  @Test
  public void testSplittable() throws SchedulerException {

    List<VM> vms = Arrays.asList(vm1, vm2, vm3);
    Collection<Collection<Node>> parts = new ArrayList<>();
    parts.add(Arrays.asList(n1, n2));
    parts.add(Arrays.asList(n3));
    parts.add(Arrays.asList(n4));

    Among single = new Among(vms, parts);

    /*
    N1 v1 v2
    N2 v3
    ---
    N3 v4
    --
    N4 v5
    */
    FixedNodeSetsPartitioning partitionner = new FixedNodeSetsPartitioning(parts);
    partitionner.setPartitions(parts);
    List<Instance> instances =
        partitionner.split(
            new DefaultParameters(),
            new Instance(mo, Collections.<SatConstraint>emptyList(), new MinMTTR()));

    TIntIntHashMap vmIndex = Instances.makeVMIndex(instances);
    TIntIntHashMap nodeIndex = Instances.makeNodeIndex(instances);
    splitter.split(single, new Instance(mo, new MinMTTR()), instances, vmIndex, nodeIndex);
    Among a = (Among) instances.get(0).getSatConstraints().iterator().next();
    Assert.assertEquals(a.getGroupsOfNodes().size(), 1);
    Assert.assertEquals(a.getInvolvedNodes(), Arrays.asList(n1, n2));
    for (Instance i : instances) {
      System.out.println(i.getSatConstraints());
    }
  }
}