76 lines
1.9 KiB
Ruby
76 lines
1.9 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Kubernetes
|
||
|
class RolloutInstances
|
||
|
include ::Gitlab::Utils::StrongMemoize
|
||
|
|
||
|
def initialize(deployments, pods)
|
||
|
@deployments = deployments
|
||
|
@pods = pods
|
||
|
end
|
||
|
|
||
|
def pod_instances
|
||
|
pods = matching_pods + extra_pending_pods
|
||
|
|
||
|
pods.sort_by(&:order).map do |pod|
|
||
|
to_hash(pod)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :deployments, :pods
|
||
|
|
||
|
def matching_pods
|
||
|
strong_memoize(:matching_pods) do
|
||
|
deployment_tracks = deployments.map(&:track)
|
||
|
pods.select { |p| deployment_tracks.include?(p.track) }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def extra_pending_pods
|
||
|
wanted_instances = sum_hashes(deployments.map { |d| { d.track => d.wanted_instances } })
|
||
|
present_instances = sum_hashes(matching_pods.map { |p| { p.track => 1 } })
|
||
|
pending_instances = subtract_hashes(wanted_instances, present_instances)
|
||
|
|
||
|
pending_instances.flat_map do |track, num|
|
||
|
Array.new(num, pending_pod_for(track))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def sum_hashes(hashes)
|
||
|
hashes.reduce({}) do |memo, hash|
|
||
|
memo.merge(hash) { |_key, memo_val, hash_val| memo_val + hash_val }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def subtract_hashes(hash_a, hash_b)
|
||
|
hash_a.merge(hash_b) { |_key, val_a, val_b| [0, val_a - val_b].max }
|
||
|
end
|
||
|
|
||
|
def pending_pod_for(track)
|
||
|
::Gitlab::Kubernetes::Pod.new({
|
||
|
'status' => { 'phase' => 'Pending' },
|
||
|
'metadata' => {
|
||
|
'name' => 'Not provided',
|
||
|
'labels' => {
|
||
|
'track' => track
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
end
|
||
|
|
||
|
def to_hash(pod)
|
||
|
{
|
||
|
status: pod.status&.downcase,
|
||
|
pod_name: pod.name,
|
||
|
tooltip: "#{pod.name} (#{pod.status})",
|
||
|
track: pod.track,
|
||
|
stable: pod.stable?
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|