Project

General

Profile

« Previous | Next » 

Revision f89389b9

Added by Brad Buckingham over 10 years ago

Package Groups: add ability to list groups by repo and retrieve info for a group

View differences:

app/controllers/katello/api/v2/package_groups_controller.rb
#
# Copyright 2014 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public
# License as published by the Free Software Foundation; either version
# 2 of the License (GPLv2) or (at your option) any later version.
# There is NO WARRANTY for this software, express or implied,
# including the implied warranties of MERCHANTABILITY,
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
# have received a copy of GPLv2 along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
module Katello
class Api::V2::PackageGroupsController < Api::V2::ApiController
before_filter :find_repository
before_filter :authorize
before_filter :find_package_group, :only => [:show]
def rules
readable = lambda { @repo.environment.contents_readable? && @repo.product.readable? }
{
:index => readable,
:show => readable
}
end
api :GET, "/package_groups", "List package groups"
api :GET, "/repositories/:repository_id/package_groups", "List package groups"
param :repository_id, :identifier, :desc => "repository identifier", :required => true
def index
options = sort_params
options[:filters] = [{ :term => { :repo_id => @repo.pulp_id } }]
@search_service.model = PackageGroup
respond(:collection => item_search(PackageGroup, params, options))
end
api :GET, "/package_groups/:id", "Show a package group"
api :GET, "/repositories/:repository_id/package_groups/:id", "Show a package group"
param :repository_id, :identifier, :desc => "repository identifier", :required => true
param :id, String, :desc => "package group identifier", :required => true
def show
respond :resource => @package_group
end
private
def find_repository
@repo = Repository.find(params[:repository_id]) if params[:repository_id]
end
def find_package_group
@package_group = PackageGroup.find(params[:id])
fail HttpErrors::NotFound, _("Package group with id '%s' not found") % params[:id] if @package_group.nil?
end
end
end
app/controllers/katello/content_search_controller.rb
def repo_puppet_modules
offset = params[:offset] || 0
puppet_modules = PuppetModule.search('', { :start => offset, :page_size => current_user.page_size,
:repoids => [@repo.pulp_id] })
puppet_modules = PuppetModule.legacy_search('', { :start => offset, :page_size => current_user.page_size,
:repoids => [@repo.pulp_id] })
rows = puppet_modules.collect do |puppet_module|
ContentSearch::Row.new(:id => puppet_module.id,
app/lib/katello/content_search/content_view_comparison.rb
:filters => {:repoids => view_repos.map(&:pulp_id)},
:search_mode => search_mode)
when :puppet_module
PuppetModule.search('', :start => offset, :page_size => page_size,
:repoids => view_repos.map(&:pulp_id), :search_mode => search_mode)
PuppetModule.legacy_search('', :start => offset, :page_size => page_size,
:repoids => view_repos.map(&:pulp_id),
:search_mode => search_mode)
end
next if units.empty? # if we don't have units, don't show repo
app/models/katello/glue/elastic_search/content_view.rb
def total_puppet_module_count(env)
repoids = self.repos(env).collect{|r| r.pulp_id}
result = Katello::PuppetModule.search('*', :page_size => 1, :repoids => repoids)
result = Katello::PuppetModule.legacy_search('*', :page_size => 1, :repoids => repoids)
result.length > 0 ? result.total : 0
end
app/models/katello/glue/elastic_search/package_group.rb
"#{Katello.config.elastic_index}_package_group"
end
def self.mapping
Tire.index(self.index).mapping
end
def self.search(options = {}, &block)
Tire.search(self.index, &block).results
end
def self.id_search(ids)
return Util::Support.array_with_total unless Tire.index(self.index).exists?
search = Tire.search self.index do
......
search.results
end
def self.search(query, start, page_size, repoid = nil, sort = [:name_sort, "ASC"],
default_field = 'name')
def self.legacy_search(query, start, page_size, repoid = nil, sort = [:name_sort, "ASC"],
default_field = 'name')
return Util::Support.array_with_total if !Tire.index(self.index).exists?
all_rows = query.blank? #if blank, get all rows
app/models/katello/glue/elastic_search/product.rb
def total_puppet_module_count(env, view)
repo_ids = view.repos(env).in_product(self).collect{ |r| r.pulp_id }
results = Katello::PuppetModule.search('', :page_size => 1, :repoids => repo_ids)
results = Katello::PuppetModule.legacy_search('', :page_size => 1, :repoids => repo_ids)
results.empty? ? 0 : results.total
end
app/models/katello/glue/elastic_search/repository.rb
end
def puppet_module_count
results = Katello::PuppetModule.search('', :page_size => 1, :repoids => [self.pulp_id])
results = Katello::PuppetModule.legacy_search('', :page_size => 1, :repoids => [self.pulp_id])
results.empty? ? 0 : results.total
end
app/models/katello/glue/pulp/package_group.rb
attr_accessor :name, :package_group_id, :default_package_names, :id, :repoid, :conditional_package_names,
:mandatory_package_names, :description, :optional_package_names
def self.find(id)
attrs = Katello.pulp_server.extensions.package_group.find_by_unit_id(id)
Katello::PackageGroup.new(attrs) if !attrs.nil?
end
def self.list_by_filter_clauses(clauses)
package_groups = Katello.pulp_server.extensions.package_group.search(Katello::PackageGroup::CONTENT_TYPE,
:filters => clauses)
app/models/katello/package_group_filter.rb
ids = parameters[:units].collect do |unit|
#{'name' => {"$regex" => unit[:name]}}
unless unit[:name].blank?
PackageGroup.search(unit[:name], 0, 0, [repo.pulp_id]).collect(&:package_group_id)
PackageGroup.legacy_search(unit[:name], 0, 0, [repo.pulp_id]).collect(&:package_group_id)
end
end
ids.flatten!
app/views/katello/api/v2/package_groups/index.json.rabl
object false
extends 'katello/api/v2/common/index'
app/views/katello/api/v2/package_groups/show.json.rabl
object @resource
attributes :id
attributes :package_group_id
attributes :name
attributes :description
attributes :repo_id
attributes :default_package_names
attributes :mandatory_package_names
attributes :conditional_package_names
attributes :optional_package_names
config/routes/api/v2.rb
end
end
api_resources :package_groups, :only => [:index, :show]
api_resources :ping, :only => [:index]
match "/status" => "ping#server_status", :via => :get
......
api_resources :packages, :only => [:index, :show] do
get :search, :on => :collection
end
api_resources :package_groups, :only => [:index, :show]
api_resources :errata, :only => [:index, :show], :constraints => {:id => /[0-9a-zA-Z\-\+%_.:]+/}
api_resources :distributions, :only => [:index, :show], :constraints => {:id => /[0-9a-zA-Z \-\+%_.]+/}
api_resources :puppet_modules, :only => [:index, :show] do
test/controllers/api/v2/package_groups_controller_test.rb
#
# Copyright 2014 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public
# License as published by the Free Software Foundation; either version
# 2 of the License (GPLv2) or (at your option) any later version.
# There is NO WARRANTY for this software, express or implied,
# including the implied warranties of MERCHANTABILITY,
# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
# have received a copy of GPLv2 along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
require "katello_test_helper"
module Katello
class Api::V2::PackageGroupsControllerTest < ActionController::TestCase
def before_suite
models = ["Organization", "KTEnvironment", "PackageGroup", "Repository", "Product", "Provider"]
services = ["Candlepin", "Pulp", "ElasticSearch"]
disable_glue_layers(services, models)
super
end
def models
@repo = Repository.find(katello_repositories(:fedora_17_x86_64_dev))
end
def permissions
@env_read_permission = UserPermission.new(:read_contents, :environments)
@prod_read_permission = UserPermission.new(:read, :providers)
@read_permission = @env_read_permission + @prod_read_permission
@unauth_perms = [NO_PERMISSION, @env_read_permission, @prod_read_permission]
end
def setup
setup_controller_defaults_api
@request.env['HTTP_ACCEPT'] = 'application/json'
@request.env['CONTENT_TYPE'] = 'application/json'
@fake_search_service = @controller.load_search_service(Support::SearchService::FakeSearchService.new)
models
permissions
end
def test_index
get :index, :repository_id => @repo.id
assert_response :success
assert_template %w(katello/api/v2/package_groups/index)
end
def test_index_protected
assert_protected_action(:index, @read_permission, @unauth_perms) do
get :index, :repository_id => @repo.id
end
end
def test_show
PackageGroup.expects(:find).once.returns(mock({}))
get :show, :repository_id => @repo.id, :id => "3805853f-5cae-4a4a-8549-0ec86410f58f"
assert_response :success
assert_template %w(katello/api/v2/package_groups/show)
end
def test_show_group_not_found
PackageGroup.expects(:find).once.returns(nil)
get :show, :repository_id => @repo.id, :id => "3805853f-5cae-4a4a-8549-0ec86410f58f"
assert_response 404
end
def test_show_protected
PackageGroup.expects(:find).returns(mock({}))
assert_protected_action(:show, @read_permission, @unauth_perms) do
get :show, :repository_id => @repo.id, :id => "3805853f-5cae-4a4a-8549-0ec86410f58f"
end
end
end
end

Also available in: Unified diff