module HammerCLIKatello::ContentExportHelper
Public Class Methods
included(base)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 184 def self.included(base) if base.command_name.first.to_sym == :version setup_version(base) elsif base.command_name.first.to_sym == :library setup_library(base) elsif base.command_name.first.to_sym == :repository setup_repository(base) end end
setup_library(base)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 230 def self.setup_library(base) base.action(:library) base.success_message _("Library environment is being exported in task %{id}.") base.failure_message _("Could not export the library") base.option "--fail-on-missing-content", :flag, _("Fails if any of the repositories belonging"\ " to this organization are unexportable.") base.build_options do |o| o.expand(:all).including(:organizations) end end
setup_repository(base)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 194 def self.setup_repository(base) base.action(:repository) base.success_message _("Repository is being exported in task %{id}.") base.failure_message _("Could not export the repository") base.option "--name", "NAME", _("Filter repositories by name."), :attribute_name => :option_name, :required => false base.build_options do |o| o.expand(:all).including(:products, :organizations) end base.validate_options do any(:option_id, :option_name).required unless option(:option_id).exist? any( :option_product_id, :option_product_name ).required unless option(:option_product_id).exist? any(:option_organization_id, :option_organization_name, \ :option_organization_label).required end end end base.class_eval do def request_params super.tap do |opts| opts["id"] = resolver.repository_id(options) end end end end
setup_version(base)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 243 def self.setup_version(base) base.action(:version) setup_version_options(base) base.success_message _("Content view version is being exported in task %{id}.") base.failure_message _("Could not export the content view version") base.extend_with( HammerCLIKatello::CommandExtensions::LifecycleEnvironments.new(only: :option_sources) ) base.include(LifecycleEnvironmentNameMapping) base.class_eval do def request_params super.tap do |opts| opts["id"] = resolver.content_view_version_id(options) end end end end
setup_version_options(base)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 263 def self.setup_version_options(base) base.option "--fail-on-missing-content", :flag, _("Fails if any of the repositories belonging"\ " to this version are unexportable.") base.option "--version", "VERSION", _("Filter versions by version number."), :attribute_name => :option_version, :required => false base.build_options do |o| o.expand(:all).including(:content_views, :organizations, :lifecycle_environments) o.without(:environment_ids, :environment_id) end base.validate_options do unless option(:option_id).exist? any(:option_id, :option_content_view_name, :option_content_view_id).required any( :option_version, :option_lifecycle_environment_id, :option_lifecycle_environment_name ).required unless option(:option_content_view_id).exist? any(:option_organization_id, :option_organization_name, \ :option_organization_label).required end end end end
Public Instance Methods
check_export_history_syncable!(export_history)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 72 def check_export_history_syncable!(export_history) unless export_history["metadata"]["format"] == "syncable" raise _("Cannot generate listing files for this export since "\ + "it is not syncable. It was not generated with --format=syncable.") end raise _("Export History does not have the path specified."\ + " The task may have errored out.") unless export_history["path"] end
emit_async_info()
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 29 def emit_async_info if syncable? output.print_message _("Once the task completes the listing files may be generated "\ + "with the command:") output.print_message(" hammer content-export generate-listing --task-id #{@task['id']}") else output.print_message _("Once the task completes the export metadata must be generated "\ + "with the command:") output.print_message(" hammer content-export generate-metadata --task-id #{@task['id']}") end end
execute()
click to toggle source
Calls superclass method
# File lib/hammer_cli_katello/content_export_helper.rb, line 7 def execute warn_unexportable_repositories response = super if option_async? emit_async_info HammerCLI::EX_OK elsif response != HammerCLI::EX_OK response else export_history = fetch_export_history_from_task(reload_task(@task)) if export_history make_listing_files(export_history) if syncable? generate_metadata_json(export_history) HammerCLI::EX_OK else output.print_error _("Could not fetch the export history") HammerCLI::EX_CANTCREAT end end end
fetch_export_history(export_history_id)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 58 def fetch_export_history(export_history_id) return unless export_history_id index(:content_exports, :id => export_history_id).first end
fetch_export_history_from_task(task)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 63 def fetch_export_history_from_task(task) # checking this here implies the task object was loaded recently if %w(error warning).include?(task['result']) raise _("Can not fetch export history from an unfinished task") end export_history_id = task.dig('output', 'export_history_id') fetch_export_history(export_history_id) end
fetch_repositories()
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 136 def fetch_repositories if repository_command? resp = show(:repositories, id: resolver.repository_id(options)) return resp["content_type"] != "yum" || resp["download_policy"] == "immediate" ? [] : [resp] end repo_options = { library: true, content_type: 'yum', search: 'download_policy != immediate' } if version_command? repo_options[:content_view_version_id] = resolver.content_view_version_id(options) else repo_options[:organization_id] = options["option_organization_id"] end index(:repositories, repo_options) end
generate_metadata_json(export_history)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 113 def generate_metadata_json(export_history) metadata_json = export_history["metadata"].to_json begin metadata_path = "#{export_history['path']}/metadata.json" File.write(metadata_path, metadata_json) output.print_message _("Generated #{metadata_path}") rescue SystemCallError filename = "metadata-#{export_history['id']}.json" File.write(filename, metadata_json) output.print_message _("Unable to access/write to '#{export_history['path']}'. "\ "Generated '#{Dir.pwd}/#{filename}' instead. "\ "This file is necessary to perform an import.") end end
make_listing_files(export_history)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 82 def make_listing_files(export_history) check_export_history_syncable!(export_history) return unless Dir.exist?("#{export_history['path']}/content") begin # export history path may look like # "/var/lib/pulp/exports/export-12803/apple/3.0//2022-06-30T17-23-06-00-00" # Generate listing files for all sub directories of # /var/lib/pulp/exports/export-12803/apple/3.0/$date/$org/Library/ ignorables = Dir.glob("#{export_history['path']}/content/**/repodata").map do |path| File.dirname(path) end paths = Find.find("#{export_history['path']}/content").select do |path| File.directory?(path) && ignorables.none? { |ignorable| path.start_with?(ignorable) } end paths.each do |dir| directories = Dir.chdir(dir) { Dir['*'] } File.write("#{dir}/listing", directories.join("\n")) File.chmod(0o644, "#{dir}/listing") end rescue SystemCallError output.print_message _("Unable to access/write listing files"\ + " to '#{export_history['path']}'." \ + " To generate listing files run the command below as a root user ") output.print_message(" hammer content-export generate-listing --id #{export_history['id']}") end end
reload_task(task)
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 49 def reload_task(task) task_id = if task.is_a? Hash task['id'] else task end show(:foreman_tasks, id: task_id) end
repository_command?()
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 132 def repository_command? self.class.command_name.first.to_sym == :repository end
request_params()
click to toggle source
Calls superclass method
# File lib/hammer_cli_katello/content_export_helper.rb, line 222 def request_params super.tap do |opts| opts["id"] = resolver.repository_id(options) end end
send_request()
click to toggle source
Calls superclass method
# File lib/hammer_cli_katello/content_export_helper.rb, line 45 def send_request @task = super end
syncable?()
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 41 def syncable? options.key?("option_format") && option_format == 'syncable' end
version_command?()
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 128 def version_command? self.class.command_name.first.to_sym == :version end
warn_unexportable_repositories()
click to toggle source
# File lib/hammer_cli_katello/content_export_helper.rb, line 155 def warn_unexportable_repositories repos = fetch_repositories unless repos.empty? if version_command? output.print_message _("NOTE: Unable to fully export this version because"\ " it contains repositories without the 'immediate' download policy."\ " Update the download policy and sync affected repositories."\ " Once synced republish the content view"\ " and export the generated version.") elsif repository_command? output.print_message _("NOTE: Unable to fully export this repository because"\ " it does not have the 'immediate' download policy."\ " Update the download policy, sync the repository and export.") else output.print_message _("NOTE: Unable to fully export this organization's library because"\ " it contains repositories without the 'immediate' download policy."\ " Update the download policy and sync affected"\ " repositories to include them in the export.") end output.print_message _("Use the following command to update the "\ "download policy of these repositories.") output.print_message "hammer repository update --id=<REPOSITORY_ID> "\ "--download-policy='immediate'" output.print_message "" print_record(::HammerCLIKatello::Repository::ListCommand.output_definition, repos) exit(HammerCLI::EX_SOFTWARE) if repository_command? || option_fail_on_missing_content? end end