← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~jugmac00/launchpad:expose-getfileurls-for-rock-builds into launchpad:master

 

Jürgen Gmach has proposed merging ~jugmac00/launchpad:expose-getfileurls-for-rock-builds into launchpad:master.

Commit message:
Add and export RockRecipeBuild.getFileUrls

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~jugmac00/launchpad/+git/launchpad/+merge/474912
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~jugmac00/launchpad:expose-getfileurls-for-rock-builds into launchpad:master.
diff --git a/lib/lp/rocks/interfaces/rockrecipebuild.py b/lib/lp/rocks/interfaces/rockrecipebuild.py
index ca11c62..e4b5d12 100644
--- a/lib/lp/rocks/interfaces/rockrecipebuild.py
+++ b/lib/lp/rocks/interfaces/rockrecipebuild.py
@@ -9,7 +9,12 @@ __all__ = [
     "IRockRecipeBuildSet",
 ]
 
-from lazr.restful.declarations import exported, exported_as_webservice_entry
+from lazr.restful.declarations import (
+    export_read_operation,
+    exported,
+    exported_as_webservice_entry,
+    operation_for_version,
+)
 from lazr.restful.fields import Reference
 from zope.interface import Attribute, Interface
 from zope.schema import Bool, Datetime, Dict, Int, TextLine
@@ -150,6 +155,13 @@ class IRockRecipeBuildView(IPackageBuildView):
         :return: The corresponding `ILibraryFileAlias`.
         """
 
+    @export_read_operation()
+    @operation_for_version("devel")
+    def getFileUrls():
+        """URLs for all the files produced by this build.
+
+        :return: A collection of URLs for this build."""
+
 
 class IRockRecipeBuildEdit(IBuildFarmJobEdit):
     """`IRockRecipeBuild` methods that require launchpad.Edit."""
diff --git a/lib/lp/rocks/model/rockrecipebuild.py b/lib/lp/rocks/model/rockrecipebuild.py
index 6ac028c..9905795 100644
--- a/lib/lp/rocks/model/rockrecipebuild.py
+++ b/lib/lp/rocks/model/rockrecipebuild.py
@@ -44,6 +44,7 @@ from lp.services.database.decoratedresultset import DecoratedResultSet
 from lp.services.database.enumcol import DBEnum
 from lp.services.database.interfaces import IPrimaryStore, IStore
 from lp.services.database.stormbase import StormBase
+from lp.services.librarian.browser import ProxiedLibraryFileAlias
 from lp.services.librarian.model import LibraryFileAlias, LibraryFileContent
 from lp.services.propertycache import cachedproperty, get_property_cache
 from lp.services.webapp.snapshot import notify_modified
@@ -305,6 +306,13 @@ class RockRecipeBuild(PackageBuildMixin, StormBase):
 
         raise NotFoundError(filename)
 
+    def getFileUrls(self):
+        """See `IRockRecipeBuild`."""
+        return [
+            ProxiedLibraryFileAlias(lfa, self).http_url
+            for _, lfa, _ in self.getFiles()
+        ]
+
     def addFile(self, lfa):
         """See `IRockRecipeBuild`."""
         rock_file = RockFile(build=self, library_file=lfa)
diff --git a/lib/lp/rocks/tests/test_rockrecipebuild.py b/lib/lp/rocks/tests/test_rockrecipebuild.py
index 36c25b5..98d6b83 100644
--- a/lib/lp/rocks/tests/test_rockrecipebuild.py
+++ b/lib/lp/rocks/tests/test_rockrecipebuild.py
@@ -29,6 +29,7 @@ from lp.rocks.interfaces.rockrecipebuild import (
 )
 from lp.services.config import config
 from lp.services.features.testing import FeatureFixture
+from lp.services.librarian.browser import ProxiedLibraryFileAlias
 from lp.services.propertycache import clear_property_cache
 from lp.services.webapp.interfaces import OAuthPermission
 from lp.testing import (
@@ -591,3 +592,23 @@ class TestRockRecipeBuildWebservice(TestCaseWithFactory):
         self.assertCanOpenRedirectedUrl(browser, build["build_log_url"])
         self.assertIsNotNone(build["upload_log_url"])
         self.assertCanOpenRedirectedUrl(browser, build["upload_log_url"])
+
+    def test_getFileUrls(self):
+        # API clients can fetch files attached to builds.
+        db_build = self.factory.makeRockRecipeBuild(requester=self.person)
+        db_files = [
+            self.factory.makeRockFile(build=db_build) for i in range(2)
+        ]
+        build_url = api_url(db_build)
+        file_urls = [
+            ProxiedLibraryFileAlias(file.library_file, db_build).http_url
+            for file in db_files
+        ]
+        logout()
+        response = self.webservice.named_get(build_url, "getFileUrls")
+        self.assertEqual(200, response.status)
+        self.assertContentEqual(file_urls, response.jsonBody())
+        browser = self.getNonRedirectingBrowser(user=self.person)
+        browser.raiseHttpErrors = False
+        for file_url in file_urls:
+            self.assertCanOpenRedirectedUrl(browser, file_url)