2018-09-06 06:33:30 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2020-02-19 18:09:10 +00:00
|
|
|
class DeleteContainerRepositoryWorker # rubocop:disable Scalability/IdempotentWorker
|
2018-09-06 06:33:30 +00:00
|
|
|
include ApplicationWorker
|
2022-06-09 15:09:21 +00:00
|
|
|
include ExclusiveLeaseGuard
|
2021-04-30 18:10:09 +00:00
|
|
|
|
2021-07-21 12:09:35 +00:00
|
|
|
data_consistency :always
|
|
|
|
|
2021-04-30 18:10:09 +00:00
|
|
|
sidekiq_options retry: 3
|
2018-09-06 06:33:30 +00:00
|
|
|
|
2019-01-10 14:22:58 +00:00
|
|
|
queue_namespace :container_repository
|
2019-10-18 11:11:44 +00:00
|
|
|
feature_category :container_registry
|
2019-01-10 14:22:58 +00:00
|
|
|
|
2022-06-09 15:09:21 +00:00
|
|
|
LEASE_TIMEOUT = 1.hour.freeze
|
|
|
|
FIXED_DELAY = 10.seconds.freeze
|
2018-09-06 06:33:30 +00:00
|
|
|
|
|
|
|
attr_reader :container_repository
|
|
|
|
|
|
|
|
def perform(current_user_id, container_repository_id)
|
2021-11-10 15:13:21 +00:00
|
|
|
current_user = User.find_by_id(current_user_id)
|
|
|
|
@container_repository = ContainerRepository.find_by_id(container_repository_id)
|
2018-09-06 06:33:30 +00:00
|
|
|
project = container_repository&.project
|
|
|
|
|
|
|
|
return unless current_user && container_repository && project
|
|
|
|
|
2022-06-09 15:09:21 +00:00
|
|
|
if migration.delete_container_repository_worker_support? && migrating?
|
|
|
|
delay = migration_duration
|
|
|
|
|
|
|
|
self.class.perform_in(delay.from_now)
|
|
|
|
|
|
|
|
log_extra_metadata_on_done(:delete_postponed, delay)
|
|
|
|
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2018-09-06 06:33:30 +00:00
|
|
|
# If a user accidentally attempts to delete the same container registry in quick succession,
|
|
|
|
# this can lead to orphaned tags.
|
|
|
|
try_obtain_lease do
|
|
|
|
Projects::ContainerRepository::DestroyService.new(project, current_user).execute(container_repository)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-06-09 15:09:21 +00:00
|
|
|
private
|
|
|
|
|
|
|
|
def migrating?
|
|
|
|
!(container_repository.default? ||
|
|
|
|
container_repository.import_done? ||
|
|
|
|
container_repository.import_skipped?)
|
|
|
|
end
|
|
|
|
|
|
|
|
def migration_duration
|
|
|
|
duration = migration.import_timeout.seconds + FIXED_DELAY
|
|
|
|
|
|
|
|
if container_repository.pre_importing?
|
|
|
|
duration += migration.dynamic_pre_import_timeout_for(container_repository)
|
|
|
|
end
|
|
|
|
|
|
|
|
duration
|
|
|
|
end
|
|
|
|
|
|
|
|
def migration
|
|
|
|
ContainerRegistry::Migration
|
|
|
|
end
|
|
|
|
|
2018-09-06 06:33:30 +00:00
|
|
|
# For ExclusiveLeaseGuard concern
|
|
|
|
def lease_key
|
|
|
|
@lease_key ||= "container_repository:delete:#{container_repository.id}"
|
|
|
|
end
|
|
|
|
|
|
|
|
# For ExclusiveLeaseGuard concern
|
|
|
|
def lease_timeout
|
|
|
|
LEASE_TIMEOUT
|
|
|
|
end
|
|
|
|
end
|