/src/main/java/nl/bitbrains/nebu/deployer/policies/BasicReplicationPolicy.java

https://github.com/deltaforge/nebu-core · Java · 82 lines · 49 code · 15 blank · 18 comment · 2 complexity · 1dcb803cd162ca26f65b6a7cd796fc5a MD5 · raw file

  1. package nl.bitbrains.nebu.deployer.policies;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import nl.bitbrains.nebu.common.topology.PhysicalHost;
  5. import nl.bitbrains.nebu.common.topology.PhysicalRack;
  6. import nl.bitbrains.nebu.common.topology.PhysicalStore;
  7. import nl.bitbrains.nebu.common.topology.PhysicalTopology;
  8. import nl.bitbrains.nebu.common.util.ErrorChecker;
  9. import nl.bitbrains.nebu.containers.DeploymentRequest;
  10. import nl.bitbrains.nebu.containers.VMDeploymentSpecification;
  11. import nl.bitbrains.nebu.containers.VMDeploymentSpecificationBuilder;
  12. import nl.bitbrains.nebu.containers.VMTemplate;
  13. import nl.bitbrains.nebu.deployer.DeployerException;
  14. import nl.bitbrains.nebu.deployer.DeployerPolicy;
  15. import org.apache.logging.log4j.LogManager;
  16. import org.apache.logging.log4j.Logger;
  17. /**
  18. * Class representing the basic replication policy (spreads vms on rack-level).
  19. *
  20. * @author Jesse Donkervliet, Tim Hegeman, and Stefan Hugtenburg
  21. *
  22. */
  23. public class BasicReplicationPolicy extends DeployerPolicy {
  24. public static final String POLICY_NAME = "replicated";
  25. private static Logger logger = LogManager.getLogger();
  26. /**
  27. * Basic default constructor.
  28. */
  29. public BasicReplicationPolicy() {
  30. }
  31. @Override
  32. public final List<VMDeploymentSpecification> generateDeployment(final DeploymentRequest request)
  33. throws DeployerException {
  34. BasicReplicationPolicy.logger.entry();
  35. ErrorChecker.throwIfNullArgument(request, "request");
  36. // Basic algorithm: (rack-level equal spread)
  37. // Input: ts = templates, n(t) = vms/template
  38. // for t in ts
  39. // for i = 1..n(t)
  40. // r = min_{x in racks} vms(x)
  41. // h = min_{x in hosts(r)} vms(x)
  42. // place vm on h
  43. // end for
  44. // end for
  45. final List<VMDeploymentSpecification> result = new ArrayList<VMDeploymentSpecification>();
  46. for (final VMTemplate template : request.getTemplateRequests().keySet()) {
  47. final int nt = request.getTemplateRequests().get(template);
  48. final PhysicalTopology topology = super.retrieveTopology(template);
  49. this.initializeVmCounters(topology);
  50. this.updateVMCountersForApplicationAndTemplate(request.getApplication(),
  51. template,
  52. topology);
  53. for (int i = 0; i < nt; i++) {
  54. final PhysicalRack r = this.getLeastUsedRack();
  55. final PhysicalHost h = this
  56. .getLeastStressedHostFromLeastUsed(r.getCPUs(), template);
  57. final PhysicalStore s = this.getSuitableStoreFromLeastUsedOrFull(r.getDisks());
  58. final VMDeploymentSpecification spec = new VMDeploymentSpecificationBuilder()
  59. .withTemplate(template).withHost(h.getUniqueIdentifier())
  60. .withStore(s.getUniqueIdentifier()).build();
  61. result.add(spec);
  62. this.updateVMCountersWithNewlyChosenHostAndStore(h, s);
  63. }
  64. }
  65. return BasicReplicationPolicy.logger.exit(result);
  66. }
  67. }