Merge lp:~cjwatson/launchpad/snap-store-revision into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 18343
Proposed branch: lp:~cjwatson/launchpad/snap-store-revision
Merge into: lp:launchpad
Diff against target: 191 lines (+43/-5)
5 files modified
lib/lp/snappy/interfaces/snapbuild.py (+5/-0)
lib/lp/snappy/interfaces/snapbuildjob.py (+8/-1)
lib/lp/snappy/model/snapbuild.py (+5/-0)
lib/lp/snappy/model/snapbuildjob.py (+13/-3)
lib/lp/snappy/tests/test_snapbuildjob.py (+12/-1)
To merge this branch: bzr merge lp:~cjwatson/launchpad/snap-store-revision
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+321712@code.launchpad.net

Commit message

Export store-assigned revision as SnapBuild.store_upload_revision.

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

Seems like we might also want to record the snap-id, since name remapping will happen at some point,.

review: Approve (code)
Revision history for this message
Colin Watson (cjwatson) wrote :

I would, but as far as I can see none of the relevant API endpoints return it. SnapPushHandler.create returns {success, status_url, status_details_url}, while SnapPushStatusHandler.read returns {code, processed, can_release, errors, url, revision}. So I think that's a more involved matter that would require changes on the SCA side.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/snappy/interfaces/snapbuild.py'
2--- lib/lp/snappy/interfaces/snapbuild.py 2017-02-27 18:46:38 +0000
3+++ lib/lp/snappy/interfaces/snapbuild.py 2017-04-03 14:48:19 +0000
4@@ -195,6 +195,11 @@
5 "The URL to use for managing this package in the store."),
6 required=False, readonly=True))
7
8+ store_upload_revision = exported(Int(
9+ title=_("Store revision"),
10+ description=_("The revision assigned to this package by the store."),
11+ required=False, readonly=True))
12+
13 store_upload_error_message = exported(TextLine(
14 title=_("Store upload error message"),
15 description=_(
16
17=== modified file 'lib/lp/snappy/interfaces/snapbuildjob.py'
18--- lib/lp/snappy/interfaces/snapbuildjob.py 2017-03-20 00:03:52 +0000
19+++ lib/lp/snappy/interfaces/snapbuildjob.py 2017-04-03 14:48:19 +0000
20@@ -19,7 +19,10 @@
21 Attribute,
22 Interface,
23 )
24-from zope.schema import TextLine
25+from zope.schema import (
26+ Int,
27+ TextLine,
28+ )
29
30 from lp import _
31 from lp.services.job.interfaces.job import (
32@@ -58,6 +61,10 @@
33 title=_("The URL on the store corresponding to this build"),
34 required=False, readonly=True)
35
36+ store_revision = Int(
37+ title=_("The revision assigned to this build by the store"),
38+ required=False, readonly=True)
39+
40
41 class ISnapStoreUploadJobSource(IJobSource):
42
43
44=== modified file 'lib/lp/snappy/model/snapbuild.py'
45--- lib/lp/snappy/model/snapbuild.py 2017-02-27 18:46:38 +0000
46+++ lib/lp/snappy/model/snapbuild.py 2017-04-03 14:48:19 +0000
47@@ -439,6 +439,11 @@
48 return job and job.store_url
49
50 @property
51+ def store_upload_revision(self):
52+ job = self.last_store_upload_job
53+ return job and job.store_revision
54+
55+ @property
56 def store_upload_error_message(self):
57 job = self.last_store_upload_job
58 return job and job.error_message
59
60=== modified file 'lib/lp/snappy/model/snapbuildjob.py'
61--- lib/lp/snappy/model/snapbuildjob.py 2017-03-20 00:03:52 +0000
62+++ lib/lp/snappy/model/snapbuildjob.py 2017-04-03 14:48:19 +0000
63@@ -225,6 +225,16 @@
64 """See `ISnapStoreUploadJob`."""
65 self.metadata["store_url"] = url
66
67+ @property
68+ def store_revision(self):
69+ """See `ISnapStoreUploadJob`."""
70+ return self.metadata.get("store_revision")
71+
72+ @store_revision.setter
73+ def store_revision(self, revision):
74+ """See `ISnapStoreUploadJob`."""
75+ self.metadata["store_revision"] = revision
76+
77 # Ideally we'd just override Job._set_status or similar, but
78 # lazr.delegates makes that difficult, so we use this to override all
79 # the individual Job lifecycle methods instead.
80@@ -259,14 +269,14 @@
81 if "status_url" not in self.metadata:
82 self.metadata["status_url"] = client.upload(self.snapbuild)
83 if self.store_url is None:
84- self.store_url, self.metadata["store_revision"] = (
85+ self.store_url, self.store_revision = (
86 client.checkStatus(self.metadata["status_url"]))
87 if self.snapbuild.snap.store_channels:
88- if self.metadata["store_revision"] is None:
89+ if self.store_revision is None:
90 raise ManualReview(
91 "Package held for manual review on the store; "
92 "cannot release it automatically.")
93- client.release(self.snapbuild, self.metadata["store_revision"])
94+ client.release(self.snapbuild, self.store_revision)
95 self.error_message = None
96 except self.retry_error_types:
97 raise
98
99=== modified file 'lib/lp/snappy/tests/test_snapbuildjob.py'
100--- lib/lp/snappy/tests/test_snapbuildjob.py 2017-03-20 00:03:52 +0000
101+++ lib/lp/snappy/tests/test_snapbuildjob.py 2017-04-03 14:48:19 +0000
102@@ -137,7 +137,8 @@
103 repr(delivery))
104
105 def test_run(self):
106- # The job uploads the build to the store and records the store URL.
107+ # The job uploads the build to the store and records the store URL
108+ # and revision.
109 snapbuild = self.makeSnapBuild()
110 self.assertContentEqual([], snapbuild.store_upload_jobs)
111 job = SnapStoreUploadJob.create(snapbuild)
112@@ -152,6 +153,7 @@
113 self.assertEqual([], client.release.calls)
114 self.assertContentEqual([job], snapbuild.store_upload_jobs)
115 self.assertEqual(self.store_url, job.store_url)
116+ self.assertEqual(1, job.store_revision)
117 self.assertIsNone(job.error_message)
118 self.assertEqual([], pop_notifications())
119 self.assertWebhookDeliveries(snapbuild, ["Pending", "Uploaded"])
120@@ -171,6 +173,7 @@
121 self.assertEqual([], client.release.calls)
122 self.assertContentEqual([job], snapbuild.store_upload_jobs)
123 self.assertIsNone(job.store_url)
124+ self.assertIsNone(job.store_revision)
125 self.assertEqual("An upload failure", job.error_message)
126 self.assertEqual([], pop_notifications())
127 self.assertWebhookDeliveries(
128@@ -196,6 +199,7 @@
129 self.assertEqual([], client.release.calls)
130 self.assertContentEqual([job], snapbuild.store_upload_jobs)
131 self.assertIsNone(job.store_url)
132+ self.assertIsNone(job.store_revision)
133 self.assertEqual("Authorization failed.", job.error_message)
134 [notification] = pop_notifications()
135 self.assertEqual(
136@@ -244,6 +248,7 @@
137 self.assertEqual([], client.release.calls)
138 self.assertContentEqual([job], snapbuild.store_upload_jobs)
139 self.assertIsNone(job.store_url)
140+ self.assertIsNone(job.store_revision)
141 self.assertEqual("Failed to upload", job.error_message)
142 [notification] = pop_notifications()
143 self.assertEqual(
144@@ -291,6 +296,7 @@
145 self.assertEqual([], client.release.calls)
146 self.assertContentEqual([job], snapbuild.store_upload_jobs)
147 self.assertIsNone(job.store_url)
148+ self.assertIsNone(job.store_revision)
149 self.assertIsNone(job.error_message)
150 self.assertEqual([], pop_notifications())
151 self.assertEqual(JobStatus.WAITING, job.job.status)
152@@ -310,6 +316,7 @@
153 self.assertEqual([], client.release.calls)
154 self.assertContentEqual([job], snapbuild.store_upload_jobs)
155 self.assertEqual(self.store_url, job.store_url)
156+ self.assertEqual(1, job.store_revision)
157 self.assertIsNone(job.error_message)
158 self.assertEqual([], pop_notifications())
159 self.assertEqual(JobStatus.COMPLETED, job.job.status)
160@@ -335,6 +342,7 @@
161 self.assertEqual([], client.release.calls)
162 self.assertContentEqual([job], snapbuild.store_upload_jobs)
163 self.assertIsNone(job.store_url)
164+ self.assertIsNone(job.store_revision)
165 self.assertEqual("Scan failed.", job.error_message)
166 [notification] = pop_notifications()
167 self.assertEqual(
168@@ -378,6 +386,7 @@
169 self.assertEqual([((snapbuild, 1), {})], client.release.calls)
170 self.assertContentEqual([job], snapbuild.store_upload_jobs)
171 self.assertEqual(self.store_url, job.store_url)
172+ self.assertEqual(1, job.store_revision)
173 self.assertIsNone(job.error_message)
174 self.assertEqual([], pop_notifications())
175 self.assertWebhookDeliveries(snapbuild, ["Pending", "Uploaded"])
176@@ -405,6 +414,7 @@
177 self.assertEqual([], client.release.calls)
178 self.assertContentEqual([job], snapbuild.store_upload_jobs)
179 self.assertEqual(self.store_url, job.store_url)
180+ self.assertIsNone(job.store_revision)
181 self.assertEqual(
182 "Package held for manual review on the store; "
183 "cannot release it automatically.",
184@@ -457,6 +467,7 @@
185 self.assertEqual([((snapbuild, 1), {})], client.release.calls)
186 self.assertContentEqual([job], snapbuild.store_upload_jobs)
187 self.assertEqual(self.store_url, job.store_url)
188+ self.assertEqual(1, job.store_revision)
189 self.assertEqual("Failed to publish", job.error_message)
190 [notification] = pop_notifications()
191 self.assertEqual(