72 lines
2 KiB
Ruby
72 lines
2 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
|