blob: 1bf32e04a15f8b314ebc8daa1f3cfcb4f7869b47 (
plain)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# frozen_string_literal: true
module Ci
class FreezePeriod < Ci::ApplicationRecord
include StripAttribute
include Ci::NamespacedModelName
include Gitlab::Utils::StrongMemoize
STATUS_ACTIVE = :active
STATUS_INACTIVE = :inactive
default_scope { order(created_at: :asc) } # rubocop:disable Cop/DefaultScope
belongs_to :project, inverse_of: :freeze_periods
strip_attributes! :freeze_start, :freeze_end
validates :freeze_start, cron: true, presence: true
validates :freeze_end, cron: true, presence: true
validates :cron_timezone, cron_freeze_period_timezone: true, presence: true
def active?
status == STATUS_ACTIVE
end
def status
Gitlab::SafeRequestStore.fetch("ci:freeze_period:#{id}:status") do
within_freeze_period? ? STATUS_ACTIVE : STATUS_INACTIVE
end
end
def time_start
Gitlab::SafeRequestStore.fetch("ci:freeze_period:#{id}:time_start") do
freeze_start_parsed_cron.previous_time_from(time_zone_now)
end
end
def next_time_start
Gitlab::SafeRequestStore.fetch("ci:freeze_period:#{id}:next_time_start") do
freeze_start_parsed_cron.next_time_from(time_zone_now)
end
end
def time_end_from_now
Gitlab::SafeRequestStore.fetch("ci:freeze_period:#{id}:time_end_from_now") do
freeze_end_parsed_cron.next_time_from(time_zone_now)
end
end
def time_end_from_start
Gitlab::SafeRequestStore.fetch("ci:freeze_period:#{id}:time_end_from_start") do
freeze_end_parsed_cron.next_time_from(time_start)
end
end
private
def within_freeze_period?
time_start <= time_zone_now && time_zone_now <= time_end_from_start
end
def freeze_start_parsed_cron
Gitlab::Ci::CronParser.new(freeze_start, cron_timezone)
end
strong_memoize_attr :freeze_start_parsed_cron
def freeze_end_parsed_cron
Gitlab::Ci::CronParser.new(freeze_end, cron_timezone)
end
strong_memoize_attr :freeze_end_parsed_cron
def time_zone_now
Time.zone.now
end
strong_memoize_attr :time_zone_now
end
end
|