Skip to content

Commit

Permalink
Fixes #34456 - Allow reclaim space task to acquire repo lock (#9952)
Browse files Browse the repository at this point in the history
  • Loading branch information
sjha4 committed Feb 21, 2022
1 parent 5961d84 commit 5b8426e
Show file tree
Hide file tree
Showing 8 changed files with 1,306 additions and 38 deletions.
Expand Up @@ -53,7 +53,16 @@ def sync_repositories
api :POST, "/repositories/bulk/reclaim_space", N_("Reclaim space from On Demand repositories")
param :ids, Array, :desc => N_("List of repository ids"), :required => true
def reclaim_space_from_repositories
task = async_task(::Actions::Pulp3::Repository::ReclaimSpace, @repositories)
if @repositories.empty?
fail _("No repositories selected.")
end
repositories = @repositories.select { |repo| repo.download_policy == ::Katello::RootRepository::DOWNLOAD_ON_DEMAND }
if repositories.empty?
fail _("Only On Demand repositories may have space reclaimed.")
end
task = async_task(::Actions::BulkAction,
::Actions::Pulp3::Repository::ReclaimSpace,
repositories)

respond_for_async :resource => task
end
Expand Down
3 changes: 3 additions & 0 deletions app/controllers/katello/api/v2/repositories_controller.rb
Expand Up @@ -327,6 +327,9 @@ def verify_checksum
api :POST, "/repositories/:id/reclaim_space", N_("Reclaim space from an On Demand repository")
param :id, :number, :required => true, :desc => N_("repository ID")
def reclaim_space
if @repository.download_policy != ::Katello::RootRepository::DOWNLOAD_ON_DEMAND
fail HttpErrors::BadRequest, _("Only On Demand repositories may have space reclaimed.")
end
task = async_task(::Actions::Pulp3::Repository::ReclaimSpace, @repository)
respond_for_async :resource => task
rescue Errors::InvalidActionOptionError => e
Expand Down
2 changes: 1 addition & 1 deletion app/lib/actions/pulp3/abstract.rb
@@ -1,6 +1,6 @@
module Actions
module Pulp3
class Abstract < Actions::Base
class Abstract < Actions::EntryAction
middleware.use ::Actions::Middleware::RemoteAction
middleware.use Actions::Middleware::Pulp3ServicesCheck

Expand Down
13 changes: 3 additions & 10 deletions app/lib/actions/pulp3/repository/reclaim_space.rb
Expand Up @@ -2,16 +2,9 @@ module Actions
module Pulp3
module Repository
class ReclaimSpace < Pulp3::AbstractAsyncTask
def plan(repositories, smart_proxy = SmartProxy.pulp_primary)
repositories = [repositories] if repositories.is_a?(::Katello::Repository)
if repositories.empty?
fail _("No repositories selected.")
end
repositories = repositories.select { |repo| repo.download_policy == ::Katello::RootRepository::DOWNLOAD_ON_DEMAND }
if repositories.empty?
fail _("Only On Demand repositories may have space reclaimed.")
end
repository_hrefs = ::Katello::Pulp3::RepositoryReference.default_cv_repository_hrefs(repositories, Organization.current || repositories.first.organization)
def plan(repo, smart_proxy = SmartProxy.pulp_primary)
action_subject(repo)
repository_hrefs = ::Katello::Pulp3::RepositoryReference.default_cv_repository_hrefs([repo], Organization.current || repositories.first.organization)
plan_self(repository_hrefs: repository_hrefs, smart_proxy_id: smart_proxy.id)
end

Expand Down
27 changes: 3 additions & 24 deletions test/actions/pulp3/repository/reclaim_space_test.rb
Expand Up @@ -22,33 +22,12 @@ def setup
@repo3.root.update(download_policy: 'immediate')
end

def test_proper_repositories_have_space_reclaimed
def test_repository_has_space_reclaimed
task = ForemanTasks.async_task(::Actions::Pulp3::Repository::ReclaimSpace,
[@repo, @repo2, @repo3])
@repo)

on_demand_repo_hrefs = [@repo.version_href.split('/').slice(0, 8).join('/') + '/',
@repo2.version_href.split('/').slice(0, 8).join('/') + '/']

immediate_repo_href = @repo3.version_href.split('/').slice(0, 8).join('/') + '/'

refute_includes task.input.with_indifferent_access[:repository_hrefs], immediate_repo_href
on_demand_repo_hrefs = [@repo.version_href.split('/').slice(0, 8).join('/') + '/']
assert_equal task.input.with_indifferent_access[:repository_hrefs] & on_demand_repo_hrefs, on_demand_repo_hrefs
end

def test_empty_repositories_error
error = assert_raises(RuntimeError) do
ForemanTasks.async_task(::Actions::Pulp3::Repository::ReclaimSpace, [])
end

assert_equal 'No repositories selected.', error.message
end

def test_no_on_demand_repositories_error
error = assert_raises(RuntimeError) do
ForemanTasks.async_task(::Actions::Pulp3::Repository::ReclaimSpace, [@repo3])
end

assert_equal 'Only On Demand repositories may have space reclaimed.', error.message
end
end
end
Expand Up @@ -79,8 +79,10 @@ def test_sync_protected
end

def test_reclaim_space
assert_async_task(::Actions::Pulp3::Repository::ReclaimSpace) do |repos|
assert_equal @repositories.map(&:id).sort, repos.map(&:id).sort
assert_async_task(::Actions::BulkAction) do |action_class, repos|
assert_equal action_class, ::Actions::Pulp3::Repository::ReclaimSpace
assert_equal @repositories.select { |repo| repo.download_policy == ::Katello::RootRepository::DOWNLOAD_ON_DEMAND }.map(&:id).sort,
repos.select { |repo| repo.download_policy == ::Katello::RootRepository::DOWNLOAD_ON_DEMAND }.map(&:id).sort
end

post :reclaim_space_from_repositories, params: { :ids => @repositories.collect(&:id), :organization_id => @organization.id }
Expand Down
9 changes: 9 additions & 0 deletions test/controllers/api/v2/repositories_controller_test.rb
Expand Up @@ -864,12 +864,21 @@ def test_verify_checksum
end

def test_reclaim_space
@repository.root.update_attribute(:download_policy, ::Katello::RootRepository::DOWNLOAD_ON_DEMAND)
assert_async_task ::Actions::Pulp3::Repository::ReclaimSpace do |repo|
repo.id == @repository.id
end

post :reclaim_space, params: { :id => @repository.id }
assert_response :success
@repository.root.update_attribute(:download_policy, ::Katello::RootRepository::DOWNLOAD_IMMEDIATE)
end

def test_reclaim_space_with_immediate_repo
@repository.root.download_policy = ::Katello::RootRepository::DOWNLOAD_IMMEDIATE
post :reclaim_space, params: { :id => @repository.id }
assert_response 400
assert_match "Only On Demand repositories may have space reclaimed.", @response.body
end

def test_verify_checksum_protected
Expand Down

0 comments on commit 5b8426e

Please sign in to comment.