Merge lp:~cjwatson/launchpad/livefsbuild-version into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 17743
Proposed branch: lp:~cjwatson/launchpad/livefsbuild-version
Merge into: lp:launchpad
Prerequisite: lp:~cjwatson/launchpad/db-livefsbuild-version
Diff against target: 196 lines (+44/-14)
6 files modified
lib/lp/soyuz/interfaces/livefs.py (+6/-2)
lib/lp/soyuz/interfaces/livefsbuild.py (+4/-3)
lib/lp/soyuz/model/livefs.py (+3/-2)
lib/lp/soyuz/model/livefsbuild.py (+12/-5)
lib/lp/soyuz/tests/test_livefs.py (+17/-0)
lib/lp/testing/factory.py (+2/-2)
To merge this branch: bzr merge lp:~cjwatson/launchpad/livefsbuild-version
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+271193@code.launchpad.net

Commit message

Allow overriding the build version in LiveFS.requestBuild.

Description of the change

Allow overriding the build version in LiveFS.requestBuild. This makes it possible for users (e.g. cloud-image) to set their own serial numbers for builds. The existing LiveFSBuild.version property is informational from LP's point of view, so it shouldn't be a problem to make it user-settable.

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/soyuz/interfaces/livefs.py'
2--- lib/lp/soyuz/interfaces/livefs.py 2015-05-07 10:52:10 +0000
3+++ lib/lp/soyuz/interfaces/livefs.py 2015-09-15 20:24:14 +0000
4@@ -162,12 +162,13 @@
5 required=False),
6 metadata_override=Dict(
7 title=_("A dict of data about the image."),
8- key_type=TextLine(), required=False))
9+ key_type=TextLine(), required=False),
10+ version=TextLine(title=_("A version string for this build.")))
11 # Really ILiveFSBuild, patched in _schema_circular_imports.py.
12 @export_factory_operation(Interface, [])
13 @operation_for_version("devel")
14 def requestBuild(requester, archive, distro_arch_series, pocket,
15- unique_key=None, metadata_override=None):
16+ unique_key=None, metadata_override=None, version=None):
17 """Request that the live filesystem be built.
18
19 :param requester: The person requesting the build.
20@@ -179,6 +180,9 @@
21 :param metadata_override: An optional JSON string with a dict of
22 data about the image; this will be merged into the metadata dict
23 for the live filesystem.
24+ :param version: A version string for this build; if not set, a
25+ version string will be generated from the date and time when the
26+ build was requested.
27 :return: `ILiveFSBuild`.
28 """
29
30
31=== modified file 'lib/lp/soyuz/interfaces/livefsbuild.py'
32--- lib/lp/soyuz/interfaces/livefsbuild.py 2014-06-17 11:01:51 +0000
33+++ lib/lp/soyuz/interfaces/livefsbuild.py 2015-09-15 20:24:14 +0000
34@@ -1,4 +1,4 @@
35-# Copyright 2014 Canonical Ltd. This software is licensed under the
36+# Copyright 2014-2015 Canonical Ltd. This software is licensed under the
37 # GNU Affero General Public License version 3 (see the file LICENSE).
38
39 """Live filesystem build interfaces."""
40@@ -97,7 +97,7 @@
41 title=_("If True, this build is virtualized."), readonly=True)
42
43 version = exported(TextLine(
44- title=_("A timestamp-based version identifying this build."),
45+ title=_("A version string for this build."),
46 required=True, readonly=True))
47
48 score = exported(Int(
49@@ -195,5 +195,6 @@
50 """Utility for `ILiveFSBuild`."""
51
52 def new(requester, livefs, archive, distro_arch_series, pocket,
53- unique_key=None, metadata_override=None, date_created=DEFAULT):
54+ unique_key=None, metadata_override=None, version=None,
55+ date_created=DEFAULT):
56 """Create an `ILiveFSBuild`."""
57
58=== modified file 'lib/lp/soyuz/model/livefs.py'
59--- lib/lp/soyuz/model/livefs.py 2015-07-20 20:31:20 +0000
60+++ lib/lp/soyuz/model/livefs.py 2015-09-15 20:24:14 +0000
61@@ -127,7 +127,7 @@
62 self.date_last_modified = date_created
63
64 def requestBuild(self, requester, archive, distro_arch_series, pocket,
65- unique_key=None, metadata_override=None):
66+ unique_key=None, metadata_override=None, version=None):
67 """See `ILiveFS`."""
68 if not requester.inTeam(self.owner):
69 raise LiveFSNotOwner(
70@@ -152,7 +152,8 @@
71
72 build = getUtility(ILiveFSBuildSet).new(
73 requester, self, archive, distro_arch_series, pocket,
74- unique_key=unique_key, metadata_override=metadata_override)
75+ unique_key=unique_key, metadata_override=metadata_override,
76+ version=version)
77 build.queueBuild()
78 return build
79
80
81=== modified file 'lib/lp/soyuz/model/livefsbuild.py'
82--- lib/lp/soyuz/model/livefsbuild.py 2015-07-08 16:05:11 +0000
83+++ lib/lp/soyuz/model/livefsbuild.py 2015-09-15 20:24:14 +0000
84@@ -1,4 +1,4 @@
85-# Copyright 2014 Canonical Ltd. This software is licensed under the
86+# Copyright 2014-2015 Canonical Ltd. This software is licensed under the
87 # GNU Affero General Public License version 3 (see the file LICENSE).
88
89 __metaclass__ = type
90@@ -121,6 +121,8 @@
91
92 metadata_override = JSON('json_data_override')
93
94+ _version = Unicode(name='version')
95+
96 date_created = DateTime(
97 name='date_created', tzinfo=pytz.UTC, allow_none=False)
98 date_started = DateTime(name='date_started', tzinfo=pytz.UTC)
99@@ -145,7 +147,7 @@
100
101 def __init__(self, build_farm_job, requester, livefs, archive,
102 distro_arch_series, pocket, processor, virtualized,
103- unique_key, metadata_override, date_created):
104+ unique_key, metadata_override, version, date_created):
105 """Construct a `LiveFSBuild`."""
106 if not getFeatureFlag(LIVEFS_FEATURE_FLAG):
107 raise LiveFSFeatureDisabled
108@@ -160,6 +162,7 @@
109 self.virtualized = virtualized
110 self.unique_key = unique_key
111 self.metadata_override = metadata_override
112+ self._version = version
113 self.date_created = date_created
114 self.status = BuildStatus.NEEDSBUILD
115
116@@ -200,7 +203,10 @@
117 @property
118 def version(self):
119 """See `ILiveFSBuild`."""
120- return self.date_created.strftime("%Y%m%d-%H%M%S")
121+ if self._version is not None:
122+ return self._version
123+ else:
124+ return self.date_created.strftime("%Y%m%d-%H%M%S")
125
126 @property
127 def score(self):
128@@ -338,7 +344,8 @@
129 class LiveFSBuildSet(SpecificBuildFarmJobSourceMixin):
130
131 def new(self, requester, livefs, archive, distro_arch_series, pocket,
132- unique_key=None, metadata_override=None, date_created=DEFAULT):
133+ unique_key=None, metadata_override=None, version=None,
134+ date_created=DEFAULT):
135 """See `ILiveFSBuildSet`."""
136 store = IMasterStore(LiveFSBuild)
137 build_farm_job = getUtility(IBuildFarmJobSource).new(
138@@ -349,7 +356,7 @@
139 pocket, distro_arch_series.processor,
140 not distro_arch_series.processor.supports_nonvirtualized
141 or livefs.require_virtualized or archive.require_virtualized,
142- unique_key, metadata_override, date_created)
143+ unique_key, metadata_override, version, date_created)
144 store.add(livefsbuild)
145 return livefsbuild
146
147
148=== modified file 'lib/lp/soyuz/tests/test_livefs.py'
149--- lib/lp/soyuz/tests/test_livefs.py 2015-07-20 20:31:20 +0000
150+++ lib/lp/soyuz/tests/test_livefs.py 2015-09-15 20:24:14 +0000
151@@ -219,6 +219,23 @@
152 PackagePublishingPocket.RELEASE)
153 self.assertEqual(build_virt, build.virtualized)
154
155+ def test_requestBuild_version(self):
156+ # requestBuild may optionally override the version.
157+ livefs = self.factory.makeLiveFS()
158+ distroarchseries = self.factory.makeDistroArchSeries(
159+ distroseries=livefs.distro_series)
160+ build = livefs.requestBuild(
161+ livefs.owner, livefs.distro_series.main_archive, distroarchseries,
162+ PackagePublishingPocket.RELEASE)
163+ self.assertEqual(
164+ build.date_created.strftime("%Y%m%d-%H%M%S"), build.version)
165+ build.updateStatus(BuildStatus.BUILDING)
166+ build.updateStatus(BuildStatus.FULLYBUILT)
167+ build = livefs.requestBuild(
168+ livefs.owner, livefs.distro_series.main_archive, distroarchseries,
169+ PackagePublishingPocket.RELEASE, version=u"20150101")
170+ self.assertEqual(u"20150101", build.version)
171+
172 def test_getBuilds(self):
173 # Test the various getBuilds methods.
174 livefs = self.factory.makeLiveFS()
175
176=== modified file 'lib/lp/testing/factory.py'
177--- lib/lp/testing/factory.py 2015-09-09 14:17:46 +0000
178+++ lib/lp/testing/factory.py 2015-09-15 20:24:14 +0000
179@@ -4472,7 +4472,7 @@
180
181 def makeLiveFSBuild(self, requester=None, registrant=None, livefs=None,
182 archive=None, distroarchseries=None, pocket=None,
183- unique_key=None, metadata_override=None,
184+ unique_key=None, metadata_override=None, version=None,
185 date_created=DEFAULT, status=BuildStatus.NEEDSBUILD,
186 builder=None, duration=None, **kwargs):
187 """Make a new LiveFSBuild."""
188@@ -4503,7 +4503,7 @@
189 livefsbuild = getUtility(ILiveFSBuildSet).new(
190 requester, livefs, archive, distroarchseries, pocket,
191 unique_key=unique_key, metadata_override=metadata_override,
192- date_created=date_created)
193+ version=version, date_created=date_created)
194 if duration is not None:
195 removeSecurityProxy(livefsbuild).updateStatus(
196 BuildStatus.BUILDING, builder=builder,