blob: 1df2f4bafe20153abb43ba7899887825ea07dd8d [file] [log] [blame] [edit]
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import re
from recipe_engine import recipe_api
class LogUtilsApi(recipe_api.RecipeApi):
"""Utilities to collect logs in a generic way."""
def initialize_logs_collection(self, env):
"""Initializes log processing.
The initialization process creates a temp directory and adds it to the
FLUTTER_LOGS_DIR env variable to make it available to the task steps. Task
steps can place any files they want to upload to GCS as public logs.
Args:
env(dict): Env variables dictionary.
"""
# Create a temp folder to keep logs until we can upload them to gcs
# at the end of the execution of the test.
with self.m.step.nest('Initialize logs'):
logs_path = self.m.path['cleanup'].join('flutter_logs_dir')
self.m.file.ensure_directory('Ensure %s' % logs_path, logs_path)
env['FLUTTER_LOGS_DIR'] = logs_path
# Ensure that any test outputs, e.g. timelines/timeline summaries are
# included as logs.
env['FLUTTER_TEST_OUTPUTS_DIR'] = logs_path
# Write a noop file to for the creation of the remote folder estructure
# when there logs folder is empty.
self.m.file.write_text(
'Write noop file', logs_path.join('noop.txt'), '', include_log=False
)
def upload_logs(self, task):
"""Upload the log files in FLUTTER_LOGS_DIR to GCS.
Args:
task(str): A string with the task name the logs belong to.
"""
git_hash = self.m.buildbucket.gitiles_commit.id
# gitiles_commit is only populated on post-submits.
# UUID is used in LED and try jobs.
uuid = self.m.uuid.random()
invocation_id = git_hash if git_hash else uuid
logs_path = self.m.path['cleanup'].join('flutter_logs_dir')
with self.m.step.nest('process logs'):
self.m.gsutil.upload(
bucket='flutter_logs',
source=logs_path,
dest='flutter/%s/%s/%s' % (invocation_id, task, uuid),
link_name='archive logs',
args=['-r'],
multithreaded=True,
name='upload logs %s' % invocation_id,
unauthenticated_url=True
)
log_files = self.m.file.glob_paths(
'logs', source=logs_path, pattern='*', test_data=['a.txt']
)
with self.m.step.nest('log links') as presentation:
pattern_str = 'https://storage.googleapis.com/%s/flutter/%s/%s/%s/%s'
log_files = self.m.file.listdir(
'List logs path', logs_path, True, test_data=('myfile.txt',)
)
for log_file in log_files:
base_name = self.m.path.basename(log_file)
url = pattern_str % (
'flutter_logs', invocation_id, task, uuid, base_name
)
presentation.links[base_name] = url