Class: VSphereCloud::Resources::Scorer

Inherits:
Object
  • Object
show all
Defined in:
lib/cloud/vsphere/resources/scorer.rb

Defined Under Namespace

Classes: DiskPool

Class Method Summary collapse

Class Method Details

.score(logger, cluster, requested_memory, requested_ephemeral_size, requested_persistent_sizes) ⇒ Integer

Run the scoring function and return the placement score for the required resources.

Parameters:

  • logger (Logging::Logger)

    logger to which to log.

  • requested_memory (Integer)

    required memory.

  • cluster (Cluster)

    requested cluster.

  • requested_ephemeral_size (Integer)

    disk size in mb.

  • requested_persistent_sizes (Array<Integer>)

    list of requested persistent sizes in mb.

Returns:

  • (Integer)

    score.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/cloud/vsphere/resources/scorer.rb', line 16

def self.score(logger, cluster, requested_memory, requested_ephemeral_size, requested_persistent_sizes)
  free_memory = cluster.free_memory
  ephemeral_pool = DiskPool.new(cluster.ephemeral_datastores.values.map(&:free_space))
  persistent_pool = DiskPool.new(cluster.persistent_datastores.values.map(&:free_space))

  successful_allocations = 0
  loop do
    free_memory -= requested_memory
    if free_memory < MEMORY_HEADROOM
      logger.debug("#{cluster.name} memory bound")
      break
    end

    unless ephemeral_pool.consume_disk(requested_ephemeral_size)
      logger.debug("#{cluster.name} ephemeral disk bound")
      break
    end

    unless requested_persistent_sizes.empty?
      placed = requested_persistent_sizes.select { |size| persistent_pool.consume_disk(size) }
      unless requested_persistent_sizes == placed
        logger.debug("#{cluster.name} persistent disk bound")
        break
      end
    end

    successful_allocations += 1
  end

  successful_allocations
end