Merge lp:~ricardokirkner/click-reviewers-tools/override-frameworks into lp:click-reviewers-tools

Proposed by Ricardo Kirkner
Status: Merged
Merged at revision: 292
Proposed branch: lp:~ricardokirkner/click-reviewers-tools/override-frameworks
Merge into: lp:click-reviewers-tools
Diff against target: 271 lines (+104/-24)
7 files modified
bin/click-check-lint (+9/-1)
bin/click-check-security (+9/-1)
clickreviews/cr_lint.py (+4/-2)
clickreviews/cr_security.py (+35/-9)
clickreviews/frameworks.py (+16/-9)
clickreviews/tests/test_cr_lint.py (+15/-1)
clickreviews/tests/test_cr_security.py (+16/-1)
To merge this branch: bzr merge lp:~ricardokirkner/click-reviewers-tools/override-frameworks
Reviewer Review Type Date Requested Status
Jamie Strandboge (community) Approve
Review via email: mp+241998@code.launchpad.net

Commit message

allow specifying overrides for framework checks

- support overriding frameworks for lint check
- support overriding framework policy data for security checks

To post a comment you must log in.
Revision history for this message
Jamie Strandboge (jdstrand) wrote :

Looks great, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/click-check-lint'
2--- bin/click-check-lint 2013-09-26 12:24:10 +0000
3+++ bin/click-check-lint 2014-11-17 17:14:19 +0000
4@@ -16,6 +16,7 @@
5 # along with this program. If not, see <http://www.gnu.org/licenses/>.
6
7 from __future__ import print_function
8+import json
9 import sys
10
11 import clickreviews.cr_common as cr_common
12@@ -25,7 +26,14 @@
13 if len(sys.argv) < 2:
14 cr_common.error("Must give path to click package")
15
16- review = cr_lint.ClickReviewLint(sys.argv[1])
17+ # extract args
18+ fn = sys.argv[1]
19+ if len(sys.argv) > 2:
20+ overrides = json.loads(sys.argv[2])
21+ else:
22+ overrides = None
23+
24+ review = cr_lint.ClickReviewLint(fn, overrides=overrides)
25 review.do_checks()
26 rc = review.do_report()
27 sys.exit(rc)
28
29=== modified file 'bin/click-check-security'
30--- bin/click-check-security 2013-09-26 12:24:10 +0000
31+++ bin/click-check-security 2014-11-17 17:14:19 +0000
32@@ -16,6 +16,7 @@
33 # along with this program. If not, see <http://www.gnu.org/licenses/>.
34
35 from __future__ import print_function
36+import json
37 import sys
38
39 import clickreviews.cr_common as cr_common
40@@ -25,7 +26,14 @@
41 if len(sys.argv) < 2:
42 cr_common.error("Must give path to click package")
43
44- review = cr_security.ClickReviewSecurity(sys.argv[1])
45+ # extract args
46+ fn = sys.argv[1]
47+ if len(sys.argv) > 2:
48+ overrides = json.loads(sys.argv[2])
49+ else:
50+ overrides = None
51+
52+ review = cr_security.ClickReviewSecurity(fn, overrides=overrides)
53 review.do_checks()
54 rc = review.do_report()
55 sys.exit(rc)
56
57=== modified file 'clickreviews/cr_lint.py'
58--- clickreviews/cr_lint.py 2014-11-11 15:19:59 +0000
59+++ clickreviews/cr_lint.py 2014-11-17 17:14:19 +0000
60@@ -31,7 +31,7 @@
61 class ClickReviewLint(ClickReview):
62 '''This class represents click lint reviews'''
63
64- def __init__(self, fn):
65+ def __init__(self, fn, overrides=None):
66 '''Set up the class.'''
67 ClickReview.__init__(self, fn, "lint")
68 self.control_files = dict()
69@@ -87,6 +87,7 @@
70 'urls']
71
72 self.redflagged_hooks = ['pay-ui']
73+ self.overrides = overrides if overrides is not None else {}
74
75 def _list_control_files(self):
76 '''List all control files with their full path.'''
77@@ -641,7 +642,8 @@
78 '''Check framework()'''
79 n = 'framework'
80 l = "http://askubuntu.com/questions/460512/what-framework-should-i-use-in-my-manifest-file"
81- frameworks = Frameworks()
82+ framework_overrides = self.overrides.get('framework')
83+ frameworks = Frameworks(overrides=framework_overrides)
84 if self.manifest['framework'] in frameworks.AVAILABLE_FRAMEWORKS:
85 t = 'info'
86 s = 'OK'
87
88=== modified file 'clickreviews/cr_security.py'
89--- clickreviews/cr_security.py 2014-10-14 13:14:05 +0000
90+++ clickreviews/cr_security.py 2014-11-17 17:14:19 +0000
91@@ -25,7 +25,7 @@
92
93 class ClickReviewSecurity(ClickReview):
94 '''This class represents click lint reviews'''
95- def __init__(self, fn):
96+ def __init__(self, fn, overrides=None):
97 ClickReview.__init__(self, fn, "security")
98
99 local_copy = os.path.join(os.path.dirname(__file__),
100@@ -78,10 +78,19 @@
101 # framework policy is based on major framework version. In 13.10, there
102 # was only 'ubuntu-sdk-13.10', but in 14.04, there will be several,
103 # like 'ubuntu-sdk-14.04-html5', 'ubuntu-sdk-14.04-platform', etc
104- self.major_framework_policy = {'ubuntu-sdk-13.10': 1.0,
105- 'ubuntu-sdk-14.04': 1.1,
106- 'ubuntu-sdk-14.10': 1.2,
107- }
108+ self.major_framework_policy = {
109+ 'ubuntu-sdk-13.10': {
110+ 'policy_version': 1.0,
111+ },
112+ 'ubuntu-sdk-14.04': {
113+ 'policy_version': 1.1,
114+ },
115+ 'ubuntu-sdk-14.10': {
116+ 'policy_version': 1.2,
117+ },
118+ }
119+ framework_overrides = overrides.get('framework') if overrides else {}
120+ self._override_framework_policies(framework_overrides)
121
122 self.security_manifests = dict()
123 self.security_apps = []
124@@ -102,6 +111,23 @@
125 self._extract_security_manifest(app)
126 self.security_apps.append(app)
127
128+ def _override_framework_policies(self, overrides):
129+ # override major framework policies
130+ self.major_framework_policy.update(overrides)
131+
132+ # override apparmor policies
133+ for name, data in overrides.items():
134+ vendor = data.get('policy_vendor')
135+ version = str(data.get('policy_version'))
136+
137+ if vendor not in self.aa_policy:
138+ self.aa_policy[vendor] = {}
139+
140+ if version not in self.aa_policy[vendor]:
141+ # just ensure the version is defined
142+ # TODO: add support to override templates and policy groups
143+ self.aa_policy[vendor][version] = {}
144+
145 def _extract_security_manifest(self, app):
146 '''Extract security manifest and verify it has the expected
147 structure'''
148@@ -269,15 +295,15 @@
149 n = 'policy_version_matches_framework (%s)' % (f)
150 s = "OK"
151 found_major = False
152- for k in self.major_framework_policy.keys():
153+ for name, data in self.major_framework_policy.items():
154 # TODO: use libclick when it is available
155- if not self.manifest['framework'].startswith(k):
156+ if not self.manifest['framework'].startswith(name):
157 continue
158 found_major = True
159- if m['policy_version'] != self.major_framework_policy[k]:
160+ if m['policy_version'] != data['policy_version']:
161 t = 'error'
162 s = '%s != %s (%s)' % (str(m['policy_version']),
163- self.major_framework_policy[k],
164+ data['policy_version'],
165 self.manifest['framework'])
166 if not found_major:
167 t = 'error'
168
169=== modified file 'clickreviews/frameworks.py'
170--- clickreviews/frameworks.py 2014-11-11 16:12:57 +0000
171+++ clickreviews/frameworks.py 2014-11-17 17:14:19 +0000
172@@ -32,14 +32,21 @@
173 OBSOLETE_FRAMEWORKS = []
174 AVAILABLE_FRAMEWORKS = []
175
176- def __init__(self):
177+ def __init__(self, overrides=None):
178 self.FRAMEWORKS = clickreviews.remote.read_cr_file(USER_DATA_FILE,
179 FRAMEWORKS_DATA_URL)
180-
181- for k, v in self.FRAMEWORKS.items():
182- if v == 'deprecated':
183- self.DEPRECATED_FRAMEWORKS.append(k)
184- elif v == 'obsolete':
185- self.OBSOLETE_FRAMEWORKS.append(k)
186- elif v == 'available':
187- self.AVAILABLE_FRAMEWORKS.append(k)
188+ if overrides is not None:
189+ self.FRAMEWORKS.update(overrides)
190+
191+ for name, data in self.FRAMEWORKS.items():
192+ if type(data) is dict:
193+ state = data.get('state')
194+ else:
195+ state = data
196+
197+ if state == 'deprecated':
198+ self.DEPRECATED_FRAMEWORKS.append(name)
199+ elif state == 'obsolete':
200+ self.OBSOLETE_FRAMEWORKS.append(name)
201+ elif state == 'available':
202+ self.AVAILABLE_FRAMEWORKS.append(name)
203
204=== modified file 'clickreviews/tests/test_cr_lint.py'
205--- clickreviews/tests/test_cr_lint.py 2014-11-11 16:12:57 +0000
206+++ clickreviews/tests/test_cr_lint.py 2014-11-17 17:14:19 +0000
207@@ -31,7 +31,7 @@
208 super()
209
210 def patch_frameworks(self):
211- def _mock_frameworks(self):
212+ def _mock_frameworks(self, overrides=None):
213 self.FRAMEWORKS = {
214 'ubuntu-sdk-14.10-qml-dev2': 'available',
215 'ubuntu-sdk-13.10': 'deprecated',
216@@ -752,6 +752,20 @@
217 expected_counts = {'info': None, 'warn': 0, 'error': 1}
218 self.check_results(r, expected_counts)
219
220+ @patch('clickreviews.remote.read_cr_file')
221+ def test_check_framework_with_overrides(self, mock_read_cr_file):
222+ '''Test check_framework() - using overrides'''
223+ mock_read_cr_file.return_value = {
224+ 'ubuntu-sdk-14.10-qml-dev2': 'available',
225+ }
226+ self.set_test_manifest("framework", "nonexistent")
227+ overrides = {'framework': {'nonexistent': {'state': 'available'}}}
228+ c = ClickReviewLint(self.test_name, overrides=overrides)
229+ c.check_framework()
230+ r = c.click_report
231+ expected_counts = {'info': 1, 'warn': 0, 'error': 0}
232+ self.check_results(r, expected_counts)
233+
234 def test_check_hooks(self):
235 '''Test check_hooks()'''
236 self.set_test_manifest("framework", "ubuntu-sdk-13.10")
237
238=== modified file 'clickreviews/tests/test_cr_security.py'
239--- clickreviews/tests/test_cr_security.py 2014-10-08 20:08:44 +0000
240+++ clickreviews/tests/test_cr_security.py 2014-11-17 17:14:19 +0000
241@@ -136,7 +136,7 @@
242 policy_version = 0
243 for k in tmp.major_framework_policy.keys():
244 if f.startswith(k):
245- policy_version = tmp.major_framework_policy[k]
246+ policy_version = tmp.major_framework_policy[k]['policy_version']
247 self.set_test_security_manifest(self.default_appname,
248 "policy_version",
249 policy_version)
250@@ -209,6 +209,21 @@
251 {"text": "Invalid framework 'nonexistent'"}
252 self.check_results(report, expected=expected)
253
254+ def test_check_policy_version_framework_with_overrides(self):
255+ '''Test check_policy_version() - override framework (nonexistent)'''
256+ self.set_test_manifest("framework", "nonexistent")
257+ self.set_test_security_manifest(self.default_appname,
258+ "policy_version", 1.3)
259+ overrides = {'framework': {'nonexistent': {'state': 'available',
260+ 'policy_vendor': 'ubuntu',
261+ 'policy_version': 1.3}}}
262+ c = ClickReviewSecurity(self.test_name, overrides=overrides)
263+ c.check_policy_version()
264+ report = c.click_report
265+
266+ expected_counts = {'info': 3, 'warn': 0, 'error': 0}
267+ self.check_results(report, expected_counts)
268+
269 def test_check_policy_vendor_unspecified(self):
270 '''Test check_policy_vendor() - unspecified'''
271 c = ClickReviewSecurity(self.test_name)

Subscribers

People subscribed via source and target branches