summaryrefslogtreecommitdiff
path: root/lib/gitlab/kubernetes/rollout_status.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/kubernetes/rollout_status.rb')
-rw-r--r--lib/gitlab/kubernetes/rollout_status.rb72
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