Merge lp:~wgrant/launchpad/bug-897999 into lp:launchpad

Proposed by William Grant
Status: Merged
Approved by: Steve Kowalik
Approved revision: no longer in the source branch.
Merged at revision: 16003
Proposed branch: lp:~wgrant/launchpad/bug-897999
Merge into: lp:launchpad
Diff against target: 379 lines (+10/-206)
7 files modified
lib/lp/registry/browser/distribution.py (+0/-15)
lib/lp/registry/browser/tests/test_distribution_views.py (+5/-56)
lib/lp/soyuz/browser/archive.py (+1/-33)
lib/lp/soyuz/browser/tests/test_archive_admin_view.py (+0/-47)
lib/lp/soyuz/interfaces/archive.py (+0/-5)
lib/lp/soyuz/model/archive.py (+4/-20)
lib/lp/soyuz/tests/test_archive.py (+0/-30)
To merge this branch: bzr merge lp:~wgrant/launchpad/bug-897999
Reviewer Review Type Date Requested Status
Steve Kowalik (community) code Approve
Review via email: mp+125640@code.launchpad.net

Commit message

Rip out the restriction that non-virtualized main archives have to build on all restricted processor families. It doesn't make much sense, is a fair bit of code, and the form integration is buggy.

Description of the change

Presently a main archive (primary or partner) that builds on non-virtual builders is implicitly allowed to use all restricted processor families, regardless of the configuration in the database. The widgets on Archive:+admin and Distribution:+edit attempt to enforce this, but end up being both too strict and too lenient, resulting in problems like bug #897999.

This branch removes the main archive special case. It applies to a total of two archives on production which can be easily configured manually, it's a fair bit of code, and the corresponding UI has always been fairly broken. All archives can now have restricted families enabled or disabled as desired.

Ubuntu's primary and partner archives will need tweaking on production before this is deployed; I suspect that simply clicking Save on their respective +admin forms will be sufficient.

To post a comment you must log in.
Revision history for this message
Steve Kowalik (stevenk) wrote :

Looks like excellent work to me.

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/registry/browser/distribution.py'
2--- lib/lp/registry/browser/distribution.py 2012-08-24 05:09:51 +0000
3+++ lib/lp/registry/browser/distribution.py 2012-09-21 07:05:28 +0000
4@@ -888,10 +888,6 @@
5 """The page title."""
6 return self.label
7
8- def validate(self, data):
9- self.validate_enabled_restricted_families(
10- data, ENABLED_RESTRICTED_FAMILITES_ERROR_MSG)
11-
12 @property
13 def initial_values(self):
14 proc_family_set = getUtility(IProcessorFamilySet)
15@@ -937,12 +933,6 @@
16 self.next_url = canonical_url(distribution)
17
18
19-ENABLED_RESTRICTED_FAMILITES_ERROR_MSG = (
20- u"This distribution's main archive can not be restricted to "
21- 'certain architectures unless the archive is also set '
22- 'to build on virtualized builders.')
23-
24-
25 class DistributionEditView(RegistryEditFormView,
26 RequireVirtualizedBuildersMixin,
27 EnableRestrictedFamiliesMixin):
28@@ -1004,11 +994,6 @@
29 if not official_malone:
30 data['enable_bug_expiration'] = False
31
32- # Validate enabled_restricted_families.
33- self.validate_enabled_restricted_families(
34- data,
35- ENABLED_RESTRICTED_FAMILITES_ERROR_MSG)
36-
37 def change_archive_fields(self, data):
38 # Update context.main_archive.
39 new_require_virtualized = data.get('require_virtualized')
40
41=== modified file 'lib/lp/registry/browser/tests/test_distribution_views.py'
42--- lib/lp/registry/browser/tests/test_distribution_views.py 2012-01-01 02:58:52 +0000
43+++ lib/lp/registry/browser/tests/test_distribution_views.py 2012-09-21 07:05:28 +0000
44@@ -169,39 +169,13 @@
45 def test_add_distro_enabled_restricted_families(self):
46 creation_form = self.getDefaultAddDict()
47 creation_form['field.enabled_restricted_families'] = []
48- creation_form['field.require_virtualized'] = 'on'
49 create_initialized_view(
50 self.distributionset, '+add', principal=self.admin,
51 method='POST', form=creation_form)
52
53 distribution = self.distributionset.getByName('newbuntu')
54- self.assertEqual(
55- True,
56- distribution.main_archive.require_virtualized)
57 self.assertContentEqual(
58- [],
59- distribution.main_archive.enabled_restricted_families)
60-
61- def test_add_distro_enabled_restricted_families_error(self):
62- # If require_virtualized is False, enabled_restricted_families
63- # cannot be changed.
64- creation_form = self.getDefaultAddDict()
65- creation_form['field.enabled_restricted_families'] = []
66- creation_form['field.require_virtualized'] = ''
67- view = create_initialized_view(
68- self.distributionset, '+add', principal=self.admin,
69- method='POST', form=creation_form)
70-
71- error_msg = (
72- u"This distribution's main archive can not be restricted to "
73- "certain architectures unless the archive is also set to build "
74- "on virtualized builders.")
75- self.assertEqual(
76- error_msg,
77- view.widget_errors.get('enabled_restricted_families'))
78- self.assertEqual(
79- error_msg,
80- view.widget_errors.get('require_virtualized'))
81+ [], distribution.main_archive.enabled_restricted_families)
82
83
84 class TestDistroEditView(TestCaseWithFactory):
85@@ -227,7 +201,8 @@
86 widget._getCurrentValue())
87
88 def test_edit_distro_init_value_enabled_restricted_families(self):
89- self.distribution.main_archive.require_virtualized = False
90+ self.distribution.main_archive.enabled_restricted_families = (
91+ self.restricted_families)
92 view = create_initialized_view(
93 self.distribution, '+edit', principal=self.admin,
94 method='GET')
95@@ -264,16 +239,11 @@
96 self.distribution.main_archive.require_virtualized)
97
98 def test_change_enabled_restricted_families(self):
99- # If require_virtualized is True, enabled_restricted_families
100- # can be changed.
101 edit_form = self.getDefaultEditDict()
102- edit_form['field.require_virtualized'] = 'on'
103 edit_form['field.enabled_restricted_families'] = []
104
105- self.distribution.main_archive.require_virtualized = False
106- self.assertContentEqual(
107- self.restricted_families,
108- self.distribution.main_archive.enabled_restricted_families)
109+ self.distribution.main_archive.enabled_restricted_families = (
110+ self.restricted_families)
111 create_initialized_view(
112 self.distribution, '+edit', principal=self.admin,
113 method='POST', form=edit_form)
114@@ -282,27 +252,6 @@
115 [],
116 self.distribution.main_archive.enabled_restricted_families)
117
118- def test_cannot_change_enabled_restricted_families(self):
119- # If require_virtualized is False, enabled_restricted_families
120- # cannot be changed.
121- edit_form = self.getDefaultEditDict()
122- edit_form['field.require_virtualized'] = ''
123- edit_form['field.enabled_restricted_families'] = []
124-
125- view = create_initialized_view(
126- self.distribution, '+edit', principal=self.admin,
127- method='POST', form=edit_form)
128- error_msg = (
129- u"This distribution's main archive can not be restricted to "
130- "certain architectures unless the archive is also set to build "
131- "on virtualized builders.")
132- self.assertEqual(
133- error_msg,
134- view.widget_errors.get('enabled_restricted_families'))
135- self.assertEqual(
136- error_msg,
137- view.widget_errors.get('require_virtualized'))
138-
139 def test_package_derivatives_email(self):
140 # Test that the edit form allows changing package_derivatives_email
141 edit_form = self.getDefaultEditDict()
142
143=== modified file 'lib/lp/soyuz/browser/archive.py'
144--- lib/lp/soyuz/browser/archive.py 2012-09-13 04:11:09 +0000
145+++ lib/lp/soyuz/browser/archive.py 2012-09-21 07:05:28 +0000
146@@ -2086,9 +2086,7 @@
147 """A mixin that provides enabled_restricted_families field support"""
148
149 def createEnabledRestrictedFamilies(self, description=None):
150- """Creates the 'enabled_restricted_families' field.
151-
152- """
153+ """Creates the 'enabled_restricted_families' field."""
154 terms = []
155 for family in getUtility(IProcessorFamilySet).getRestricted():
156 terms.append(SimpleTerm(
157@@ -2103,22 +2101,6 @@
158 else description),
159 render_context=self.render_context)
160
161- def validate_enabled_restricted_families(self, data, error_msg):
162- enabled_restricted_families = data['enabled_restricted_families']
163- require_virtualized = data.get('require_virtualized', False)
164- proc_family_set = getUtility(IProcessorFamilySet)
165- if (not require_virtualized and
166- set(enabled_restricted_families) !=
167- set(proc_family_set.getRestricted())):
168- self.setFieldError('enabled_restricted_families', error_msg)
169- self.setFieldError('require_virtualized', error_msg)
170-
171-
172-ARCHIVE_ENABLED_RESTRICTED_FAMILITES_ERROR_MSG = (
173- u'Main archives can not be restricted to certain '
174- 'architectures unless they are set to build on '
175- 'virtualized builders.')
176-
177
178 class ArchiveAdminView(BaseArchiveEditView, EnableRestrictedFamiliesMixin):
179
180@@ -2187,20 +2169,6 @@
181 error_text = "\n".join(errors)
182 self.setFieldError('external_dependencies', error_text)
183
184- enabled_restricted_families = data.get('enabled_restricted_families')
185- require_virtualized = data.get('require_virtualized')
186- proc_family_set = getUtility(IProcessorFamilySet)
187- if (enabled_restricted_families and
188- not require_virtualized and
189- set(enabled_restricted_families) !=
190- set(proc_family_set.getRestricted())):
191- self.setFieldError(
192- 'enabled_restricted_families',
193- ARCHIVE_ENABLED_RESTRICTED_FAMILITES_ERROR_MSG)
194- self.setFieldError(
195- 'require_virtualized',
196- ARCHIVE_ENABLED_RESTRICTED_FAMILITES_ERROR_MSG)
197-
198 @property
199 def owner_is_private_team(self):
200 """Is the owner a private team?
201
202=== modified file 'lib/lp/soyuz/browser/tests/test_archive_admin_view.py'
203--- lib/lp/soyuz/browser/tests/test_archive_admin_view.py 2012-01-01 02:58:52 +0000
204+++ lib/lp/soyuz/browser/tests/test_archive_admin_view.py 2012-09-21 07:05:28 +0000
205@@ -103,50 +103,3 @@
206 'This archive already has published sources. '
207 'It is not possible to switch the privacy.',
208 view.errors[0])
209-
210- def test_can_leave_restricted_families_unchecked(self):
211- # We should be able to leave restricted families unchecked and
212- # still submit the form. (see bug 888083)
213- self.factory.makeProcessorFamily(restricted=True)
214- self.factory.makeProcessorFamily(restricted=True)
215- form = {
216- "field.enabled": "on",
217- 'field.private': 'off',
218- "field.require_virtualized": "off",
219- 'field.enabled_restricted_families': [],
220- 'field.actions.save': 'Save',
221- }
222-
223- view = ArchiveAdminView(
224- self.ppa, LaunchpadTestRequest(method="POST", form=form))
225- view.initialize()
226-
227- self.assertEqual(
228- None, view.widget_errors.get('enabled_restricted_families'))
229-
230- def test_cannot_change_enabled_restricted_families(self):
231- # If require_virtualized is False, enabled_restricted_families
232- # cannot be changed.
233- pf1 = self.factory.makeProcessorFamily(restricted=True)
234- method = 'POST'
235- form = {
236- 'field.enabled': 'on',
237- 'field.require_virtualized': '',
238- 'field.enabled_restricted_families': [pf1.name],
239- 'field.actions.save': 'Save',
240- }
241-
242- view = ArchiveAdminView(self.ppa, LaunchpadTestRequest(
243- method=method, form=form))
244- view.initialize()
245-
246- error_msg = (
247- u'Main archives can not be restricted to certain '
248- 'architectures unless they are set to build on '
249- 'virtualized builders.')
250- self.assertEqual(
251- error_msg,
252- view.widget_errors.get('enabled_restricted_families'))
253- self.assertEqual(
254- error_msg,
255- view.widget_errors.get('require_virtualized'))
256
257=== modified file 'lib/lp/soyuz/interfaces/archive.py'
258--- lib/lp/soyuz/interfaces/archive.py 2012-08-17 10:37:13 +0000
259+++ lib/lp/soyuz/interfaces/archive.py 2012-09-21 07:05:28 +0000
260@@ -16,7 +16,6 @@
261 'CannotCopy',
262 'CannotSwitchPrivacy',
263 'ComponentNotFound',
264- 'CannotRestrictArchitectures',
265 'CannotUploadToArchive',
266 'CannotUploadToPPA',
267 'CannotUploadToPocket',
268@@ -180,10 +179,6 @@
269 """Raised on some queries when version is specified but name is not."""
270
271
272-class CannotRestrictArchitectures(Exception):
273- """The architectures for this archive can not be restricted."""
274-
275-
276 @error_status(httplib.FORBIDDEN)
277 class CannotUploadToArchive(Exception):
278 """A reason for not being able to upload to an archive."""
279
280=== modified file 'lib/lp/soyuz/model/archive.py'
281--- lib/lp/soyuz/model/archive.py 2012-09-17 05:25:38 +0000
282+++ lib/lp/soyuz/model/archive.py 2012-09-21 07:05:28 +0000
283@@ -125,7 +125,6 @@
284 ArchiveDisabled,
285 ArchiveNotPrivate,
286 CannotCopy,
287- CannotRestrictArchitectures,
288 CannotSwitchPrivacy,
289 CannotUploadToPocket,
290 CannotUploadToPPA,
291@@ -168,7 +167,6 @@
292 )
293 from lp.soyuz.interfaces.packagecopyjob import IPlainPackageCopyJobSource
294 from lp.soyuz.interfaces.packagecopyrequest import IPackageCopyRequestSet
295-from lp.soyuz.interfaces.processor import IProcessorFamilySet
296 from lp.soyuz.interfaces.publishing import (
297 active_publishing_status,
298 IPublishingSet,
299@@ -2033,28 +2031,14 @@
300 def _getEnabledRestrictedFamilies(self):
301 """Retrieve the restricted architecture families this archive can
302 build on."""
303- # Main archives are always allowed to build on restricted
304- # architectures if require_virtualized is False.
305- if self.is_main and not self.require_virtualized:
306- return getUtility(IProcessorFamilySet).getRestricted()
307- archive_arch_set = getUtility(IArchiveArchSet)
308- restricted_families = archive_arch_set.getRestrictedFamilies(self)
309- return [family for (family, archive_arch) in restricted_families
310- if archive_arch is not None]
311+ families = getUtility(IArchiveArchSet).getRestrictedFamilies(self)
312+ return [
313+ family for (family, archive_arch) in families
314+ if archive_arch is not None]
315
316 def _setEnabledRestrictedFamilies(self, value):
317 """Set the restricted architecture families this archive can
318 build on."""
319- # Main archives are not allowed to build on restricted
320- # architectures unless they are set to build on virtualized
321- # builders.
322- if (self.is_main and not self.require_virtualized):
323- proc_family_set = getUtility(IProcessorFamilySet)
324- if set(value) != set(proc_family_set.getRestricted()):
325- raise CannotRestrictArchitectures(
326- "Main archives can not be restricted to certain "
327- "architectures unless they are set to build on "
328- "virtualized builders")
329 archive_arch_set = getUtility(IArchiveArchSet)
330 restricted_families = archive_arch_set.getRestrictedFamilies(self)
331 for (family, archive_arch) in restricted_families:
332
333=== modified file 'lib/lp/soyuz/tests/test_archive.py'
334--- lib/lp/soyuz/tests/test_archive.py 2012-09-13 05:20:10 +0000
335+++ lib/lp/soyuz/tests/test_archive.py 2012-09-21 07:05:28 +0000
336@@ -56,7 +56,6 @@
337 ArchiveDependencyError,
338 ArchiveDisabled,
339 CannotCopy,
340- CannotRestrictArchitectures,
341 CannotUploadToPocket,
342 CannotUploadToPPA,
343 IArchiveSet,
344@@ -1038,35 +1037,6 @@
345 self.archive_arch_set = getUtility(IArchiveArchSet)
346 self.arm = getUtility(IProcessorFamilySet).getByName('arm')
347
348- def test_main_archive_can_use_restricted(self):
349- # Main archives for distributions can always use restricted
350- # architectures if they are not using virtual builders.
351- distro = self.factory.makeDistribution()
352- distro.main_archive.require_virtualized = False
353- self.assertContentEqual([self.arm],
354- distro.main_archive.enabled_restricted_families)
355-
356- def test_main_archive_can_not_be_restricted_not_virtualized(self):
357- # A main archive can not be restricted to certain architectures
358- # (unless it's set to build on virtualized builders).
359- distro = self.factory.makeDistribution()
360- distro.main_archive.require_virtualized = False
361- # Restricting to all restricted architectures is fine
362- distro.main_archive.enabled_restricted_families = [self.arm]
363- self.assertRaises(
364- CannotRestrictArchitectures, setattr, distro.main_archive,
365- "enabled_restricted_families", [])
366-
367- def test_main_virtualized_archive_can_be_restricted(self):
368- # A main archive can be restricted to certain architectures
369- # if it's set to build on virtualized builders.
370- distro = self.factory.makeDistribution()
371- distro.main_archive.require_virtualized = True
372-
373- # Restricting to architectures is fine.
374- distro.main_archive.enabled_restricted_families = [self.arm]
375- distro.main_archive.enabled_restricted_families = []
376-
377 def test_default(self):
378 """By default, ARM builds are not allowed as ARM is restricted."""
379 self.assertEqual(0,