Class: VSphereCloud::Resources::Scorer

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

Overview

Resource Scorer.

Instance Method Summary collapse

Constructor Details

#initialize(config, cluster, memory, ephemeral, persistent) ⇒ Scorer

Creates a new Scorer given a cluster and requested memory and storage.

Parameters:

  • cluster (Cluster)

    requested cluster.

  • memory (Integer)

    required memory.

  • ephemeral (Array<Integer>)

    list of required ephemeral disk sizes.

  • persistent (Array<Integer>)

    list of required persistent disk sizes.



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

def initialize(config, cluster, memory, ephemeral, persistent)
  @logger = config.logger
  @cluster = cluster
  @memory = memory
  @ephemeral = ephemeral
  @persistent = persistent

  @free_memory = cluster.free_memory

  @free_ephemeral = []
  cluster.ephemeral_datastores.each_value do |datastore|
    @free_ephemeral << datastore.free_space
  end

  @free_persistent = []
  cluster.persistent_datastores.each_value do |datastore|
    @free_persistent << datastore.free_space
  end

  @free_shared = []
  cluster.shared_datastores.each_value do |datastore|
    @free_shared << datastore.free_space
  end
end

Instance Method Details

#scoreInteger

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

Returns:

  • (Integer)

    score.



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/cloud/vsphere/resources/scorer.rb', line 45

def score
  min_ephemeral = @ephemeral
  min_persistent = @persistent.min
  min_shared = min_ephemeral
  if !min_persistent.nil? && min_persistent < min_shared
    min_shared = min_persistent
  end

  # Filter out any datastores that are below the min threshold
  filter(@free_ephemeral, min_ephemeral + DISK_THRESHOLD)
  filter(@free_shared, min_shared + DISK_THRESHOLD)
  unless @persistent.empty?
    filter(@free_persistent, min_persistent + DISK_THRESHOLD)
  end

  count = 0
  loop do
    @free_memory -= @memory
    if @free_memory < MEMORY_THRESHOLD
      @logger.debug("#{@cluster.name} memory bound")
      break
    end

    consumed = consume_disk(@free_ephemeral, @ephemeral, min_ephemeral)
    unless consumed
      unless consume_disk(@free_shared, @ephemeral, min_shared)
        @logger.debug("#{@cluster.name} ephemeral disk bound")
        break
      end
    end

    unless @persistent.empty?
      consumed_all = true
      @persistent.each do |size|
        consumed = consume_disk(@free_persistent, size, min_persistent)
        unless consumed
          unless consume_disk(@free_shared, size, min_shared)
            consumed_all = false
            @logger.debug("#{@cluster.name} persistent disk bound")
            break
          end
        end
      end
      break unless consumed_all
    end

    count += 1
  end

  count
end