From 83ae2a4802acde84b39305b00a884ee64f1e459f Mon Sep 17 00:00:00 2001 From: Jeremy Lenz Date: Wed, 25 Feb 2026 10:47:55 -0500 Subject: [PATCH] Search generated_reports and other improvements to report file paths and dev setup (#1155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve report file paths and dev environment setup Updates report_file_paths to search in priority order (done, uploads, generated) ensuring downloads return the most recent report. Also fixes base_folder to use parent directory in dev environments, keeping generated files outside the Foreman repo directory. Co-Authored-By: Claude Sonnet 4.5 * Add documentation for report_file_paths search order Explains the file lifecycle through generated → uploads → done folders and why the search order prioritizes newest files first. Co-Authored-By: Claude Sonnet 4.5 --------- Co-authored-by: Claude Sonnet 4.5 --- lib/foreman_inventory_upload.rb | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/foreman_inventory_upload.rb b/lib/foreman_inventory_upload.rb index fefdcb69..204b301f 100644 --- a/lib/foreman_inventory_upload.rb +++ b/lib/foreman_inventory_upload.rb @@ -1,10 +1,10 @@ module ForemanInventoryUpload def self.base_folder # in production setup, where selinux is enabled, we only have rights to - # create folders under /ver/lib/foreman. If the folder does not exist, it's - # a dev setup, where we can use our current root + # create folders under /var/lib/foreman. If the folder does not exist, it's + # a dev setup, where we can use the parent of the current working directory @base_folder ||= File.join( - Dir.glob('/var/lib/foreman').first || Dir.getwd, + Dir.glob('/var/lib/foreman').first || File.dirname(Dir.getwd), 'red_hat_inventory/' ) end @@ -30,11 +30,6 @@ def self.done_file_path(filename) File.join(ForemanInventoryUpload.done_folder, filename) end - def self.report_file_paths(organization_id) - filename = facts_archive_name(organization_id) - Dir[ForemanInventoryUpload.uploads_file_path(filename), ForemanInventoryUpload.done_file_path(filename)] - end - def self.generated_reports_folder @generated_reports_folder ||= ensure_folder( File.join( @@ -44,6 +39,26 @@ def self.generated_reports_folder ) end + def self.generated_reports_file_path(filename) + File.join(ForemanInventoryUpload.generated_reports_folder, filename) + end + + def self.report_file_paths(organization_id) + filename = facts_archive_name(organization_id) + # Report files start in generated + # They are then MOVED (not copied) to uploads, then done. + # When they are moved to the new folder, they overwrite any file with the same name. + # If it's a generate-only, it will be in generated + # Failed or incomplete uploads will be in uploads + # Completed uploads will be in done + # The ordering here ensures we get the correct file path every time. + Dir[ + ForemanInventoryUpload.generated_reports_file_path(filename), + ForemanInventoryUpload.uploads_file_path(filename), + ForemanInventoryUpload.done_file_path(filename), + ] + end + def self.outputs_folder @outputs_folder ||= ensure_folder(File.join(ForemanInventoryUpload.base_folder, 'outputs/')) end