Merge lp:~cjwatson/launchpad/das-filter-webservice into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 19066
Proposed branch: lp:~cjwatson/launchpad/das-filter-webservice
Merge into: lp:launchpad
Prerequisite: lp:~cjwatson/launchpad/das-filter-initialize-ds
Diff against target: 140 lines (+71/-0)
3 files modified
lib/lp/_schema_circular_imports.py (+2/-0)
lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py (+55/-0)
lib/lp/soyuz/interfaces/distroarchseries.py (+14/-0)
To merge this branch: bzr merge lp:~cjwatson/launchpad/das-filter-webservice
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+372265@code.launchpad.net

Commit message

Export IDistroArchSeries.setSourceFilter and IDistroArchSeries.removeSourceFilter on the webservice.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/_schema_circular_imports.py'
--- lib/lp/_schema_circular_imports.py 2019-09-27 10:51:56 +0000
+++ lib/lp/_schema_circular_imports.py 2019-09-27 15:39:39 +0000
@@ -496,6 +496,8 @@
496patch_reference_property(IDistroArchSeries, 'main_archive', IArchive)496patch_reference_property(IDistroArchSeries, 'main_archive', IArchive)
497patch_plain_parameter_type(497patch_plain_parameter_type(
498 IDistroArchSeries, 'setChrootFromBuild', 'livefsbuild', ILiveFSBuild)498 IDistroArchSeries, 'setChrootFromBuild', 'livefsbuild', ILiveFSBuild)
499patch_plain_parameter_type(
500 IDistroArchSeries, 'setSourceFilter', 'packageset', IPackageset)
499501
500# IGitRef502# IGitRef
501patch_reference_property(IGitRef, 'repository', IGitRepository)503patch_reference_property(IGitRef, 'repository', IGitRepository)
502504
=== modified file 'lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py'
--- lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py 2019-07-30 11:38:18 +0000
+++ lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py 2019-09-27 15:39:39 +0000
@@ -11,12 +11,14 @@
11 BadRequest,11 BadRequest,
12 Unauthorized,12 Unauthorized,
13 )13 )
14from testtools.matchers import MatchesStructure
14from zope.security.management import endInteraction15from zope.security.management import endInteraction
1516
16from lp.buildmaster.enums import BuildBaseImageType17from lp.buildmaster.enums import BuildBaseImageType
17from lp.registry.enums import PersonVisibility18from lp.registry.enums import PersonVisibility
18from lp.registry.interfaces.pocket import PackagePublishingPocket19from lp.registry.interfaces.pocket import PackagePublishingPocket
19from lp.services.features.testing import FeatureFixture20from lp.services.features.testing import FeatureFixture
21from lp.soyuz.enums import DistroArchSeriesFilterSense
20from lp.soyuz.interfaces.livefs import LIVEFS_FEATURE_FLAG22from lp.soyuz.interfaces.livefs import LIVEFS_FEATURE_FLAG
21from lp.testing import (23from lp.testing import (
22 api_url,24 api_url,
@@ -291,3 +293,56 @@
291 image_type="LXD image")293 image_type="LXD image")
292 self.assertIsNone(das.getChroot(image_type=BuildBaseImageType.CHROOT))294 self.assertIsNone(das.getChroot(image_type=BuildBaseImageType.CHROOT))
293 self.assertEqual(lfa, das.getChroot(image_type=BuildBaseImageType.LXD))295 self.assertEqual(lfa, das.getChroot(image_type=BuildBaseImageType.LXD))
296
297 def test_setSourceFilter_removeSourceFilter_random_user(self):
298 # Random users are not allowed to set or remove filters.
299 das = self.factory.makeDistroArchSeries()
300 packageset = self.factory.makePackageset(distroseries=das.distroseries)
301 user = self.factory.makePerson()
302 packageset_url = api_url(packageset)
303 webservice = launchpadlib_for("testing", user, version="devel")
304 ws_das = ws_object(webservice, das)
305 self.assertRaises(
306 Unauthorized, ws_das.setSourceFilter,
307 packageset=packageset_url, sense="Include")
308 self.assertRaises(Unauthorized, ws_das.removeSourceFilter)
309
310 def test_setSourceFilter_wrong_distroseries(self):
311 # Trying to set a filter using a packageset for the wrong
312 # distroseries returns an error.
313 das = self.factory.makeDistroArchSeries()
314 packageset = self.factory.makePackageset()
315 user = das.distroseries.distribution.main_archive.owner
316 packageset_url = api_url(packageset)
317 webservice = launchpadlib_for("testing", user, version="devel")
318 ws_das = ws_object(webservice, das)
319 e = self.assertRaises(
320 BadRequest, ws_das.setSourceFilter,
321 packageset=packageset_url, sense="Include")
322 self.assertEqual(
323 "The requested package set is for %s and cannot be set as a "
324 "filter for %s %s." % (
325 packageset.distroseries.fullseriesname,
326 das.distroseries.fullseriesname, das.architecturetag),
327 e.content)
328
329 def test_setSourceFilter_removeSourceFilter(self):
330 das = self.factory.makeDistroArchSeries()
331 packageset = self.factory.makePackageset(distroseries=das.distroseries)
332 user = das.distroseries.distribution.main_archive.owner
333 packageset_url = api_url(packageset)
334 webservice = launchpadlib_for("testing", user, version="devel")
335 ws_das = ws_object(webservice, das)
336 ws_das.setSourceFilter(packageset=packageset_url, sense="Include")
337 with person_logged_in(user):
338 dasf = das.getSourceFilter()
339 self.assertThat(dasf, MatchesStructure.byEquality(
340 packageset=packageset, sense=DistroArchSeriesFilterSense.INCLUDE))
341 ws_das.setSourceFilter(packageset=packageset_url, sense="Exclude")
342 with person_logged_in(user):
343 dasf = das.getSourceFilter()
344 self.assertThat(dasf, MatchesStructure.byEquality(
345 packageset=packageset, sense=DistroArchSeriesFilterSense.EXCLUDE))
346 ws_das.removeSourceFilter()
347 with person_logged_in(user):
348 self.assertIsNone(das.getSourceFilter())
294349
=== modified file 'lib/lp/soyuz/interfaces/distroarchseries.py'
--- lib/lp/soyuz/interfaces/distroarchseries.py 2019-09-10 11:16:22 +0000
+++ lib/lp/soyuz/interfaces/distroarchseries.py 2019-09-27 15:39:39 +0000
@@ -16,6 +16,7 @@
16import httplib16import httplib
1717
18from lazr.restful.declarations import (18from lazr.restful.declarations import (
19 call_with,
19 error_status,20 error_status,
20 export_as_webservice_entry,21 export_as_webservice_entry,
21 export_read_operation,22 export_read_operation,
@@ -23,6 +24,7 @@
23 exported,24 exported,
24 operation_for_version,25 operation_for_version,
25 operation_parameters,26 operation_parameters,
27 REQUEST_USER,
26 )28 )
27from lazr.restful.fields import (29from lazr.restful.fields import (
28 Reference,30 Reference,
@@ -49,6 +51,7 @@
49from lp.registry.interfaces.person import IPerson51from lp.registry.interfaces.person import IPerson
50from lp.registry.interfaces.pocket import PackagePublishingPocket52from lp.registry.interfaces.pocket import PackagePublishingPocket
51from lp.registry.interfaces.role import IHasOwner53from lp.registry.interfaces.role import IHasOwner
54from lp.soyuz.enums import DistroArchSeriesFilterSense
52from lp.soyuz.interfaces.buildrecords import IHasBuildRecords55from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
5356
5457
@@ -292,6 +295,15 @@
292 tarball".295 tarball".
293 """296 """
294297
298 @operation_parameters(
299 # Really IPackageset, patched in _schema_circular_imports.py.
300 packageset=Reference(Interface, title=_("Package set"), required=True),
301 sense=Choice(
302 vocabulary=DistroArchSeriesFilterSense,
303 title=_("Sense"), required=True))
304 @call_with(creator=REQUEST_USER)
305 @export_write_operation()
306 @operation_for_version("devel")
295 def setSourceFilter(packageset, sense, creator):307 def setSourceFilter(packageset, sense, creator):
296 """Set a filter for packages to build for this architecture.308 """Set a filter for packages to build for this architecture.
297309
@@ -314,6 +326,8 @@
314 :param creator: The `IPerson` who is creating this filter.326 :param creator: The `IPerson` who is creating this filter.
315 """327 """
316328
329 @export_write_operation()
330 @operation_for_version("devel")
317 def removeSourceFilter():331 def removeSourceFilter():
318 """Remove any filter for packages to build for this architecture.332 """Remove any filter for packages to build for this architecture.
319333