aboutsummaryrefslogtreecommitdiff
path: root/pgo_tools
diff options
context:
space:
mode:
Diffstat (limited to 'pgo_tools')
-rwxr-xr-xpgo_tools/monitor_pgo_profiles.py72
-rwxr-xr-xpgo_tools/monitor_pgo_profiles_unittest.py74
2 files changed, 52 insertions, 94 deletions
diff --git a/pgo_tools/monitor_pgo_profiles.py b/pgo_tools/monitor_pgo_profiles.py
index cb41eb88..5c17423b 100755
--- a/pgo_tools/monitor_pgo_profiles.py
+++ b/pgo_tools/monitor_pgo_profiles.py
@@ -5,18 +5,13 @@
"""Emails the mage if PGO profile generation hasn't succeeded recently."""
-# pylint: disable=cros-logging-import
-
import argparse
import datetime
-import sys
-import subprocess
import logging
+import subprocess
+import sys
from typing import List, NamedTuple, Optional, Tuple
-from cros_utils import email_sender
-from cros_utils import tiny_render
-
PGO_BUILDBOT_LINK = ('https://ci.chromium.org/p/chromeos/builders/toolchain/'
'pgo-generate-llvm-next-orchestrator')
@@ -56,47 +51,35 @@ def fetch_most_recent_profdata(arch: str) -> ProfdataInfo:
return max(infos)
-def compose_complaint_email(
+def compose_complaint(
out_of_date_profiles: List[Tuple[datetime.datetime, ProfdataInfo]]
-) -> Optional[Tuple[str, tiny_render.Piece]]:
+) -> Optional[str]:
if not out_of_date_profiles:
return None
if len(out_of_date_profiles) == 1:
- subject = '1 llvm profile is out of date'
- body = ['out-of-date profile:']
+ body_lines = ['1 profile is out of date:']
else:
- subject = f'{len(out_of_date_profiles)} llvm profiles are out of date'
- body = ['out-of-date profiles:']
+ body_lines = [f'{len(out_of_date_profiles)} profiles are out of date:']
- out_of_date_items = []
for arch, profdata_info in out_of_date_profiles:
- out_of_date_items.append(
- f'{arch} (most recent profile was from {profdata_info.date} at '
+ body_lines.append(
+ f'- {arch} (most recent profile was from {profdata_info.date} at '
f'{profdata_info.location!r})')
- body += [
- tiny_render.UnorderedList(out_of_date_items),
- tiny_render.line_break,
- tiny_render.line_break,
+ body_lines.append('\n')
+ body_lines.append(
'PTAL to see if the llvm-pgo-generate bots are functioning normally. '
- 'Their status can be found at ',
- tiny_render.Link(href=PGO_BUILDBOT_LINK, inner=PGO_BUILDBOT_LINK),
- '.',
- ]
- return subject, body
+ f'Their status can be found at {PGO_BUILDBOT_LINK}.')
+ return '\n'.join(body_lines)
def main() -> None:
logging.basicConfig(level=logging.INFO)
parser = argparse.ArgumentParser(
- description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
- parser.add_argument(
- '--dry_run',
- action='store_true',
- help="Don't actually send an email",
- )
+ description=__doc__,
+ formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument(
'--max_age_days',
# These builders run ~weekly. If we fail to generate two in a row,
@@ -121,29 +104,12 @@ def main() -> None:
if age >= max_age:
out_of_date_profiles.append((arch, most_recent))
- email = compose_complaint_email(out_of_date_profiles)
- if not email:
- logging.info('No email to send; quit')
- return
-
- subject, body = email
+ complaint = compose_complaint(out_of_date_profiles)
+ if complaint:
+ logging.error('%s', complaint)
+ sys.exit(1)
- identifier = 'llvm-pgo-monitor'
- subject = f'[{identifier}] {subject}'
-
- logging.info('Sending email with title %r', subject)
- if args.dry_run:
- logging.info('Dry run specified\nSubject: %s\nBody:\n%s', subject,
- tiny_render.render_text_pieces(body))
- else:
- email_sender.EmailSender().SendX20Email(
- subject=subject,
- identifier=identifier,
- well_known_recipients=['mage'],
- direct_recipients=['gbiv@google.com'],
- text_body=tiny_render.render_text_pieces(body),
- html_body=tiny_render.render_html_pieces(body),
- )
+ logging.info('Nothing seems wrong')
if __name__ == '__main__':
diff --git a/pgo_tools/monitor_pgo_profiles_unittest.py b/pgo_tools/monitor_pgo_profiles_unittest.py
index b4e085ec..eef33887 100755
--- a/pgo_tools/monitor_pgo_profiles_unittest.py
+++ b/pgo_tools/monitor_pgo_profiles_unittest.py
@@ -11,41 +11,36 @@ import unittest
import unittest.mock
import monitor_pgo_profiles
-from cros_utils import tiny_render
class Test(unittest.TestCase):
"""Tests for monitor_pgo_profiles."""
+ def test_compose_complaint_with_zero_out_of_date(self):
+ self.assertIsNone(monitor_pgo_profiles.compose_complaint([]))
- def test_compose_complaint_email_with_zero_out_of_date(self):
- self.assertIsNone(monitor_pgo_profiles.compose_complaint_email([]))
-
- def test_compose_complaint_email_with_one_out_of_date(self):
+ def test_compose_complaint_with_one_out_of_date(self):
profdata_info = monitor_pgo_profiles.ProfdataInfo(
date=datetime.datetime(2020, 1, 2, 3, 4, 5),
location='gs://somewhere',
)
- result = monitor_pgo_profiles.compose_complaint_email([
+ result = monitor_pgo_profiles.compose_complaint([
('some_arch', profdata_info),
])
- self.assertEqual(result, ('1 llvm profile is out of date', [
- 'out-of-date profile:',
- tiny_render.UnorderedList([
- f'some_arch (most recent profile was from {profdata_info.date} at '
- f'{profdata_info.location!r})'
- ]),
- tiny_render.line_break,
- tiny_render.line_break,
- 'PTAL to see if the llvm-pgo-generate bots are functioning normally. '
- 'Their status can be found at ',
- tiny_render.Link(
- href=monitor_pgo_profiles.PGO_BUILDBOT_LINK,
- inner=monitor_pgo_profiles.PGO_BUILDBOT_LINK,
- ),
- '.',
- ]))
+ self.assertEqual(
+ result,
+ '\n'.join((
+ '1 profile is out of date:',
+ f'- some_arch (most recent profile was from {profdata_info.date} '
+ f'at {profdata_info.location!r})',
+ '',
+ '',
+ 'PTAL to see if the llvm-pgo-generate bots are functioning '
+ 'normally. Their status can be found at '
+ f'{monitor_pgo_profiles.PGO_BUILDBOT_LINK}.',
+ )),
+ )
- def test_compose_complaint_email_with_two_out_of_date(self):
+ def test_compose_complaint_with_two_out_of_date(self):
profdata_info_1 = monitor_pgo_profiles.ProfdataInfo(
date=datetime.datetime(2020, 1, 2, 3, 4, 5),
location='gs://somewhere',
@@ -54,28 +49,25 @@ class Test(unittest.TestCase):
date=datetime.datetime(2020, 3, 2, 1, 4, 5),
location='gs://somewhere-else',
)
- result = monitor_pgo_profiles.compose_complaint_email([
+ result = monitor_pgo_profiles.compose_complaint([
('some_arch', profdata_info_1),
('some_other_arch', profdata_info_2),
])
- self.assertEqual(result, ('2 llvm profiles are out of date', [
- 'out-of-date profiles:',
- tiny_render.UnorderedList([
- f'some_arch (most recent profile was from {profdata_info_1.date} '
+ self.assertEqual(
+ result,
+ '\n'.join((
+ '2 profiles are out of date:',
+ f'- some_arch (most recent profile was from {profdata_info_1.date} '
f'at {profdata_info_1.location!r})',
- f'some_other_arch (most recent profile was from '
- f'{profdata_info_2.date} at {profdata_info_2.location!r})'
- ]),
- tiny_render.line_break,
- tiny_render.line_break,
- 'PTAL to see if the llvm-pgo-generate bots are functioning normally. '
- 'Their status can be found at ',
- tiny_render.Link(
- href=monitor_pgo_profiles.PGO_BUILDBOT_LINK,
- inner=monitor_pgo_profiles.PGO_BUILDBOT_LINK,
- ),
- '.',
- ]))
+ f'- some_other_arch (most recent profile was from '
+ f'{profdata_info_2.date} at {profdata_info_2.location!r})',
+ '',
+ '',
+ 'PTAL to see if the llvm-pgo-generate bots are functioning '
+ 'normally. Their status can be found at '
+ f'{monitor_pgo_profiles.PGO_BUILDBOT_LINK}.',
+ )),
+ )
@unittest.mock.patch.object(subprocess, 'run')
def test_fetching_profdata_functions(self, subprocess_run_mock):