diff options
Diffstat (limited to 'lib/gitlab/kubernetes/rollout_status.rb')
-rw-r--r-- | lib/gitlab/kubernetes/rollout_status.rb | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/gitlab/kubernetes/rollout_status.rb b/lib/gitlab/kubernetes/rollout_status.rb new file mode 100644 index 00000000000..e275303e650 --- /dev/null +++ b/lib/gitlab/kubernetes/rollout_status.rb @@ -0,0 +1,72 @@ +# 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 |