Skip to content

Commit 1eea562

Browse files
Copy fuzzer script logs to correct buckets (#5099)
Handler for `store_fuzzer_run_results` in postprocess (#3406) was not adding the fuzzer script logs to the correct structured buckets, as expected by the fuzzer page on the UI. This PR tries to fix it by copying the data from the blob store to the expected buckets during postprocess. b/361867455
1 parent af4b075 commit 1eea562

6 files changed

Lines changed: 103 additions & 77 deletions

File tree

src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -784,18 +784,33 @@ def preprocess_store_fuzzer_run_results(fuzz_task_input):
784784
fuzz_task_input.sample_testcase_upload_key = blobs.generate_new_blob_name()
785785
fuzz_task_input.sample_testcase_upload_url = blobs.get_signed_upload_url(
786786
fuzz_task_input.sample_testcase_upload_key)
787-
script_log_upload_key = blobs.generate_new_blob_name()
787+
fuzz_task_input.script_log_upload_key = blobs.generate_new_blob_name()
788788
fuzz_task_input.script_log_upload_url = blobs.get_signed_upload_url(
789-
script_log_upload_key)
789+
fuzz_task_input.script_log_upload_key)
790790

791791

792792
def postprocess_store_fuzzer_run_results(output):
793793
"""Postprocess store_fuzzer_run_results."""
794794
if environment.is_engine_fuzzer_job(output.uworker_input.job_type):
795795
return
796+
uworker_input = output.uworker_input
797+
798+
# Copy fuzzer logs to the structured bucket.
799+
if uworker_input.fuzz_task_input.script_log_upload_key:
800+
logs_blob_bucket = blobs.get_gcs_path(
801+
uworker_input.fuzz_task_input.script_log_upload_key)
802+
fuzzer_logs_bucket = fuzzer_logs.get_logs_gcs_path(
803+
fuzzer_name=output.fuzz_task_output.fully_qualified_fuzzer_name)
804+
try:
805+
if not storage.copy_blob(logs_blob_bucket, fuzzer_logs_bucket):
806+
raise FuzzTaskError('Copying fuzzer logs returned false.')
807+
except:
808+
logs.warning(
809+
f'Failed copying fuzzer logs from blobs {logs_blob_bucket} to the'
810+
f'structured bucket {fuzzer_logs_bucket}.')
811+
796812
if not output.fuzz_task_output.fuzzer_run_results:
797813
return
798-
uworker_input = output.uworker_input
799814
fuzzer = data_types.Fuzzer.query(
800815
data_types.Fuzzer.name == output.uworker_input.fuzzer_name).get()
801816
if not fuzzer:

src/clusterfuzz/_internal/metrics/fuzzer_logs.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ def upload_to_logs(bucket_name,
128128
"""
129129
if signed_upload_url:
130130
if storage.upload_signed_url(contents, signed_upload_url):
131-
logs.info('Uploaded file to logs bucket.')
131+
logs.info(
132+
'Uploaded file to logs bucket.', signed_upload_url=signed_upload_url)
132133
else:
133134
logs.error(
134135
'Failed to write file to logs bucket.',

src/clusterfuzz/_internal/protos/uworker_msg.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ message FuzzTaskInput {
5454
repeated BlobUploadUrl crash_upload_urls = 7;
5555
repeated google.protobuf.Any trials = 8;
5656
optional string web_tests_url = 9;
57+
optional string script_log_upload_key = 10;
5758
}
5859

5960
message DataBundleCorpus {

src/clusterfuzz/_internal/protos/uworker_msg_pb2.py

Lines changed: 70 additions & 70 deletions
Large diffs are not rendered by default.

src/clusterfuzz/_internal/protos/uworker_msg_pb2.pyi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ class FuzzTaskInput(google.protobuf.message.Message):
252252
CRASH_UPLOAD_URLS_FIELD_NUMBER: builtins.int
253253
TRIALS_FIELD_NUMBER: builtins.int
254254
WEB_TESTS_URL_FIELD_NUMBER: builtins.int
255+
SCRIPT_LOG_UPLOAD_KEY_FIELD_NUMBER: builtins.int
255256
sample_testcase_upload_key: builtins.str
256257
sample_testcase_upload_url: builtins.str
257258
script_log_upload_url: builtins.str
@@ -267,6 +268,7 @@ class FuzzTaskInput(google.protobuf.message.Message):
267268
@property
268269
def trials(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[google.protobuf.any_pb2.Any]: ...
269270
web_tests_url: builtins.str
271+
script_log_upload_key: builtins.str
270272
def __init__(
271273
self,
272274
*,
@@ -279,9 +281,10 @@ class FuzzTaskInput(google.protobuf.message.Message):
279281
crash_upload_urls: collections.abc.Iterable[global___BlobUploadUrl] | None = ...,
280282
trials: collections.abc.Iterable[google.protobuf.any_pb2.Any] | None = ...,
281283
web_tests_url: builtins.str | None = ...,
284+
script_log_upload_key: builtins.str | None = ...,
282285
) -> None: ...
283-
def HasField(self, field_name: typing_extensions.Literal["_corpus", b"_corpus", "_fuzz_target", b"_fuzz_target", "_sample_testcase_upload_key", b"_sample_testcase_upload_key", "_sample_testcase_upload_url", b"_sample_testcase_upload_url", "_script_log_upload_url", b"_script_log_upload_url", "_web_tests_url", b"_web_tests_url", "corpus", b"corpus", "fuzz_target", b"fuzz_target", "sample_testcase_upload_key", b"sample_testcase_upload_key", "sample_testcase_upload_url", b"sample_testcase_upload_url", "script_log_upload_url", b"script_log_upload_url", "web_tests_url", b"web_tests_url"]) -> builtins.bool: ...
284-
def ClearField(self, field_name: typing_extensions.Literal["_corpus", b"_corpus", "_fuzz_target", b"_fuzz_target", "_sample_testcase_upload_key", b"_sample_testcase_upload_key", "_sample_testcase_upload_url", b"_sample_testcase_upload_url", "_script_log_upload_url", b"_script_log_upload_url", "_web_tests_url", b"_web_tests_url", "corpus", b"corpus", "crash_upload_urls", b"crash_upload_urls", "fuzz_target", b"fuzz_target", "global_blacklisted_functions", b"global_blacklisted_functions", "sample_testcase_upload_key", b"sample_testcase_upload_key", "sample_testcase_upload_url", b"sample_testcase_upload_url", "script_log_upload_url", b"script_log_upload_url", "trials", b"trials", "web_tests_url", b"web_tests_url"]) -> None: ...
286+
def HasField(self, field_name: typing_extensions.Literal["_corpus", b"_corpus", "_fuzz_target", b"_fuzz_target", "_sample_testcase_upload_key", b"_sample_testcase_upload_key", "_sample_testcase_upload_url", b"_sample_testcase_upload_url", "_script_log_upload_key", b"_script_log_upload_key", "_script_log_upload_url", b"_script_log_upload_url", "_web_tests_url", b"_web_tests_url", "corpus", b"corpus", "fuzz_target", b"fuzz_target", "sample_testcase_upload_key", b"sample_testcase_upload_key", "sample_testcase_upload_url", b"sample_testcase_upload_url", "script_log_upload_key", b"script_log_upload_key", "script_log_upload_url", b"script_log_upload_url", "web_tests_url", b"web_tests_url"]) -> builtins.bool: ...
287+
def ClearField(self, field_name: typing_extensions.Literal["_corpus", b"_corpus", "_fuzz_target", b"_fuzz_target", "_sample_testcase_upload_key", b"_sample_testcase_upload_key", "_sample_testcase_upload_url", b"_sample_testcase_upload_url", "_script_log_upload_key", b"_script_log_upload_key", "_script_log_upload_url", b"_script_log_upload_url", "_web_tests_url", b"_web_tests_url", "corpus", b"corpus", "crash_upload_urls", b"crash_upload_urls", "fuzz_target", b"fuzz_target", "global_blacklisted_functions", b"global_blacklisted_functions", "sample_testcase_upload_key", b"sample_testcase_upload_key", "sample_testcase_upload_url", b"sample_testcase_upload_url", "script_log_upload_key", b"script_log_upload_key", "script_log_upload_url", b"script_log_upload_url", "trials", b"trials", "web_tests_url", b"web_tests_url"]) -> None: ...
285288
@typing.overload
286289
def WhichOneof(self, oneof_group: typing_extensions.Literal["_corpus", b"_corpus"]) -> typing_extensions.Literal["corpus"] | None: ...
287290
@typing.overload
@@ -291,6 +294,8 @@ class FuzzTaskInput(google.protobuf.message.Message):
291294
@typing.overload
292295
def WhichOneof(self, oneof_group: typing_extensions.Literal["_sample_testcase_upload_url", b"_sample_testcase_upload_url"]) -> typing_extensions.Literal["sample_testcase_upload_url"] | None: ...
293296
@typing.overload
297+
def WhichOneof(self, oneof_group: typing_extensions.Literal["_script_log_upload_key", b"_script_log_upload_key"]) -> typing_extensions.Literal["script_log_upload_key"] | None: ...
298+
@typing.overload
294299
def WhichOneof(self, oneof_group: typing_extensions.Literal["_script_log_upload_url", b"_script_log_upload_url"]) -> typing_extensions.Literal["script_log_upload_url"] | None: ...
295300
@typing.overload
296301
def WhichOneof(self, oneof_group: typing_extensions.Literal["_web_tests_url", b"_web_tests_url"]) -> typing_extensions.Literal["web_tests_url"] | None: ...

src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/fuzz_task_test.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1505,15 +1505,18 @@ class PreprocessStoreFuzzerRunResultsTest(unittest.TestCase):
15051505
"""Tests for preprocess_store_fuzzer_run_results."""
15061506

15071507
SIGNED_URL = 'https://signed'
1508+
BLOB_KEY = 'blob_key'
15081509

15091510
def setUp(self):
15101511
helpers.patch(self, [
15111512
'clusterfuzz._internal.google_cloud_utils.storage._sign_url',
15121513
'clusterfuzz._internal.google_cloud_utils.blobs.get_signed_upload_url',
1514+
'clusterfuzz._internal.google_cloud_utils.blobs.generate_new_blob_name'
15131515
])
15141516
self.mock._sign_url.side_effect = (
15151517
lambda remote_path, method, minutes: remote_path)
15161518
self.mock.get_signed_upload_url.return_value = self.SIGNED_URL
1519+
self.mock.generate_new_blob_name.return_value = self.BLOB_KEY
15171520
helpers.patch_environ(self)
15181521
os.environ['JOB_NAME'] = 'linux_chrome_asan'
15191522

@@ -1522,8 +1525,9 @@ def test_preprocess_store_fuzzer_run_results(self):
15221525
fuzz_task.preprocess_store_fuzzer_run_results(fuzz_task_input)
15231526
self.assertEqual(fuzz_task_input.sample_testcase_upload_url,
15241527
self.SIGNED_URL)
1525-
1528+
self.assertEqual(fuzz_task_input.sample_testcase_upload_key, self.BLOB_KEY)
15261529
self.assertEqual(fuzz_task_input.script_log_upload_url, self.SIGNED_URL)
1530+
self.assertEqual(fuzz_task_input.script_log_upload_key, self.BLOB_KEY)
15271531

15281532

15291533
@test_utils.with_cloud_emulators('datastore')

0 commit comments

Comments
 (0)