• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mozilla / relman-auto-nag / #4995

09 May 2024 05:53PM CUT coverage: 21.84% (+0.01%) from 21.827%
#4995

push

coveralls-python

benjaminmah
Old and new triage owners are CC'ed in the email, added link to triage as extra column in table

716 of 3594 branches covered (19.92%)

0 of 9 new or added lines in 2 files covered. (0.0%)

1 existing line in 1 file now uncovered.

1928 of 8828 relevant lines covered (21.84%)

0.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/bugbot/rules/triage_owner_rotations.py
1
# This Source Code Form is subject to the terms of the Mozilla Public
2
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
3
# You can obtain one at http://mozilla.org/MPL/2.0/.
4

5

6
from typing import List, Set
×
7
from urllib.parse import quote_plus
×
8

9
from libmozdata.bugzilla import BugzillaComponent
×
10
from requests import HTTPError
×
11
from tenacity import (
×
12
    RetryError,
13
    retry,
14
    retry_if_exception_message,
15
    stop_after_attempt,
16
    wait_exponential,
17
)
18

NEW
19
from bugbot import logger
×
20
from bugbot.bzcleaner import BzCleaner
×
21
from bugbot.component_triagers import ComponentName, ComponentTriagers, TriageOwner
×
22

23

24
class TriageOwnerRotations(BzCleaner):
×
25
    def __init__(
×
26
        self,
27
        excluded_teams: List[str] = [
28
            "Layout",
29
            "GFX",
30
        ],
31
    ) -> None:
32
        """Constructor
33

34
        Args:
35
            excluded_teams: teams to excluded all of their components when
36
                performing the triage owner rotation.
37
        """
38
        super().__init__()
×
39
        self.component_triagers = ComponentTriagers(excluded_teams=excluded_teams)
×
40
        self.query_url = None
×
41
        self.has_put_errors = False
×
42

43
    def description(self) -> str:
×
44
        return "Triage owners that got updated"
×
45

46
    def get_extra_for_template(self):
×
47
        return {"has_put_errors": self.has_put_errors}
×
48

49
    def _update_triage_owners(
×
50
        self, new_triage_owners: List[TriageOwner]
51
    ) -> Set[ComponentName]:
52
        failures = set()
×
53
        for new_triager in new_triage_owners:
×
54
            logger.info(
×
55
                "The triage owner for '%s' will be: '%s'",
56
                new_triager.component,
57
                new_triager.bugzilla_email,
58
            )
59

UNCOV
60
            if not self.dryrun and not self.test_mode:
×
61
                try:
×
62
                    self._put_new_triage_owner(new_triager)
×
63
                except (HTTPError, RetryError) as err:
×
64
                    failures.add(new_triager.component)
×
65
                    logger.exception(
×
66
                        "Cannot update the triage owner for '%s' to be '%s': %s",
67
                        new_triager.component,
68
                        new_triager.bugzilla_email,
69
                        err,
70
                    )
71

72
        return failures
×
73

74
    @retry(
×
75
        retry=retry_if_exception_message(match=r"^\d{3} Server Error"),
76
        wait=wait_exponential(),
77
        stop=stop_after_attempt(3),
78
    )
79
    def _put_new_triage_owner(self, new_triager: TriageOwner) -> None:
×
80
        change = {"triage_owner": new_triager.bugzilla_email}
×
81
        BugzillaComponent(
×
82
            new_triager.component.product,
83
            new_triager.component.name,
84
        ).put(change)
85

86
    def get_email_data(self, date: str) -> List[dict]:
×
87
        new_triagers = self.component_triagers.get_new_triage_owners()
×
88
        failures = self._update_triage_owners(new_triagers)
×
89
        self.has_put_errors = len(failures) > 0
×
90

NEW
91
        email_data = []
×
92

NEW
93
        for new_triager in new_triagers:
×
NEW
94
            data = {
×
95
                "component": new_triager.component,
96
                "old_triage_owner": self.component_triagers.get_current_triage_owner(
97
                    new_triager.component
98
                ),
99
                "new_triage_owner": new_triager.bugzilla_email,
100
                "has_put_error": new_triager.component in failures,
101
                "link_to_triage": self.convert_to_url(str(new_triager.component)),
102
            }
103

NEW
104
            data["cc_emails"] = [data["old_triage_owner"], data["new_triage_owner"]]
×
105

NEW
106
            print(f"CC EMAILS: {data['cc_emails']}")
×
107

NEW
108
            email_data.append(data)
×
109

NEW
110
        return email_data
×
111

112
    def convert_to_url(self, component: str) -> str:
×
113
        # replace double colons with a single colon
114
        component = component.replace("::", ":")
×
115

116
        encoded = quote_plus(component)
×
117

118
        url = "https://bugdash.moz.tools/?component=" + encoded
×
119

120
        return url
×
121

122

123
if __name__ == "__main__":
×
124
    TriageOwnerRotations().run()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc