module Katello
module HostsAndHostgroupsHelper
def kt_ak_label
"kt_activation_keys"
end
def using_hostgroups_page?
controller.controller_name == "hostgroups"
end
def blank_or_inherit_with_id(f, attr)
return true unless f.object.respond_to?(:parent_id) && f.object.parent_id
inherited_value = f.object.send(attr).try(:id) || ''
%()
end
def envs_by_kt_org
::Environment.all.find_all(&:katello_id).group_by do |env|
if env.katello_id
env.katello_id.split('/').first
end
end
end
def content_view(host)
if host.is_a?(Hostgroup)
host.content_view
else
host.content_facet.try(:content_view)
end
end
def lifecycle_environment(host)
if host.is_a?(Hostgroup)
host.lifecycle_environment
else
host.content_facet.try(:lifecycle_environment)
end
end
def use_install_media(host, options = {})
return true if host && host.errors && host.errors.include?(:medium_id)
kickstart_repository_id(host, options).blank?
end
def host_hostgroup_kickstart_repository_id(host)
return if host.blank?
return host.kickstart_repository_id if host.is_a?(Hostgroup)
host.content_facet.kickstart_repository_id if host.try(:content_facet).present?
end
def kickstart_repository_id(host, options = {})
return if host.try(:medium_id).present?
host_ks_repo_id = host_hostgroup_kickstart_repository_id(host)
ks_repo_options = kickstart_repository_options(host, options)
# if the kickstart repo id is set in the selected_hostgroup use that
selected_host_group = options.fetch(:selected_host_group, nil)
if selected_host_group.try(:kickstart_repository_id).present?
ks_repo_ids = ks_repo_options.map(&:id)
if ks_repo_ids.include?(selected_host_group.kickstart_repository_id)
return selected_host_group.kickstart_repository_id
elsif host_ks_repo_id && ks_repo_ids.include?(host_ks_repo_id)
return host_ks_repo_id
else
return ks_repo_options.first.try(:id)
end
end
# if the kickstart repo id is set in the host use that
return host_ks_repo_id if host_ks_repo_id.present?
if selected_host_group.try(:medium_id).blank? && host.try(:medium_id).blank?
ks_repo_options.first.try(:id)
end
end
def fetch_lifecycle_environment(host, options = {})
selected_host_group = options.fetch(:selected_host_group, nil)
return lifecycle_environment(selected_host_group) if selected_host_group.present?
selected_env = lifecycle_environment(host)
return selected_env if selected_env.present?
end
def fetch_content_view(host, options = {})
selected_host_group = options.fetch(:selected_host_group, nil)
return content_view(selected_host_group) if selected_host_group.present?
selected_content_view = content_view(host)
selected_content_view if selected_content_view.present?
end
def lifecycle_environment_options(host, options = {})
include_blank = options.fetch(:include_blank, nil)
if include_blank == true #check for true specifically
include_blank = ''
end
selected_id = fetch_lifecycle_environment(host, options).try(:id)
orgs = Organization.current ? [Organization.current] : Organization.my_organizations
all_options = []
orgs.each do |org|
env_options = ""
org.kt_environments.each do |env|
selected = selected_id == env.id ? 'selected' : ''
env_options << %()
end
if Organization.current
all_options << env_options
else
all_options << %()
end
end
all_options = all_options.join
all_options.insert(0, include_blank) if include_blank
all_options.html_safe
end
def content_views_for_host(host, options)
include_blank = options.fetch(:include_blank, nil)
if include_blank == true #check for true specifically
include_blank = ''
end
lifecycle_environment = fetch_lifecycle_environment(host, options)
content_view = fetch_content_view(host, options)
views = []
if lifecycle_environment
views = Katello::ContentView.in_environment(lifecycle_environment)
elsif content_view
views = [content_view]
end
view_options = views.map do |view|
selected = content_view.try(:id) == view.id ? 'selected' : ''
%()
end
view_options = view_options.join
view_options.insert(0, include_blank) if include_blank
view_options.html_safe
end
def view_to_options(view_options, selected_val, include_blank = false)
if include_blank == true #check for true specifically
include_blank = ''
end
views = view_options.map do |view|
selected = selected_val == view.id ? 'selected' : ''
%()
end
views = views.join
views.insert(0, include_blank) if include_blank
views.html_safe
end
def kickstart_repository_options(param_host, options = {})
# this method gets called in 2 places
# 1) On initial page load or a host group selection. At that point the host object is already
# => populated and we should just use that.
# 2) Once you chose a diff os/content source/arch/lifecycle env/cv via the os_selected method.
# In case 2 we want it to play by the rules of "one of these params" and
# in case 1 we want it to behave as if everything is already set right and
# We need to figure out the available KS repos in both cases.
if param_host.present?
# case 1
selected_host_group = options.fetch(:selected_host_group, nil)
host = selected_host_group.present? ? selected_host_group : param_host
return [] unless host.operatingsystem.is_a?(Redhat)
new_host = ::Host.new
# there is foreman bug right now that prevents
# os and arch to get updated properly,
# http://projects.theforeman.org/issues/14737
# so we are going to hard code it to use what
# is in the param host for now.
new_host.operatingsystem = param_host.operatingsystem.present? ? param_host.operatingsystem : host.operatingsystem
new_host.architecture = param_host.architecture.present? ? param_host.architecture : host.architecture
if (host.is_a? Hostgroup)
new_host.content_facet = Host::ContentFacet.new(:lifecycle_environment_id => host.lifecycle_environment_id,
:content_view_id => host.content_view_id)
elsif host.content_facet.present?
new_host.content_facet = Host::ContentFacet.new(:lifecycle_environment_id => host.content_facet.lifecycle_environment_id,
:content_view_id => host.content_facet.content_view_id)
end
new_host.content_source = host.content_source
new_host.operatingsystem.kickstart_repos(new_host).map { |repo| OpenStruct.new(repo) }
else
# case 2
os_updated_kickstart_options(host)
end
end
def os_updated_kickstart_options(host)
# this method gets called in 1 place Once you chose a diff os/content source/arch/lifecycle env/cv
# via the os_selected method.
# In this case we want it play by the rules of "one of these params" and
# need to figure out the available KS repos for the given params.
os_selection_params = ["operatingsystem_id", 'content_view_id', 'lifecycle_environment_id',
'content_source_id', 'architecture_id']
view_options = []
if os_selection_params.all? { |key| params[key].present? }
if host.nil?
host = ::Host.new
end
host.operatingsystem = Operatingsystem.find(params[:operatingsystem_id])
host.architecture = Architecture.find(params[:architecture_id])
lifecycle_env = Katello::KTEnvironment.find(params[:lifecycle_environment_id])
content_view = Katello::ContentView.find(params[:content_view_id])
host.content_facet = Host::ContentFacet.new(:lifecycle_environment_id => lifecycle_env.id,
:content_view_id => content_view.id)
host.content_source = SmartProxy.find(params[:content_source_id])
if host.operatingsystem.is_a?(Redhat)
view_options = host.operatingsystem.kickstart_repos(host).map { |repo| OpenStruct.new(repo) }
end
end
view_options
end
end
end