/src/test/java/nl/bitbrains/nebu/deployer/policies/TestAggregatedLocalityPolicy.java

https://github.com/deltaforge/nebu-core · Java · 158 lines · 140 code · 14 blank · 4 comment · 1 complexity · 1a256d946907e73a1ff3de5878b96c3a MD5 · raw file

  1. package nl.bitbrains.nebu.deployer.policies;
  2. import java.util.ArrayList;
  3. import java.util.HashSet;
  4. import java.util.List;
  5. import java.util.Set;
  6. import nl.bitbrains.nebu.common.VirtualMachine;
  7. import nl.bitbrains.nebu.common.VirtualMachineBuilder;
  8. import nl.bitbrains.nebu.common.cache.CacheException;
  9. import nl.bitbrains.nebu.common.topology.PhysicalTopology;
  10. import nl.bitbrains.nebu.containers.Application;
  11. import nl.bitbrains.nebu.containers.ApplicationBuilder;
  12. import nl.bitbrains.nebu.containers.Deployment;
  13. import nl.bitbrains.nebu.containers.DeploymentBuilder;
  14. import nl.bitbrains.nebu.containers.VMDeploymentSpecification;
  15. import nl.bitbrains.nebu.containers.VMTemplate;
  16. import nl.bitbrains.nebu.deployer.DeployerException;
  17. import nl.bitbrains.nebu.deployer.policies.AggregatedLocalityPolicy;
  18. import nl.bitbrains.nebu.rest.client.RequestSender;
  19. import org.junit.Assert;
  20. import org.junit.Before;
  21. import org.junit.Test;
  22. import org.junit.runner.RunWith;
  23. import org.mockito.Mockito;
  24. import org.powermock.api.mockito.PowerMockito;
  25. import org.powermock.core.classloader.annotations.PowerMockIgnore;
  26. import org.powermock.core.classloader.annotations.PrepareForTest;
  27. import org.powermock.modules.junit4.PowerMockRunner;
  28. /**
  29. * @author Jesse Donkervliet, Tim Hegeman, and Stefan Hugtenburg
  30. *
  31. */
  32. @RunWith(PowerMockRunner.class)
  33. @PrepareForTest({ RequestSender.class, Application.class, VMDeploymentSpecification.class })
  34. @PowerMockIgnore("javax.management.*")
  35. public class TestAggregatedLocalityPolicy extends PolicyTest {
  36. private final int numDcs = 2;
  37. private final int numRacks = 3;
  38. private final int numCpus = 4;
  39. private final int numNetworkDisks = 2;
  40. private final int numLocalDisks = 3;
  41. private final String prefix = "prefix";
  42. @Override
  43. @Before
  44. public void setUp() {
  45. super.setUp();
  46. this.setPolicy(new AggregatedLocalityPolicy());
  47. }
  48. @Test
  49. public void getSetMax() {
  50. final AggregatedLocalityPolicy policy = (AggregatedLocalityPolicy) this.getPolicy();
  51. policy.setMaxVMsPerHost(1);
  52. Assert.assertEquals(1, policy.getMaxVMsPerHost());
  53. }
  54. @Test
  55. public void testAllOnOneHostSimpleTopology() throws CacheException, DeployerException {
  56. this.generateDeployment(new String[] { "id" }, new int[] { 2 }, new int[] { 8 });
  57. Assert.assertEquals(this.getSpecs().get(0).getHost(), this.getSpecs().get(1).getHost());
  58. }
  59. @Test
  60. public void testAllOnOneHostNonSimpleTopology() throws CacheException, DeployerException {
  61. final PhysicalTopology topology = this.createTopology(this.numDcs,
  62. this.numRacks,
  63. this.numCpus,
  64. this.numNetworkDisks,
  65. this.numLocalDisks,
  66. this.prefix);
  67. this.generateDeployment(new String[] { "id" }, new int[] { 2 }, topology);
  68. Assert.assertEquals(this.getSpecs().get(0).getHost(), this.getSpecs().get(1).getHost());
  69. }
  70. @Test
  71. public void testTwoHostsNonSimpleTopology() throws CacheException, DeployerException {
  72. final AggregatedLocalityPolicy policy = (AggregatedLocalityPolicy) this.getPolicy();
  73. policy.setMaxVMsPerHost(1);
  74. final PhysicalTopology topology = this.createTopology(this.numDcs,
  75. this.numRacks,
  76. this.numCpus,
  77. this.numNetworkDisks,
  78. this.numLocalDisks,
  79. this.prefix);
  80. this.generateDeployment(new String[] { "id" }, new int[] { 2 }, topology);
  81. Assert.assertNotEquals(this.getSpecs().get(0).getHost(), this.getSpecs().get(1).getHost());
  82. }
  83. @Test
  84. public void testThreeHostsNonSimpleTopology() throws CacheException, DeployerException {
  85. final AggregatedLocalityPolicy policy = (AggregatedLocalityPolicy) this.getPolicy();
  86. policy.setMaxVMsPerHost(1);
  87. final PhysicalTopology topology = this.createTopology(this.numDcs,
  88. this.numRacks,
  89. this.numCpus,
  90. this.numNetworkDisks,
  91. this.numLocalDisks,
  92. this.prefix);
  93. this.generateDeployment(new String[] { "id" }, new int[] { 3 }, topology);
  94. final Set<String> set = new HashSet<String>();
  95. for (final VMDeploymentSpecification spec : this.getSpecs()) {
  96. set.add(spec.getHost());
  97. }
  98. Assert.assertEquals(3, set.size());
  99. }
  100. @Test
  101. public void testNotEnoughHostsSimpleTopology() throws CacheException, DeployerException {
  102. final AggregatedLocalityPolicy policy = (AggregatedLocalityPolicy) this.getPolicy();
  103. policy.setMaxVMsPerHost(1);
  104. boolean caught = false;
  105. try {
  106. this.generateDeployment(new String[] { "id" }, new int[] { 3 }, new int[] { 1 });
  107. } catch (final DeployerException e) {
  108. caught = true;
  109. }
  110. Assert.assertTrue(caught);
  111. }
  112. @Test
  113. public void testExistingVMsMakeItNotFitSimpleTopology() throws CacheException,
  114. DeployerException {
  115. final AggregatedLocalityPolicy policy = (AggregatedLocalityPolicy) this.getPolicy();
  116. policy.setMaxVMsPerHost(1);
  117. final PhysicalTopology topology = this.createTopology(1, 1, 1, 1, 1, this.prefix);
  118. final String hostname = topology.getCPUs().get(0).getUniqueIdentifier();
  119. final Application app = new ApplicationBuilder().withUuid("uuid").build();
  120. final List<Deployment> deps = new ArrayList<Deployment>();
  121. final List<VirtualMachine> vms = new ArrayList<VirtualMachine>();
  122. final List<String> vmIds = new ArrayList<String>();
  123. final Deployment dep = new DeploymentBuilder().withUuid("id").build();
  124. final VirtualMachine vm = new VirtualMachineBuilder().withUuid("vmId").withHost(hostname)
  125. .build();
  126. final VMDeploymentSpecification spec = PowerMockito.mock(VMDeploymentSpecification.class);
  127. final VMTemplate template = this.mockTemplate("id", 1, topology);
  128. vmIds.add(vm.getUniqueIdentifier());
  129. Mockito.when(spec.getTemplate()).thenReturn(template);
  130. Mockito.when(this.reqSender.getVirtualMachines()).thenReturn(vmIds);
  131. Mockito.when(this.reqSender.getVirtualMachine(vm.getUniqueIdentifier())).thenReturn(vm);
  132. vms.add(vm);
  133. dep.addVirtualMachines(vm, spec);
  134. deps.add(dep);
  135. app.putDeployment(dep);
  136. boolean caught = false;
  137. try {
  138. this.generateDeployment(this.mockRequest(app));
  139. } catch (final DeployerException e) {
  140. caught = true;
  141. }
  142. Assert.assertTrue(caught);
  143. }
  144. }