debian-mirror-gitlab/app/models/container_expiration_policy.rb

93 lines
2.8 KiB
Ruby
Raw Normal View History

2020-01-01 13:55:28 +05:30
# frozen_string_literal: true
class ContainerExpirationPolicy < ApplicationRecord
2020-03-13 15:44:24 +05:30
include Schedulable
2020-04-22 19:07:51 +05:30
include UsageStatistics
2021-01-03 14:25:43 +05:30
include EachBatch
2020-03-13 15:44:24 +05:30
2021-01-29 00:20:46 +05:30
POLICY_PARAMS = %w[
older_than
keep_n
name_regex
name_regex_keep
].freeze
2020-01-01 13:55:28 +05:30
belongs_to :project, inverse_of: :container_expiration_policy
2020-03-13 15:44:24 +05:30
delegate :container_repositories, to: :project
2020-01-01 13:55:28 +05:30
validates :project, presence: true
validates :enabled, inclusion: { in: [true, false] }
validates :cadence, presence: true, inclusion: { in: ->(_) { self.cadence_options.stringify_keys } }
validates :older_than, inclusion: { in: ->(_) { self.older_than_options.stringify_keys } }, allow_nil: true
validates :keep_n, inclusion: { in: ->(_) { self.keep_n_options.keys } }, allow_nil: true
2021-01-29 00:20:46 +05:30
validates :name_regex, presence: true, if: :enabled?
2020-06-23 00:09:42 +05:30
validates :name_regex, untrusted_regexp: true, if: :enabled?
validates :name_regex_keep, untrusted_regexp: true, if: :enabled?
2020-01-01 13:55:28 +05:30
2020-03-13 15:44:24 +05:30
scope :active, -> { where(enabled: true) }
scope :preloaded, -> { preload(project: [:route]) }
2021-01-29 00:20:46 +05:30
def self.with_container_repositories
where(
2021-01-03 14:25:43 +05:30
'EXISTS (?)',
ContainerRepository.select(1)
.where(
'container_repositories.project_id = container_expiration_policies.project_id'
)
)
end
2021-09-04 01:27:46 +05:30
def self.without_container_repositories
where.not(
'EXISTS(?)',
ContainerRepository.select(1)
.where(
'container_repositories.project_id = container_expiration_policies.project_id'
)
)
end
2020-01-01 13:55:28 +05:30
def self.keep_n_options
{
1 => _('%{tags} tag per image name') % { tags: 1 },
5 => _('%{tags} tags per image name') % { tags: 5 },
10 => _('%{tags} tags per image name') % { tags: 10 },
25 => _('%{tags} tags per image name') % { tags: 25 },
50 => _('%{tags} tags per image name') % { tags: 50 },
100 => _('%{tags} tags per image name') % { tags: 100 }
}
end
def self.cadence_options
{
'1d': _('Every day'),
'7d': _('Every week'),
'14d': _('Every two weeks'),
'1month': _('Every month'),
'3month': _('Every three months')
}
end
def self.older_than_options
{
'7d': _('%{days} days until tags are automatically removed') % { days: 7 },
'14d': _('%{days} days until tags are automatically removed') % { days: 14 },
'30d': _('%{days} days until tags are automatically removed') % { days: 30 },
'90d': _('%{days} days until tags are automatically removed') % { days: 90 }
}
end
2020-03-13 15:44:24 +05:30
def set_next_run_at
self.next_run_at = Time.zone.now + ChronicDuration.parse(cadence).seconds
end
2020-06-23 00:09:42 +05:30
def disable!
update_attribute(:enabled, false)
end
2021-01-29 00:20:46 +05:30
def policy_params
attributes.slice(*POLICY_PARAMS)
end
2020-01-01 13:55:28 +05:30
end