diff --git a/src/clusterfuzz/_internal/config/local_config.py b/src/clusterfuzz/_internal/config/local_config.py index f1bfd8668a7..87a252fb503 100644 --- a/src/clusterfuzz/_internal/config/local_config.py +++ b/src/clusterfuzz/_internal/config/local_config.py @@ -34,6 +34,7 @@ MONITORING_REGIONS_PATH = 'monitoring.regions' PROJECT_PATH = 'project' SWARMING_PATH = 'swarming.swarming' +EXTERNAL_TESTCASE_UPLOADER_PATH = 'external_testcase_reader.config' def _load_yaml_file(yaml_file_path): @@ -259,3 +260,10 @@ class SwarmingConfig(Config): def __init__(self): super().__init__(SWARMING_PATH) + + +class ExternalTestcaseReaderConfig(Config): + """External testcase reader config.""" + + def __init__(self): + super().__init__(EXTERNAL_TESTCASE_UPLOADER_PATH) diff --git a/src/clusterfuzz/_internal/cron/external_testcase_reader.py b/src/clusterfuzz/_internal/cron/external_testcase_reader.py index 42845853766..d99b861854e 100644 --- a/src/clusterfuzz/_internal/cron/external_testcase_reader.py +++ b/src/clusterfuzz/_internal/cron/external_testcase_reader.py @@ -22,6 +22,7 @@ from appengine.libs import form from appengine.libs import gcs from appengine.libs import helpers +from clusterfuzz._internal.config import local_config from clusterfuzz._internal.issue_management.google_issue_tracker import \ issue_tracker @@ -32,12 +33,11 @@ ISSUETRACKER_WONTFIX_STATE = 'NOT_REPRODUCIBLE' -def get_vrp_uploaders(): +def get_vrp_uploaders(config): """Checks whether the given reporter has permission to upload.""" - # TODO(pgrace) Add this to a YAML file. storage_client = storage.Client() - bucket = storage_client.bucket('clusterfuzz-vrp-uploaders') - blob = bucket.blob('vrp-uploaders') + bucket = storage_client.bucket(config.get('vrp-uploaders-bucket')) + blob = bucket.blob(config.get('vrp-uploaders-blob')) members = blob.download_as_string().decode('utf-8').splitlines()[0].split(',') return members @@ -151,7 +151,7 @@ def submit_testcase(issue_id, file, filename, filetype, cmds): 'https://clusterfuzz.com/upload-testcase/upload', data=data, timeout=10) -def handle_testcases(tracker): +def handle_testcases(tracker, config): """Fetches and submits testcases from bugs or closes unnecssary bugs.""" # TODO(pgrace) remove ID filter once done testing. issues = tracker.find_issues_with_filters( @@ -163,7 +163,7 @@ def handle_testcases(tracker): return # TODO(pgrace) Cache in redis. - vrp_uploaders = get_vrp_uploaders() + vrp_uploaders = get_vrp_uploaders(config) # TODO(pgrace) Implement rudimentary rate limiting. @@ -199,7 +199,7 @@ def handle_testcases(tracker): def main(): tracker = issue_tracker.IssueTracker('chromium', None, {'default_component_id': 1363614}) - handle_testcases(tracker) + handle_testcases(tracker, local_config.ExternalTestcaseReaderConfig()) if __name__ == '__main__': diff --git a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/external_testcase_reader_test.py b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/external_testcase_reader_test.py index 01ca96f3cb5..91d8b10f066 100644 --- a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/external_testcase_reader_test.py +++ b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/external_testcase_reader_test.py @@ -30,6 +30,10 @@ }, 'etag': 'TXpjek9Ea3pNekV4TFRZd01USTNOalk0TFRjNE9URTROVFl4TlE9PQ==' } +BASIC_CONFIG = { + 'vrp-uploaders-bucket': 'bucket-name', + 'vrp-uploaders-blob': 'blob-name' +} @mock.patch.object( @@ -52,7 +56,7 @@ def test_handle_testcases(self, mock_close_issue_if_invalid, basic_issue.reporter.return_value = 'test-reporter@gmail.com' mock_it.find_issues_with_filters.return_value = [basic_issue] - external_testcase_reader.handle_testcases(mock_it) + external_testcase_reader.handle_testcases(mock_it, BASIC_CONFIG) mock_close_issue_if_invalid.assert_called_once() mock_it.get_attachment.assert_called_once() @@ -67,7 +71,7 @@ def test_handle_testcases_invalid(self, mock_close_issue_if_invalid, basic_issue.reporter.return_value = 'test-reporter@gmail.com' mock_it.find_issues_with_filters.return_value = [basic_issue] - external_testcase_reader.handle_testcases(mock_it) + external_testcase_reader.handle_testcases(mock_it, BASIC_CONFIG) mock_close_issue_if_invalid.assert_called_once() mock_it.get_attachment.assert_not_called() @@ -86,7 +90,7 @@ def test_handle_testcases_not_reproducible( basic_issue.reporter.return_value = 'test-reporter@gmail.com' mock_it.find_issues_with_filters.return_value = [basic_issue] - external_testcase_reader.handle_testcases(mock_it) + external_testcase_reader.handle_testcases(mock_it, BASIC_CONFIG) mock_close_issue_if_invalid.assert_not_called() mock_it.get_attachment.assert_not_called() @@ -98,7 +102,7 @@ def test_handle_testcases_no_issues(self, mock_close_issue_if_invalid, mock_it = mock.create_autospec(issue_tracker.IssueTracker) mock_it.find_issues_with_filters.return_value = [] - external_testcase_reader.handle_testcases(mock_it) + external_testcase_reader.handle_testcases(mock_it, BASIC_CONFIG) mock_close_issue_if_invalid.assert_not_called() mock_it.get_attachment.assert_not_called() @@ -221,9 +225,8 @@ def test_get_vrp_uploaders(self): mock_blob.download_as_string.return_value = "test-user@google.com,test-user2@chromium.org".encode( 'utf-8') - actual = external_testcase_reader.get_vrp_uploaders() - mock_storage.return_value.bucket.assert_called_once_with( - 'clusterfuzz-vrp-uploaders') - mock_bucket.blob.assert_called_once_with('vrp-uploaders') + actual = external_testcase_reader.get_vrp_uploaders(BASIC_CONFIG) + mock_storage.return_value.bucket.assert_called_once_with('bucket-name') + mock_bucket.blob.assert_called_once_with('blob-name') self.assertEqual(actual, ['test-user@google.com', 'test-user2@chromium.org'])