require 'tempfile'
namespace :rh_cloud_inventory do
namespace :report do desc 'Generate inventory report and send it to Red Hat cloud' task generate_upload: [:environment, 'dynflow:client'] do if ENV['organization_id'].nil? organizations = Organization.unscoped.all else organizations = [Organization.where(:id => ENV['organization_id']).first] end User.as_anonymous_admin do organizations.each do |organization| ForemanTasks.async_task( ForemanInventoryUpload::Async::HostInventoryReportJob, ForemanInventoryUpload.generated_reports_folder, organization.id, '', # hosts_filter true # upload ) puts "Generated and uploaded inventory report for organization '#{organization.name}'" end end end desc 'Generate inventory report to be sent to Red Hat cloud' task generate: [:environment, 'dynflow:client'] do organization_ids = [ENV['organization_id']] base_folder = ENV['target'] || Dir.pwd filter = ENV['hosts_filter'] unless File.writable?(base_folder) puts "#{base_folder} is not writable by the current process" base_folder = Dir.mktmpdir puts "Using #{base_folder} for the output" end if organization_ids.empty? puts "Must specify organization_id" return end User.as_anonymous_admin do organization_ids.each do |organization_id| task = ForemanTasks.sync_task( ForemanInventoryUpload::Async::HostInventoryReportJob, base_folder, organization_id, filter, false # don't upload; the user ran report:generate and not report:generate_upload ) if task.result == 'success' unless Setting[:subscription_connection_enabled] target_file = File.join(base_folder, ForemanInventoryUpload.facts_archive_name(organization_id, filter)) puts "Generated #{target_file} for organization id #{organization_id}" end else puts "Failed to generate report for organization id #{organization_id}. Task result: #{task.result}" puts "Check task #{task.id} in the Tasks dashboard for error details." end end puts "Check the Uploading tab for report uploading status." if Setting[:subscription_connection_enabled] end end desc 'Upload generated inventory report to Red Hat cloud' task upload: [:environment, 'dynflow:client'] do base_folder = ENV['target'] || ForemanInventoryUpload.generated_reports_folder organization_id = ENV['organization_id'] report_file = ForemanInventoryUpload.facts_archive_name(organization_id) ForemanTasks.sync_task(ForemanInventoryUpload::Async::QueueForUploadJob, base_folder, report_file, organization_id) puts "Uploaded #{report_file}" end end desc "Synchronize Hosts inventory" task sync: [:environment, 'dynflow:client'] do if !ENV['organization_id'].nil? organizations = [Organization.where(:id => ENV['organization_id']).first] else organizations = Organization.all end organizations.each do |organization| ForemanTasks.async_task(InventorySync::Async::InventoryFullSync, organization) puts "Synchronized inventory for organization '#{organization.name}'" end end
end