Expose buildset to the executor and url formatter

For github (and probably other providers) we really only have the option
of returning 1 url for the entire buildset, as opposed to 1 per build.
To make log uploading within that easier we really need a way to
globally identify all the different builds that belong to 1 change.

The zuul ref is already available however this is a concept that is
planned to be deprecated, so instead add a UUID parameter to the
buildset that we can pass through. This UUID is used to build the ref to
make migration easier.

Change-Id: I1cab8af5c9d7f6875591fbe4ac4e184b90f6ca12
Signed-off-by: Jamie Lennox <jamielennox@gmail.com>
diff --git a/tests/fixtures/layouts/reporting-github.yaml b/tests/fixtures/layouts/reporting-github.yaml
index 43e71c7..d054df7 100644
--- a/tests/fixtures/layouts/reporting-github.yaml
+++ b/tests/fixtures/layouts/reporting-github.yaml
@@ -29,7 +29,7 @@
       github:
         comment: false
         status: 'success'
-        status-url: http://logs.example.com/{tenant.name}/{pipeline.name}/{change.project}/{change.number}/{change.patchset}/
+        status-url: http://logs.example.com/{tenant.name}/{pipeline.name}/{change.project}/{change.number}/{buildset.uuid}/
     failure:
       github:
         comment: false
diff --git a/tests/unit/test_github_driver.py b/tests/unit/test_github_driver.py
index ab304b2..636abb4 100644
--- a/tests/unit/test_github_driver.py
+++ b/tests/unit/test_github_driver.py
@@ -13,7 +13,7 @@
 # under the License.
 
 import re
-from testtools.matchers import MatchesRegex
+from testtools.matchers import MatchesRegex, StartsWith
 import time
 
 from tests.base import ZuulTestCase, simple_layout, random_sha1
@@ -300,9 +300,20 @@
         self.assertEqual('tenant-one/reporting', report_status['context'])
         self.assertEqual('success', report_status['state'])
         self.assertEqual(2, len(A.comments))
-        report_url = ('http://logs.example.com/tenant-one/reporting/'
-                      '%s/%s/%s/' % (A.project, A.number, A.head_sha))
-        self.assertEqual(report_url, report_status['url'])
+
+        base = 'http://logs.example.com/tenant-one/reporting/%s/%s/' % (
+            A.project, A.number)
+
+        # Deconstructing the URL because we don't save the BuildSet UUID
+        # anywhere to do a direct comparison and doing regexp matches on a full
+        # URL is painful.
+
+        # The first part of the URL matches the easy base string
+        self.assertThat(report_status['url'], StartsWith(base))
+
+        # The rest of the URL is a UUID and a trailing slash.
+        self.assertThat(report_status['url'][len(base):],
+                        MatchesRegex('^[a-fA-F0-9]{32}\/$'))
 
     @simple_layout('layouts/merging-github.yaml', driver='github')
     def test_report_pull_merge(self):