diff options
Diffstat (limited to 'lib/gitlab/kubernetes/deployment.rb')
-rw-r--r-- | lib/gitlab/kubernetes/deployment.rb | 117 |
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 |