Skip to content

Commit

Permalink
Fixes #33525 - Add debs packages_restrict_latest
Browse files Browse the repository at this point in the history
  • Loading branch information
m-bucher committed Aug 31, 2022
1 parent fccabdf commit a6fe79d
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 1 deletion.
11 changes: 11 additions & 0 deletions app/controllers/katello/api/v2/debs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ def auto_complete_arch
param :host_id, :number, :desc => N_("Host id to list applicable deb packages for")
param :packages_restrict_applicable, :boolean, :desc => N_("Return deb packages that are applicable to one or more hosts (defaults to true if host_id is specified)")
param :packages_restrict_upgradable, :boolean, :desc => N_("Return deb packages that are upgradable on one or more hosts")
param :packages_restrict_latest, :boolean, :desc => N_("Return only the latest version of each package")
param :available_for, String, :desc => N_("Return deb packages that can be added to the specified object. Only the value 'content_view_version' is supported.")
param_group :search, ::Katello::Api::V2::ApiController
def index
Expand Down Expand Up @@ -66,6 +67,16 @@ def custom_index_relation(collection)
collection
end

def final_custom_index_relation(collection)
# :packages_restrict_latest is intended to filter the result set after all
# other constraints have been applied, including the scoped_search
# constraints. If any constraints are applied after this, then a package
# will not be returned if its latest version does not match those
# constraints, even if an older version does match those constraints.
collection = Katello::Deb.latest(collection) if ::Foreman::Cast.to_bool(params[:packages_restrict_latest])
collection
end

private

def find_hosts
Expand Down
5 changes: 4 additions & 1 deletion app/models/katello/deb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,10 @@ def self.applicable_to_hosts(hosts)
end

def self.latest(_relation)
fail 'NotImplemented'
return relation.joins(
"LEFT JOIN (#{relation.to_sql}) AS katello_debs2 ON " \
'katello_debs.name=katello_debs2.name AND deb_version_cmp(katello_debs.version,katello_debs2.version) < 0'
).where('katello_debs2.version IS NULL')
end
end
end
10 changes: 10 additions & 0 deletions test/controllers/api/v2/debs_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ def models
@version = ContentViewVersion.first
@deb = katello_debs(:one)
@host = hosts(:one)
@org = get_organization
end

def setup
Expand Down Expand Up @@ -70,6 +71,15 @@ def test_index_with_available_for_content_view_version
assert_includes ids, @deb.id
end

def test_index_with_latest
response = get :index, params: { :packages_restrict_latest => true, :organization_id => @org.id }

assert_response :success
ids = JSON.parse(response.body)['results'].map { |p| p['id'] }
assert_includes ids, katello_debs(:one_new).id
refute_includes ids, @deb.id
end

def test_index_protected
assert_protected_action(:index, @auth_permissions, @unauth_permissions) do
get :index, params: { :repository_id => @repo.id }
Expand Down

0 comments on commit a6fe79d

Please sign in to comment.