Merge lp:~michael.nelson/rnr-server/1262627-verify-click into lp:rnr-server

Proposed by Michael Nelson
Status: Merged
Merged at revision: 235
Proposed branch: lp:~michael.nelson/rnr-server/1262627-verify-click
Merge into: lp:rnr-server
Diff against target: 246 lines (+99/-17)
6 files modified
src/reviewsapp/forms.py (+2/-2)
src/reviewsapp/schema.py (+4/-0)
src/reviewsapp/tests/test_handlers.py (+1/-1)
src/reviewsapp/tests/test_rnrclient.py (+3/-3)
src/reviewsapp/tests/test_utilities.py (+73/-9)
src/reviewsapp/utilities.py (+16/-2)
To merge this branch: bzr merge lp:~michael.nelson/rnr-server/1262627-verify-click
Reviewer Review Type Date Requested Status
James Tait (community) Approve
Michael Nelson (community) Approve
Review via email: mp+199816@code.launchpad.net

Commit message

Check a packagename using the click-package-index.

Description of the change

Fix for bug 1262627 - when origin-distroseries is ubuntu-click, check for a valid package using the click-package-index api.

To post a comment you must log in.
Revision history for this message
Michael Nelson (michael.nelson) wrote :

self-approving so I can go ahead with getting this on staging, but happy to do a second branch with any review changes.

review: Approve
Revision history for this message
James Tait (jamestait) wrote :

I'm not familiar with the code, but this seems self-explanatory and looks good to me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/reviewsapp/forms.py'
2--- src/reviewsapp/forms.py 2012-06-20 12:19:49 +0000
3+++ src/reviewsapp/forms.py 2013-12-20 14:09:49 +0000
4@@ -168,10 +168,10 @@
5
6 if require_repository_check:
7 ws = WebServices()
8- valid_in_lp = ws.lp_verify_packagename_in_repository(
9+ is_valid_package = ws.verify_packagename_in_repository(
10 package_name, origin, distroseries, arch_tag=arch_tag)
11
12- if not valid_in_lp:
13+ if not is_valid_package:
14 valid_in_sca = ws.sca_verify_packagename_in_repository(
15 package_name, origin, distroseries, arch_tag=arch_tag)
16 if not valid_in_sca:
17
18=== modified file 'src/reviewsapp/schema.py'
19--- src/reviewsapp/schema.py 2012-08-29 20:01:15 +0000
20+++ src/reviewsapp/schema.py 2013-12-20 14:09:49 +0000
21@@ -88,6 +88,10 @@
22 'http://archive.canonical.com/': 'canonical',
23 })
24
25+ class clickpackageindex(schema.Section):
26+ click_index_api_uri = schema.StringOption(
27+ default="https://search.apps.ubuntu.com/api/v1/")
28+
29 # Launchpad
30 class launchpad(schema.Section):
31 lp_service = schema.StringOption()
32
33=== modified file 'src/reviewsapp/tests/test_handlers.py'
34--- src/reviewsapp/tests/test_handlers.py 2013-04-11 07:48:45 +0000
35+++ src/reviewsapp/tests/test_handlers.py 2013-12-20 14:09:49 +0000
36@@ -857,7 +857,7 @@
37 is_authed_fn = ('reviewsapp.auth.SSOOAuthAuthentication.'
38 'is_authenticated')
39 lp_verify_fn = ('reviewsapp.utilities.WebServices.'
40- 'lp_verify_packagename_in_repository')
41+ 'verify_packagename_in_repository')
42 sca_verify_fn = ('reviewsapp.utilities.WebServices.'
43 'sca_verify_packagename_in_repository')
44 with patch(is_authed_fn) as mock_is_authenticated:
45
46=== modified file 'src/reviewsapp/tests/test_rnrclient.py'
47--- src/reviewsapp/tests/test_rnrclient.py 2013-06-13 08:30:07 +0000
48+++ src/reviewsapp/tests/test_rnrclient.py 2013-12-20 14:09:49 +0000
49@@ -294,7 +294,7 @@
50
51 lp_verify_packagename_method = (
52 'reviewsapp.utilities.WebServices.'
53- 'lp_verify_packagename_in_repository')
54+ 'verify_packagename_in_repository')
55
56 mock_verify_package = Mock()
57 mock_verify_package.return_value = True
58@@ -319,7 +319,7 @@
59
60 lp_verify_packagename_method = (
61 'reviewsapp.utilities.WebServices.'
62- 'lp_verify_packagename_in_repository')
63+ 'verify_packagename_in_repository')
64
65 mock_verify_package = Mock()
66 mock_verify_package.return_value = True
67@@ -358,7 +358,7 @@
68 token.token, token.token_secret, consumer.key, consumer.secret)
69 lp_verify_packagename_method = (
70 'reviewsapp.utilities.WebServices.'
71- 'lp_verify_packagename_in_repository')
72+ 'verify_packagename_in_repository')
73
74 if mock_verify_package is None:
75 mock_verify_package = Mock()
76
77=== modified file 'src/reviewsapp/tests/test_utilities.py'
78--- src/reviewsapp/tests/test_utilities.py 2012-06-12 17:44:57 +0000
79+++ src/reviewsapp/tests/test_utilities.py 2013-12-20 14:09:49 +0000
80@@ -23,8 +23,8 @@
81 'FullClaimedIdTestCase',
82 'IdentityProviderTestCase',
83 'InvalidatePaginatedReviewsTestCase',
84- 'LaunchpadTestCase',
85 'SCATestCase',
86+ 'VerifyPackageTestCase',
87 ]
88
89 import os
90@@ -102,9 +102,9 @@
91 self.assertEquals(set(fields), set(data))
92
93
94-class LaunchpadTestCase(TestCaseWithFactory):
95+class VerifyPackageTestCase(TestCaseWithFactory):
96 def setUp(self):
97- super(LaunchpadTestCase, self).setUp()
98+ super(VerifyPackageTestCase, self).setUp()
99 # Force web_services to recreate the the Launchpad service root
100 WebServices._launchpad_service = None
101
102@@ -130,7 +130,7 @@
103 self, mock_lp_api, package_name, distro, series, arch_tag):
104 with patch('reviewsapp.utilities.Launchpad') as mock_launchpad:
105 mock_launchpad.login_anonymously.return_value = mock_lp_api
106- return WebServices().lp_verify_packagename_in_repository(
107+ return WebServices().verify_packagename_in_repository(
108 package_name, distro, series, arch_tag)
109
110 def test_package_in_ubuntu(self):
111@@ -216,13 +216,13 @@
112 lp_api, ubuntu, archive = self._make_mock_launchpad()
113 mock_launchpad.login_anonymously.return_value = lp_api
114 ws = WebServices()
115- ws.lp_verify_packagename_in_repository("foobar", 'ubuntu',
116- "lucid", 'i386')
117+ ws.verify_packagename_in_repository("foobar", 'ubuntu',
118+ "lucid", 'i386')
119 self.assertTrue(mock_launchpad.login_anonymously.called)
120 mock_launchpad.login_anonymously.reset_mock()
121
122- ws.lp_verify_packagename_in_repository("foobar", 'ubuntu',
123- "lucid", 'i386')
124+ ws.verify_packagename_in_repository("foobar", 'ubuntu',
125+ "lucid", 'i386')
126
127 self.assertFalse(mock_launchpad.login_anonymously.called)
128
129@@ -235,9 +235,73 @@
130 ws = WebServices()
131 # SyntaxError is raised when we fail to parse our dummy wadl
132 self.assertRaises(
133- SyntaxError, ws.lp_verify_packagename_in_repository,
134+ SyntaxError, ws.verify_packagename_in_repository,
135 "foobar", "ubuntu", "lucid", 'i386')
136
137+ def patch_httplib2_request(self):
138+ patcher = patch('reviewsapp.utilities.Http.request')
139+ self.addCleanup(patcher.stop)
140+ return patcher.start()
141+
142+ def patch_click_api_uri(self, uri="http://example.com/api/"):
143+ patcher = patch.multiple(settings, CLICK_INDEX_API_URI=uri)
144+ self.addCleanup(patcher.stop)
145+ return patcher.start()
146+
147+ def test_click_verify(self):
148+ ws = WebServices()
149+ mock_request = self.patch_httplib2_request()
150+ self.patch_click_api_uri()
151+ mock_request.return_value = ({
152+ 'content-length': '1152',
153+ 'status': '200',
154+ }, '')
155+
156+ result = ws.verify_packagename_in_repository(
157+ "com.ubuntu.developer.dholbach.webapp-bvg", "ubuntu", "click",
158+ "i386")
159+
160+ self.assertTrue(result)
161+ mock_request.assert_called_once_with(
162+ "http://example.com/api/package/"
163+ "com.ubuntu.developer.dholbach.webapp-bvg", "HEAD"
164+ )
165+
166+ def test_click_verify_false(self):
167+ ws = WebServices()
168+ mock_request = self.patch_httplib2_request()
169+ self.patch_click_api_uri()
170+ mock_request.return_value = ({
171+ 'content-length': '1152',
172+ 'status': '404',
173+ }, '')
174+
175+ result = ws.verify_packagename_in_repository(
176+ "com.ubuntu.developer.dholbach.webapp-bvg", "ubuntu", "click",
177+ "i386")
178+
179+ self.assertFalse(result)
180+ mock_request.assert_called_once_with(
181+ "http://example.com/api/package/"
182+ "com.ubuntu.developer.dholbach.webapp-bvg", "HEAD"
183+ )
184+
185+ def test_click_verify_error(self):
186+ ws = WebServices()
187+ mock_request = self.patch_httplib2_request()
188+ self.patch_click_api_uri()
189+ mock_request.side_effect = ServerNotFoundError
190+
191+ result = ws.verify_packagename_in_repository(
192+ "com.ubuntu.developer.dholbach.webapp-bvg", "ubuntu", "click",
193+ "i386")
194+
195+ self.assertFalse(result)
196+ mock_request.assert_called_once_with(
197+ "http://example.com/api/package/"
198+ "com.ubuntu.developer.dholbach.webapp-bvg", "HEAD"
199+ )
200+
201
202 class SCATestCase(TestCaseWithFactory):
203
204
205=== modified file 'src/reviewsapp/utilities.py'
206--- src/reviewsapp/utilities.py 2012-06-20 12:19:49 +0000
207+++ src/reviewsapp/utilities.py 2013-12-20 14:09:49 +0000
208@@ -29,7 +29,11 @@
209 import logging
210 import math
211 import urllib
212-from httplib2 import ServerNotFoundError
213+from httplib2 import (
214+ Http,
215+ HttpLib2Error,
216+ ServerNotFoundError,
217+)
218
219 from django.conf import settings
220 from django.core.cache import cache
221@@ -157,7 +161,7 @@
222 result.update(api.accounts.me())
223 return result
224
225- def lp_verify_packagename_in_repository(
226+ def verify_packagename_in_repository(
227 self, pkgname, origin, distroseries, arch_tag):
228 """Verify that a given package exists in a distroseries on LP.
229
230@@ -168,6 +172,16 @@
231 :return: Whether the package was found or not.
232 :rtype: bool
233 """
234+ if origin == "ubuntu" and distroseries == 'click':
235+ try:
236+ result = Http().request(
237+ settings.CLICK_INDEX_API_URI.rstrip('/') +
238+ "/package/{}".format(pkgname), 'HEAD')
239+ return result[0]['status'] == '200'
240+ except HttpLib2Error:
241+ self.logger.exception("Error querying click-package-index.")
242+ return False
243+
244 ubuntu = self.launchpad_service.distributions['ubuntu']
245 if origin == 'ubuntu':
246 archive = ubuntu.getArchive(name='primary')

Subscribers

People subscribed via source and target branches