diff options
Diffstat (limited to 'cros_utils/bugs.py')
-rwxr-xr-x | cros_utils/bugs.py | 168 |
1 files changed, 89 insertions, 79 deletions
diff --git a/cros_utils/bugs.py b/cros_utils/bugs.py index 88fb7675..43e0e553 100755 --- a/cros_utils/bugs.py +++ b/cros_utils/bugs.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright 2021 The Chromium OS Authors. All rights reserved. +# Copyright 2021 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -12,93 +12,103 @@ import json import os from typing import Any, Dict, List, Optional -X20_PATH = '/google/data/rw/teams/c-compiler-chrome/prod_bugs' + +X20_PATH = "/google/data/rw/teams/c-compiler-chrome/prod_bugs" class WellKnownComponents(enum.IntEnum): - """A listing of "well-known" components recognized by our infra.""" - CrOSToolchainPublic = -1 - CrOSToolchainPrivate = -2 + """A listing of "well-known" components recognized by our infra.""" + + CrOSToolchainPublic = -1 + CrOSToolchainPrivate = -2 def _WriteBugJSONFile(object_type: str, json_object: Dict[str, Any]): - """Writes a JSON file to X20_PATH with the given bug-ish object.""" - final_object = { - 'type': object_type, - 'value': json_object, - } - - # The name of this has two parts: - # - An easily sortable time, to provide uniqueness and let our service send - # things in the order they were put into the outbox. - # - 64 bits of entropy, so two racing bug writes don't clobber the same file. - now = datetime.datetime.utcnow().isoformat('T', 'seconds') + 'Z' - entropy = base64.urlsafe_b64encode(os.getrandom(8)) - entropy_str = entropy.rstrip(b'=').decode('utf-8') - file_path = os.path.join(X20_PATH, f'{now}_{entropy_str}.json') - - temp_path = file_path + '.in_progress' - try: - with open(temp_path, 'w') as f: - json.dump(final_object, f) - os.rename(temp_path, file_path) - except: - os.remove(temp_path) - raise - return file_path + """Writes a JSON file to X20_PATH with the given bug-ish object.""" + final_object = { + "type": object_type, + "value": json_object, + } + + # The name of this has two parts: + # - An easily sortable time, to provide uniqueness and let our service send + # things in the order they were put into the outbox. + # - 64 bits of entropy, so two racing bug writes don't clobber the same file. + now = datetime.datetime.utcnow().isoformat("T", "seconds") + "Z" + entropy = base64.urlsafe_b64encode(os.getrandom(8)) + entropy_str = entropy.rstrip(b"=").decode("utf-8") + file_path = os.path.join(X20_PATH, f"{now}_{entropy_str}.json") + + temp_path = file_path + ".in_progress" + try: + with open(temp_path, "w") as f: + json.dump(final_object, f) + os.rename(temp_path, file_path) + except: + os.remove(temp_path) + raise + return file_path def AppendToExistingBug(bug_id: int, body: str): - """Sends a reply to an existing bug.""" - _WriteBugJSONFile('AppendToExistingBugRequest', { - 'body': body, - 'bug_id': bug_id, - }) - - -def CreateNewBug(component_id: int, - title: str, - body: str, - assignee: Optional[str] = None, - cc: Optional[List[str]] = None): - """Sends a request to create a new bug. - - Args: - component_id: The component ID to add. Anything from WellKnownComponents - also works. - title: Title of the bug. Must be nonempty. - body: Body of the bug. Must be nonempty. - assignee: Assignee of the bug. Must be either an email address, or a - "well-known" assignee (detective, mage). - cc: A list of emails to add to the CC list. Must either be an email - address, or a "well-known" individual (detective, mage). - """ - obj = { - 'component_id': component_id, - 'subject': title, - 'body': body, - } - - if assignee: - obj['assignee'] = assignee - - if cc: - obj['cc'] = cc - - _WriteBugJSONFile('FileNewBugRequest', obj) + """Sends a reply to an existing bug.""" + _WriteBugJSONFile( + "AppendToExistingBugRequest", + { + "body": body, + "bug_id": bug_id, + }, + ) + + +def CreateNewBug( + component_id: int, + title: str, + body: str, + assignee: Optional[str] = None, + cc: Optional[List[str]] = None, +): + """Sends a request to create a new bug. + + Args: + component_id: The component ID to add. Anything from WellKnownComponents + also works. + title: Title of the bug. Must be nonempty. + body: Body of the bug. Must be nonempty. + assignee: Assignee of the bug. Must be either an email address, or a + "well-known" assignee (detective, mage). + cc: A list of emails to add to the CC list. Must either be an email + address, or a "well-known" individual (detective, mage). + """ + obj = { + "component_id": component_id, + "subject": title, + "body": body, + } + + if assignee: + obj["assignee"] = assignee + + if cc: + obj["cc"] = cc + + _WriteBugJSONFile("FileNewBugRequest", obj) def SendCronjobLog(cronjob_name: str, failed: bool, message: str): - """Sends the record of a cronjob to our bug infra. - - cronjob_name: The name of the cronjob. Expected to remain consistent over - time. - failed: Whether the job failed or not. - message: Any seemingly relevant context. This is pasted verbatim in a bug, if - the cronjob infra deems it worthy. - """ - _WriteBugJSONFile('ChrotomationCronjobUpdate', { - 'name': cronjob_name, - 'message': message, - 'failed': failed, - }) + """Sends the record of a cronjob to our bug infra. + + cronjob_name: The name of the cronjob. Expected to remain consistent over + time. + failed: Whether the job failed or not. + message: Any seemingly relevant context. This is pasted verbatim in a bug, if + the cronjob infra deems it worthy. + """ + _WriteBugJSONFile( + "ChrotomationCronjobUpdate", + { + "name": cronjob_name, + "message": message, + "failed": failed, + }, + ) |