summaryrefslogtreecommitdiff
path: root/lib/gitlab/kubernetes/deployment.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/kubernetes/deployment.rb')
-rw-r--r--lib/gitlab/kubernetes/deployment.rb117
1 files changed, 117 insertions, 0 deletions
diff --git a/lib/gitlab/kubernetes/deployment.rb b/lib/gitlab/kubernetes/deployment.rb
new file mode 100644
index 00000000000..55ed9a7517e
--- /dev/null
+++ b/lib/gitlab/kubernetes/deployment.rb
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Kubernetes
+ class Deployment
+ include Gitlab::Utils::StrongMemoize
+
+ STABLE_TRACK_VALUE = 'stable'.freeze
+
+ 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