Bug 1256998 - Include links to the l10n changesets in the build email r=jlund
authorJohan Lorenzo <jlorenzo@mozilla.com>
Thu, 08 Sep 2016 10:56:50 +0200
changeset 7204 cab42e42703aed9bf67e08ca9dd8dcf8ed12955c
parent 7203 1005cd769d3555db50badbefe67bad08668cce77
child 7205 46ece28c68a5f5d8383b3d189dfe61316c390134
push id160
push userjlorenzo@mozilla.com
push dateWed, 14 Sep 2016 13:41:15 +0000
reviewersjlund
bugs1256998
Bug 1256998 - Include links to the l10n changesets in the build email r=jlund MozReview-Commit-ID: 9tGD3hIQrqq
buildfarm/release/release-runner.py
lib/python/kickoff/__init__.py
lib/python/kickoff/api.py
--- a/buildfarm/release/release-runner.py
+++ b/buildfarm/release/release-runner.py
@@ -455,19 +455,20 @@ def main(options):
             graph = make_task_graph_strict_kwargs(**kwargs)
             rr.update_status(release, "Submitting task graph")
             log.info("Task graph generated!")
             import pprint
             log.debug(pprint.pformat(graph, indent=4, width=160))
             print scheduler.createTaskGraph(graph_id, graph)
 
             rr.mark_as_completed(release)
+            l10n_url = rr.release_l10n_api.getL10nFullUrl(release['name'])
             email_release_drivers(smtp_server=smtp_server, from_=notify_from,
                                   to=notify_to, release=release,
-                                  task_group_id=graph_id)
+                                  task_group_id=graph_id, l10n_url=l10n_url)
         except Exception as exception:
             # We explicitly do not raise an error here because there's no
             # reason not to start other releases if creating the Task Graph
             # fails for another one. We _do_ need to set this in order to exit
             # with the right code, though.
             rc = 2
             rr.mark_as_failed(
                 release,
--- a/lib/python/kickoff/__init__.py
+++ b/lib/python/kickoff/__init__.py
@@ -87,32 +87,34 @@ class ReleaseRunner(object):
         log.info('mark as completed %s' % release['name'])
         self.release_api.update(release['name'], complete=True,
                                 status='Started')
 
     def mark_as_failed(self, release, why):
         log.info('mark as failed %s' % release['name'])
         self.release_api.update(release['name'], ready=False, status=why)
 
-def email_release_drivers(smtp_server, from_, to, release, task_group_id):
+
+def email_release_drivers(smtp_server, from_, to, release, task_group_id, l10n_url):
     # Send an email to the mailing after the build
 
     content = """\
 A new build has been submitted through ship-it:
 
 Commit: https://hg.mozilla.org/{path}/rev/{revision}
-Task group: https://tools.taskcluster.net/push-inspector/#/{task_group_id}/
+Task group: https://tools.taskcluster.net/push-inspector/#/{task_group_id}
+Locales: {l10n_url} (requires VPN access)
 
 Created by {submitter}
 Started by {starter}
 
 
 """.format(path=release["branch"], revision=release["mozillaRevision"],
            submitter=release["submitter"], starter=release["starter"],
-           task_group_id=task_group_id)
+           task_group_id=task_group_id, l10n_url=l10n_url)
 
     comment = release.get("comment")
     if comment:
         content += "Comment:\n" + comment + "\n\n"
 
     # On r-d, we prefix the subject of the email in order to simplify filtering
     if "Fennec" in release["name"]:
         subject_prefix = "[mobile] "
--- a/lib/python/kickoff/api.py
+++ b/lib/python/kickoff/api.py
@@ -33,18 +33,20 @@ class API(object):
         self.auth = auth
         self.verify = ca_certs
         self.timeout = timeout
         self.raise_exceptions = raise_exceptions
         self.session = requests.session()
         self.csrf_token = None
         self.retries = retry_attempts
 
-    def request(self, params=None, data=None, method='GET', url_template_vars={}):
-        url = self.api_root + self.url_template % url_template_vars
+    def request(self, params=None, data=None, method='GET', url_template_vars=None):
+        url_template_vars = {} if url_template_vars is None else url_template_vars
+
+        url = self._getFullUrl(url_template_vars)
         if method != 'GET' and method != 'HEAD':
             if not self.csrf_token or is_csrf_token_expired(self.csrf_token):
                 res = self.session.request(
                     method='HEAD', url=self.api_root + '/csrf_token',
                     timeout=self.timeout, auth=self.auth)
                 if self.raise_exceptions:
                     res.raise_for_status()
                 self.csrf_token = res.headers['X-CSRF-Token']
@@ -65,16 +67,19 @@ class API(object):
                                            requests.ConnectionError),
                          attempts=self.retries)
         except requests.HTTPError, e:
             log.error('Caught HTTPError: %d %s' %
                      (e.response.status_code, e.response.content),
                      exc_info=True)
             raise
 
+    def _getFullUrl(self, url_template_vars):
+        return self.api_root + self.url_template % url_template_vars
+
 
 class Releases(API):
     url_template = '/releases'
 
     def getReleases(self, ready=1, complete=0):
         resp = None
         try:
             resp = self.request(params={'ready': ready, 'complete': complete})
@@ -108,8 +113,11 @@ class Release(API):
                             url_template_vars=url_template_vars).content
 
 
 class ReleaseL10n(API):
     url_template = '/releases/%(name)s/l10n'
 
     def getL10n(self, name):
         return self.request(url_template_vars={'name': name}).content
+
+    def getL10nFullUrl(self, name):
+        return self._getFullUrl(url_template_vars={'name': name})