|
module IoRedirect |
|
extend self |
|
|
|
DIRECTORY_TAG = "io_redirect" |
|
STDOUT_FILE = "stdout.log" |
|
STDERR_FILE = "stderr.log" |
|
|
|
def command_with_io_redirection(command, job_identifier, uuid) |
|
stdout_path = create_log(job_identifier, uuid, STDOUT_FILE) |
|
stderr_path = create_log(job_identifier, uuid, STDERR_FILE) |
|
"#{command} 1>>#{stdout_path} 2>>#{stderr_path}" |
|
end |
|
|
|
def create_log(job_identifier, uuid, file_descriptor) |
|
base_path = log_base_path(job_identifier, uuid) |
|
log_path = File.join(base_path, file_descriptor) |
|
FileUtils.mkdir_p(base_path) unless Dir.exist?(base_path) |
|
FileUtils.touch(log_path) && File.truncate(log_path, 0) |
|
log_path |
|
end |
|
|
|
def log_base_path(job_identifier, uuid) |
|
File.join(Config.log_path, [job_identifier, DIRECTORY_TAG, uuid].join('_')) |
|
end |
|
|
|
def find_logs(job_identifier, uuid) |
|
[STDOUT_FILE, STDERR_FILE].inject({}) do |log_paths, file_descriptor| |
|
log_path = File.join(log_base_path(job_identifier, uuid), file_descriptor) |
|
log_paths[file_descriptor] = log_path if File.exist?(log_path) |
|
log_paths |
|
end |
|
end |
|
|
|
def purge_logs(threshold_time) |
|
Dir.glob(File.join(Config.log_path, "*_#{DIRECTORY_TAG}_*")).each do |log_path_match| |
|
if File.directory?(log_path_match) && File.stat(log_path_match).mtime < threshold_time |
|
FileUtils.rmtree(log_path_match) |
|
end |
|
end |
|
end |
|
|
|
def copy_logs_to_s3(job_identifier, uuid) |
|
logs = find_logs(job_identifier, uuid) |
|
logs.each do |log_file_name, log_file_path| |
|
key = File.join(Config.s3_key_base, job_identifier, uuid, log_file_name) |
|
Aws::S3::Object.new( |
|
bucket_name: Config.s3_bucket, |
|
key: key, |
|
client: Config.s3_client |
|
).upload_file(log_file_path) |
|
end |
|
end |
|
end |