Project

General

Profile

Download (5.73 KB) Statistics
| Branch: | Tag: | Revision:
#
# Copyright 2013 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::ContentViewsController < Api::V2::ApiController
respond_to :json

before_filter :find_content_view, :except => [:index, :create]
before_filter :find_organization, :only => [:index, :create]
before_filter :find_environment, :only => [:index]
before_filter :load_search_service, :only => [:index, :available_puppet_modules]

before_filter :authorize

wrap_parameters :include => (ContentView.attribute_names + %w(repository_ids component_ids))

def rules
index_rule = lambda { ContentView.any_readable?(@organization) }
view_rule = lambda { @view.readable? }
create_rule = lambda { ContentView.creatable?(@organization) }
edit_rule = lambda { @view.editable? }
publish_rule = lambda { @view.publishable? }

{
:index => index_rule,
:show => view_rule,
:create => create_rule,
:update => edit_rule,
:publish => publish_rule,
:available_puppet_modules => view_rule,
:history => view_rule
}
end

api :GET, "/organizations/:organization_id/content_views", "List content views"
api :GET, "/content_views", "List content views"
param :organization_id, :identifier, :desc => "organization identifier", :required => true
param :environment_id, :identifier, :desc => "environment identifier"
def index
options = sort_params
options[:load_records?] = true

ids = if @environment
# TODO: move environment to an ES filter
ContentView.non_default.readable(@organization).in_environment(@environment).pluck(:id)
else
ContentView.non_default.readable(@organization).pluck(:id)
end
options[:filters] = [{:terms => {:id => ids}}]

@search_service.model = ContentView
respond(:collection => item_search(ContentView, params, options))
end

api :POST, "/organizations/:organization_id/content_views", "Create a content view"
api :POST, "/content_views", "Create a content view"
param :organization_id, :identifier, :desc => "Organization identifier", :required => true
param :name, String, :desc => "Name of the content view", :required => true
param :description, String, :desc => "Description of the content view"
param :label, String, :desc => "Content view label"
param :repositoriy_ids, Array, :desc => "List of repository ids"
param :composite, :bool, :desc => "Composite content view"
def create
@view = ContentView.create!(view_params) do |view|
view.organization = @organization
view.label ||= labelize_params(params[:content_view])
end

respond :resource => @view
end

api :PUT, "/content_views/:id", "Update a content view"
param :id, :number, :desc => "Content view identifier", :required => true
param :name, String, :desc => "New name for the content view"
param :description, String, :desc => "Updated description for the content view"
param :repository_ids, Array, :desc => "List of repository ids"
param :component_ids, Array, :desc => "List of component content view version ids"
def update
@view.update_attributes!(view_params)

respond :resource => @view
end

api :POST, "/content_views/:id/publish", "Publish a content view"
param :id, :identifier, :desc => "Content view identifier", :required => true
def publish
@view.publish(:async => false)

respond_for_show :resource => @view
end

api :GET, "/content_views/:id", "Show a content view"
param :id, :number, :desc => "content view numeric identifier", :required => true
def show
respond :resource => @view
end

api :GET, "/content_views/:id/available_puppet_modules",
"Get puppet modules that are available to be added to the content view"
param :id, :identifier, :desc => "content view numeric identifier", :required => true
def available_puppet_modules
current_ids = @view.content_view_puppet_modules.map(&:uuid)
repo_ids = @view.organization.library.puppet_repositories.pluck(:pulp_id)
search_filters = [{ :terms => { :repoids => repo_ids } },
{ :not => { :terms => { :id => current_ids } } }]
options = { :filters => search_filters }

respond_for_index :template => '../puppet_modules/index',
:collection => item_search(PuppetModule, params, options)
end

api :GET, "/content_views/:id/history", "Show a content view's history"
param :id, :number, :desc => "content view numeric identifier", :required => true
def history
respond_for_index(:collection => @view.history)
end

private

def find_content_view
@view = ContentView.non_default.find(params[:id])
end

def view_params
attrs = [:name, :description, {:repository_ids => []}, {:component_ids => []}]
attrs.push(:label, :composite) if action_name == "create"
params.require(:content_view).permit(*attrs)
end

def find_environment
return unless params.key?(:environment_id)
@environment = KTEnvironment.find(params[:environment_id])
end
end
end
(7-7/44)