|
|
|
#
|
|
# 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 ProvidersController < Katello::ApplicationController
|
|
|
|
before_filter :find_rh_provider, :only => [:redhat_provider, :redhat_provider_tab]
|
|
|
|
before_filter :find_provider, :only => [:products_repos, :show, :edit, :update, :destroy, :manifest_progress,
|
|
:repo_discovery, :discovered_repos, :discover, :cancel_discovery,
|
|
:new_discovered_repos, :create_discovered_repos]
|
|
before_filter :authorize #after find_provider
|
|
before_filter :panel_options, :only => [:index, :items]
|
|
before_filter :search_filter, :only => [:auto_complete_search]
|
|
|
|
respond_to :html, :js
|
|
|
|
def section_id
|
|
'contents'
|
|
end
|
|
|
|
def rules
|
|
index_test = lambda{current_organization && Provider.any_readable?(current_organization)}
|
|
create_test = lambda{current_organization && Provider.creatable?(current_organization)}
|
|
read_test = lambda{@provider.readable?}
|
|
edit_test = lambda{@provider.editable?}
|
|
delete_test = lambda{@provider.deletable?}
|
|
{
|
|
:index => index_test,
|
|
:items => index_test,
|
|
:show => index_test,
|
|
:auto_complete_search => index_test,
|
|
:new => create_test,
|
|
:create => create_test,
|
|
:edit => read_test,
|
|
:update => edit_test,
|
|
:destroy => delete_test,
|
|
:products_repos => read_test,
|
|
:manifest_progress => edit_test,
|
|
:redhat_provider => read_test,
|
|
:redhat_provider_tab => read_test,
|
|
:repo_discovery => edit_test,
|
|
:new_discovered_repos => edit_test,
|
|
:cancel_discovery => edit_test,
|
|
:discovered_repos => edit_test,
|
|
:discover => edit_test
|
|
}
|
|
end
|
|
|
|
def param_rules
|
|
{
|
|
:create => {:provider => [:name, :description]}
|
|
}
|
|
end
|
|
|
|
def products_repos
|
|
@products = @provider.products
|
|
render :partial => "products_repos", :locals => {:provider => @provider,
|
|
:providers => @providers, :products => @products, :editable => @provider.editable?,
|
|
:repositories_cloned_in_envrs => repositories_cloned_in_envrs}
|
|
end
|
|
|
|
def manifest_progress
|
|
expire_page :action => :manifest_progress
|
|
# "finished" is checked for in the javascript to see if polling for task progress should be done
|
|
if @provider.manifest_task.nil?
|
|
to_ret = {'state' => 'finished'}
|
|
else
|
|
to_ret = @provider.manifest_task.to_json
|
|
end
|
|
|
|
# Never cache these results since the user may close and re-open the "new" panel and no status would
|
|
# be available for checking
|
|
response.headers["Last-Modified"] = Time.now.httpdate
|
|
response.headers["Expires"] = "0"
|
|
response.headers["Pragma"] = "no-cache"
|
|
response.headers["Cache-Control"] = 'no-store, no-cache, must-revalidate, max-age=0, pre-check=0, post-check=0'
|
|
|
|
render :json => to_ret
|
|
end
|
|
|
|
def redhat_provider
|
|
render :template => "katello/providers/redhat/show"
|
|
end
|
|
|
|
def redhat_provider_tab
|
|
#preload orphaned product information, as it is very slow per product
|
|
subscription_product_ids = []
|
|
|
|
subscriptions = Resources::Candlepin::Subscription.get_for_owner(current_organization.label)
|
|
subscriptions.each do |sub|
|
|
subscription_product_ids << sub["product"]["id"] if sub["product"]["id"]
|
|
subscription_product_ids += sub["providedProducts"].map{|p| p["id"]}
|
|
end
|
|
|
|
orphaned_product_ids = current_organization.redhat_provider.products.engineering.
|
|
where("cp_id not in (?)", subscription_product_ids).pluck(:id)
|
|
|
|
render :partial => "katello/providers/redhat/tab",
|
|
:locals => { :tab_id => params[:tab], :orphaned_product_ids => orphaned_product_ids }
|
|
end
|
|
|
|
def items
|
|
ids = Provider.readable(current_organization).collect{|p| p.id}
|
|
render_panel_direct(
|
|
Provider,
|
|
@panel_options,
|
|
params[:search],
|
|
params[:offset] || 0,
|
|
[:name_sort, 'asc'],
|
|
{:default_field => :name, :filter => [{ "id" => ids }, { :provider_type => [Provider::CUSTOM] }]}
|
|
)
|
|
end
|
|
|
|
def show
|
|
provider = Provider.find(params[:id])
|
|
render :partial => "katello/common/list_update",
|
|
:locals => { :item => provider, :accessor => "id", :columns => ['name'] }
|
|
end
|
|
|
|
def edit
|
|
render :partial => "edit", :locals => {:provider => @provider, :editable => @provider.editable?,
|
|
:repositories_cloned_in_envrs => repositories_cloned_in_envrs,
|
|
:name => controller_display_name}
|
|
end
|
|
|
|
def new
|
|
@provider = Provider.new
|
|
render :partial => "new", :locals => {:provider => @provider}
|
|
end
|
|
|
|
def create
|
|
@provider = Provider.create! params[:provider].merge({:provider_type => Provider::CUSTOM,
|
|
:organization => current_organization})
|
|
notify.success _("Provider '%s' was created.") % @provider['name']
|
|
|
|
if search_validate(Provider, @provider.id, params[:search])
|
|
render :partial => "katello/common/list_item",
|
|
:locals => { :item => @provider, :initial_action => :products_repos,
|
|
:accessor => "id", :columns => ['name'], :name => controller_display_name }
|
|
else
|
|
notify.message _("'%s' did not meet the current search criteria and is not being shown.") % @provider["name"]
|
|
render :json => { :no_match => true }
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
if @provider.destroy
|
|
notify.success _("Provider '%s' was deleted.") % @provider[:name]
|
|
#render and do the removal in one swoop!
|
|
render :partial => "katello/common/list_remove", :locals => {:id => params[:id], :name => controller_display_name}
|
|
end
|
|
end
|
|
|
|
def update
|
|
updated_provider = Provider.find(params[:id])
|
|
result = params[:provider].values.first
|
|
|
|
updated_provider.name = params[:provider][:name] unless params[:provider][:name].nil?
|
|
|
|
unless params[:provider][:description].nil?
|
|
result = updated_provider.description = params[:provider][:description].gsub("\n", '')
|
|
end
|
|
|
|
updated_provider.repository_url = params[:provider][:repository_url] unless params[:provider][:repository_url].nil?
|
|
updated_provider.provider_type = params[:provider][:provider_type] unless params[:provider][:provider_type].nil?
|
|
|
|
updated_provider.save!
|
|
notify.success _("Provider '%s' was updated.") % updated_provider.name
|
|
|
|
if !search_validate(Provider, updated_provider.id, params[:search])
|
|
notify.message _("'%s' no longer matches the current search criteria.") % updated_provider["name"]
|
|
end
|
|
|
|
render :text => escape_html(result)
|
|
end
|
|
|
|
def repo_discovery
|
|
running = @provider.discovery_task.nil? ? false : !@provider.discovery_task.finished?
|
|
render :partial => 'repo_discovery',
|
|
:locals => {:provider => @provider, :discovered => get_discovered_urls,
|
|
:running => running,
|
|
:repositories_cloned_in_envrs => repositories_cloned_in_envrs}
|
|
end
|
|
|
|
def discovered_repos
|
|
running = @provider.discovery_task.nil? ? false : !@provider.discovery_task.finished?
|
|
render :json => {:urls => get_discovered_urls, :running => running}
|
|
end
|
|
|
|
def new_discovered_repos
|
|
urls = params[:urls] || []
|
|
render :partial => 'new_discovered_repos', :locals => {:urls => urls}
|
|
end
|
|
|
|
def cancel_discovery
|
|
@provider.discovery_task = nil
|
|
@provider.save!
|
|
render :nothing => true
|
|
end
|
|
|
|
def discover
|
|
@provider.discovery_url = params[:url]
|
|
@provider.save!
|
|
@provider.discover_repos(true)
|
|
render :nothing => true
|
|
end
|
|
|
|
protected
|
|
|
|
def get_discovered_urls
|
|
urls = @provider.discovered_repos.try(:sort) || []
|
|
urls.collect do |url|
|
|
path = url.sub(@provider.discovery_url, '')
|
|
path = "/#{path}" if path[0] != '/'
|
|
|
|
all_repos = Repository.where(:feed => url).in_environments_products([current_organization.library.id],
|
|
@provider.products.pluck(:id))
|
|
existing = {}
|
|
all_repos.each do |repo|
|
|
existing[repo.product.name] ||= []
|
|
existing[repo.product.name] << repo.name
|
|
end
|
|
|
|
{:url => url, :path => path, :existing => existing}
|
|
end
|
|
end
|
|
|
|
def find_provider
|
|
@provider = Provider.find(params[:id])
|
|
end
|
|
|
|
def find_rh_provider
|
|
@provider = current_organization.redhat_provider
|
|
end
|
|
|
|
def panel_options
|
|
@panel_options = { :title => _('Providers'),
|
|
:col => ['name'],
|
|
:titles => [_('Name')],
|
|
:create => _('Provider'),
|
|
:create_label => _('+ New Provider'),
|
|
:name => controller_display_name,
|
|
:ajax_load => true,
|
|
:ajax_scroll => items_providers_path,
|
|
:initial_action => :products_repos,
|
|
:search_class => Provider,
|
|
:enable_create => Provider.creatable?(current_organization)}
|
|
end
|
|
|
|
def controller_display_name
|
|
return 'provider'
|
|
end
|
|
|
|
def search_filter
|
|
@filter = {:organization_id => current_organization}
|
|
end
|
|
|
|
def repositories_cloned_in_envrs
|
|
cloned_repositories = @provider.repositories.select {|r| r.promoted? }
|
|
cloned_repositories.collect {|r| [r.name, r.product.environments.select {|env| r.is_cloned_in?(env)}.map(&:name)] }
|
|
end
|
|
end
|
|
end
|