118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module Gitlab
 | |
|   module Kubernetes
 | |
|     class Deployment
 | |
|       include Gitlab::Utils::StrongMemoize
 | |
| 
 | |
|       STABLE_TRACK_VALUE = 'stable'
 | |
| 
 | |
|       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
 |