launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #31692
[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)