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
1=== modified file 'lib/lp/_schema_circular_imports.py'
2--- lib/lp/_schema_circular_imports.py 2019-09-27 10:51:56 +0000
3+++ lib/lp/_schema_circular_imports.py 2019-09-27 15:39:39 +0000
4@@ -496,6 +496,8 @@
5 patch_reference_property(IDistroArchSeries, 'main_archive', IArchive)
6 patch_plain_parameter_type(
7 IDistroArchSeries, 'setChrootFromBuild', 'livefsbuild', ILiveFSBuild)
8+patch_plain_parameter_type(
9+ IDistroArchSeries, 'setSourceFilter', 'packageset', IPackageset)
10
11 # IGitRef
12 patch_reference_property(IGitRef, 'repository', IGitRepository)
13
14=== modified file 'lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py'
15--- lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py 2019-07-30 11:38:18 +0000
16+++ lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py 2019-09-27 15:39:39 +0000
17@@ -11,12 +11,14 @@
18 BadRequest,
19 Unauthorized,
20 )
21+from testtools.matchers import MatchesStructure
22 from zope.security.management import endInteraction
23
24 from lp.buildmaster.enums import BuildBaseImageType
25 from lp.registry.enums import PersonVisibility
26 from lp.registry.interfaces.pocket import PackagePublishingPocket
27 from lp.services.features.testing import FeatureFixture
28+from lp.soyuz.enums import DistroArchSeriesFilterSense
29 from lp.soyuz.interfaces.livefs import LIVEFS_FEATURE_FLAG
30 from lp.testing import (
31 api_url,
32@@ -291,3 +293,56 @@
33 image_type="LXD image")
34 self.assertIsNone(das.getChroot(image_type=BuildBaseImageType.CHROOT))
35 self.assertEqual(lfa, das.getChroot(image_type=BuildBaseImageType.LXD))
36+
37+ def test_setSourceFilter_removeSourceFilter_random_user(self):
38+ # Random users are not allowed to set or remove filters.
39+ das = self.factory.makeDistroArchSeries()
40+ packageset = self.factory.makePackageset(distroseries=das.distroseries)
41+ user = self.factory.makePerson()
42+ packageset_url = api_url(packageset)
43+ webservice = launchpadlib_for("testing", user, version="devel")
44+ ws_das = ws_object(webservice, das)
45+ self.assertRaises(
46+ Unauthorized, ws_das.setSourceFilter,
47+ packageset=packageset_url, sense="Include")
48+ self.assertRaises(Unauthorized, ws_das.removeSourceFilter)
49+
50+ def test_setSourceFilter_wrong_distroseries(self):
51+ # Trying to set a filter using a packageset for the wrong
52+ # distroseries returns an error.
53+ das = self.factory.makeDistroArchSeries()
54+ packageset = self.factory.makePackageset()
55+ user = das.distroseries.distribution.main_archive.owner
56+ packageset_url = api_url(packageset)
57+ webservice = launchpadlib_for("testing", user, version="devel")
58+ ws_das = ws_object(webservice, das)
59+ e = self.assertRaises(
60+ BadRequest, ws_das.setSourceFilter,
61+ packageset=packageset_url, sense="Include")
62+ self.assertEqual(
63+ "The requested package set is for %s and cannot be set as a "
64+ "filter for %s %s." % (
65+ packageset.distroseries.fullseriesname,
66+ das.distroseries.fullseriesname, das.architecturetag),
67+ e.content)
68+
69+ def test_setSourceFilter_removeSourceFilter(self):
70+ das = self.factory.makeDistroArchSeries()
71+ packageset = self.factory.makePackageset(distroseries=das.distroseries)
72+ user = das.distroseries.distribution.main_archive.owner
73+ packageset_url = api_url(packageset)
74+ webservice = launchpadlib_for("testing", user, version="devel")
75+ ws_das = ws_object(webservice, das)
76+ ws_das.setSourceFilter(packageset=packageset_url, sense="Include")
77+ with person_logged_in(user):
78+ dasf = das.getSourceFilter()
79+ self.assertThat(dasf, MatchesStructure.byEquality(
80+ packageset=packageset, sense=DistroArchSeriesFilterSense.INCLUDE))
81+ ws_das.setSourceFilter(packageset=packageset_url, sense="Exclude")
82+ with person_logged_in(user):
83+ dasf = das.getSourceFilter()
84+ self.assertThat(dasf, MatchesStructure.byEquality(
85+ packageset=packageset, sense=DistroArchSeriesFilterSense.EXCLUDE))
86+ ws_das.removeSourceFilter()
87+ with person_logged_in(user):
88+ self.assertIsNone(das.getSourceFilter())
89
90=== modified file 'lib/lp/soyuz/interfaces/distroarchseries.py'
91--- lib/lp/soyuz/interfaces/distroarchseries.py 2019-09-10 11:16:22 +0000
92+++ lib/lp/soyuz/interfaces/distroarchseries.py 2019-09-27 15:39:39 +0000
93@@ -16,6 +16,7 @@
94 import httplib
95
96 from lazr.restful.declarations import (
97+ call_with,
98 error_status,
99 export_as_webservice_entry,
100 export_read_operation,
101@@ -23,6 +24,7 @@
102 exported,
103 operation_for_version,
104 operation_parameters,
105+ REQUEST_USER,
106 )
107 from lazr.restful.fields import (
108 Reference,
109@@ -49,6 +51,7 @@
110 from lp.registry.interfaces.person import IPerson
111 from lp.registry.interfaces.pocket import PackagePublishingPocket
112 from lp.registry.interfaces.role import IHasOwner
113+from lp.soyuz.enums import DistroArchSeriesFilterSense
114 from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
115
116
117@@ -292,6 +295,15 @@
118 tarball".
119 """
120
121+ @operation_parameters(
122+ # Really IPackageset, patched in _schema_circular_imports.py.
123+ packageset=Reference(Interface, title=_("Package set"), required=True),
124+ sense=Choice(
125+ vocabulary=DistroArchSeriesFilterSense,
126+ title=_("Sense"), required=True))
127+ @call_with(creator=REQUEST_USER)
128+ @export_write_operation()
129+ @operation_for_version("devel")
130 def setSourceFilter(packageset, sense, creator):
131 """Set a filter for packages to build for this architecture.
132
133@@ -314,6 +326,8 @@
134 :param creator: The `IPerson` who is creating this filter.
135 """
136
137+ @export_write_operation()
138+ @operation_for_version("devel")
139 def removeSourceFilter():
140 """Remove any filter for packages to build for this architecture.
141