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

73 lines
2.0 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Kubernetes
# Calculates the rollout status for a set of kubernetes deployments.
#
# A GitLab environment may be composed of several Kubernetes deployments and
# other resources. The rollout status sums the Kubernetes deployments
# together.
class RolloutStatus
attr_reader :deployments, :instances, :completion, :status, :canary_ingress
def complete?
completion == 100
end
def loading?
@status == :loading
end
def not_found?
@status == :not_found
end
def found?
@status == :found
end
def canary_ingress_exists?
canary_ingress.present?
end
def self.from_deployments(*deployments_attrs, pods_attrs: [], ingresses: [])
return new([], status: :not_found) if deployments_attrs.empty?
deployments = deployments_attrs.map do |attrs|
::Gitlab::Kubernetes::Deployment.new(attrs, pods: pods_attrs)
end
deployments.sort_by!(&:order)
pods = pods_attrs.map do |attrs|
::Gitlab::Kubernetes::Pod.new(attrs)
end
ingresses = ingresses.map { |ingress| ::Gitlab::Kubernetes::Ingress.new(ingress) }
new(deployments, pods: pods, ingresses: ingresses)
end
def self.loading
new([], status: :loading)
end
def initialize(deployments, pods: [], ingresses: [], status: :found)
@status = status
@deployments = deployments
@instances = RolloutInstances.new(deployments, pods).pod_instances
@canary_ingress = ingresses.find(&:canary?)
@completion =
if @instances.empty?
100
else
# We downcase the pod status in Gitlab::Kubernetes::Deployment#deployment_instance
finished = @instances.count { |instance| instance[:status] == ::Gitlab::Kubernetes::Pod::RUNNING.downcase }
(finished / @instances.count.to_f * 100).to_i
end
end
end
end
end