gitlab-org--gitlab-foss/lib/gitlab/kubernetes/deployment.rb

118 lines
2.6 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Kubernetes
class Deployment
include Gitlab::Utils::StrongMemoize
STABLE_TRACK_VALUE = 'stable'
def initialize(attributes = {}, pods: [])
@attributes = attributes
@pods = pods
end
def name
metadata['name'] || 'unknown'
end
def labels
metadata.fetch('labels', {})
end
def annotations
metadata.fetch('annotations', {})
end
def track
labels.fetch('track', STABLE_TRACK_VALUE)
end
def stable?
track == 'stable'
end
def order
stable? ? 1 : 0
end
def outdated?
observed_generation < generation
end
def wanted_instances
spec.fetch('replicas', 0)
end
def created_instances
filtered_pods_by_track.map do |pod|
pod_metadata = pod.fetch('metadata', {})
pod_name = pod_metadata['name'] || pod_metadata['generateName']
pod_status = pod.dig('status', 'phase')
deployment_instance(pod_name: pod_name, pod_status: pod_status)
end
end
# These are replicas that did not get created yet,
# So they still do not have any associated pod,
# these are marked as pending instances.
def not_created_instances
pending_instances_count = wanted_instances - filtered_pods_by_track.count
return [] if pending_instances_count <= 0
Array.new(pending_instances_count, deployment_instance(pod_name: 'Not provided', pod_status: 'Pending'))
end
def filtered_pods_by_track
strong_memoize(:filtered_pods_by_track) do
@pods.select { |pod| has_same_track?(pod) }
end
end
def instances
created_instances + not_created_instances
end
private
def deployment_instance(pod_name:, pod_status:)
{
status: pod_status&.downcase,
pod_name: pod_name,
tooltip: "#{pod_name} (#{pod_status})",
track: track,
stable: stable?
}
end
def has_same_track?(pod)
pod_track = pod.dig('metadata', 'labels', 'track') || STABLE_TRACK_VALUE
pod_track == track
end
def metadata
@attributes.fetch('metadata', {})
end
def spec
@attributes.fetch('spec', {})
end
def status
@attributes.fetch('status', {})
end
def generation
metadata.fetch('generation', 0)
end
def observed_generation
status.fetch('observedGeneration', 0)
end
end
end
end