From b45737b8012fabe5641d429768a3077ab424a09a Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 9 Aug 2023 12:41:48 +0100 Subject: [PATCH] Add logger that writes to s3 file --- config/initializers/multi_logger.rb | 21 +++++++++++++++++++ lib/tasks/full_import.rake | 24 +++++++++++++--------- spec/lib/tasks/full_import_spec.rb | 32 +++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 config/initializers/multi_logger.rb diff --git a/config/initializers/multi_logger.rb b/config/initializers/multi_logger.rb new file mode 100644 index 000000000..51b42977a --- /dev/null +++ b/config/initializers/multi_logger.rb @@ -0,0 +1,21 @@ +class MultiLogger + def initialize(*targets) + @targets = targets + end + + def info(data) + @targets.each { |t| t.info(data) } + end + + def warn(data) + @targets.each { |t| t.warn(data) } + end + + def error(data) + @targets.each { |t| t.error(data) } + end + + def close + @targets.each(&:close) + end +end diff --git a/lib/tasks/full_import.rake b/lib/tasks/full_import.rake index 28af8c4dc..1a4a32dd4 100644 --- a/lib/tasks/full_import.rake +++ b/lib/tasks/full_import.rake @@ -1,4 +1,4 @@ -Import = Struct.new("Import", :import_class, :import_method, :folder) +Import = Struct.new("Import", :import_class, :import_method, :folder, :logger) namespace :import do desc "Run initial import steps - orgs, schemes, users etc (without triggering user invite emails)" @@ -8,18 +8,20 @@ namespace :import do s3_service = Storage::S3Service.new(Configuration::PaasConfigurationService.new, ENV["IMPORT_PAAS_INSTANCE"]) csv = CSV.parse(s3_service.get_file_io(institutions_csv_name), headers: true) + logs_string = StringIO.new + logger = MultiLogger.new(Rails.logger, Logger.new(logs_string)) org_count = csv.length initial_import_list = [ - Import.new(Imports::OrganisationImportService, :create_organisations, "institution"), - Import.new(Imports::SchemeImportService, :create_schemes, "mgmtgroups"), - Import.new(Imports::SchemeLocationImportService, :create_scheme_locations, "schemes"), - Import.new(Imports::UserImportService, :create_users, "user"), - Import.new(Imports::DataProtectionConfirmationImportService, :create_data_protection_confirmations, "dataprotect"), - Import.new(Imports::OrganisationRentPeriodImportService, :create_organisation_rent_periods, "rent-period"), + Import.new(Imports::OrganisationImportService, :create_organisations, "institution", logger), + Import.new(Imports::SchemeImportService, :create_schemes, "mgmtgroups", logger), + Import.new(Imports::SchemeLocationImportService, :create_scheme_locations, "schemes", logger), + Import.new(Imports::UserImportService, :create_users, "user", logger), + Import.new(Imports::DataProtectionConfirmationImportService, :create_data_protection_confirmations, "dataprotect", logger), + Import.new(Imports::OrganisationRentPeriodImportService, :create_organisation_rent_periods, "rent-period", logger), ] - Rails.logger.info("Beginning initial imports for #{org_count} organisations") + logger.info("Beginning initial imports for #{org_count} organisations") csv.each do |row| archive_path = row[1] @@ -30,12 +32,14 @@ namespace :import do initial_import_list.each do |step| if archive_service.folder_present?(step.folder) - step.import_class.new(archive_service).send(step.import_method, step.folder) + step.import_class.new(archive_service).send(step.import_method, step.folder, step.logger) end end end - Rails.logger.info("Finished initial imports") + logger.info("Finished initial imports") + log_file = "#{File.basename(institutions_csv_name, File.extname(institutions_csv_name))}_initial.log" + s3_service.write_file(log_file, logs_string.string) end desc "Run logs import steps" diff --git a/spec/lib/tasks/full_import_spec.rb b/spec/lib/tasks/full_import_spec.rb index f263f15fc..716956b99 100644 --- a/spec/lib/tasks/full_import_spec.rb +++ b/spec/lib/tasks/full_import_spec.rb @@ -41,4 +41,36 @@ describe "full import", type: :task do end end end + + describe "import:initial" do + subject(:task) { Rake::Task["import:initial"] } + + let(:archive_service) { instance_double(Storage::ArchiveService) } + + before do + Rake.application.rake_require("tasks/full_import") + Rake::Task.define_task(:environment) + task.reenable + end + + context "when calling the initial import" do + before do + allow(Storage::ArchiveService).to receive(:new).and_return(archive_service) + allow(archive_service).to receive(:folder_present?).and_return(false) + allow(Imports::OrganisationImportService).to receive(:new).and_return(instance_double(Imports::OrganisationImportService)) + allow(Imports::SchemeImportService).to receive(:new).and_return(instance_double(Imports::SchemeImportService)) + allow(Imports::SchemeLocationImportService).to receive(:new).and_return(instance_double(Imports::SchemeLocationImportService)) + allow(Imports::UserImportService).to receive(:new).and_return(instance_double(Imports::UserImportService)) + allow(Imports::DataProtectionConfirmationImportService).to receive(:new).and_return(instance_double(Imports::DataProtectionConfirmationImportService)) + allow(Imports::OrganisationRentPeriodImportService).to receive(:new).and_return(instance_double(Imports::OrganisationRentPeriodImportService)) + end + + it "creates a report using given organisation csv" do + expect(Storage::S3Service).to receive(:new).with(paas_config_service, instance_name) + expect(storage_service).to receive(:write_file).with("some_name_initial.log", / INFO -- : Beginning initial imports for 2 organisations/) + + task.invoke("some_name.csv") + end + end + end end