module Katello
module HostsAndHostgroupsHelper
def kt_ak_label
"kt_activation_keys"
end
def edit_action?
params[:action] == 'edit'
end
def cv_lce_disabled?
edit_action? && !using_discovered_hosts_page?
end
def using_discovered_hosts_page?
controller.controller_name == "discovered_hosts"
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 organizations(host)
if host.is_a?(::Hostgroup)
host.organizations
else
host.organization ? [host.organization] : []
end
end
def use_install_media(host, options = {})
return true if 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?
host.content_facet&.kickstart_repository_id
end
def kickstart_repository_id(host, options = {})
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_or_hostgroup, options = {})
return host_or_hostgroup.single_lifecycle_environment if host_or_hostgroup.try(:single_lifecycle_environment)
return host_or_hostgroup.lifecycle_environment if host_or_hostgroup.try(:lifecycle_environment)
selected_host_group = options.fetch(:selected_host_group, nil)
return selected_host_group.lifecycle_environment if selected_host_group.present?
end
def fetch_content_view(host_or_hostgroup, options = {})
return host_or_hostgroup.single_content_view if host_or_hostgroup.try(:single_content_view)
return host_or_hostgroup.content_view if host_or_hostgroup.try(:content_view)
selected_host_group = options.fetch(:selected_host_group, nil)
return selected_host_group.content_view if selected_host_group.present?
end
def fetch_content_source(host, options = {})
return host.content_source if host.try(:content_source_id)
selected_host_group = options.fetch(:selected_host_group, nil)
return selected_host_group.content_source if selected_host_group.present?
end
def accessible_lifecycle_environments(org, host_or_hostgroup)
selected = if host_or_hostgroup.is_a?(::Host::Managed)
host_or_hostgroup.try(:single_lifecycle_environment)
else
host_or_hostgroup.lifecycle_environment
end
envs = org.kt_environments.readable.order(:name)
envs |= [selected] if selected.present? && org == selected.organization
envs
end
def accessible_content_proxies(obj)
list = accessible_resource_records(:smart_proxy).with_content.order(:name).to_a
current = obj.content_source
list |= [current] if current.present?
list
end
def relevant_organizations(host)
host_orgs = organizations(host)
if Organization.current
[Organization.current]
elsif host_orgs.present?
host_orgs
else
Organization.my_organizations
end
end
# Generic method to provide a list of options in the UI
def content_options(host, selected_id, object_type, options = {})
include_blank = options.fetch(:include_blank, nil)
include_blank = '' if include_blank == true #check for true specifically
orgs = relevant_organizations(host)
all_options = []
orgs.each do |org|
content_object_options = ""
accessible_content_objects = if object_type == :lifecycle_environment
accessible_lifecycle_environments(org, host)
elsif object_type == :content_source
accessible_content_proxies(host)
end
accessible_content_objects.each do |content_object|
selected = selected_id == content_object.id ? 'selected' : ''
content_object_options << %()
end
if orgs.count > 1
all_options << %()
else
all_options << content_object_options
end
end
all_options = all_options.join
all_options.insert(0, include_blank) if include_blank
all_options.html_safe
end
def lifecycle_environment_options(host, options = {})
content_options(
host,
fetch_lifecycle_environment(host, options).try(:id),
:lifecycle_environment,
options
)
end
def content_source_options(host, options = {})
content_options(
host,
fetch_content_source(host, options).try(:id),
:content_source,
options
)
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).ignore_generated.readable.order(:name)
views |= [content_view] if content_view.present? && content_view.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
new_host = ::Host.new
new_host.operatingsystem = param_host.operatingsystem.present? ? param_host.operatingsystem : host.operatingsystem
new_host.architecture = param_host.architecture.present? ? param_host.architecture : host.architecture
return [] unless new_host.operatingsystem.is_a?(Redhat)
if (host.is_a? ::Hostgroup)
new_host.content_facet = hostgroup_content_facet(host, param_host)
elsif host.content_facet.present?
new_host.content_facet = ::Katello::Host::ContentFacet.new(:content_source_id => host.content_source_id)
if host.single_content_view_environment?
# assign new_host the same CVE as host
new_host.content_facet.assign_single_environment(
:lifecycle_environment => host.content_facet.single_lifecycle_environment,
:content_view => host.content_facet.single_content_view
)
end
end
new_host.operatingsystem.kickstart_repos(new_host).map { |repo| OpenStruct.new(repo) }
else
# case 2
os_updated_kickstart_options
end
end
def fetch_inherited_param(id, entity, parent_value)
id.blank? ? parent_value : entity.find(id)
end
def os_updated_kickstart_options(host = nil)
# 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 = []
host_params = params[:hostgroup] || params[:host]
parent = ::Hostgroup.find(host_params[:parent_id]) unless host_params.blank? || host_params[:parent_id].blank?
if host_params && (parent || os_selection_params.all? { |key| host_params[key].present? })
if host.nil?
host = ::Host.new
end
host.operatingsystem = fetch_inherited_param(host_params[:operatingsystem_id], ::Operatingsystem, parent&.os)
host.architecture = fetch_inherited_param(host_params[:architecture_id], ::Architecture, parent&.architecture)
lifecycle_env = fetch_inherited_param(host_params[:lifecycle_environment_id], ::Katello::KTEnvironment, parent&.lifecycle_environment)
content_view = fetch_inherited_param(host_params[:content_view_id], ::Katello::ContentView, parent&.content_view)
content_source = fetch_inherited_param(host_params[:content_source_id], ::SmartProxy, parent&.content_source)
host.content_facet = Host::ContentFacet.new(:content_source => content_source)
host.content_facet.assign_single_environment(
:lifecycle_environment_id => lifecycle_env.id,
:content_view_id => content_view.id
)
if host.operatingsystem.is_a?(Redhat)
view_options = host.operatingsystem.kickstart_repos(host).map { |repo| OpenStruct.new(repo) }
end
end
view_options
end
def content_host_overview_button(host)
return [] unless host.content_facet || host.subscription_facet
[{
:button => link_to(
_('Content'),
"/content_hosts/#{host.id}",
:title => _("Host content and subscription details"),
:class => 'btn btn-default'),
:priority => 900
}]
end
def hosts_change_content_source
[{ action: [_('Change Content Source'), '/change_host_content_source', false], priority: 100 }]
end
def host_status_icon(status)
colours = [:green, :yellow, :red]
colour = colours[status] || :red
icons = {
green: "#{colour} host-status pficon pficon-ok status-ok",
yellow: "#{colour} host-status pficon pficon-info status-warn",
red: "#{colour} host-status pficon pficon-error-circle-o status-error"
}
"".html_safe
end
def errata_counts(host)
counts = host.content_facet_attributes&.errata_counts || {}
render partial: 'katello/hosts/errata_counts', locals: { counts: counts, host: host }
end
def host_registered_time(host)
return ''.html_safe unless host.subscription_facet_attributes&.registered_at
date_time_relative_value(host.subscription_facet_attributes.registered_at)
end
def host_checkin_time(host)
return ''.html_safe unless host.subscription_facet_attributes&.last_checkin
date_time_relative_value(host.subscription_facet_attributes.last_checkin)
end
private
def inherited_or_own_content_source_id(host_or_hostgroup, hostgroup)
content_source_id = hostgroup.inherited_content_source_id
if host_or_hostgroup.content_source_id && (hostgroup.inherited_content_source_id != host_or_hostgroup.content_source_id)
content_source_id = host_or_hostgroup.content_source_id
end
content_source_id
end
def inherited_or_own_facet_attributes(host_or_hostgroup, hostgroup)
lifecycle_environment_id = hostgroup.inherited_lifecycle_environment_id
content_view_id = hostgroup.inherited_content_view_id
case host_or_hostgroup
when ::Hostgroup
if host_or_hostgroup.lifecycle_environment_id && (hostgroup.inherited_lifecycle_environment_id != host_or_hostgroup.lifecycle_environment_id)
lifecycle_environment_id = host_or_hostgroup.lifecycle_environment_id
end
if host_or_hostgroup.content_view_id && (hostgroup.inherited_content_view_id != host_or_hostgroup.content_view_id)
content_view_id = host_or_hostgroup.content_view_id
end
when ::Host::Managed
if host_or_hostgroup.single_lifecycle_environment && (hostgroup.inherited_lifecycle_environment_id != host_or_hostgroup.single_lifecycle_environment.id)
lifecycle_environment_id = host_or_hostgroup.single_lifecycle_environment.id
end
if host_or_hostgroup.single_content_view && (hostgroup.inherited_content_view_id != host_or_hostgroup.single_content_view.id)
content_view_id = host_or_hostgroup.single_content_view.id
end
end
[lifecycle_environment_id, content_view_id]
end
def hostgroup_content_facet(hostgroup, param_host)
lifecycle_environment_id, content_view_id = inherited_or_own_facet_attributes(param_host, hostgroup)
content_source_id = inherited_or_own_content_source_id(param_host, hostgroup)
facet = ::Katello::Host::ContentFacet.new(:content_source_id => content_source_id)
if content_view_id && lifecycle_environment_id
facet.assign_single_environment(
:lifecycle_environment_id => lifecycle_environment_id,
:content_view_id => content_view_id
)
end
facet
end
end
end