app/lib/actions/katello/content_view/remove.rb
module Actions
module Katello
module ContentView
class Remove < Actions::EntryAction
# Remove content view versions and/or environments from a content view
# Options: (note that all are optional)
# content_view_environments - content view environments to delete
# content_view_versions - view versions to delete
# system_content_view_id - content view to reassociate systems with
# system_environment_id - environment to reassociate systems with
# key_content_view_id - content view to reassociate actvation keys with
# key_environment_id - environment to reassociate activation keys with'
# destroy_content_view - delete the CV completely along with all cv versions and environments
# organization_destroy
# rubocop:disable Metrics/MethodLength
# rubocop:disable Metrics/CyclomaticComplexity
def plan(content_view, options)
cv_envs = options.fetch(:content_view_environments, [])
versions = options.fetch(:content_view_versions, [])
organization_destroy = options.fetch(:organization_destroy, false)
skip_repo_destroy = options.fetch(:skip_repo_destroy, false)
action_subject(content_view)
validate_options(content_view, cv_envs, versions, options) unless organization_destroy
all_cv_envs = combined_cv_envs(cv_envs, versions)
check_version_deletion(versions, cv_envs)
sequence do
unless organization_destroy
concurrence do
all_cv_envs.each do |cv_env|
if cv_env.hosts.any? || cv_env.activation_keys.any?
plan_action(ContentViewEnvironment::ReassignObjects, cv_env, options)
end
end
end
end
cv_histories = []
all_cv_envs.each do |cve|
cv_histories << ::Katello::ContentViewHistory.create!(:content_view_version => cve.content_view_version,
:user => ::User.current.login,
:environment => cve.environment,
:status => ::Katello::ContentViewHistory::IN_PROGRESS,
:action => ::Katello::ContentViewHistory.actions[:removal],
:task => self.task)
plan_action(ContentViewEnvironment::Destroy,
cve,
:skip_repo_destroy => skip_repo_destroy,
:organization_destroy => organization_destroy)
end
versions.each do |version|
::Katello::ContentViewHistory.create!(:content_view_version => version,
:user => ::User.current.login,
:action => ::Katello::ContentViewHistory.actions[:removal],
:status => ::Katello::ContentViewHistory::IN_PROGRESS, :task => self.task)
plan_action(ContentViewVersion::Destroy, version,
:skip_environment_check => true,
:skip_destroy_env_content => true)
end
if options[:destroy_content_view] && SmartProxy.pulp_primary&.pulp3_enabled?
plan_action(Actions::Pulp3::ContentView::DeleteRepositoryReferences, content_view, SmartProxy.pulp_primary)
end
plan_self(content_view_id: content_view.id,
destroy_content_view: options[:destroy_content_view],
environment_ids: cv_envs.map(&:environment_id),
environment_names: cv_envs.map { |cve| cve.environment.name },
version_ids: versions.map(&:id),
content_view_history_ids: cv_histories.map { |history| history.id })
if organization_destroy
destroy_host_and_hostgroup_associations(content_view: content_view)
end
end
end
def destroy_host_and_hostgroup_associations(content_view:)
content_view.hostgroups.destroy_all
host_ids = content_view.hosts.ids
::Katello::Host::ContentFacet.where(:host_id => host_ids).destroy_all
::Katello::Host::SubscriptionFacet.where(:host_id => host_ids).destroy_all
end
def check_version_deletion(versions, cv_envs)
versions.each do |version|
version.environments.each do |env|
if cv_envs.none? { |cv_env| cv_env.content_view_version == version && cv_env.environment == env }
fail _("Cannot delete version while it is in environment %s") % env.name
end
end
end
end
def humanized_name
_("Remove Versions and Associations")
end
def finalize
if input[:destroy_content_view]
content_view = ::Katello::ContentView.find(input[:content_view_id])
content_view.content_view_repositories.each(&:destroy)
content_view.destroy!
else
input[:content_view_history_ids].each do |history_id|
history = ::Katello::ContentViewHistory.find_by(:id => history_id)
if history
history.status = ::Katello::ContentViewHistory::SUCCESSFUL
history.save!
end
end
end
end
def validate_options(_content_view, cv_envs, versions, options)
if !options[:destroy_content_view] && cv_envs.empty? && versions.empty?
fail _("Either environments or versions must be specified.")
end
all_cv_envs = combined_cv_envs(cv_envs, versions)
if all_cv_envs.flat_map(&:hosts).any? && system_cve(options).nil?
fail _("Unable to reassign systems. Please check system_content_view_id and system_environment_id.")
end
if all_cv_envs.flat_map(&:activation_keys).any? && activation_key_cve(options).nil?
fail _("Unable to reassign activation_keys. Please check activation_key_content_view_id and activation_key_environment_id.")
end
end
def combined_cv_envs(cv_envs, versions)
(cv_envs + versions.flat_map(&:content_view_environments)).uniq
end
def system_cve(options)
::Katello::ContentViewEnvironment.where(:environment_id => options[:system_environment_id],
:content_view_id => options[:system_content_view_id]
).first
end
def activation_key_cve(options)
::Katello::ContentViewEnvironment.where(:environment_id => options[:key_environment_id],
:content_view_id => options[:key_content_view_id]
).first
end
end
end
end
end