@@ -30,8 +30,8 @@ class LogRuntimeArchive
3030 # to the ftp server @see process_root_folder_transfer
3131 # @param [Logger] logger the log structure
3232 def initialize (
33- root_dir , target_dir : nil ,
34- logger : LogRuntimeArchive . null_logger
33+ root_dir ,
34+ target_dir : nil , logger : LogRuntimeArchive . null_logger
3535 )
3636 @last_archive_index = { }
3737 @logger = logger
@@ -44,12 +44,13 @@ def initialize(
4444 #
4545 # @param [Params] server_params the FTP server parameters
4646 # @return [Array<TransferDatasetResult>]
47- def process_root_folder_transfer ( server_params )
47+ def process_root_folder_transfer ( server_params , info_name : "info" )
4848 candidates = self . class . find_all_dataset_folders ( @root_dir )
4949 candidates . map do |child |
5050 process_dataset_transfer (
5151 child , server_params , @root_dir ,
52- full : !Roby ::Application . log_dir_locked? ( child . basename )
52+ full : !Roby ::Application . log_dir_locked? ( child . basename ) ,
53+ info_name : info_name
5354 )
5455 end
5556 end
@@ -147,9 +148,10 @@ def process_dataset(child, full:, max_archive_size: DEFAULT_MAX_ARCHIVE_SIZE)
147148 end
148149 end
149150
150- def process_dataset_transfer ( child , server , root , full :)
151+ def process_dataset_transfer ( child , server , root , full :, info_name : "info" )
151152 self . class . transfer_dataset (
152- child , server , root , full : full , logger : @logger
153+ child , server , root ,
154+ full : full , logger : @logger , info_name : info_name
153155 )
154156 end
155157
@@ -166,36 +168,74 @@ def failures
166168 end
167169
168170 # Transfer the given dataset
169- def self . transfer_dataset (
171+ def self . transfer_dataset ( # rubocop:disable Metrics/ParameterLists
170172 dataset_path , server , root ,
171- full :, logger : null_logger
173+ full :, info_name : "info" , logger : null_logger
172174 )
173175 logger . info (
174176 "Transfering dataset #{ dataset_path } in " \
175177 "#{ full ? 'full' : 'partial' } mode"
176178 )
179+ complete , paths_to_transfer =
180+ transfer_compute_paths ( dataset_path , full , info_name )
181+
182+ transfer_results = paths_to_transfer . map do |source_path , target_name |
183+ result =
184+ transfer_file ( source_path , server , root , target_name : target_name )
185+ source_path . unlink if result . success?
186+
187+ result
188+ end
189+
190+ result = TransferDatasetResult . new (
191+ complete : complete , transfer_results : transfer_results
192+ )
193+ log_transfer_results ( dataset_path , result , logger : logger )
194+ end
195+
196+ # @api private
197+ #
198+ # Compute paths to the files that should be transferred in a given dataset dir
199+ #
200+ # @param [Pathname] dataset_path the path to the dataset dir
201+ # @param [Boolean] full if the transfer should be in full mode (all files
202+ # are transferred) or partial mode (only already rotated pocolog files
203+ # are transferred)
204+ # @param [String] info_name name that should be given to the `info.yml`
205+ # file on the target machine
206+ # @return [(Boolean,Array<Pathname>)] the boolean indicates whether this pass
207+ # is complete or not. The caller should call transfer_dataset until
208+ # the flag is true. The array is the list of paths to be transferred
209+ # in this pass
210+ def self . transfer_compute_paths ( dataset_path , full , info_name )
177211 candidates =
178212 each_file_from_path ( dataset_path )
179213 . reject { |p | p . extname == ".partial" }
180214
181- complete , candidates =
215+ complete , paths_to_transfer =
182216 if full
183217 archive_filter_candidates_full ( candidates )
184218 else
185219 archive_filter_candidates_partial ( candidates )
186220 end
187221
188- transfer_results = candidates . map do |child_path |
189- result = transfer_file ( child_path , server , root )
190- child_path . unlink if result . success?
222+ paths_to_transfer =
223+ transfer_compute_remote_names ( paths_to_transfer , info_name )
191224
192- result
193- end
225+ [ complete , paths_to_transfer ]
226+ end
194227
195- result = TransferDatasetResult . new (
196- complete : complete , transfer_results : transfer_results
197- )
198- log_transfer_results ( dataset_path , result , logger : logger )
228+ # Renames the info.yml file
229+ def self . transfer_compute_remote_names ( paths , info_name )
230+ paths . map do |p |
231+ basename = p . basename . to_s
232+
233+ if basename == "info.yml"
234+ [ p , "#{ info_name } .yml" ]
235+ else
236+ [ p , basename ]
237+ end
238+ end
199239 end
200240
201241 # Logs the transfer dataset results
@@ -232,10 +272,11 @@ def self.log_transfer_results(dataset_path, result, logger: null_logger)
232272 # Transfer a file to the central log server via FTP
233273 #
234274 # @return [LogUploadState:Result]
235- def self . transfer_file ( file , server , root )
275+ def self . transfer_file ( file , server , root , target_name : File . basename ( file ) )
236276 ftp = RobyApp ::LogTransferServer ::FTPUpload . new (
237277 server . host , server . port , server . certificate , server . user ,
238278 server . password , file ,
279+ target_name : target_name ,
239280 max_upload_rate : server . max_upload_rate || Float ::INFINITY ,
240281 implicit_ftps : server . implicit_ftps
241282 )
0 commit comments