1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
# frozen_string_literal: true
module Ci
module HasRunnerStatus
extend ActiveSupport::Concern
included do
scope :offline, -> { where(arel_table[:contacted_at].lteq(online_contact_time_deadline)) }
scope :never_contacted, -> { where(contacted_at: nil) }
scope :online, -> { where(arel_table[:contacted_at].gt(online_contact_time_deadline)) }
scope :with_status, ->(status) do
return all if available_statuses.exclude?(status.to_s)
public_send(status) # rubocop:disable GitlabSecurity/PublicSend -- safe to call
end
end
class_methods do
def available_statuses
self::AVAILABLE_STATUSES_INCL_DEPRECATED
end
def online_contact_time_deadline
raise NotImplementedError
end
def stale_deadline
raise NotImplementedError
end
end
def status
return :stale if stale?
return :never_contacted unless finished_creation_state?
online? ? :online : :offline
end
def online?
contacted_at && contacted_at > self.class.online_contact_time_deadline
end
def stale?
return false unless created_at
[created_at, contacted_at].compact.max <= self.class.stale_deadline
end
end
end
|