debian-mirror-gitlab/app/services/projects/container_repository/gitlab/delete_tags_service.rb

68 lines
2.1 KiB
Ruby
Raw Normal View History

2020-10-24 23:57:45 +05:30
# frozen_string_literal: true
module Projects
module ContainerRepository
module Gitlab
class DeleteTagsService
include BaseServiceUtility
2020-11-24 15:15:51 +05:30
include ::Gitlab::Utils::StrongMemoize
DISABLED_TIMEOUTS = [nil, 0].freeze
TimeoutError = Class.new(StandardError)
2020-10-24 23:57:45 +05:30
def initialize(container_repository, tag_names)
@container_repository = container_repository
@tag_names = tag_names
2021-01-29 00:20:46 +05:30
@deleted_tags = []
2020-10-24 23:57:45 +05:30
end
# Delete tags by name with a single DELETE request. This is only supported
# by the GitLab Container Registry fork. See
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23325 for details.
def execute
return success(deleted: []) if @tag_names.empty?
2020-11-24 15:15:51 +05:30
delete_tags
2021-03-08 18:12:59 +05:30
rescue TimeoutError, ::Faraday::Error => e
2020-11-24 15:15:51 +05:30
::Gitlab::ErrorTracking.track_exception(e, tags_count: @tag_names&.size, container_repository_id: @container_repository&.id)
2021-03-08 18:12:59 +05:30
error('error while deleting tags', nil, pass_back: { deleted: @deleted_tags, exception_class_name: e.class.name })
2020-11-24 15:15:51 +05:30
end
private
def delete_tags
start_time = Time.zone.now
2021-01-29 00:20:46 +05:30
@tag_names.each do |name|
2020-11-24 15:15:51 +05:30
raise TimeoutError if timeout?(start_time)
2021-01-29 00:20:46 +05:30
if @container_repository.delete_tag_by_name(name)
@deleted_tags.append(name)
end
2020-10-24 23:57:45 +05:30
end
2021-01-29 00:20:46 +05:30
@deleted_tags.any? ? success(deleted: @deleted_tags) : error('could not delete tags')
2020-10-24 23:57:45 +05:30
end
2020-11-24 15:15:51 +05:30
def timeout?(start_time)
return false unless throttling_enabled?
return false if service_timeout.in?(DISABLED_TIMEOUTS)
(Time.zone.now - start_time) > service_timeout
end
def throttling_enabled?
strong_memoize(:feature_flag) do
Feature.enabled?(:container_registry_expiration_policies_throttling)
end
end
def service_timeout
::Gitlab::CurrentSettings.current_application_settings.container_registry_delete_tags_service_timeout
end
2020-10-24 23:57:45 +05:30
end
end
end
end