Merge lp:~jpds/launchpad/fix_515388 into lp:launchpad

Proposed by Jonathan Davies
Status: Merged
Approved by: Graham Binns
Approved revision: not available
Merged at revision: 10252
Proposed branch: lp:~jpds/launchpad/fix_515388
Merge into: lp:launchpad
Diff against target: 354 lines (+164/-36)
5 files modified
lib/canonical/launchpad/interfaces/_schema_circular_imports.py (+5/-0)
lib/lp/registry/interfaces/distribution.py (+16/-7)
lib/lp/registry/interfaces/distributionmirror.py (+41/-29)
lib/lp/registry/stories/webservice/xx-distribution-mirror.txt (+75/-0)
lib/lp/registry/stories/webservice/xx-distribution.txt (+27/-0)
To merge this branch: bzr merge lp:~jpds/launchpad/fix_515388
Reviewer Review Type Date Requested Status
Graham Binns (community) code Approve
Review via email: mp+18413@code.launchpad.net

Commit message

Added DistributionMirrors to the Launchpad API.

To post a comment you must log in.
Revision history for this message
Jonathan Davies (jpds) wrote :

= Summary =

Distribution mirrors should be exposed via the Launchpad API. This branch makes the necessary changes to make this a reality.

Revision history for this message
Graham Binns (gmb) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/launchpad/interfaces/_schema_circular_imports.py'
--- lib/canonical/launchpad/interfaces/_schema_circular_imports.py 2010-01-15 01:59:08 +0000
+++ lib/canonical/launchpad/interfaces/_schema_circular_imports.py 2010-02-01 23:20:32 +0000
@@ -44,6 +44,7 @@
44from lp.code.interfaces.diff import IPreviewDiff44from lp.code.interfaces.diff import IPreviewDiff
45from lp.code.interfaces.hasbranches import IHasBranches, IHasMergeProposals45from lp.code.interfaces.hasbranches import IHasBranches, IHasMergeProposals
46from lp.registry.interfaces.distribution import IDistribution46from lp.registry.interfaces.distribution import IDistribution
47from lp.registry.interfaces.distributionmirror import IDistributionMirror
47from lp.registry.interfaces.distributionsourcepackage import (48from lp.registry.interfaces.distributionsourcepackage import (
48 IDistributionSourcePackage)49 IDistributionSourcePackage)
49from lp.registry.interfaces.distroseries import IDistroSeries50from lp.registry.interfaces.distroseries import IDistroSeries
@@ -261,6 +262,10 @@
261IDistribution['all_distro_archives'].value_type.schema = IArchive262IDistribution['all_distro_archives'].value_type.schema = IArchive
262263
263264
265# IDistributionMirror
266IDistributionMirror['distribution'].schema = IDistribution
267
268
264# IDistroSeries269# IDistroSeries
265patch_entry_return_type(270patch_entry_return_type(
266 IDistroSeries, 'getDistroArchSeries', IDistroArchSeries)271 IDistroSeries, 'getDistroArchSeries', IDistroArchSeries)
267272
=== modified file 'lib/lp/registry/interfaces/distribution.py'
--- lib/lp/registry/interfaces/distribution.py 2009-12-09 14:55:02 +0000
+++ lib/lp/registry/interfaces/distribution.py 2010-02-01 23:20:32 +0000
@@ -20,7 +20,7 @@
20 'NoSuchDistribution',20 'NoSuchDistribution',
21 ]21 ]
2222
23from zope.schema import Bool, Choice, Datetime, List, Text, TextLine23from zope.schema import Bool, Choice, Datetime, List, Object, Text, TextLine
24from zope.interface import Attribute, Interface24from zope.interface import Attribute, Interface
2525
26from lazr.restful.fields import CollectionField, Reference26from lazr.restful.fields import CollectionField, Reference
@@ -39,6 +39,7 @@
39 IStructuralSubscriptionTarget)39 IStructuralSubscriptionTarget)
40from lp.app.interfaces.headings import IRootContext40from lp.app.interfaces.headings import IRootContext
41from lp.registry.interfaces.announcement import IMakesAnnouncements41from lp.registry.interfaces.announcement import IMakesAnnouncements
42from lp.registry.interfaces.distributionmirror import IDistributionMirror
42from lp.bugs.interfaces.bugtarget import (43from lp.bugs.interfaces.bugtarget import (
43 IBugTarget, IOfficialBugTagTargetPublic, IOfficialBugTagTargetRestricted)44 IBugTarget, IOfficialBugTagTargetPublic, IOfficialBugTagTargetRestricted)
44from lp.soyuz.interfaces.buildrecords import IHasBuildRecords45from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
@@ -184,18 +185,22 @@
184 title=_("Members"),185 title=_("Members"),
185 description=_("The distro's members team."), required=True,186 description=_("The distro's members team."), required=True,
186 vocabulary='ValidPersonOrTeam')187 vocabulary='ValidPersonOrTeam')
187 mirror_admin = PublicPersonChoice(188 mirror_admin = exported(PublicPersonChoice(
188 title=_("Mirror Administrator"),189 title=_("Mirror Administrator"),
189 description=_("The person or team that has the rights to review and "190 description=_("The person or team that has the rights to review and "
190 "mark this distribution's mirrors as official."),191 "mark this distribution's mirrors as official."),
191 required=True, vocabulary='ValidPersonOrTeam')192 required=True, vocabulary='ValidPersonOrTeam'))
192 lucilleconfig = TextLine(193 lucilleconfig = TextLine(
193 title=_("Lucille Config"),194 title=_("Lucille Config"),
194 description=_("The Lucille Config."), required=False)195 description=_("The Lucille Config."), required=False)
195 archive_mirrors = Attribute(196 archive_mirrors = exported(CollectionField(
196 "All enabled and official ARCHIVE mirrors of this Distribution.")197 description=_("All enabled and official ARCHIVE mirrors of this "
197 cdimage_mirrors = Attribute(198 "Distribution."),
198 "All enabled and official RELEASE mirrors of this Distribution.")199 readonly=True, value_type=Object(schema=IDistributionMirror)))
200 cdimage_mirrors = exported(CollectionField(
201 description=_("All enabled and official RELEASE mirrors of this "
202 "Distribution."),
203 readonly=True, value_type=Object(schema=IDistributionMirror)))
199 disabled_mirrors = Attribute(204 disabled_mirrors = Attribute(
200 "All disabled and official mirrors of this Distribution.")205 "All disabled and official mirrors of this Distribution.")
201 unofficial_mirrors = Attribute(206 unofficial_mirrors = Attribute(
@@ -304,6 +309,10 @@
304 `IDistroSeries.version`.309 `IDistroSeries.version`.
305 """310 """
306311
312 @operation_parameters(
313 name=TextLine(title=_("Name"), required=True))
314 @operation_returns_entry(IDistributionMirror)
315 @export_read_operation()
307 def getMirrorByName(name):316 def getMirrorByName(name):
308 """Return the mirror with the given name for this distribution or None317 """Return the mirror with the given name for this distribution or None
309 if it's not found.318 if it's not found.
310319
=== modified file 'lib/lp/registry/interfaces/distributionmirror.py'
--- lib/lp/registry/interfaces/distributionmirror.py 2009-10-26 18:40:04 +0000
+++ lib/lp/registry/interfaces/distributionmirror.py 2010-02-01 23:20:32 +0000
@@ -27,6 +27,9 @@
27from zope.interface.interface import invariant27from zope.interface.interface import invariant
28from zope.component import getUtility28from zope.component import getUtility
29from lazr.enum import DBEnumeratedType, DBItem29from lazr.enum import DBEnumeratedType, DBItem
30from lazr.restful.declarations import (
31 export_as_webservice_entry, export_read_operation, exported)
32from lazr.restful.fields import Reference
3033
31from canonical.launchpad import _34from canonical.launchpad import _
32from canonical.launchpad.fields import (35from canonical.launchpad.fields import (
@@ -280,61 +283,68 @@
280283
281class IDistributionMirror(Interface):284class IDistributionMirror(Interface):
282 """A mirror of a given distribution."""285 """A mirror of a given distribution."""
286 export_as_webservice_entry()
283287
284 id = Int(title=_('The unique id'), required=True, readonly=True)288 id = Int(title=_('The unique id'), required=True, readonly=True)
285 owner = PublicPersonChoice(289 owner = exported(PublicPersonChoice(
286 title=_('Owner'), required=False, readonly=True,290 title=_('Owner'), required=False, readonly=True,
287 vocabulary='ValidOwner')291 vocabulary='ValidOwner'))
288 reviewer = PublicPersonChoice(292 reviewer = PublicPersonChoice(
289 title=_('Reviewer'), required=False, readonly=False,293 title=_('Reviewer'), required=False, readonly=False,
290 vocabulary='ValidPersonOrTeam')294 vocabulary='ValidPersonOrTeam')
291 distribution = Attribute(_("The distribution that is mirrored"))295 distribution = exported(
292 name = DistributionMirrorNameField(296 Reference(
297 Interface,
298 # Really IDistribution, circular import fixed in
299 # _schema_circular_imports.
300 title=_("Distribution"), required=True,
301 description=_("The distribution that is mirrored")))
302 name = exported(DistributionMirrorNameField(
293 title=_('Name'), required=True, readonly=False,303 title=_('Name'), required=True, readonly=False,
294 description=_('A short and unique name for this mirror.'),304 description=_('A short and unique name for this mirror.'),
295 constraint=name_validator)305 constraint=name_validator))
296 displayname = TextLine(306 displayname = exported(TextLine(
297 title=_('Organisation'), required=False, readonly=False,307 title=_('Organisation'), required=False, readonly=False,
298 description=_('The name of the organization hosting this mirror.'))308 description=_('The name of the organization hosting this mirror.')))
299 description = TextLine(309 description = exported(TextLine(
300 title=_('Description'), required=False, readonly=False)310 title=_('Description'), required=False, readonly=False))
301 http_base_url = DistroMirrorHTTPURIField(311 http_base_url = exported(DistroMirrorHTTPURIField(
302 title=_('HTTP URL'), required=False, readonly=False,312 title=_('HTTP URL'), required=False, readonly=False,
303 allowed_schemes=['http'], allow_userinfo=False,313 allowed_schemes=['http'], allow_userinfo=False,
304 allow_query=False, allow_fragment=False, trailing_slash=True,314 allow_query=False, allow_fragment=False, trailing_slash=True,
305 description=_('e.g.: http://archive.ubuntu.com/ubuntu/'))315 description=_('e.g.: http://archive.ubuntu.com/ubuntu/')))
306 ftp_base_url = DistroMirrorFTPURIField(316 ftp_base_url = exported(DistroMirrorFTPURIField(
307 title=_('FTP URL'), required=False, readonly=False,317 title=_('FTP URL'), required=False, readonly=False,
308 allowed_schemes=['ftp'], allow_userinfo=False,318 allowed_schemes=['ftp'], allow_userinfo=False,
309 allow_query=False, allow_fragment=False, trailing_slash=True,319 allow_query=False, allow_fragment=False, trailing_slash=True,
310 description=_('e.g.: ftp://archive.ubuntu.com/ubuntu/'))320 description=_('e.g.: ftp://archive.ubuntu.com/ubuntu/')))
311 rsync_base_url = DistroMirrorRsyncURIField(321 rsync_base_url = exported(DistroMirrorRsyncURIField(
312 title=_('Rsync URL'), required=False, readonly=False,322 title=_('Rsync URL'), required=False, readonly=False,
313 allowed_schemes=['rsync'], allow_userinfo=False,323 allowed_schemes=['rsync'], allow_userinfo=False,
314 allow_query=False, allow_fragment=False, trailing_slash=True,324 allow_query=False, allow_fragment=False, trailing_slash=True,
315 description=_('e.g.: rsync://archive.ubuntu.com/ubuntu/'))325 description=_('e.g.: rsync://archive.ubuntu.com/ubuntu/')))
316 enabled = Bool(326 enabled = exported(Bool(
317 title=_('This mirror was probed successfully.'),327 title=_('This mirror was probed successfully.'),
318 required=False, readonly=False, default=False)328 required=False, readonly=False, default=False))
319 speed = Choice(329 speed = exported(Choice(
320 title=_('Link Speed'), required=True, readonly=False,330 title=_('Link Speed'), required=True, readonly=False,
321 vocabulary=MirrorSpeed)331 vocabulary=MirrorSpeed))
322 country = Choice(332 country = Choice(
323 title=_('Location'), required=True, readonly=False,333 title=_('Location'), required=True, readonly=False,
324 vocabulary='CountryName')334 vocabulary='CountryName')
325 content = Choice(335 content = exported(Choice(
326 title=_('Content'), required=True, readonly=False,336 title=_('Content'), required=True, readonly=False,
327 description=_(337 description=_(
328 'Choose "CD Image" if this mirror contains CD images of '338 'Choose "CD Image" if this mirror contains CD images of '
329 'this distribution. Choose "Archive" if this is a '339 'this distribution. Choose "Archive" if this is a '
330 'mirror of packages for this distribution.'),340 'mirror of packages for this distribution.'),
331 vocabulary=MirrorContent)341 vocabulary=MirrorContent))
332 official_candidate = Bool(342 official_candidate = exported(Bool(
333 title=_('Apply to be an official mirror of this distribution'),343 title=_('Apply to be an official mirror of this distribution'),
334 required=False, readonly=False, default=True)344 required=False, readonly=False, default=True))
335 status = Choice(345 status = exported(Choice(
336 title=_('Status'), required=True, readonly=False,346 title=_('Status'), required=True, readonly=False,
337 vocabulary=MirrorStatus)347 vocabulary=MirrorStatus))
338348
339 title = Attribute('The title of this mirror')349 title = Attribute('The title of this mirror')
340 cdimage_series = Attribute(350 cdimage_series = Attribute(
@@ -345,11 +355,11 @@
345 last_probe_record = Attribute(355 last_probe_record = Attribute(
346 'The last MirrorProbeRecord for this mirror.')356 'The last MirrorProbeRecord for this mirror.')
347 all_probe_records = Attribute('All MirrorProbeRecords for this mirror.')357 all_probe_records = Attribute('All MirrorProbeRecords for this mirror.')
348 has_ftp_or_rsync_base_url = Bool(358 has_ftp_or_rsync_base_url = exported(Bool(
349 title=_('Does this mirror have a ftp or rsync base URL?'))359 title=_('Does this mirror have a ftp or rsync base URL?')))
350 base_url = Attribute('The HTTP or FTP base URL of this mirror')360 base_url = Attribute('The HTTP or FTP base URL of this mirror')
351 date_created = Datetime(361 date_created = exported(Datetime(
352 title=_('Date Created'), required=True, readonly=True)362 title=_('Date Created'), required=True, readonly=True))
353 date_reviewed = Datetime(363 date_reviewed = Datetime(
354 title=_('Date reviewed'), required=False, readonly=False)364 title=_('Date reviewed'), required=False, readonly=False)
355 whiteboard = Whiteboard(365 whiteboard = Whiteboard(
@@ -380,6 +390,7 @@
380 each distro_arch_series of this distribution mirror.390 each distro_arch_series of this distribution mirror.
381 """391 """
382392
393 @export_read_operation()
383 def getOverallFreshness():394 def getOverallFreshness():
384 """Return this mirror's overall freshness.395 """Return this mirror's overall freshness.
385396
@@ -392,6 +403,7 @@
392 contain one or more ISO images.403 contain one or more ISO images.
393 """404 """
394405
406 @export_read_operation()
395 def isOfficial():407 def isOfficial():
396 """Return True if this is an official mirror."""408 """Return True if this is an official mirror."""
397409
398410
=== added file 'lib/lp/registry/stories/webservice/xx-distribution-mirror.txt'
--- lib/lp/registry/stories/webservice/xx-distribution-mirror.txt 1970-01-01 00:00:00 +0000
+++ lib/lp/registry/stories/webservice/xx-distribution-mirror.txt 2010-02-01 23:20:32 +0000
@@ -0,0 +1,75 @@
1= Distribution Mirrors =
2
3For every mirror of distribution we publish most of its attributes. For archive
4mirrors:
5
6 >>> from lazr.restful.testing.webservice import pprint_entry
7 >>> distros = webservice.get("/distros").jsonBody()
8 >>> distro = distros['entries'][0]
9 >>> ubuntu = webservice.get(distro['self_link']).jsonBody()
10 >>> ubuntu_archive_mirrors = webservice.get(ubuntu['archive_mirrors_collection_link']).jsonBody()
11 >>> canonical_archive = ubuntu_archive_mirrors['entries'][0]
12 >>> canonical_archive_json = webservice.get(canonical_archive['self_link']).jsonBody()
13 >>> pprint_entry(canonical_archive_json)
14 content: u'Archive'
15 date_created: u'2006-10-16T18:31:43.434567+00:00'
16 description: None
17 displayname: None
18 distribution_link: u'http://.../ubuntu'
19 enabled: True
20 ftp_base_url: None
21 has_ftp_or_rsync_base_url: False
22 http_base_url: u'http://archive.ubuntu.com/ubuntu/'
23 name: u'canonical-archive'
24 official_candidate: True
25 owner_link: u'http://.../~mark'
26 resource_type_link: u'http://.../#distribution_mirror'
27 rsync_base_url: None
28 self_link: u'http://.../ubuntu/+mirror/canonical-archive'
29 speed: u'100 Mbps'
30 status: u'Official'
31
32And CD image mirrors:
33
34 >>> ubuntu_cd_mirrors = webservice.get(ubuntu['cdimage_mirrors_collection_link']).jsonBody()
35 >>> canonical_releases = ubuntu_cd_mirrors['entries'][0]
36 >>> canonical_releases_json = webservice.get(canonical_releases['self_link']).jsonBody()
37 >>> pprint_entry(canonical_releases_json)
38 content: u'CD Image'
39 date_created: u'2006-10-16T18:31:43.434567+00:00'
40 description: None
41 displayname: None
42 distribution_link: u'http://.../ubuntu'
43 enabled: True
44 ftp_base_url: None
45 has_ftp_or_rsync_base_url: False
46 http_base_url: u'http://releases.ubuntu.com/'
47 name: u'canonical-releases'
48 official_candidate: True
49 owner_link: u'http://.../~mark'
50 resource_type_link: u'http://.../#distribution_mirror'
51 rsync_base_url: None
52 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
53 speed: u'100 Mbps'
54 status: u'Official'
55
56= Distribution Mirror Custom Operations =
57
58DistributionMirror has some custom operations.
59
60"isOfficial" returns a boolean result on whether a mirror is an official mirror
61or not.
62
63 >>> is_official_mirror = webservice.named_get(canonical_releases['self_link'],
64 ... 'isOfficial').jsonBody()
65 >>> print is_official_mirror
66 True
67
68"getOverallFreshness" returns the freshness of the mirror determined by the
69mirror prober from the mirror's last probe.
70
71 >>> releases_mirror2 = ubuntu_cd_mirrors['entries'][2]
72 >>> freshness = webservice.named_get(releases_mirror2['self_link'],
73 ... 'getOverallFreshness').jsonBody()
74 >>> print freshness
75 Up to date
076
=== modified file 'lib/lp/registry/stories/webservice/xx-distribution.txt'
--- lib/lp/registry/stories/webservice/xx-distribution.txt 2009-05-08 20:20:40 +0000
+++ lib/lp/registry/stories/webservice/xx-distribution.txt 2010-02-01 23:20:32 +0000
@@ -21,8 +21,10 @@
21 active: True21 active: True
22 active_milestones_collection_link: u'http://.../ubuntu/active_milestones'22 active_milestones_collection_link: u'http://.../ubuntu/active_milestones'
23 all_milestones_collection_link: u'http://.../ubuntu/all_milestones'23 all_milestones_collection_link: u'http://.../ubuntu/all_milestones'
24 archive_mirrors_collection_link: u'http://.../ubuntu/archive_mirrors'
24 archives_collection_link: u'http://.../ubuntu/archives'25 archives_collection_link: u'http://.../ubuntu/archives'
25 bug_reporting_guidelines: None26 bug_reporting_guidelines: None
27 cdimage_mirrors_collection_link: u'http://.../ubuntu/cdimage_mirrors'
26 current_series_link: u'http://.../ubuntu/hoary'28 current_series_link: u'http://.../ubuntu/hoary'
27 date_created: u'2006-10-16T18:31:43.415195+00:00'29 date_created: u'2006-10-16T18:31:43.415195+00:00'
28 description: u'Ubuntu is a new approach...'30 description: u'Ubuntu is a new approach...'
@@ -33,6 +35,7 @@
33 icon_link: u'http://.../ubuntu/icon'35 icon_link: u'http://.../ubuntu/icon'
34 logo_link: u'http://.../ubuntu/logo'36 logo_link: u'http://.../ubuntu/logo'
35 main_archive_link: u'http://.../ubuntu/+archive/primary'37 main_archive_link: u'http://.../ubuntu/+archive/primary'
38 mirror_admin_link: u'http://.../~ubuntu-mirror-admins'
36 mugshot_link: u'http://.../ubuntu/mugshot'39 mugshot_link: u'http://.../ubuntu/mugshot'
37 name: u'ubuntu'40 name: u'ubuntu'
38 official_bug_tags: []41 official_bug_tags: []
@@ -112,3 +115,27 @@
112 http://.../ubuntu/+source/alsa-utils115 http://.../ubuntu/+source/alsa-utils
113 http://.../ubuntu/+source/foobar116 http://.../ubuntu/+source/foobar
114 http://.../ubuntu/+source/commercialpackage117 http://.../ubuntu/+source/commercialpackage
118
119"getMirrorByName" returns a mirror by its unique name.
120
121 >>> canonical_releases = webservice.named_get(
122 ... ubuntu['self_link'], 'getMirrorByName',
123 ... name='canonical-releases').jsonBody()
124 >>> pprint_entry(canonical_releases)
125 content: u'CD Image'
126 date_created: u'2006-10-16T18:31:43.434567+00:00'
127 description: None
128 displayname: None
129 distribution_link: u'http://.../ubuntu'
130 enabled: True
131 ftp_base_url: None
132 has_ftp_or_rsync_base_url: False
133 http_base_url: u'http://releases.ubuntu.com/'
134 name: u'canonical-releases'
135 official_candidate: True
136 owner_link: u'http://.../~mark'
137 resource_type_link: u'http://.../#distribution_mirror'
138 rsync_base_url: None
139 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
140 speed: u'100 Mbps'
141 status: u'Official'